Repository: rxhanson/Rectangle
Branch: main
Commit: fa2b425bce88
Files: 301
Total size: 3.0 MB
Directory structure:
gitextract_oju34tob/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── funding.yml
│ └── workflows/
│ └── build.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── Rectangle/
│ ├── AccessibilityAuthorization/
│ │ ├── AccessibilityAuthorization.swift
│ │ └── AccessibilityWindowController.swift
│ ├── AccessibilityElement.swift
│ ├── AppDelegate.swift
│ ├── AppIcon.icon/
│ │ └── icon.json
│ ├── ApplicationToggle.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── StatusTemplate.imageset/
│ │ │ └── Contents.json
│ │ ├── WindowPositions/
│ │ │ ├── Contents.json
│ │ │ ├── almostMaximizeTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── blEighthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomCenterLeftSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomCenterLeftTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomCenterNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomCenterRightSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomCenterRightTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomCenterSixthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomHalfTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomLeftNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomLeftSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomLeftSixthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomLeftTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomLeftTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomRightNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomRightSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomRightSixthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomRightTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomRightTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomThirdTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bottomTwoThirdsTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── brEighthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── cblEighthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── cbrEighthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── centerLeftFourthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── centerRightFourthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── centerTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── centerThirdHorizontalTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── centerThirdTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── centerThreeFourthsTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── centerTwoThirdsTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ctlEighthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ctrEighthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── firstThirdTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── firstThreeFourthsTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── firstTwoThirdsTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── halfWidthCenterTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── largerWidthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── lastThirdTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── lastThreeFourthsTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── lastTwoThirdsTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── leftFourthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── leftHalfTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── lowerMiddleCenterLeftSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── lowerMiddleCenterRightSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── lowerMiddleLeftSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── lowerMiddleRightSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── makeLargerTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── makeSmallerTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── maximizeHeightTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── maximizeTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── middleCenterLeftTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── middleCenterNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── middleCenterRightTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── middleLeftNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── middleLeftTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── middleRightNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── middleRightTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── moveDownTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── moveLeftTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── moveRightTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── moveUpTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── nextDisplayTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── prevDisplayTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── restoreTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── rightFourthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── rightHalfTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── smallerWidthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── tlEighthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topCenterLeftSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topCenterLeftTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topCenterNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topCenterRightSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topCenterRightTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topCenterSixthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topHalfTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topLeftNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topLeftSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topLeftSixthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topLeftTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topLeftTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topRightNinthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topRightSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topRightSixthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topRightTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topRightTwelfthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topThirdTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── topTwoThirdsTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── trEighthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── upperMiddleCenterLeftSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── upperMiddleCenterRightSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── upperMiddleLeftSixteenthTemplate.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── upperMiddleRightSixteenthTemplate.imageset/
│ │ │ └── Contents.json
│ │ ├── keyboardToolbarTemplate.imageset/
│ │ │ └── Contents.json
│ │ ├── snapAreaTemplate.imageset/
│ │ │ └── Contents.json
│ │ ├── square.and.arrow.down.imageset/
│ │ │ └── Contents.json
│ │ ├── square.and.arrow.up.imageset/
│ │ │ └── Contents.json
│ │ ├── toolbarSettingsTemplate.imageset/
│ │ │ └── Contents.json
│ │ ├── wallpaperTiger.imageset/
│ │ │ └── Contents.json
│ │ └── wallpaperTigerVertical.imageset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── Main.storyboard
│ ├── CycleSize.swift
│ ├── Defaults.swift
│ ├── Info.plist
│ ├── InternetAccessPolicy.plist
│ ├── LaunchOnLogin.swift
│ ├── Logging/
│ │ ├── LogViewer.storyboard
│ │ └── LogViewer.swift
│ ├── MultiWindow/
│ │ ├── MultiWindowManager.swift
│ │ └── ReverseAllManager.swift
│ ├── Popover/
│ │ ├── MessageView.swift
│ │ └── MessageView.xib
│ ├── PrefsWindow/
│ │ ├── Config.swift
│ │ ├── PrefsViewController.swift
│ │ ├── SettingsViewController.swift
│ │ └── SnapAreaViewController.swift
│ ├── Rectangle-Bridging-Header.h
│ ├── Rectangle.entitlements
│ ├── RectangleRelease.entitlements
│ ├── RectangleStatusItem.swift
│ ├── ScreenDetection.swift
│ ├── ShortcutManager.swift
│ ├── Snapping/
│ │ ├── CompoundSnapArea/
│ │ │ ├── CompoundSnapArea.swift
│ │ │ ├── EighthsCompoundCalculation.swift
│ │ │ ├── FourthsCompoundCalculation.swift
│ │ │ ├── HalvesCompoundCalculation.swift
│ │ │ ├── SixthsCompoundCalculation.swift
│ │ │ └── ThirdsCompoundCalculation.swift
│ │ ├── FootprintWindow.swift
│ │ ├── SnapAreaModel.swift
│ │ └── SnappingManager.swift
│ ├── SubsequentExecutionMode.swift
│ ├── TitleBarManager.swift
│ ├── TodoMode/
│ │ └── TodoManager.swift
│ ├── Utilities/
│ │ ├── AXExtension.swift
│ │ ├── AlertUtil.swift
│ │ ├── CFExtension.swift
│ │ ├── CGExtension.swift
│ │ ├── CUtil.swift
│ │ ├── Debounce.swift
│ │ ├── DispatchTimeExtension.swift
│ │ ├── EventMonitor.swift
│ │ ├── MASShortcutMigration.swift
│ │ ├── MacTilingDefaults.swift
│ │ ├── NSImageExtension.swift
│ │ ├── NotificationExtension.swift
│ │ ├── RunLoopThread.swift
│ │ ├── SequenceExtension.swift
│ │ ├── StageUtil.swift
│ │ ├── StringExtension.swift
│ │ ├── TimeoutCache.swift
│ │ └── WindowUtil.swift
│ ├── WelcomeWindow/
│ │ └── WelcomeViewController.swift
│ ├── WindowAction.swift
│ ├── WindowActionCategory.swift
│ ├── WindowCalculation/
│ │ ├── AlmostMaximizeCalculation.swift
│ │ ├── BottomCenterLeftEighthCalculation.swift
│ │ ├── BottomCenterLeftSixteenthCalculation.swift
│ │ ├── BottomCenterLeftTwelfthCalculation.swift
│ │ ├── BottomCenterNinthCalculation.swift
│ │ ├── BottomCenterRightEighthCalculation.swift
│ │ ├── BottomCenterRightSixteenthCalculation.swift
│ │ ├── BottomCenterRightTwelfthCalculation.swift
│ │ ├── BottomCenterSixthCalculation.swift
│ │ ├── BottomHalfCalculation.swift
│ │ ├── BottomLeftEighthCalculation.swift
│ │ ├── BottomLeftNinthCalculation.swift
│ │ ├── BottomLeftSixteenthCalculation.swift
│ │ ├── BottomLeftSixthCalculation.swift
│ │ ├── BottomLeftThirdCalculation.swift
│ │ ├── BottomLeftTwelfthCalculation.swift
│ │ ├── BottomRightEighthCalculation.swift
│ │ ├── BottomRightNinthCalculation.swift
│ │ ├── BottomRightSixteenthCalculation.swift
│ │ ├── BottomRightSixthCalculation.swift
│ │ ├── BottomRightThirdCalculation.swift
│ │ ├── BottomRightTwelfthCalculation.swift
│ │ ├── BottomVerticalThirdCalculation.swift
│ │ ├── BottomVerticalTwoThirdsCalculation.swift
│ │ ├── CenterCalculation.swift
│ │ ├── CenterHalfCalculation.swift
│ │ ├── CenterProminentlyCalculation.swift
│ │ ├── CenterThirdCalculation.swift
│ │ ├── CenterThreeFourthsCalculation.swift
│ │ ├── CenterTwoThirdsCalculation.swift
│ │ ├── ChangeSizeCalculation.swift
│ │ ├── ChangeWindowDimensionCalculation.swift
│ │ ├── EighthsRepeated.swift
│ │ ├── FirstFourthCalculation.swift
│ │ ├── FirstThirdCalculation.swift
│ │ ├── FirstThreeFourthsCalculation.swift
│ │ ├── FirstTwoThirdsCalculation.swift
│ │ ├── GapCalculation.swift
│ │ ├── HalfOrDoubleDimensionCalculation.swift
│ │ ├── HorizontalThirdsRepeated.swift
│ │ ├── LastFourthCalculation.swift
│ │ ├── LastThirdCalculation.swift
│ │ ├── LastThreeFourthsCalculation.swift
│ │ ├── LastTwoThirdsCalculation.swift
│ │ ├── LeftRightHalfCalculation.swift
│ │ ├── LeftTodoCalculation.swift
│ │ ├── LowerLeftCalculation.swift
│ │ ├── LowerMiddleCenterLeftSixteenthCalculation.swift
│ │ ├── LowerMiddleCenterRightSixteenthCalculation.swift
│ │ ├── LowerMiddleLeftSixteenthCalculation.swift
│ │ ├── LowerMiddleRightSixteenthCalculation.swift
│ │ ├── LowerRightCalculation.swift
│ │ ├── MaximizeCalculation.swift
│ │ ├── MaximizeHeightCalculation.swift
│ │ ├── MiddleCenterLeftTwelfthCalculation.swift
│ │ ├── MiddleCenterNinthCalculation.swift
│ │ ├── MiddleCenterRightTwelfthCalculation.swift
│ │ ├── MiddleLeftNinthCalculation.swift
│ │ ├── MiddleLeftTwelfthCalculation.swift
│ │ ├── MiddleRightNinthCalculation.swift
│ │ ├── MiddleRightTwelfthCalculation.swift
│ │ ├── MiddleVerticalThirdCalculation.swift
│ │ ├── MoveLeftRightCalculation.swift
│ │ ├── MoveUpDownCalculation.swift
│ │ ├── NextPrevDisplayCalculation.swift
│ │ ├── NinthsRepeated.swift
│ │ ├── OrientationAware.swift
│ │ ├── QuartersRepeated.swift
│ │ ├── RepeatedExecutionsCalculation.swift
│ │ ├── RepeatedExecutionsInThirdsCalculation.swift
│ │ ├── RightTodoCalculation.swift
│ │ ├── SecondFourthCalculation.swift
│ │ ├── SixteenthsRepeated.swift
│ │ ├── SixthsRepeated.swift
│ │ ├── SpecifiedCalculation.swift
│ │ ├── ThirdFourthCalculation.swift
│ │ ├── TopCenterLeftEighthCalculation.swift
│ │ ├── TopCenterLeftSixteenthCalculation.swift
│ │ ├── TopCenterLeftTwelfthCalculation.swift
│ │ ├── TopCenterNinthCalculation.swift
│ │ ├── TopCenterRightEighthCalculation.swift
│ │ ├── TopCenterRightSixteenthCalculation.swift
│ │ ├── TopCenterRightTwelfthCalculation.swift
│ │ ├── TopCenterSixthCalculation.swift
│ │ ├── TopHalfCalculation.swift
│ │ ├── TopLeftEighthCalculation.swift
│ │ ├── TopLeftNinthCalculation.swift
│ │ ├── TopLeftSixteenthCalculation.swift
│ │ ├── TopLeftSixthCalculation.swift
│ │ ├── TopLeftThirdCalculation.swift
│ │ ├── TopLeftTwelfthCalculation.swift
│ │ ├── TopRightEighthCalculation.swift
│ │ ├── TopRightNinthCalculation.swift
│ │ ├── TopRightSixteenthCalculation.swift
│ │ ├── TopRightSixthCalculation.swift
│ │ ├── TopRightThirdCalculation.swift
│ │ ├── TopRightTwelfthCalculation.swift
│ │ ├── TopVerticalThirdCalculation.swift
│ │ ├── TopVerticalTwoThirdsCalculation.swift
│ │ ├── TwelfthsRepeated.swift
│ │ ├── UpperLeftCalculation.swift
│ │ ├── UpperMiddleCenterLeftSixteenthCalculation.swift
│ │ ├── UpperMiddleCenterRightSixteenthCalculation.swift
│ │ ├── UpperMiddleLeftSixteenthCalculation.swift
│ │ ├── UpperMiddleRightSixteenthCalculation.swift
│ │ ├── UpperRightCalculation.swift
│ │ └── WindowCalculation.swift
│ ├── WindowHistory.swift
│ ├── WindowManager.swift
│ ├── WindowMover/
│ │ ├── BestEffortWindowMover.swift
│ │ ├── CenteringFixedSizedWindowMover.swift
│ │ ├── QuantizedWindowMover.swift
│ │ ├── StandardWindowMover.swift
│ │ └── WindowMover.swift
│ └── mul.lproj/
│ └── Main.xcstrings
├── Rectangle.xcodeproj/
│ └── project.pbxproj
├── RectangleLauncher/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── RectangleLauncher.entitlements
│ ├── RectangleLauncherRelease.entitlements
│ └── mul.lproj/
│ └── Main.xcstrings
├── RectangleTests/
│ ├── Info.plist
│ └── RectangleTests.swift
└── TerminalCommands.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: 'bug'
assignees: ''
---
- [ ] This is a new bug that hasn't been documented in a closed issue or in the Readme.
macOS version:
Rectangle version:
Logs if applicable (In Rectangle menu, hold option, "View Logging..."):
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature idea
about: Please use the Discussions tab to share a feature idea ⬆️
title: ''
labels: 'enhancement'
assignees: ''
contact_links:
- name: Rectangle Discussions
url: https://github.com/rxhanson/Rectangle/discussions
about: Please discuss feature ideas here.
---
Feature ideas are now kept in the [discussions tab](https://github.com/rxhanson/Rectangle/discussions). Please create an issue there, not here.
================================================
FILE: .github/funding.yml
================================================
github: rxhanson
custom: https://rectangleapp.com
================================================
FILE: .github/workflows/build.yml
================================================
name: Build
on: [push, pull_request]
permissions: read-all
env:
XCODE_PROJECT: "Rectangle.xcodeproj"
XCODE_SCHEME: "Rectangle"
CODE_SIGN_IDENTITY: "-"
BUILD_DIR: "build"
XCODE_ARCHIVE: "Rectangle.xcarchive"
APP_NAME: "Rectangle.app"
EXPORT_OPTIONS_PLIST: "exportOptions.plist"
DMG_NAME: "Rectangle"
DMG_FILE_NAME: "Rectangle.dmg"
jobs:
build:
runs-on: macos-26
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build
run: xcodebuild -project "$XCODE_PROJECT" -scheme "$XCODE_SCHEME" archive CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" -archivePath "$BUILD_DIR/$XCODE_ARCHIVE"
- name: Export
run: |
plutil -convert xml1 - -o "$EXPORT_OPTIONS_PLIST" << EOF
{
"destination": "export",
"method": "mac-application"
}
EOF
xcodebuild -exportArchive -archivePath "$BUILD_DIR/$XCODE_ARCHIVE" -exportPath "$BUILD_DIR" -exportOptionsPlist "$EXPORT_OPTIONS_PLIST"
- name: Resign App
run: codesign --force --deep -s "$CODE_SIGN_IDENTITY" "$BUILD_DIR/$APP_NAME"
- name: Make DMG
run: hdiutil create -srcdir "$BUILD_DIR" -volname "$DMG_NAME" "$DMG_FILE_NAME"
- name: Upload
uses: actions/upload-artifact@v4
with:
name: Build
path: ${{ env.DMG_FILE_NAME }}
================================================
FILE: .gitignore
================================================
.idea
**/.DS_Store
*/xcuserdata/
xcuserdata/
**.xcuserstate
*.xcworkspace
Pods
## Xcode per-user config
*.mode1
*.mode1v3
*.mode2v3
*.perspective
*.perspectivev3
*.pbxuser
## Xcode Patch
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
!*.xcodeproj/xcshareddata/
!*.xcworkspace/contents.xcworkspacedata
/*.gcno
## Build products
build/
*.o
*.LinkFileList
*.hmap
## Automatic backup files
*~.nib/
*.swp
*~
*.dat
*.dep
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at ryan@ryanhanson.dev. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
## Feature Requests
Rectangle is not accepting any new feature requests at this time, sorry. You can file a feature request for a feature that you plan to implement and submit a pull request for, so that the feature can be reviewed and you will know ahead of time if the feature will be rejected.
## Bugs
Please search through the existing issues, open and closed, before filing a new bug.
Add the version of Rectangle, the version of the OS, and screenshots or videos as necessary.
## Coding Style
Please match the existing coding style as much as possible.
## License
By contributing to Rectangle you agree that your contributions will be licensed under its MIT license.
## Incentives
Logic from Rectangle is used in the [Multitouch](https://multitouch.app) app. The [Rectangle Pro](https://rectangleapp.com/pro) app is entirely built on top of Rectangle. If you contribute significant code or localizations that get merged into Rectangle, you get a free license of Multitouch or Rectangle Pro. Contributors to Sparkle, MASShortcut, or Spectacle can also receive free Multitouch or Rectangle Pro licenses (just send me a direct message on [Gitter](https://gitter.im)).
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2019-2025 Ryan Hanson
Based on the Spectacle app, Copyright (c) 2017 Eric Czarny eczarny@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Rectangle
[](https://github.com/rxhanson/Rectangle/actions/workflows/build.yml)
Rectangle is a window management app based on Spectacle, written in Swift.
## System Requirements
Rectangle supports macOS v10.15+. The last version that is supported for macOS 10.13 and 10.14 is https://github.com/rxhanson/Rectangle/releases/tag/v0.73.
## Installation
You can download the latest dmg from or the [Releases page](https://github.com/rxhanson/Rectangle/releases).
Or install with brew cask:
```bash
brew install --cask rectangle
```
## How to use it
The [keyboard shortcuts](https://support.apple.com/guide/mac-help/what-are-those-symbols-shown-in-menus-cpmh0011/mac) are self explanatory, but the snap areas can use some explanation if you've never used them on Windows or other window management apps.
Drag a window to the edge of the screen. When the mouse cursor reaches the edge of the screen, you'll see a footprint that Rectangle will attempt to resize and move the window to when the click is released.
| Snap Area | Resulting Action |
|--------------------------------------------------------|----------------------------------------|
| Left or right edge | Left or right half |
| Top | Maximize |
| Corners | Quarter in respective corner |
| Left or right edge, just above or below a corner | Top or bottom half |
| Bottom left, center, or right third | Respective third |
| Bottom left or right third, then drag to bottom center | First or last two thirds, respectively |
### Ignore an app
Ignoring an app means that when the app is frontmost, keyboard shortcuts are un-registered from macOS. When the app is no longer frontmost, keyboard shortcuts are re-registered with macOS. This is useful for apps that have the same shortcuts like Rectangle and you do not want to change them.
1. Focus the app that you want to ignore (make a window from that app frontmost).
1. Open the Rectangle menu and select "Ignore app"
To un-ignore an app that you have selected to ignore, simply bring that app frontmost again, open the Rectangle menu, and deselect "Ignore".
## Execute an action by URL
Open the URL `rectangle://execute-action?name=[name]`. Do not activate Rectangle if possible.
Available values for `[name]`: `left-half`, `right-half`, `center-half`, `top-half`, `bottom-half`, `top-left`, `top-right`, `bottom-left`, `bottom-right`, `first-third`, `center-third`, `last-third`, `first-two-thirds`, `last-two-thirds`, `maximize`, `almost-maximize`, `maximize-height`, `smaller`, `larger`, `center`, `center-prominently`, `restore`, `next-display`, `previous-display`, `move-left`, `move-right`, `move-up`, `move-down`, `first-fourth`, `second-fourth`, `third-fourth`, `last-fourth`, `first-three-fourths`, `last-three-fourths`, `top-left-sixth`, `top-center-sixth`, `top-right-sixth`, `bottom-left-sixth`, `bottom-center-sixth`, `bottom-right-sixth`, `specified`, `reverse-all`, `top-left-ninth`, `top-center-ninth`, `top-right-ninth`, `middle-left-ninth`, `middle-center-ninth`, `middle-right-ninth`, `bottom-left-ninth`, `bottom-center-ninth`, `bottom-right-ninth`, `top-left-third`, `top-right-third`, `bottom-left-third`, `bottom-right-third`, `top-left-eighth`, `top-center-left-eighth`, `top-center-right-eighth`, `top-right-eighth`, `bottom-left-eighth`, `bottom-center-left-eighth`, `bottom-center-right-eighth`, `bottom-right-eighth`, `tile-all`, `cascade-all`, `cascade-active-app`
Example, from a shell: `open -g "rectangle://execute-action?name=left-half"`
URLs can also be used to ignore/unignore apps.
```
rectangle://execute-task?name=ignore-app
rectangle://execute-task?name=unignore-app
```
A bundle identifier can also be specified, for example:
```
rectangle://execute-task?name=ignore-app&app-bundle-id=com.apple.Safari
```
## Terminal Commands for Hidden Preferences
See [TerminalCommands.md](TerminalCommands.md)
## Differences with Spectacle
* Rectangle uses [MASShortcut](https://github.com/rxhanson/MASShortcut) for keyboard shortcut recording. Spectacle used its own shortcut recorder.
* Rectangle has additional window actions: move windows to each edge without resizing, maximize only the height of a window, almost maximizing a window.
* Next/prev screen thirds is replaced with explicitly first third, first two thirds, center third, last two thirds, and last third. Screen orientation is taken into account, as in first third will be left third on landscape and top third on portrait.
* You can however emulate Spectacle's third cycling using first and last third actions. So, if you repeatedly execute first third, it will cycle through thirds (first, center, last) and vice-versa with the last third.
* There's an option to have windows traverse across displays on subsequent left or right executions.
* Windows will snap when dragged to edges/corners of the screen. This can be disabled.
## Common Known Issues
### Rectangle doesn't have the ability to move to other desktops/spaces
Apple never released a public API for doing this. Rectangle Pro has next/prev Space actions, but there are no plans to add those into Rectangle at this time.
### Window resizing is off slightly for iTerm2
By default iTerm2 will only resize in increments of character widths. There might be a setting inside iTerm2 to disable this, but you can change it with the following command.
```bash
defaults write com.googlecode.iterm2 DisableWindowSizeSnap -integer 1
```
### Rectangle appears to cause Notification Center to freeze
This appears to affect only a small amount of users. To prevent this from happening, uncheck the box for "Snap windows by dragging".
See issue [317](https://github.com/rxhanson/Rectangle/issues/317).
### Troubleshooting
If windows aren't resizing or moving as you expect, here's some initial steps to get to the bottom of it. Most issues of this type have been caused by other apps.
**Quick fixes (try these first):**
1. **Lock and unlock your Mac** – This simple step resolves many issues, especially after system updates.
1. Make sure macOS is up to date.
1. Restart your Mac (this often fixes things right after a macOS update).
**Diagnose the issue:**
4. **Enable debug logging** (see instructions in the following section) – This helps identify whether Rectangle is working correctly.
1. The logs are straightforward. If your calculated rect and your resulting rect are identical, chances are that there is another application causing issues.
**Check for conflicts:**
6. Make sure there are no other window manager applications running.
1. Make sure that the app whose windows are not behaving properly does not have any conflicting keyboard shortcuts.
1. Try using the menu items to execute a window action or changing the keyboard shortcut to something different so we can tell if it's a keyboard shortcut issue or not.
**Advanced troubleshooting:**
9. If you suspect there may be another application causing issues, try creating and logging in as a new macOS user.
1. Save your logs to attach to an issue if you need to create one.
#### Try resetting the macOS accessibility permissions for Rectangle:
```bash
tccutil reset All com.knollsoft.Rectangle
```
Or, this can be done with the following steps instead of the tccutil terminal command.
1. Close Rectangle if it's running
2. In System Settings -> Privacy & Security -> Accessibility, first disable Rectangle, then remove it with the minus button. (it's important to do both of those steps in that order)
3. Restart your mac.
4. Launch Rectangle and enable settings for it as prompted.
## View Debug Logging
1. Hold down the alt (option) key with the Rectangle menu open.
1. Select the "View Logging..." menu item, which is in place of the "About" menu item.
1. Logging will appear in the window as you perform Rectangle commands.
## Import & export JSON config
There are buttons for importing and exporting the config as a JSON file in the settings tab of the preferences window.
Upon launch, Rectangle will load a config file at `~/Library/Application Support/Rectangle/RectangleConfig.json` if it is present and will rename that file with a time/date stamp so that it isn't read on subsequent launches.
## Preferences Storage
The configuration for Rectangle is stored using NSUserDefaults, meaning it is stored in the following location:
`~/Library/Preferences/com.knollsoft.Rectangle.plist`
Note that shortcuts in v0.41+ are stored in a different format and will not load in prior versions.
That file can be backed up or transferred to other machines.
If you are using Rectangle v0.44+, you can also use the import/export button in the Preferences pane to share to your preferences and keyboard shortcuts across machines using a JSON file.
> [!NOTE]
> If you are having issues with configuration options persisting after an application restart and you've installed using Homebrew, you will need to uninstall and reinstall with the `--zap` flag.
```
brew uninstall --zap rectangle
brew install rectangle
```
## Uninstallation
Rectangle can be uninstalled by quitting the app and moving it to the trash. You can remove the Rectangle defaults from your machine with the following terminal command:
```bash
defaults delete com.knollsoft.Rectangle
```
> [!TIP]
> If you are uninstalling after installing with Homebrew, you should include the `--zap` flag to ensure it removes the plist entries too.
```
brew uninstall --zap rectangle
```
---
## Contributing
Logic from Rectangle is used in the [Multitouch](https://multitouch.app) app. The [Rectangle Pro](https://rectangleapp.com/pro) app is entirely built on top of Rectangle. If you contribute significant code or localizations that get merged into Rectangle, send me an email for a free license of Multitouch or Rectangle Pro. Contributors to Sparkle, MASShortcut, or Spectacle can also receive free Multitouch or Rectangle Pro licenses.
### Contributing additional sizes and positions
Rectangle's UI is intentionally simple. If you want to add a size and position that's not in the Shortcuts tab, then you can now add them into the "Extra Shortcuts" section accessed via the ellipsis button at the bottom of the General tab.
### Localization
If you would like to contribute to localization, all of the translations are held in the Main.strings.
Pull requests for new localizations or improvements on existing localizations are welcome.
### Running the app in Xcode (for developers)
Rectangle uses [Swift Package Manager](https://www.swift.org/package-manager/) to install Sparkle and MASShortcut.
The original repository for MASShortcut was archived, so Rectangle uses my [fork](https://github.com/rxhanson/MASShortcut). If you want to make any changes that involve MASShortcut, please make a pull request on my fork.
Due to the addition of the Liquid Glass icon with a fallback for older versions of macOS, there will be a build failure on macOS versions < 26. You can delete the "Asset Catalog Other Flags" to build locally on versions < 26 (but don't check that change in if you create a pull request).
## Credits
As mentioned above, Rectangle uses a forked version of [MASShortcut](https://github.com/rxhanson/MASShortcut), which still works great, and it uses [Sparkle](https://sparkle-project.org) for updates.
The Big Sur variant of the Rectangle app icon was created by Giovanni Maria Cusaro (@gmcusaro). The Liquid Glass variant of the app icon was created by [Alexander Käßner](https://www.alexkaessner.de) (@alexkaessner).
And of course, there's been a lot of community contributions over the years :)
================================================
FILE: Rectangle/AccessibilityAuthorization/AccessibilityAuthorization.swift
================================================
//
// AccessibilityAuthorization.swift
// Rectangle
//
// Created by Ryan Hanson on 6/11/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
import Cocoa
class AccessibilityAuthorization {
private var accessibilityWindowController: NSWindowController?
public func checkAccessibility(completion: @escaping () -> Void) -> Bool {
if !AXIsProcessTrusted() {
accessibilityWindowController = NSStoryboard(name: "Main", bundle: nil).instantiateController(withIdentifier: "AccessibilityWindowController") as? NSWindowController
NSApp.activate(ignoringOtherApps: true)
accessibilityWindowController?.showWindow(self)
pollAccessibility(completion: completion)
return false
} else {
return true
}
}
private func pollAccessibility(completion: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
if AXIsProcessTrusted() {
self.accessibilityWindowController?.close()
self.accessibilityWindowController = nil
completion()
} else {
self.pollAccessibility(completion: completion)
}
}
}
func showAuthorizationWindow() {
if accessibilityWindowController?.window?.isMiniaturized == true {
accessibilityWindowController?.window?.deminiaturize(self)
}
NSApp.activate(ignoringOtherApps: true)
}
}
================================================
FILE: Rectangle/AccessibilityAuthorization/AccessibilityWindowController.swift
================================================
//
// AccessibilityWindow.swift
// Rectangle
//
// Created by Ryan Hanson on 6/13/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class AccessibilityWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
let closeButton = self.window?.standardWindowButton(.closeButton)
closeButton?.target = self
closeButton?.action = #selector(quit)
}
@objc func quit() {
exit(1)
}
}
class AccessibilityViewController: NSViewController {
@IBOutlet weak var sysPrefsPathField: NSTextField!
@IBOutlet weak var openSysPrefsButton: NSButton!
@IBOutlet weak var padlockField: NSTextField!
override func viewDidLoad() {
if #available(OSX 13, *) {
sysPrefsPathField.stringValue = NSLocalizedString(
"Go to System Settings → Privacy & Security → Accessibility", tableName: "Main", value: "", comment: "")
openSysPrefsButton.title = NSLocalizedString(
"Open System Settings", tableName: "Main", value: "", comment: "")
padlockField.isHidden = true
}
}
@IBAction func openSystemPrefs(_ sender: Any) {
NSWorkspace.shared.open(URL(string:"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility")!)
}
}
================================================
FILE: Rectangle/AccessibilityElement.swift
================================================
//
// AccessibilityElement.swift
// Rectangle, Ported from Spectacle, Combined with snippets from ModMove
//
// Created by Ryan Hanson on 6/12/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class AccessibilityElement {
fileprivate let wrappedElement: AXUIElement
init(_ element: AXUIElement) {
wrappedElement = element
}
convenience init(_ pid: pid_t) {
self.init(AXUIElementCreateApplication(pid))
}
convenience init?(_ bundleIdentifier: String) {
guard let app = (NSWorkspace.shared.runningApplications.first { $0.bundleIdentifier == bundleIdentifier }) else { return nil }
self.init(app.processIdentifier)
}
convenience init?(_ position: CGPoint) {
guard let element = AXUIElement.systemWide.getElementAtPosition(position) else { return nil }
self.init(element)
}
private func getElementValue(_ attribute: NSAccessibility.Attribute) -> AccessibilityElement? {
guard let value = wrappedElement.getValue(attribute), CFGetTypeID(value) == AXUIElementGetTypeID() else { return nil }
return AccessibilityElement(value as! AXUIElement)
}
private func getElementsValue(_ attribute: NSAccessibility.Attribute) -> [AccessibilityElement]? {
guard let value = wrappedElement.getValue(attribute), let array = value as? [AXUIElement] else { return nil }
return array.map { AccessibilityElement($0) }
}
private var role: NSAccessibility.Role? {
guard let value = wrappedElement.getValue(.role) as? String else { return nil }
return NSAccessibility.Role(rawValue: value)
}
private var isApplication: Bool? {
guard let role = role else { return nil }
return role == .application
}
var isWindow: Bool? {
guard let role = role else { return nil }
return role == .window
}
var isSheet: Bool? {
guard let role = role else { return nil }
return role == .sheet
}
var isToolbar: Bool? {
guard let role = role else { return nil }
return role == .toolbar
}
var isGroup: Bool? {
guard let role = role else { return nil }
return role == .group
}
var isTabGroup: Bool? {
guard let role = role else { return nil }
return role == .tabGroup
}
var isStaticText: Bool? {
guard let role = role else { return nil }
return role == .staticText
}
private var subrole: NSAccessibility.Subrole? {
guard let value = wrappedElement.getValue(.subrole) as? String else { return nil }
return NSAccessibility.Subrole(rawValue: value)
}
var isSystemDialog: Bool? {
guard let subrole = subrole else { return nil }
return subrole == .systemDialog
}
private var position: CGPoint? {
get {
wrappedElement.getWrappedValue(.position)
}
set {
guard let newValue = newValue else { return }
wrappedElement.setValue(.position, newValue)
Logger.log("AX position proposed: \(newValue.debugDescription), result: \(position?.debugDescription ?? "N/A")")
}
}
func isResizable() -> Bool {
if let isResizable = wrappedElement.isValueSettable(.size) {
return isResizable
}
Logger.log("Unable to determine if window is resizeable. Assuming it is.")
return true
}
var size: CGSize? {
get {
wrappedElement.getWrappedValue(.size)
}
set {
guard let newValue = newValue else { return }
wrappedElement.setValue(.size, newValue)
Logger.log("AX sizing proposed: \(newValue.debugDescription), result: \(size?.debugDescription ?? "N/A")")
}
}
var frame: CGRect {
guard let position = position, let size = size else { return .null }
return .init(origin: position, size: size)
}
/// The Accessebility API only allows size & position adjustments individually.
/// To handle moving to different displays, we have to adjust the size then the position, then the size again since macOS will enforce sizes that fit on the current display.
/// When windows take a long time to adjust size & position, there is some visual stutter with doing each of these actions. The stutter can be slightly reduced by removing the initial size adjustment, which can make unsnap restore appear smoother.
func setFrame(_ frame: CGRect, adjustSizeFirst: Bool = true) {
let appElement = applicationElement
var enhancedUI: Bool? = nil
if let appElement = appElement {
enhancedUI = appElement.enhancedUserInterface
if enhancedUI == true {
Logger.log("AXEnhancedUserInterface was enabled, will disable before resizing")
appElement.enhancedUserInterface = false
}
}
if adjustSizeFirst {
size = frame.size
}
position = frame.origin
size = frame.size
// If "enhanced user interface" was originally enabled for the app, turn it back on
if Defaults.enhancedUI.value == .disableEnable, let appElement = appElement, enhancedUI == true {
appElement.enhancedUserInterface = true
}
}
private var childElements: [AccessibilityElement]? {
getElementsValue(.children)
}
func getChildElement(_ role: NSAccessibility.Role) -> AccessibilityElement? {
return childElements?.first { $0.role == role }
}
func getChildElements(_ role: NSAccessibility.Role) -> [AccessibilityElement]? {
guard let elements = (childElements?.filter { $0.role == role }), elements.count > 0 else {
return nil
}
return elements
}
func getChildElement(_ subrole: NSAccessibility.Subrole) -> AccessibilityElement? {
return childElements?.first { $0.subrole == subrole }
}
func getChildElements(_ subrole: NSAccessibility.Subrole) -> [AccessibilityElement]? {
guard let elements = (childElements?.filter { $0.subrole == subrole }), elements.count > 0 else {
return nil
}
return elements
}
func getSelfOrChildElementRecursively(_ position: CGPoint) -> AccessibilityElement? {
func getChildElement() -> AccessibilityElement? {
return element.childElements?
.map { (element: $0, frame: $0.frame) }
.filter { $0.frame.contains(position) }
.min { $0.frame.width * $0.frame.height < $1.frame.width * $1.frame.height }?
.element
}
var element = self
var elements = Set()
while let childElement = getChildElement(), elements.insert(childElement).inserted {
element = childElement
}
return element
}
var windowId: CGWindowID? {
wrappedElement.getWindowId()
}
func getWindowId() -> CGWindowID? {
if let windowId = windowId {
return windowId
}
let frame = frame
// Take the first match because there's no real way to guarantee which window we're actually getting
if let pid = pid, let info = (WindowUtil.getWindowList().first { $0.pid == pid && $0.frame == frame }) {
return info.id
}
Logger.log("Unable to obtain window id")
return nil
}
var pid: pid_t? {
wrappedElement.getPid()
}
var windowElement: AccessibilityElement? {
if isWindow == true { return self }
return getElementValue(.window)
}
private var isMainWindow: Bool? {
get {
windowElement?.wrappedElement.getValue(.main) as? Bool
}
set {
guard let newValue = newValue else { return }
windowElement?.wrappedElement.setValue(.main, newValue)
}
}
var isMinimized: Bool? {
windowElement?.wrappedElement.getValue(.minimized) as? Bool
}
var isFullScreen: Bool? {
guard let subrole = windowElement?.getElementValue(.fullScreenButton)?.subrole else { return nil }
return subrole == .zoomButton
}
var titleBarFrame: CGRect? {
guard
let windowElement,
case let windowFrame = windowElement.frame,
windowFrame != .null,
let closeButtonFrame = windowElement.getChildElement(.closeButton)?.frame,
closeButtonFrame != .null
else {
return nil
}
let gap = closeButtonFrame.minY - windowFrame.minY
let height = 2 * gap + closeButtonFrame.height
return CGRect(origin: windowFrame.origin, size: CGSize(width: windowFrame.width, height: height))
}
private var applicationElement: AccessibilityElement? {
if isApplication == true { return self }
guard let pid = pid else { return nil }
return AccessibilityElement(pid)
}
private var focusedWindowElement: AccessibilityElement? {
applicationElement?.getElementValue(.focusedWindow)
}
var windowElements: [AccessibilityElement]? {
applicationElement?.getElementsValue(.windows)
}
var isHidden: Bool? {
applicationElement?.wrappedElement.getValue(.hidden) as? Bool
}
var enhancedUserInterface: Bool? {
get {
applicationElement?.wrappedElement.getValue(.enhancedUserInterface) as? Bool
}
set {
guard let newValue = newValue else { return }
applicationElement?.wrappedElement.setValue(.enhancedUserInterface, newValue)
}
}
// Only for Stage Manager
var windowIds: [CGWindowID]? {
wrappedElement.getValue(.windowIds) as? [CGWindowID]
}
func bringToFront(force: Bool = false) {
if isMainWindow != true {
isMainWindow = true
}
if let pid = pid, let app = NSRunningApplication(processIdentifier: pid), !app.isActive || force {
app.activate(options: .activateIgnoringOtherApps)
}
}
}
extension AccessibilityElement {
static func getFrontApplicationElement() -> AccessibilityElement? {
guard let app = NSWorkspace.shared.frontmostApplication else { return nil }
return AccessibilityElement(app.processIdentifier)
}
static func getFrontWindowElement() -> AccessibilityElement? {
guard let appElement = getFrontApplicationElement() else {
Logger.log("Failed to find the application that currently has focus.")
return nil
}
if let focusedWindowElement = appElement.focusedWindowElement {
return focusedWindowElement
}
if let firstWindowElement = appElement.windowElements?.first {
return firstWindowElement
}
Logger.log("Failed to find frontmost window.")
return nil
}
private static func getWindowInfo(_ location: CGPoint) -> WindowInfo? {
WindowUtil.getWindowList().first(where: {windowInfo in
windowInfo.level < 23 // 23 is the level of the Notification Center
&& !["Dock", "WindowManager"].contains(windowInfo.processName)
&& windowInfo.frame.contains(location)
})
}
static func getWindowElementUnderCursor() -> AccessibilityElement? {
let position = NSEvent.mouseLocation.screenFlipped
var systemWideFirst = Defaults.systemWideMouseDown.userEnabled
if Defaults.systemWideMouseDown.notSet, let frontAppId = ApplicationToggle.frontAppId {
systemWideFirst = Defaults.systemWideMouseDownApps.typedValue?.contains(frontAppId) == true
}
if systemWideFirst,
let element = AccessibilityElement(position),
let windowElement = element.windowElement {
return windowElement
}
if let info = getWindowInfo(position) {
if !Defaults.dragFromStage.userDisabled {
if StageUtil.stageCapable && StageUtil.stageEnabled,
let group = StageUtil.getStageStripWindowGroup(info.id),
let windowId = group.first,
windowId != info.id,
let element = StageWindowAccessibilityElement(windowId) {
return element
}
}
if let windowElements = AccessibilityElement(info.pid).windowElements {
if let windowElement = (windowElements.first { $0.windowId == info.id }) {
return windowElement
}
if let windowElement = (windowElements.first { $0.frame == info.frame }) {
return windowElement
}
}
}
if !systemWideFirst,
let element = AccessibilityElement(position),
let windowElement = element.windowElement {
if Logger.logging, let pid = windowElement.pid {
let appName = NSRunningApplication(processIdentifier: pid)?.localizedName ?? ""
Logger.log("Window under cursor fallback matched: \(appName)")
}
return windowElement
}
Logger.log("Unable to obtain the accessibility element with the specified attribute at mouse location")
return nil
}
static func getWindowElement(_ windowId: CGWindowID) -> AccessibilityElement? {
guard let pid = WindowUtil.getWindowList(ids: [windowId]).first?.pid else { return nil }
return AccessibilityElement(pid).windowElements?.first { $0.windowId == windowId }
}
private static let excludedProcessNames: Set = ["Dock", "WindowManager", "Notification Center"]
static func getAllWindowElements() -> [AccessibilityElement] {
return WindowUtil.getWindowList()
.filter { !excludedProcessNames.contains($0.processName ?? "") }
.uniqueMap { $0.pid }
.compactMap { AccessibilityElement($0).windowElements }
.flatMap { $0 }
}
}
extension AccessibilityElement: Equatable {
static func == (lhs: AccessibilityElement, rhs: AccessibilityElement) -> Bool {
return lhs.wrappedElement == rhs.wrappedElement
}
}
extension AccessibilityElement: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(wrappedElement)
}
}
class StageWindowAccessibilityElement: AccessibilityElement {
private let _windowId: CGWindowID
init?(_ windowId: CGWindowID) {
guard let element = AccessibilityElement.getWindowElement(windowId) else { return nil }
_windowId = windowId
super.init(element.wrappedElement)
}
override var frame: CGRect {
let frame = super.frame
guard !frame.isNull, let windowId = windowId, let info = WindowUtil.getWindowList(ids: [windowId]).first else { return frame }
return .init(origin: info.frame.origin, size: frame.size)
}
override var windowId: CGWindowID? {
_windowId
}
}
enum EnhancedUI: Int {
case disableEnable = 1 /// The default behavior - disable Enhanced UI on every window move/resize
case disableOnly = 2 /// Don't re-enable enhanced UI after it gets disabled
case frontmostDisable = 3 /// Disable enhanced UI every time the frontmost app gets changed
}
================================================
FILE: Rectangle/AppDelegate.swift
================================================
//
// AppDelegate.swift
// Rectangle
//
// Created by Ryan Hanson on 6/11/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
import Sparkle
import ServiceManagement
import os.log
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
static let launcherAppId = "com.knollsoft.RectangleLauncher"
private let accessibilityAuthorization = AccessibilityAuthorization()
private let statusItem = RectangleStatusItem.instance
static let windowHistory = WindowHistory()
var updaterController: SPUStandardUpdaterController!
var hasPendingUpdate = false {
didSet {
Notification.Name.updateAvailability.post()
}
}
private var shortcutManager: ShortcutManager!
private var windowManager: WindowManager!
private var applicationToggle: ApplicationToggle!
private var windowCalculationFactory: WindowCalculationFactory!
private var snappingManager: SnappingManager!
private var titleBarManager: TitleBarManager!
private var prefsWindowController: NSWindowController?
private var prevActiveAppObservation: NSKeyValueObservation?
private var prevActiveApp: NSRunningApplication?
private var additionalSizeMenuItems: [NSMenuItem] = []
private var dynamicMenuItemCount: Int = 0
@IBOutlet weak var mainStatusMenu: NSMenu!
@IBOutlet weak var unauthorizedMenu: NSMenu!
@IBOutlet weak var ignoreMenuItem: NSMenuItem!
@IBOutlet weak var viewLoggingMenuItem: NSMenuItem!
@IBOutlet weak var updatesMenuItem: NSMenuItem!
@IBOutlet weak var quitMenuItem: NSMenuItem!
static var instance: AppDelegate {
NSApp.delegate as! AppDelegate
}
func applicationDidFinishLaunching(_ aNotification: Notification) {
Defaults.loadFromSupportDir()
migrateShowEighthsInMenu()
checkVersion()
mainStatusMenu.delegate = self
statusItem.refreshVisibility()
checkLaunchOnLogin()
let alreadyTrusted = accessibilityAuthorization.checkAccessibility {
self.showWelcomeWindow()
self.checkForConflictingApps()
self.openPreferences(self)
self.statusItem.statusMenu = self.mainStatusMenu
self.accessibilityTrusted()
}
if alreadyTrusted {
accessibilityTrusted()
}
statusItem.statusMenu = alreadyTrusted
? mainStatusMenu
: unauthorizedMenu
mainStatusMenu.autoenablesItems = false
addWindowActionMenuItems()
NotificationCenter.default.addObserver(self, selector: #selector(rebuildMenu), name: .showAdditionalSizesInMenuChanged, object: nil)
updaterController = SPUStandardUpdaterController(updaterDelegate: nil, userDriverDelegate: self)
checkAutoCheckForUpdates()
Notification.Name.configImported.onPost(using: { _ in
self.checkAutoCheckForUpdates()
self.statusItem.refreshVisibility()
self.applicationToggle.reloadFromDefaults()
self.shortcutManager.reloadFromDefaults()
self.snappingManager.reloadFromDefaults()
self.initializeTodo(false)
})
Notification.Name.todoMenuToggled.onPost(using: { _ in
self.initializeTodo(false)
})
prevActiveAppObservation = NSWorkspace.shared.observe(\.frontmostApplication, options: .old) { workspace, change in
self.prevActiveApp = change.oldValue ?? nil
}
}
func checkVersion() {
let currentVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
if let lastVersion = Defaults.lastVersion.value,
let intLastVersion = Int(lastVersion) {
if intLastVersion < 46 {
MASShortcutMigration.migrate()
}
if intLastVersion < 64 {
SnapAreaModel.instance.migrate()
}
if intLastVersion < 72 {
if #available(macOS 13, *) {
SMLoginItemSetEnabled(AppDelegate.launcherAppId as CFString, false)
}
}
} else {
Defaults.installVersion.value = currentVersion
Defaults.allowAnyShortcut.enabled = true
}
Defaults.lastVersion.value = currentVersion
}
func applicationWillBecomeActive(_ notification: Notification) {
Notification.Name.appWillBecomeActive.post()
}
func checkAutoCheckForUpdates() {
updaterController.updater.automaticallyChecksForUpdates = Defaults.SUEnableAutomaticChecks.enabled
}
func accessibilityTrusted() {
self.windowCalculationFactory = WindowCalculationFactory()
self.windowManager = WindowManager()
self.shortcutManager = ShortcutManager(windowManager: windowManager)
self.applicationToggle = ApplicationToggle(shortcutManager: shortcutManager)
self.snappingManager = SnappingManager()
self.titleBarManager = TitleBarManager()
self.initializeTodo()
checkForProblematicApps()
MacTilingDefaults.checkForBuiltInTiling(skipIfAlreadyNotified: true)
}
func checkForConflictingApps() {
let conflictingAppsIds: [String: String] = [
"com.divisiblebyzero.Spectacle": "Spectacle",
"com.crowdcafe.windowmagnet": "Magnet",
"com.hegenberg.BetterSnapTool": "BetterSnapTool",
"com.manytricks.Moom": "Moom"
]
let runningApps = NSWorkspace.shared.runningApplications
for app in runningApps {
guard let bundleId = app.bundleIdentifier else { continue }
if let conflictingAppName = conflictingAppsIds[bundleId] {
AlertUtil.oneButtonAlert(question: "Potential window manager conflict: \(conflictingAppName)", text: "Since \(conflictingAppName) might have some overlapping behavior with Rectangle, it's recommended that you either disable or quit \(conflictingAppName).")
break
}
}
}
/// certain applications have issues with the click listening done by the drag to snap feature
func checkForProblematicApps() {
guard !Defaults.windowSnapping.userDisabled, !Defaults.notifiedOfProblemApps.enabled else { return }
let problemBundleIds: [String] = [
"com.mathworks.matlab",
"com.live2d.cubism.CECubismEditorApp",
"com.aquafold.datastudio.DataStudio",
"com.adobe.illustrator",
"com.adobe.AfterEffects"
]
// these apps are java based with dynamic bundleIds
let problemJavaAppNames: [String] = [
"thinkorswim",
"Trader Workstation"
]
var problemBundles: [Bundle] = problemBundleIds.compactMap { bundleId in
if applicationToggle.isDisabled(bundleId: bundleId) { return nil }
// Directly instantiating the Bundle from the bundle id didn't work for matlab for some reason
if let url = NSWorkspace.shared.urlForApplication(withBundleIdentifier: bundleId) {
return Bundle(url: url)
}
return nil
}
for name in problemJavaAppNames {
if let path = NSWorkspace.shared.fullPath(forApplication: name) {
if let bundle = Bundle(path: path),
let bundleId = bundle.bundleIdentifier {
if !applicationToggle.isDisabled(bundleId: bundleId),
bundleId.starts(with: "com.install4j") {
problemBundles.append(bundle)
}
}
}
}
let displayNames = problemBundles.compactMap { $0.object(forInfoDictionaryKey: kCFBundleNameKey as String) as? String }
let displayNameString = displayNames.joined(separator: "\n")
if !problemBundles.isEmpty {
AlertUtil.oneButtonAlert(question: "Known issues with installed applications", text: "\(displayNameString)\n\nThese applications have issues with the drag to screen edge to snap functionality in Rectangle.\n\nYou can either ignore the applications using the menu item in Rectangle, or disable drag to screen edge snapping in Rectangle preferences.")
Defaults.notifiedOfProblemApps.enabled = true
}
}
private func showWelcomeWindow() {
let welcomeWindowController = NSStoryboard(name: "Main", bundle: nil)
.instantiateController(withIdentifier: "WelcomeWindowController") as? NSWindowController
guard let welcomeWindow = welcomeWindowController?.window else { return }
welcomeWindow.delegate = self
NSApp.activate(ignoringOtherApps: true)
let response = NSApp.runModal(for: welcomeWindow)
let usingRecommended = response == .alertFirstButtonReturn || response == .abort
Defaults.alternateDefaultShortcuts.enabled = usingRecommended
Defaults.subsequentExecutionMode.value = usingRecommended ? .acrossMonitor : .resize
welcomeWindowController?.close()
}
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
if Defaults.relaunchOpensMenu.enabled {
statusItem.openMenu()
} else {
openPreferences(sender)
}
return true
}
@IBAction func openPreferences(_ sender: Any) {
if prefsWindowController == nil {
prefsWindowController = NSStoryboard(name: "Main", bundle: nil).instantiateController(withIdentifier: "PrefsWindowController") as? NSWindowController
}
NSApp.activate(ignoringOtherApps: true)
prefsWindowController?.showWindow(self)
}
@IBAction func showAbout(_ sender: Any) {
NSApp.activate(ignoringOtherApps: true)
NSApp.orderFrontStandardAboutPanel(sender)
}
@IBAction func viewLogging(_ sender: Any) {
Logger.showLogging(sender: sender)
}
@IBAction func ignoreFrontMostApp(_ sender: NSMenuItem) {
if sender.state == .on {
applicationToggle.enableApp()
} else {
applicationToggle.disableApp()
}
}
@IBAction func checkForUpdates(_ sender: Any) {
updaterController.checkForUpdates(sender)
}
@IBAction func authorizeAccessibility(_ sender: Any) {
accessibilityAuthorization.showAuthorizationWindow()
}
private func checkLaunchOnLogin() {
if #available(macOS 13.0, *) {
if Defaults.launchOnLogin.enabled, !LaunchOnLogin.isEnabled {
LaunchOnLogin.isEnabled = true
}
} else {
let running = NSWorkspace.shared.runningApplications
let isRunning = !running.filter({$0.bundleIdentifier == AppDelegate.launcherAppId}).isEmpty
if isRunning {
let killNotification = Notification.Name("killLauncher")
DistributedNotificationCenter.default().post(name: killNotification, object: Bundle.main.bundleIdentifier!)
}
if !Defaults.SUHasLaunchedBefore {
Defaults.launchOnLogin.enabled = true
}
// Even if we are already set up to launch on login, setting it again since macOS can be buggy with this type of launch on login.
if Defaults.launchOnLogin.enabled {
let smLoginSuccess = SMLoginItemSetEnabled(AppDelegate.launcherAppId as CFString, true)
if !smLoginSuccess {
if #available(OSX 10.12, *) {
os_log("Unable to enable launch at login. Attempting one more time.", type: .info)
}
SMLoginItemSetEnabled(AppDelegate.launcherAppId as CFString, true)
}
}
}
}
}
extension AppDelegate: NSMenuDelegate {
func menuWillOpen(_ menu: NSMenu) {
if menu != mainStatusMenu {
updateWindowActionMenuItems(menu: menu)
updateTodoModeMenuItems(menu: menu)
return
}
if let frontAppName = ApplicationToggle.frontAppName {
let ignoreString = NSLocalizedString("D99-0O-MB6.title", tableName: "Main", value: "Ignore frontmost.app", comment: "")
ignoreMenuItem.title = ignoreString.replacingOccurrences(of: "frontmost.app", with: frontAppName)
ignoreMenuItem.state = ApplicationToggle.shortcutsDisabled ? .on : .off
ignoreMenuItem.isHidden = false
} else {
ignoreMenuItem.isHidden = true
}
updateWindowActionMenuItems(menu: menu)
updateTodoModeMenuItems(menu: menu)
viewLoggingMenuItem.keyEquivalentModifierMask = .option
quitMenuItem.keyEquivalent = "q"
quitMenuItem.keyEquivalentModifierMask = .command
}
private func updateWindowActionMenuItems(menu: NSMenu) {
let frontmostWindow = AccessibilityElement.getFrontWindowElement()
let screenCount = NSScreen.screens.count
let isPortrait = NSScreen.main?.frame.isLandscape == false
for menuItem in menu.items {
guard let windowAction = menuItem.representedObject as? WindowAction else { continue }
menuItem.image = windowAction.image.copy() as? NSImage
menuItem.image?.size = NSSize(width: 18, height: 12)
if isPortrait && windowAction.classification == .thirds {
menuItem.image = menuItem.image?.rotated(by: 270)
menuItem.image?.isTemplate = true
}
if !ApplicationToggle.shortcutsDisabled {
if let fullKeyEquivalent = shortcutManager.getKeyEquivalent(action: windowAction),
let keyEquivalent = fullKeyEquivalent.0?.lowercased() {
menuItem.keyEquivalent = keyEquivalent
menuItem.keyEquivalentModifierMask = fullKeyEquivalent.1
}
}
if frontmostWindow == nil {
menuItem.isEnabled = false
}
if screenCount == 1
&& (windowAction == .nextDisplay || windowAction == .previousDisplay) {
menuItem.isEnabled = false
}
}
}
func menuDidClose(_ menu: NSMenu) {
for menuItem in menu.items {
menuItem.keyEquivalent = ""
menuItem.keyEquivalentModifierMask = NSEvent.ModifierFlags()
menuItem.isEnabled = true
}
}
@objc func executeMenuWindowAction(sender: NSMenuItem) {
guard let windowAction = sender.representedObject as? WindowAction else { return }
windowAction.postMenu()
}
func addWindowActionMenuItems() {
let additionalSizeCategories: Set = [.eighths, .ninths, .twelfths, .sixteenths]
let submenuOnlyWhenAdditional: Set = [.thirds, .size]
let showAdditional = Defaults.showAdditionalSizesInMenu.userEnabled
var menuIndex = 0
var categoryMenus: [CategoryMenu] = []
for action in WindowAction.active {
guard let displayName = action.displayName else { continue }
let newMenuItem = NSMenuItem(title: displayName, action: #selector(executeMenuWindowAction), keyEquivalent: "")
newMenuItem.representedObject = action
if !Defaults.showAllActionsInMenu.userEnabled, let category = action.category {
// When additional sizes are off, keep Thirds and Size as flat items
if submenuOnlyWhenAdditional.contains(category) && !showAdditional {
// Fall through to flat item handling below
} else {
if menuIndex != 0 && action.firstInGroup {
let menu = NSMenu(title: category.displayName)
menu.autoenablesItems = false
categoryMenus.append(CategoryMenu(menu: menu, category: category))
}
categoryMenus.last?.menu.addItem(newMenuItem)
continue
}
}
// Flat item - suppress extra separator for almostMaximize when Size is not a submenu
let showSeparator = action.firstInGroup && !(action == .almostMaximize && !showAdditional)
if menuIndex != 0 && showSeparator {
mainStatusMenu.insertItem(NSMenuItem.separator(), at: menuIndex)
menuIndex += 1
}
mainStatusMenu.insertItem(newMenuItem, at: menuIndex)
menuIndex += 1
}
if !categoryMenus.isEmpty {
mainStatusMenu.insertItem(NSMenuItem.separator(), at: menuIndex)
menuIndex += 1
let sortedCategoryMenus = categoryMenus.sorted { $0.category.menuOrder < $1.category.menuOrder }
for categoryMenu in sortedCategoryMenus {
categoryMenu.menu.delegate = self
let menuMenuItem = NSMenuItem(title: categoryMenu.category.displayName, action: nil, keyEquivalent: "")
if additionalSizeCategories.contains(categoryMenu.category) {
menuMenuItem.isHidden = !Defaults.showAdditionalSizesInMenu.userEnabled
additionalSizeMenuItems.append(menuMenuItem)
}
mainStatusMenu.insertItem(menuMenuItem, at: menuIndex)
mainStatusMenu.setSubmenu(categoryMenu.menu, for: menuMenuItem)
menuIndex += 1
}
}
mainStatusMenu.insertItem(NSMenuItem.separator(), at: menuIndex)
menuIndex += 1
addTodoModeMenuItems(startingIndex: menuIndex)
// Track total dynamic items: window actions + separators + todo items (4 items + 1 separator)
dynamicMenuItemCount = menuIndex + 5
}
@objc func rebuildMenu() {
// Remove all dynamically added items
for _ in 0.. String {
return name.map { $0.isUppercase ? "-" + $0.lowercased() : String($0) }.joined()
}
func extractBundleIdParameter(fromComponents components: URLComponents) -> String? {
(components.queryItems?.first { $0.name == "app-bundle-id" })?.value ?? ApplicationToggle.frontAppId
}
func isValidParameter(bundleId: String?) -> Bool {
let isValid = bundleId?.isEmpty != true
if !isValid {
Logger.log("Received an empty app-bundle-id parameter. Either pass a valid app bundle id or remove the parameter.")
}
return isValid
}
for url in urls {
guard
let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
components.path.isEmpty
else {
continue
}
let name = (components.queryItems?.first { $0.name == "name" })?.value
switch (components.host, name) {
case ("execute-action", _):
let action = (WindowAction.active.first { getUrlName($0.name) == name })
action?.postUrl()
case ("execute-task", "ignore-app"):
let bundleId = extractBundleIdParameter(fromComponents: components)
guard isValidParameter(bundleId: bundleId) else { continue }
self.applicationToggle.disableApp(appBundleId: bundleId)
case ("execute-task", "unignore-app"):
let bundleId = extractBundleIdParameter(fromComponents: components)
guard isValidParameter(bundleId: bundleId) else { continue }
self.applicationToggle.enableApp(appBundleId: bundleId)
default:
continue
}
}
}
}
}
extension AppDelegate: SPUStandardUserDriverDelegate {
var supportsGentleScheduledUpdateReminders: Bool {
true
}
func standardUserDriverShouldHandleShowingScheduledUpdate(_ update: SUAppcastItem, andInImmediateFocus immediateFocus: Bool) -> Bool {
if immediateFocus {
return true
}
self.hasPendingUpdate = true
updatesMenuItem.title = "Update Available…".localized
return false
}
func standardUserDriverWillFinishUpdateSession() {
self.hasPendingUpdate = false
updatesMenuItem.title = "Check for Updates…".localized(key: "HIK-3r-i7E.title")
}
}
================================================
FILE: Rectangle/AppIcon.icon/icon.json
================================================
{
"color-space-for-untagged-svg-colors" : "display-p3",
"fill" : {
"linear-gradient" : [
"display-p3:0.36863,0.43529,0.50980,1.00000",
"srgb:0.24706,0.27451,0.33333,1.00000"
]
},
"groups" : [
{
"blur-material" : null,
"layers" : [
{
"glass" : true,
"image-name" : "Dots.svg",
"name" : "Dots"
}
],
"shadow" : {
"kind" : "none",
"opacity" : 0.5
},
"specular" : true,
"translucency" : {
"enabled" : true,
"value" : 0.2
}
},
{
"layers" : [
{
"fill-specializations" : [
{
"appearance" : "tinted",
"value" : {
"linear-gradient" : [
"gray:0.90000,1.00000",
"extended-gray:0.75000,1.00000"
]
}
}
],
"glass" : true,
"image-name" : "Overlay.svg",
"name" : "Overlay"
}
],
"shadow" : {
"kind" : "layer-color",
"opacity" : 0.5
},
"translucency" : {
"enabled" : true,
"value" : 0.5
}
}
],
"supported-platforms" : {
"squares" : [
"macOS"
]
}
}
================================================
FILE: Rectangle/ApplicationToggle.swift
================================================
//
// ApplicationToggle.swift
// Rectangle
//
// Created by Ryan Hanson on 6/18/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class ApplicationToggle: NSObject {
private var disabledApps = Set()
public private(set) static var frontAppId: String? = "com.knollsoft.Rectangle"
public private(set) static var frontAppName: String? = "Rectangle"
public private(set) static var shortcutsDisabled: Bool = false
private let shortcutManager: ShortcutManager
init(shortcutManager: ShortcutManager) {
self.shortcutManager = shortcutManager
super.init()
registerFrontAppChangeNote()
if let disabledApps = getDisabledApps() {
self.disabledApps = disabledApps
}
}
public func reloadFromDefaults() {
if let disabledApps = getDisabledApps() {
self.disabledApps = disabledApps
} else {
disabledApps.removeAll()
}
}
private func saveDisabledApps() {
let encoder = JSONEncoder()
if let jsonDisabledApps = try? encoder.encode(disabledApps) {
if let jsonString = String(data: jsonDisabledApps, encoding: .utf8) {
Defaults.disabledApps.value = jsonString
}
}
}
private func getDisabledApps() -> Set? {
guard let jsonDisabledAppsString = Defaults.disabledApps.value else { return nil }
let decoder = JSONDecoder()
guard let jsonDisabledApps = jsonDisabledAppsString.data(using: .utf8) else { return nil }
guard let disabledApps = try? decoder.decode(Set.self, from: jsonDisabledApps) else { return nil }
return disabledApps
}
private func disableShortcuts() {
if !Self.shortcutsDisabled {
Self.shortcutsDisabled = true
self.shortcutManager.unbindShortcuts()
if !Defaults.ignoreDragSnapToo.userDisabled {
Notification.Name.windowSnapping.post(object: false)
}
}
}
private func enableShortcuts() {
if Self.shortcutsDisabled {
Self.shortcutsDisabled = false
self.shortcutManager.bindShortcuts()
if !Defaults.ignoreDragSnapToo.userDisabled {
Notification.Name.windowSnapping.post(object: true)
}
}
}
public func disableApp(appBundleId: String? = frontAppId) {
if let appBundleId {
disabledApps.insert(appBundleId)
saveDisabledApps()
disableShortcuts()
}
}
public func enableApp(appBundleId: String? = frontAppId) {
if let appBundleId {
disabledApps.remove(appBundleId)
saveDisabledApps()
enableShortcuts()
}
}
public func isDisabled(bundleId: String) -> Bool {
return disabledApps.contains(bundleId)
}
private func registerFrontAppChangeNote() {
NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(self.receiveFrontAppChangeNote(_:)), name: NSWorkspace.didActivateApplicationNotification, object: nil)
}
@objc func receiveFrontAppChangeNote(_ notification: Notification) {
if let application = notification.userInfo?["NSWorkspaceApplicationKey"] as? NSRunningApplication {
Self.frontAppId = application.bundleIdentifier
Self.frontAppName = application.localizedName
if let frontAppId = application.bundleIdentifier {
if isDisabled(bundleId: frontAppId) {
disableShortcuts()
} else {
enableShortcuts()
}
Notification.Name.frontAppChanged.post()
} else {
enableShortcuts()
}
if Defaults.enhancedUI.value == .frontmostDisable {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(50)) {
AccessibilityElement.getFrontApplicationElement()?.enhancedUserInterface = false
}
}
}
}
}
// todo mode
extension ApplicationToggle {
public func setTodoApp() {
Defaults.todoApplication.value = Self.frontAppId
}
public func todoAppIsActive() -> Bool {
return Defaults.todoApplication.value == Self.frontAppId
}
}
================================================
FILE: Rectangle/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"filename" : "mac016pts1x.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"filename" : "mac016pts2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"filename" : "mac032pts1x.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"filename" : "mac032pts2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"filename" : "mac128pts1x.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"filename" : "mac128pts2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "mac256pts1x.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"filename" : "mac256pts2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"filename" : "mac512pts1x.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"filename" : "mac512pts2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/StatusTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "RectangleStatusTemplate22.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "RectangleStatusTemplate44.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "RectangleStatusTemplate.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/almostMaximizeTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "almostMaximizeTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/blEighthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "blEighthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomCenterLeftSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomCenterLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomCenterLeftTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomCenterLeftTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomCenterNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomCenterNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomCenterRightSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomCenterRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomCenterRightTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomCenterRightTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomCenterSixthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomCenterSixthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomHalfTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "bottomHalfTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomLeftNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomLeftNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomLeftSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomLeftSixthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomLeftSixthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomLeftTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "bottomLeftTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomLeftTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomLeftTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomRightNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomRightNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomRightSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomRightSixthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomRightSixthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomRightTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "bottomRightTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomRightTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomRightTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomThirdTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomThirdTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/bottomTwoThirdsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bottomTwoThirdsTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/brEighthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "brEighthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/cblEighthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "cblEighthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/cbrEighthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "cbrEighthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/centerLeftFourthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "centerLeftFourthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/centerRightFourthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "centerRightFourthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/centerTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "centerTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/centerThirdHorizontalTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "centerThirdTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/centerThirdTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "centerThirdTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/centerThreeFourthsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "centerThreeFourthsTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/centerTwoThirdsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "centerTwoThirdsTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/ctlEighthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "ctlEighthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/ctrEighthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "ctrEighthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/firstThirdTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "firstThirdTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/firstThreeFourthsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "firstThreeFourthsTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/firstTwoThirdsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "firstTwoThirdsTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/halfWidthCenterTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "halfWidthCenterTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/largerWidthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "largerWidthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/lastThirdTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "lastThirdTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/lastThreeFourthsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "lastThreeFourthsTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/lastTwoThirdsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "lastTwoThirdsTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/leftFourthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "leftFourthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/leftHalfTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "leftHalfTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/lowerMiddleCenterLeftSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "lowerMiddleCenterLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/lowerMiddleCenterRightSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "lowerMiddleCenterRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/lowerMiddleLeftSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "lowerMiddleLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/lowerMiddleRightSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "lowerMiddleRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/makeLargerTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "makeLargerTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/makeSmallerTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "makeSmallerTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/maximizeHeightTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "maximizeHeightTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/maximizeTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "maximizeTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/middleCenterLeftTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "middleCenterLeftTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/middleCenterNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "middleCenterNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/middleCenterRightTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "middleCenterRightTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/middleLeftNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "middleLeftNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/middleLeftTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "middleLeftTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/middleRightNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "middleRightNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/middleRightTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "middleRightTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/moveDownTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "moveDownTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/moveLeftTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "moveLeftTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/moveRightTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "moveRightTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/moveUpTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "moveUpTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/nextDisplayTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "nextDisplayTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/prevDisplayTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "prevDisplayTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/restoreTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "restoreTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/rightFourthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "rightFourthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/rightHalfTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "rightHalfTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/smallerWidthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "smallerWidthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/tlEighthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "tlEighthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topCenterLeftSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topCenterLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topCenterLeftTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topCenterLeftTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topCenterNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topCenterNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topCenterRightSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topCenterRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topCenterRightTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topCenterRightTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topCenterSixthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topCenterSixthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topHalfTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "topHalfTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topLeftNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topLeftNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topLeftSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topLeftSixthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topLeftSixthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topLeftTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "topLeftTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topLeftTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topLeftTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topRightNinthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topRightNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topRightSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topRightSixthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topRightSixthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topRightTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "topRightTemplate.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topRightTwelfthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topRightTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topThirdTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topThirdTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/topTwoThirdsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "topTwoThirdsTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/trEighthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "trEighthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/upperMiddleCenterLeftSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "upperMiddleCenterLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/upperMiddleCenterRightSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "upperMiddleCenterRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/upperMiddleLeftSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "upperMiddleLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/WindowPositions/upperMiddleRightSixteenthTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "upperMiddleRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/keyboardToolbarTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "keyboardToolbarTemplateSmall.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "keyboardToolbarTemplate.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/snapAreaTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "snapAreaTemplateSmall.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "snapAreaTemplate.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/square.and.arrow.down.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "square.and.arrow.down.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Rectangle/Assets.xcassets/square.and.arrow.up.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "square.and.arrow.up.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Rectangle/Assets.xcassets/toolbarSettingsTemplate.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "toolbarSettingsTemplate copy.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "toolbarSettingsTemplate.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/wallpaperTiger.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "wallpaperTiger.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Assets.xcassets/wallpaperTigerVertical.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "wallpaperTigerVertical.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Rectangle/Base.lproj/Main.storyboard
================================================
2. In the Rectangle menu, select
"Use [Application] as Todo App"
While in Todo Mode, you can refresh the Todo Mode layout by selecting "Reflow Todo" in the Rectangle menu or executing the associated keyboard shortcut.
================================================
FILE: Rectangle/CycleSize.swift
================================================
//
// CycleSize.swift
// Rectangle
//
// Created by Eskil Gjerde Sviggum on 01/08/2024.
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
enum CycleSize: Int, CaseIterable {
case twoThirds = 0
case oneHalf = 1
case oneThird = 2
case oneQuarter = 3
case threeQuarters = 4
static func fromBits(bits: Int) -> Set {
Set(
Self.allCases.filter {
(bits >> $0.rawValue) & 1 == 1
}
)
}
static var firstSize = CycleSize.oneHalf
static var defaultSizes: Set = [.oneHalf, .twoThirds, .oneThird]
// The expected order of the cycle sizes is to start with the
// first division, then go gradually upwards in size and wrap
// around to the smaller sizes.
//
// For example if all cycles are used, the order should be:
// 1/2, 2/3, 3/4, 1/4, 1/3
static var sortedSizes: [CycleSize] = {
let sortedSizes = Self.allCases.sorted(by: { $0.fraction < $1.fraction })
guard let firstSizeIndex = sortedSizes.firstIndex(of: firstSize) else {
return sortedSizes
}
let lessThanFistSizes = sortedSizes[0.. Int {
var bits = 0
self.forEach {
bits |= 1 << $0.rawValue
}
return bits
}
}
class CycleSizesDefault: Default {
public private(set) var key: String = "selectedCycleSizes"
private var initialized = false
var value: Set {
didSet {
if initialized {
UserDefaults.standard.set(value.toBits(), forKey: key)
}
}
}
init() {
let bits = UserDefaults.standard.integer(forKey: key)
value = CycleSize.fromBits(bits: bits)
initialized = true
}
func load(from codable: CodableDefault) {
if let bits = codable.int {
let divisions = CycleSize.fromBits(bits: bits)
value = divisions
}
}
func toCodable() -> CodableDefault {
return CodableDefault(int: value.toBits())
}
}
================================================
FILE: Rectangle/Defaults.swift
================================================
//
// Defaults.swift
// Rectangle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class Defaults {
static let launchOnLogin = BoolDefault(key: "launchOnLogin")
static let disabledApps = StringDefault(key: "disabledApps")
static let hideMenuBarIcon = BoolDefault(key: "hideMenubarIcon")
static let alternateDefaultShortcuts = BoolDefault(key: "alternateDefaultShortcuts") // switch to magnet defaults
static let subsequentExecutionMode = SubsequentExecutionDefault()
static let selectedCycleSizes = CycleSizesDefault()
static let cycleSizesIsChanged = BoolDefault(key: "cycleSizesIsChanged")
static let allowAnyShortcut = BoolDefault(key: "allowAnyShortcut")
static let windowSnapping = OptionalBoolDefault(key: "windowSnapping")
static let almostMaximizeHeight = FloatDefault(key: "almostMaximizeHeight")
static let almostMaximizeWidth = FloatDefault(key: "almostMaximizeWidth")
static let gapSize = FloatDefault(key: "gapSize")
static let snapEdgeMarginTop = FloatDefault(key: "snapEdgeMarginTop", defaultValue: 5)
static let snapEdgeMarginBottom = FloatDefault(key: "snapEdgeMarginBottom", defaultValue: 5)
static let snapEdgeMarginLeft = FloatDefault(key: "snapEdgeMarginLeft", defaultValue: 5)
static let snapEdgeMarginRight = FloatDefault(key: "snapEdgeMarginRight", defaultValue: 5)
static let centeredDirectionalMove = OptionalBoolDefault(key: "centeredDirectionalMove")
static let resizeOnDirectionalMove = BoolDefault(key: "resizeOnDirectionalMove")
static let ignoredSnapAreas = IntDefault(key: "ignoredSnapAreas")
static let traverseSingleScreen = OptionalBoolDefault(key: "traverseSingleScreen")
static let useCursorScreenDetection = BoolDefault(key: "useCursorScreenDetection")
static let minimumWindowWidth = FloatDefault(key: "minimumWindowWidth")
static let minimumWindowHeight = FloatDefault(key: "minimumWindowHeight")
static let sizeOffset = FloatDefault(key: "sizeOffset")
static let widthStepSize = FloatDefault(key: "widthStepSize", defaultValue: 30)
static let unsnapRestore = OptionalBoolDefault(key: "unsnapRestore")
static let curtainChangeSize = OptionalBoolDefault(key: "curtainChangeSize")
static let relaunchOpensMenu = BoolDefault(key: "relaunchOpensMenu")
static let obtainWindowOnClick = OptionalBoolDefault(key: "obtainWindowOnClick")
static let screenEdgeGapTop = FloatDefault(key: "screenEdgeGapTop", defaultValue: 0)
static let screenEdgeGapBottom = FloatDefault(key: "screenEdgeGapBottom", defaultValue: 0)
static let screenEdgeGapLeft = FloatDefault(key: "screenEdgeGapLeft", defaultValue: 0)
static let screenEdgeGapRight = FloatDefault(key: "screenEdgeGapRight", defaultValue: 0)
static let screenEdgeGapsOnMainScreenOnly = BoolDefault(key: "screenEdgeGapsOnMainScreenOnly")
static let screenEdgeGapTopNotch = FloatDefault(key: "screenEdgeGapTopNotch", defaultValue: 0)
static let lastVersion = StringDefault(key: "lastVersion")
static let installVersion = StringDefault(key: "installVersion")
static let showAllActionsInMenu = OptionalBoolDefault(key: "showAllActionsInMenu")
static let showAdditionalSizesInMenu = OptionalBoolDefault(key: "showAdditionalSizesInMenu")
static var SUHasLaunchedBefore: Bool { UserDefaults.standard.bool(forKey: "SUHasLaunchedBefore") }
static let footprintAlpha = FloatDefault(key: "footprintAlpha", defaultValue: 0.3)
static let footprintBorderWidth = FloatDefault(key: "footprintBorderWidth", defaultValue: 2)
static let footprintFade = OptionalBoolDefault(key: "footprintFade")
static let footprintColor = JSONDefault(key: "footprintColor")
static let SUEnableAutomaticChecks = BoolDefault(key: "SUEnableAutomaticChecks")
static let todo = OptionalBoolDefault(key: "todo")
static let todoMode = BoolDefault(key: "todoMode")
static let todoApplication = StringDefault(key: "todoApplication")
static let todoSidebarWidth = FloatDefault(key: "todoSidebarWidth", defaultValue: 400)
static let todoSidebarWidthUnit = IntEnumDefault(key: "todoSidebarWidthUnit", defaultValue: .pixels)
static let todoSidebarSide = IntEnumDefault(key: "todoSidebarSide", defaultValue: .right)
static let snapModifiers = IntDefault(key: "snapModifiers")
static let attemptMatchOnNextPrevDisplay = OptionalBoolDefault(key: "attemptMatchOnNextPrevDisplay")
static let altThirdCycle = OptionalBoolDefault(key: "altThirdCycle")
static let centerHalfCycles = OptionalBoolDefault(key: "centerHalfCycles")
static let fullIgnoreBundleIds = JSONDefault<[String]>(key: "fullIgnoreBundleIds")
static let notifiedOfProblemApps = BoolDefault(key: "notifiedOfProblemApps")
static let specifiedHeight = FloatDefault(key: "specifiedHeight", defaultValue: 1050)
static let specifiedWidth = FloatDefault(key: "specifiedWidth", defaultValue: 1680)
static let horizontalSplitRatio = FloatDefault(key: "horizontalSplitRatio", defaultValue: 50)
static let verticalSplitRatio = FloatDefault(key: "verticalSplitRatio", defaultValue: 50)
static let moveCursorAcrossDisplays = OptionalBoolDefault(key: "moveCursorAcrossDisplays")
static let moveCursor = OptionalBoolDefault(key: "moveCursor")
static let autoMaximize = OptionalBoolDefault(key: "autoMaximize")
static let applyGapsToMaximize = OptionalBoolDefault(key: "applyGapsToMaximize")
static let applyGapsToMaximizeHeight = OptionalBoolDefault(key: "applyGapsToMaximizeHeight")
static let cornerSnapAreaSize = FloatDefault(key: "cornerSnapAreaSize", defaultValue: 20)
static let shortEdgeSnapAreaSize = FloatDefault(key: "shortEdgeSnapAreaSize", defaultValue: 145)
static let cascadeAllDeltaSize = FloatDefault(key: "cascadeAllDeltaSize", defaultValue: 30)
static let sixthsSnapArea = OptionalBoolDefault(key: "sixthsSnapArea")
static let stageSize = FloatDefault(key: "stageSize", defaultValue: 190)
static let dragFromStage = OptionalBoolDefault(key: "dragFromStage")
static let alwaysAccountForStage = OptionalBoolDefault(key: "alwaysAccountForStage")
static let landscapeSnapAreas = JSONDefault<[Directional:SnapAreaConfig]>(key: "landscapeSnapAreas")
static let portraitSnapAreas = JSONDefault<[Directional:SnapAreaConfig]>(key: "portraitSnapAreas")
static let missionControlDragging = OptionalBoolDefault(key: "missionControlDragging")
static let enhancedUI = IntEnumDefault(key: "enhancedUI", defaultValue: .disableEnable)
static let footprintAnimationDurationMultiplier = FloatDefault(key: "footprintAnimationDurationMultiplier", defaultValue: 0)
static let hapticFeedbackOnSnap = OptionalBoolDefault(key: "hapticFeedbackOnSnap")
static let missionControlDraggingAllowedOffscreenDistance = FloatDefault(key: "missionControlDraggingAllowedOffscreenDistance", defaultValue: 25)
static let missionControlDraggingDisallowedDuration = IntDefault(key: "missionControlDraggingDisallowedDuration", defaultValue: 250)
static let doubleClickTitleBar = IntDefault(key: "doubleClickTitleBar")
static let doubleClickTitleBarRestore = OptionalBoolDefault(key: "doubleClickTitleBarRestore")
static let doubleClickTitleBarIgnoredApps = JSONDefault<[String]>(key: "doubleClickTitleBarIgnoredApps")
static let doubleClickToolBarIgnoredApps = JSONDefault>(key: "doubleClickTitleBarIgnoredApps", defaultValue: ["epp.package.java"])
static let ignoreDragSnapToo = OptionalBoolDefault(key: "ignoreDragSnapToo")
static let systemWideMouseDown = OptionalBoolDefault(key: "systemWideMouseDown")
static let systemWideMouseDownApps = JSONDefault>(key:"systemWideMouseDownApps", defaultValue: Set(["org.languagetool.desktop", "com.microsoft.teams2"]))
static let internalTilingNotified = BoolDefault(key: "internalTilingNotified")
static let screensOrderedByX = OptionalBoolDefault(key: "screensOrderedByX")
static var array: [Default] = [
launchOnLogin,
disabledApps,
hideMenuBarIcon,
alternateDefaultShortcuts,
subsequentExecutionMode,
selectedCycleSizes,
cycleSizesIsChanged,
allowAnyShortcut,
windowSnapping,
almostMaximizeHeight,
almostMaximizeWidth,
gapSize,
snapEdgeMarginTop,
snapEdgeMarginBottom,
snapEdgeMarginLeft,
snapEdgeMarginRight,
centeredDirectionalMove,
resizeOnDirectionalMove,
ignoredSnapAreas,
traverseSingleScreen,
minimumWindowWidth,
minimumWindowHeight,
sizeOffset,
widthStepSize,
unsnapRestore,
curtainChangeSize,
relaunchOpensMenu,
obtainWindowOnClick,
screenEdgeGapTop,
screenEdgeGapBottom,
screenEdgeGapLeft,
screenEdgeGapRight,
screenEdgeGapsOnMainScreenOnly,
screenEdgeGapTopNotch,
showAllActionsInMenu,
showAdditionalSizesInMenu,
footprintAlpha,
footprintBorderWidth,
footprintFade,
footprintColor,
SUEnableAutomaticChecks,
todo,
todoMode,
todoApplication,
todoSidebarWidth,
todoSidebarSide,
snapModifiers,
attemptMatchOnNextPrevDisplay,
altThirdCycle,
centerHalfCycles,
fullIgnoreBundleIds,
notifiedOfProblemApps,
specifiedHeight,
specifiedWidth,
horizontalSplitRatio,
verticalSplitRatio,
moveCursorAcrossDisplays,
moveCursor,
autoMaximize,
applyGapsToMaximize,
applyGapsToMaximizeHeight,
cornerSnapAreaSize,
shortEdgeSnapAreaSize,
cascadeAllDeltaSize,
sixthsSnapArea,
stageSize,
dragFromStage,
alwaysAccountForStage,
landscapeSnapAreas,
portraitSnapAreas,
missionControlDragging,
enhancedUI,
footprintAnimationDurationMultiplier,
hapticFeedbackOnSnap,
missionControlDraggingAllowedOffscreenDistance,
missionControlDraggingDisallowedDuration,
doubleClickTitleBar,
doubleClickTitleBarRestore,
doubleClickTitleBarIgnoredApps,
ignoreDragSnapToo,
systemWideMouseDown,
systemWideMouseDownApps,
screensOrderedByX,
showAdditionalSizesInMenu
]
}
struct CodableDefault: Codable {
let bool: Bool?
let int: Int?
let float: Float?
let string: String?
init(bool: Bool? = nil, int: Int? = nil, float: Float? = nil, string: String? = nil) {
self.bool = bool
self.int = int
self.float = float
self.string = string
}
}
protocol Default {
var key: String { get }
func load(from codable: CodableDefault)
func toCodable() -> CodableDefault
}
class BoolDefault: Default {
public private(set) var key: String
private var initialized = false
var enabled: Bool {
didSet {
if initialized {
UserDefaults.standard.set(enabled, forKey: key)
}
}
}
init(key: String) {
self.key = key
enabled = UserDefaults.standard.bool(forKey: key)
initialized = true
}
func load(from codable: CodableDefault) {
if let value = codable.bool {
self.enabled = value
}
}
func toCodable() -> CodableDefault {
return CodableDefault(bool: enabled)
}
}
class OptionalBoolDefault: Default {
public private(set) var key: String
private var initialized = false
var enabled: Bool? {
didSet {
if initialized {
if enabled == true {
UserDefaults.standard.set(1, forKey: key)
} else if enabled == false {
UserDefaults.standard.set(2, forKey: key)
} else {
UserDefaults.standard.set(0, forKey: key)
}
}
}
}
var userDisabled: Bool { enabled == false }
var userEnabled: Bool { enabled == true }
var notSet: Bool { enabled == nil }
init(key: String) {
self.key = key
let intValue = UserDefaults.standard.integer(forKey: key)
set(using: intValue)
initialized = true
}
private func set(using intValue: Int) {
switch intValue {
case 0: enabled = nil
case 1: enabled = true
case 2: enabled = false
default: break
}
}
func load(from codable: CodableDefault) {
if let value = codable.int {
set(using: value)
}
}
func toCodable() -> CodableDefault {
guard let enabled = enabled else { return CodableDefault(int: 0)}
let intValue = enabled ? 1 : 2
return CodableDefault(int: intValue)
}
}
class StringDefault: Default {
public private(set) var key: String
private var initialized = false
var value: String? {
didSet {
if initialized {
UserDefaults.standard.set(value, forKey: key)
}
}
}
init(key: String) {
self.key = key
value = UserDefaults.standard.string(forKey: key)
initialized = true
}
func load(from codable: CodableDefault) {
value = codable.string
}
func toCodable() -> CodableDefault {
return CodableDefault(string: value)
}
}
class FloatDefault: Default {
public private(set) var key: String
private var initialized = false
var value: Float {
didSet {
if initialized {
UserDefaults.standard.set(value, forKey: key)
}
}
}
var cgFloat: CGFloat { CGFloat(value) }
init(key: String, defaultValue: Float = 0) {
self.key = key
value = UserDefaults.standard.float(forKey: key)
if(defaultValue != 0 && value == 0) {
value = defaultValue
}
initialized = true
}
func load(from codable: CodableDefault) {
if let float = codable.float {
value = float
}
}
func toCodable() -> CodableDefault {
return CodableDefault(float: value)
}
}
class IntDefault: Default {
public private(set) var key: String
private var initialized = false
var value: Int {
didSet {
if initialized {
UserDefaults.standard.set(value, forKey: key)
}
}
}
init(key: String, defaultValue: Int = 0) {
self.key = key
value = UserDefaults.standard.integer(forKey: key)
if(defaultValue != 0 && value == 0) {
value = defaultValue
}
initialized = true
}
func load(from codable: CodableDefault) {
if let int = codable.int {
value = int
}
}
func toCodable() -> CodableDefault {
return CodableDefault(int: value)
}
}
class JSONDefault: StringDefault {
private var typeInitialized = false
var typedValue: T? {
didSet {
if typeInitialized {
saveToJSON(typedValue)
}
}
}
override init(key: String) {
super.init(key: key)
loadFromJSON()
typeInitialized = true
}
init(key: String, defaultValue: T) {
if typedValue == nil {
typedValue = defaultValue
}
super.init(key: key)
}
override func load(from codable: CodableDefault) {
if value != codable.string {
value = codable.string
typeInitialized = false
loadFromJSON()
typeInitialized = true
}
}
private func loadFromJSON() {
guard let jsonString = value else { return }
let decoder = JSONDecoder()
guard let jsonData = jsonString.data(using: .utf8) else { return }
typedValue = try? decoder.decode(T.self, from: jsonData)
}
private func saveToJSON(_ obj: T?) {
let encoder = JSONEncoder()
if let jsonData = try? encoder.encode(obj) {
let jsonString = String(data: jsonData, encoding: .utf8)
if jsonString != value {
value = jsonString
}
}
}
}
class IntEnumDefault: Default where E.RawValue == Int {
public private(set) var key: String
private let defaultValue: E
var _value: E
var value: E {
set {
if newValue != _value {
_value = newValue
UserDefaults.standard.set(_value.rawValue, forKey: key)
}
}
get { _value }
}
init(key: String, defaultValue: E) {
self.key = key
self.defaultValue = defaultValue
let intValue = UserDefaults.standard.integer(forKey: key)
_value = E(rawValue: intValue) ?? defaultValue
}
func load(from codable: CodableDefault) {
if let intValue = codable.int, _value.rawValue != intValue {
_value = E(rawValue: intValue) ?? defaultValue
UserDefaults.standard.set(_value.rawValue, forKey: key)
}
}
func toCodable() -> CodableDefault {
CodableDefault(int: value.rawValue)
}
}
struct CodableColor : Codable {
var red: CGFloat = 0.0
var green: CGFloat = 0.0
var blue: CGFloat = 0.0
var alpha: CGFloat? = 1.0
var nsColor : NSColor {
return NSColor(red: red, green: green, blue: blue, alpha: alpha ?? 1.0)
}
init(nsColor: NSColor) {
self.red = nsColor.redComponent
self.green = nsColor.greenComponent
self.blue = nsColor.blueComponent
self.alpha = nsColor.alphaComponent
}
}
================================================
FILE: Rectangle/Info.plist
================================================
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIconFile
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
6.0
CFBundleName
$(PRODUCT_NAME)
CFBundlePackageType
APPL
CFBundleShortVersionString
$(MARKETING_VERSION)
CFBundleURLTypes
CFBundleURLSchemes
rectangle
CFBundleVersion
$(CURRENT_PROJECT_VERSION)
LSApplicationCategoryType
public.app-category.productivity
LSMinimumSystemVersion
$(MACOSX_DEPLOYMENT_TARGET)
LSUIElement
NSHumanReadableCopyright
Copyright © 2019-2026 Ryan Hanson. All rights reserved.
NSMainStoryboardFile
Main
NSPrincipalClass
NSApplication
SUFeedURL
https://rectangleapp.com/downloads/updates.xml
SUPublicEDKey
lpt9M3PhocbZ3MZiLH+crEqRfU11kfoNzGxSqiEIdvM=
SUScheduledCheckInterval
172800
================================================
FILE: Rectangle/InternetAccessPolicy.plist
================================================
ApplicationDescription
Rectangle is the gold standard for window management on macOS. Free and open source.
Connections
IsIncoming
Host
rectangleapp.com
NetworkProtocol
TCP
Port
443
Purpose
Rectangle checks for new versions
DenyConsequences
If you deny this connection, you will not be notified about new versions.
================================================
FILE: Rectangle/LaunchOnLogin.swift
================================================
//
// LaunchOnLogin.swift
// Rectangle
//
// Created by Ryan Hanson on 2/20/23.
// Copyright © 2023 Ryan Hanson. All rights reserved.
//
import Foundation
import ServiceManagement
import os.log
@available(macOS 13.0, *)
public enum LaunchOnLogin {
public static var isEnabled: Bool {
get { SMAppService.mainApp.status == .enabled }
set {
do {
if newValue {
if SMAppService.mainApp.status == .enabled {
try? SMAppService.mainApp.unregister()
}
try SMAppService.mainApp.register()
} else {
try SMAppService.mainApp.unregister()
}
} catch {
os_log("Failed to \(newValue ? "enable" : "disable") launch at login: \(error.localizedDescription)")
}
}
}
}
================================================
FILE: Rectangle/Logging/LogViewer.storyboard
================================================
================================================
FILE: Rectangle/Logging/LogViewer.swift
================================================
//
// LogViewer.swift
// Multitouch
//
// Created by Ryan Hanson on 8/6/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class Logger {
static var logging = false
static private var logWindowController: LogWindowController?
static func showLogging(sender: Any?) {
if logWindowController == nil {
logWindowController = LogWindowController.freshController()
}
NSApp.activate(ignoringOtherApps: true)
logWindowController?.showWindow(sender)
logging = true
}
static func log(_ string: String) {
if logging {
logWindowController?.append(string)
}
}
}
class LogWindowController: NSWindowController, NSWindowDelegate {
@IBAction func clearClicked(_ sender: Any) {
(contentViewController as? LogViewController)?.clear()
}
func append(_ string: String) {
var datestamp: String
if #available(OSX 10.12, *) {
datestamp = ISO8601DateFormatter.string(from: Date(), timeZone: TimeZone.current, formatOptions: .withInternetDateTime)
} else {
datestamp = String(NSDate().timeIntervalSince1970)
}
(contentViewController as? LogViewController)?.append(datestamp + ": " + string + "\n")
}
func windowWillClose(_ notification: Notification) {
Logger.logging = false
clearClicked(self)
}
}
extension LogWindowController {
// MARK: Storyboard instantiation
static func freshController() -> LogWindowController {
let storyboard = NSStoryboard(name: "LogViewer", bundle: nil)
let identifier = "LogWindowController"
guard let windowController = storyboard.instantiateController(withIdentifier: identifier) as? LogWindowController else {
fatalError("Unable to find WindowController")
}
windowController.window?.delegate = windowController
return windowController
}
}
class LogViewController: NSViewController {
@IBOutlet var textView: NSTextView!
let font = NSFont(name:"Monaco", size: 10) ?? NSFont.systemFont(ofSize: 10)
let textColorAttribute =
[NSAttributedString.Key.foregroundColor: NSColor.textColor,
NSAttributedString.Key.font: NSFont(name:"Monaco", size: 10) ?? NSFont.systemFont(ofSize: 10)]
as [NSAttributedString.Key: Any]
func append(_ string: String) {
let smartScroll = self.textView.visibleRect.maxY == self.textView.bounds.maxY
textView.textStorage?.append(NSAttributedString(string: string, attributes: textColorAttribute))
if smartScroll{
textView.scrollToEndOfDocument(self)
}
}
func clear() {
textView.string = ""
}
override func viewDidLoad() {
textView.isEditable = false
}
}
class KeyDownTextView: NSTextView {
override func keyDown(with event: NSEvent) {
if event.modifierFlags.contains(NSEvent.ModifierFlags.command) {
switch event.charactersIgnoringModifiers! {
case "w":
self.window?.close()
case "h":
self.window?.orderOut(self)
default:
super.keyDown(with: event)
}
} else {
super.keyDown(with: event)
}
}
}
================================================
FILE: Rectangle/MultiWindow/MultiWindowManager.swift
================================================
//
// MultiWindowManager.swift
// Rectangle
//
// Created by Mikhail (Dirondin) Polubisok on 2/20/22.
// Copyright © 2021 Ryan Hanson. All rights reserved.
//
import Cocoa
import MASShortcut
class MultiWindowManager {
static func execute(parameters: ExecutionParameters) -> Bool {
// TODO: Protocol and factory for all multi-window positioning algorithms
switch parameters.action {
case .reverseAll:
ReverseAllManager.reverseAll(windowElement: parameters.windowElement)
return true
case .tileAll:
tileAllWindowsOnScreen(windowElement: parameters.windowElement)
return true
case .cascadeAll:
cascadeAllWindowsOnScreen(windowElement: parameters.windowElement)
return true
case .cascadeActiveApp:
cascadeActiveAppWindowsOnScreen(windowElement: parameters.windowElement)
return true
case .tileActiveApp:
tileActiveAppWindowsOnScreen(windowElement: parameters.windowElement)
return true
default:
return false
}
}
private static func allWindowsOnScreen(windowElement: AccessibilityElement? = nil, sortByPID: Bool = false) -> (screens: UsableScreens, windows: [AccessibilityElement])? {
let screenDetection = ScreenDetection()
guard let windowElement = windowElement ?? AccessibilityElement.getFrontWindowElement(),
let screens = screenDetection.detectScreens(using: windowElement)
else {
NSSound.beep()
Logger.log("Can't detect screen for multiple windows")
return nil
}
let currentScreen = screens.currentScreen
var windows = AccessibilityElement.getAllWindowElements()
if sortByPID {
windows.sort(by: { (w1: AccessibilityElement, w2: AccessibilityElement) -> Bool in
w1.pid ?? pid_t(0) > w2.pid ?? pid_t(0)
})
}
var actualWindows = [AccessibilityElement]()
for w in windows {
if Defaults.todo.userEnabled, TodoManager.isTodoWindow(w) { continue }
let screen = screenDetection.detectScreens(using: w)?.currentScreen
if screen == currentScreen,
w.isWindow == true,
w.isSheet != true,
w.isMinimized != true,
w.isHidden != true,
w.isSystemDialog != true
{
actualWindows.append(w)
}
}
return (screens, actualWindows)
}
static func tileAllWindowsOnScreen(windowElement: AccessibilityElement? = nil) {
guard let (screens, windows) = allWindowsOnScreen(windowElement: windowElement, sortByPID: true) else {
return
}
let screenFrame = screens.currentScreen.adjustedVisibleFrame().screenFlipped
let count = windows.count
let columns = Int(ceil(sqrt(CGFloat(count))))
let rows = Int(ceil(CGFloat(count) / CGFloat(columns)))
let size = CGSize(width: (screenFrame.maxX - screenFrame.minX) / CGFloat(columns), height: (screenFrame.maxY - screenFrame.minY) / CGFloat(rows))
for (ind, w) in windows.enumerated() {
let column = ind % Int(columns)
let row = ind / Int(columns)
tileWindow(w, screenFrame: screenFrame, size: size, column: column, row: row)
}
}
private static func tileWindow(_ w: AccessibilityElement, screenFrame: CGRect, size: CGSize, column: Int, row: Int) {
var rect = w.frame
// TODO: save previous position in history
rect.origin.x = screenFrame.origin.x + size.width * CGFloat(column)
rect.origin.y = screenFrame.origin.y + size.height * CGFloat(row)
rect.size = size
w.setFrame(rect)
}
static func cascadeAllWindowsOnScreen(windowElement: AccessibilityElement? = nil) {
guard let (screens, windows) = allWindowsOnScreen(windowElement: windowElement, sortByPID: true) else {
return
}
let screenFrame = screens.currentScreen.adjustedVisibleFrame().screenFlipped
let delta = CGFloat(Defaults.cascadeAllDeltaSize.value)
for (ind, w) in windows.enumerated() {
cascadeWindow(w, screenFrame: screenFrame, delta: delta, index: ind)
}
}
private struct CascadeActiveAppParameters {
let right: Bool
let bottom: Bool
let numWindows: Int
let size: CGSize
init(windowFrame: CGRect, screenFrame: CGRect, numWindows: Int, size: CGSize, delta: CGFloat) {
right = windowFrame.midX > screenFrame.midX
bottom = windowFrame.midY > screenFrame.midY
self.numWindows = numWindows
let maxSize = CGSize(width: screenFrame.width - CGFloat(numWindows - 1) * delta, height: screenFrame.height - CGFloat(numWindows - 1) * delta)
self.size = CGSize(width: min(size.width, maxSize.width), height: min(size.height, maxSize.height))
}
}
static func cascadeActiveAppWindowsOnScreen(windowElement: AccessibilityElement? = nil) {
guard let (screens, windows) = allWindowsOnScreen(windowElement: windowElement, sortByPID: true),
let frontWindowElement = AccessibilityElement.getFrontWindowElement()
else {
return
}
let screenFrame = screens.currentScreen.adjustedVisibleFrame().screenFlipped
let delta = CGFloat(Defaults.cascadeAllDeltaSize.value)
// keep windows with a pid equal to the front window's pid
var filtered = windows.filter(hasFrontWindowPid(_:))
// parameters for cascading active app windows
var cascadeParameters: CascadeActiveAppParameters?
if let first = filtered.first {
// move the first to become the last (top)
filtered.append(filtered.removeFirst())
// set up parameters
cascadeParameters = CascadeActiveAppParameters(windowFrame: first.frame, screenFrame: screenFrame, numWindows: filtered.count, size: first.size!, delta: delta)
}
// cascade the filtered windows
for (ind, w) in filtered.enumerated() {
cascadeWindow(w, screenFrame: screenFrame, delta: delta, index: ind, cascadeParameters: cascadeParameters)
}
// return true for a w pid equal to the front window's pid
func hasFrontWindowPid(_ w: AccessibilityElement) -> Bool {
return w.pid == frontWindowElement.pid
}
}
private static func cascadeWindow(_ w: AccessibilityElement, screenFrame: CGRect, delta: CGFloat, index: Int, cascadeParameters: CascadeActiveAppParameters? = nil) {
var rect = w.frame
// TODO: save previous position in history
rect.origin.x = screenFrame.origin.x + delta * CGFloat(index)
rect.origin.y = screenFrame.origin.y + delta * CGFloat(index)
if let cascadeParameters {
rect.size.width = cascadeParameters.size.width
rect.size.height = cascadeParameters.size.height
if cascadeParameters.right {
rect.origin.x = screenFrame.origin.x + screenFrame.size.width - cascadeParameters.size.width - delta * CGFloat(index)
}
if cascadeParameters.bottom {
rect.origin.y = screenFrame.origin.y + screenFrame.size.height - cascadeParameters.size.height - delta * CGFloat(cascadeParameters.numWindows - 1 - index)
}
}
w.setFrame(rect)
w.bringToFront()
}
static func tileActiveAppWindowsOnScreen(windowElement: AccessibilityElement? = nil) {
guard let (screens, windows) = allWindowsOnScreen(windowElement: windowElement, sortByPID: true),
let frontWindowElement = AccessibilityElement.getFrontWindowElement()
else {
return
}
let screenFrame = screens.currentScreen.adjustedVisibleFrame().screenFlipped
// keep windows with a pid equal to the front window's pid
let filtered = windows.filter { $0.pid == frontWindowElement.pid }
let count = filtered.count
let columns = Int(ceil(sqrt(CGFloat(count))))
let rows = Int(ceil(CGFloat(count) / CGFloat(columns)))
let size = CGSize(width: (screenFrame.maxX - screenFrame.minX) / CGFloat(columns), height: (screenFrame.maxY - screenFrame.minY) / CGFloat(rows))
for (ind, w) in filtered.enumerated() {
let column = ind % Int(columns)
let row = ind / Int(columns)
tileWindow(w, screenFrame: screenFrame, size: size, column: column, row: row)
}
}
}
================================================
FILE: Rectangle/MultiWindow/ReverseAllManager.swift
================================================
//
// TodoManager.swift
// Rectangle
//
// Created by Charlie Harding on 7/25/21.
// Copyright © 2021 Ryan Hanson. All rights reserved.
//
import Cocoa
import MASShortcut
class ReverseAllManager {
static func reverseAll(windowElement: AccessibilityElement? = nil) {
let sd = ScreenDetection()
let currentWindow = windowElement ?? AccessibilityElement.getFrontWindowElement()
guard let currentScreen = sd.detectScreens(using: currentWindow)?.currentScreen else { return }
let windows = AccessibilityElement.getAllWindowElements()
let screenFrame = currentScreen.adjustedVisibleFrame()
for w in windows {
let wScreen = sd.detectScreens(using: w)?.currentScreen
if Defaults.todo.userEnabled && TodoManager.isTodoWindow(w) { continue }
if wScreen == currentScreen {
reverseWindowPosition(w, screenFrame: screenFrame)
}
}
}
private static func reverseWindowPosition(_ w: AccessibilityElement, screenFrame: CGRect) {
var rect = w.frame
let offsetFromLeft = rect.minX - screenFrame.minX
rect.origin.x = screenFrame.maxX - offsetFromLeft - rect.width
w.setFrame(rect)
}
}
================================================
FILE: Rectangle/Popover/MessageView.swift
================================================
//
// MessageView.swift
// Multitouch
//
// Created by Ryan Hanson on 9/10/17.
// Copyright © 2017-2018 BrassMonkery, LLC. All rights reserved.
//
import Cocoa
class MessagePopover {
var messageView: MessageView
var popover: NSPopover
init() {
popover = NSPopover()
messageView = MessageView()
popover.behavior = .transient
popover.contentViewController = messageView
}
public func show(message: String, sender: NSView) {
let positioningView = sender
let positioningRect = NSZeroRect
let preferredEdge: NSRectEdge = .maxX
messageView.message = message
popover.show(relativeTo: positioningRect, of: positioningView, preferredEdge: preferredEdge)
}
}
class MessageView: NSViewController {
@IBOutlet weak var messageField: NSTextField!
var message: String?
override func viewWillAppear() {
super.viewWillAppear()
if let message = message {
self.messageField?.stringValue = message
}
}
}
================================================
FILE: Rectangle/Popover/MessageView.xib
================================================
================================================
FILE: Rectangle/PrefsWindow/Config.swift
================================================
//
// Config.swift
// Rectangle
//
// Created by Ryan Hanson on 12/15/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
import MASShortcut
extension Defaults {
static func encoded() -> String? {
guard let version = Bundle.main.infoDictionary?["CFBundleVersion"] as? String else { return nil }
var shortcuts = [String: Shortcut]()
for action in WindowAction.active {
if let masShortcut = MASShortcutBinder.shared()?.value(forKey: action.name) as? MASShortcut {
shortcuts[action.name] = Shortcut(masShortcut: masShortcut)
}
}
for defaultsKey in TodoManager.defaultsKeys {
guard
let shortcutDict = UserDefaults.standard.dictionary(forKey: defaultsKey),
let dictTransformer = ValueTransformer(forName: NSValueTransformerName(rawValue: MASDictionaryTransformerName)),
let shortcut = dictTransformer.transformedValue(shortcutDict) as? MASShortcut
else {
continue
}
shortcuts[defaultsKey] = Shortcut(masShortcut: shortcut)
}
var codableDefaults = [String: CodableDefault]()
for exportableDefault in Defaults.array {
codableDefaults[exportableDefault.key] = exportableDefault.toCodable()
}
let config = Config(bundleId: "com.knollsoft.Rectangle",
version: version,
shortcuts: shortcuts,
defaults: codableDefaults)
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
if #available(macOS 10.13, *) {
encoder.outputFormatting.update(with: .sortedKeys)
}
if let encodedJson = try? encoder.encode(config) {
if let jsonString = String(data: encodedJson, encoding: .utf8) {
return jsonString
}
}
return nil
}
static func convert(jsonString: String) -> Config? {
guard let jsonData = jsonString.data(using: .utf8) else { return nil }
let decoder = JSONDecoder()
return try? decoder.decode(Config.self, from: jsonData)
}
static func load(fileUrl: URL) {
guard let dictTransformer = ValueTransformer(forName: NSValueTransformerName(rawValue: MASDictionaryTransformerName)) else { return }
guard let jsonString = try? String(contentsOf: fileUrl, encoding: .utf8),
let config = convert(jsonString: jsonString) else { return }
for availableDefault in Defaults.array {
if let codedDefault = config.defaults[availableDefault.key] {
availableDefault.load(from: codedDefault)
}
}
for action in WindowAction.active {
if let shortcut = config.shortcuts[action.name]?.toMASSHortcut() {
let dictValue = dictTransformer.reverseTransformedValue(shortcut)
UserDefaults.standard.setValue(dictValue, forKey: action.name)
}
}
for defaultsKey in TodoManager.defaultsKeys {
if let shortcut = config.shortcuts[defaultsKey]?.toMASSHortcut() {
let dictValue = dictTransformer.reverseTransformedValue(shortcut)
UserDefaults.standard.setValue(dictValue, forKey: defaultsKey)
}
}
Notification.Name.configImported.post()
}
static func loadFromSupportDir() {
if let rectangleSupportURL = getSupportDir()?
.appendingPathComponent("Rectangle", isDirectory: true) {
let configURL = rectangleSupportURL.appendingPathComponent("RectangleConfig.json")
let exists = try? configURL.checkResourceIsReachable()
if exists == true {
load(fileUrl: configURL)
do {
let newFilename = "RectangleConfig\(timestamp()).json"
try FileManager.default.moveItem(atPath: configURL.path, toPath: rectangleSupportURL.appendingPathComponent(newFilename).path)
} catch {
do {
try FileManager.default.removeItem(at: configURL)
} catch {
AlertUtil.oneButtonAlert(question: "Error after loading from Support Dir", text: "Unable to rename/remove RectangleConfig.json from \(rectangleSupportURL) after loading.")
}
}
}
}
}
private static func getSupportDir() -> URL? {
let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
return paths.isEmpty ? nil : paths[0]
}
private static func timestamp() -> String {
let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = "y-MM-dd_H-mm-ss-SSSS"
return formatter.string(from: date)
}
}
struct Config: Codable {
let bundleId: String
let version: String
let shortcuts: [String: Shortcut]
let defaults: [String: CodableDefault]
}
================================================
FILE: Rectangle/PrefsWindow/PrefsViewController.swift
================================================
//
// PrefsViewController.swift
// Rectangle
//
// Created by Ryan Hanson on 6/18/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
import MASShortcut
import ServiceManagement
class PrefsViewController: NSViewController {
var actionsToViews = [WindowAction: MASShortcutView]()
@IBOutlet weak var leftHalfShortcutView: MASShortcutView!
@IBOutlet weak var rightHalfShortcutView: MASShortcutView!
@IBOutlet weak var centerHalfShortcutView: MASShortcutView!
@IBOutlet weak var topHalfShortcutView: MASShortcutView!
@IBOutlet weak var bottomHalfShortcutView: MASShortcutView!
@IBOutlet weak var topLeftShortcutView: MASShortcutView!
@IBOutlet weak var topRightShortcutView: MASShortcutView!
@IBOutlet weak var bottomLeftShortcutView: MASShortcutView!
@IBOutlet weak var bottomRightShortcutView: MASShortcutView!
@IBOutlet weak var nextDisplayShortcutView: MASShortcutView!
@IBOutlet weak var previousDisplayShortcutView: MASShortcutView!
@IBOutlet weak var makeLargerShortcutView: MASShortcutView!
@IBOutlet weak var makeSmallerShortcutView: MASShortcutView!
@IBOutlet weak var maximizeShortcutView: MASShortcutView!
@IBOutlet weak var almostMaximizeShortcutView: MASShortcutView!
@IBOutlet weak var maximizeHeightShortcutView: MASShortcutView!
@IBOutlet weak var centerShortcutView: MASShortcutView!
@IBOutlet weak var restoreShortcutView: MASShortcutView!
// Additional
@IBOutlet weak var firstThirdShortcutView: MASShortcutView!
@IBOutlet weak var firstTwoThirdsShortcutView: MASShortcutView!
@IBOutlet weak var centerThirdShortcutView: MASShortcutView!
@IBOutlet weak var centerTwoThirdsShortcutView: MASShortcutView!
@IBOutlet weak var lastTwoThirdsShortcutView: MASShortcutView!
@IBOutlet weak var lastThirdShortcutView: MASShortcutView!
@IBOutlet weak var moveLeftShortcutView: MASShortcutView!
@IBOutlet weak var moveRightShortcutView: MASShortcutView!
@IBOutlet weak var moveUpShortcutView: MASShortcutView!
@IBOutlet weak var moveDownShortcutView: MASShortcutView!
@IBOutlet weak var firstFourthShortcutView: MASShortcutView!
@IBOutlet weak var secondFourthShortcutView: MASShortcutView!
@IBOutlet weak var thirdFourthShortcutView: MASShortcutView!
@IBOutlet weak var lastFourthShortcutView: MASShortcutView!
@IBOutlet weak var firstThreeFourthsShortcutView: MASShortcutView!
@IBOutlet weak var centerThreeFourthsShortcutView: MASShortcutView!
@IBOutlet weak var lastThreeFourthsShortcutView: MASShortcutView!
@IBOutlet weak var topLeftSixthShortcutView: MASShortcutView!
@IBOutlet weak var topCenterSixthShortcutView: MASShortcutView!
@IBOutlet weak var topRightSixthShortcutView: MASShortcutView!
@IBOutlet weak var bottomLeftSixthShortcutView: MASShortcutView!
@IBOutlet weak var bottomCenterSixthShortcutView: MASShortcutView!
@IBOutlet weak var bottomRightSixthShortcutView: MASShortcutView!
@IBOutlet weak var showMoreButton: NSButton!
@IBOutlet weak var additionalShortcutsStackView: NSStackView!
// Settings
override func awakeFromNib() {
actionsToViews = [
.leftHalf: leftHalfShortcutView,
.rightHalf: rightHalfShortcutView,
.centerHalf: centerHalfShortcutView,
.topHalf: topHalfShortcutView,
.bottomHalf: bottomHalfShortcutView,
.topLeft: topLeftShortcutView,
.topRight: topRightShortcutView,
.bottomLeft: bottomLeftShortcutView,
.bottomRight: bottomRightShortcutView,
.nextDisplay: nextDisplayShortcutView,
.previousDisplay: previousDisplayShortcutView,
.maximize: maximizeShortcutView,
.almostMaximize: almostMaximizeShortcutView,
.maximizeHeight: maximizeHeightShortcutView,
.center: centerShortcutView,
.larger: makeLargerShortcutView,
.smaller: makeSmallerShortcutView,
.restore: restoreShortcutView,
.firstThird: firstThirdShortcutView,
.firstTwoThirds: firstTwoThirdsShortcutView,
.centerThird: centerThirdShortcutView,
.centerTwoThirds: centerTwoThirdsShortcutView,
.lastTwoThirds: lastTwoThirdsShortcutView,
.lastThird: lastThirdShortcutView,
.moveLeft: moveLeftShortcutView,
.moveRight: moveRightShortcutView,
.moveUp: moveUpShortcutView,
.moveDown: moveDownShortcutView,
.firstFourth: firstFourthShortcutView,
.secondFourth: secondFourthShortcutView,
.thirdFourth: thirdFourthShortcutView,
.lastFourth: lastFourthShortcutView,
.firstThreeFourths: firstThreeFourthsShortcutView,
.centerThreeFourths: centerThreeFourthsShortcutView,
.lastThreeFourths: lastThreeFourthsShortcutView,
.topLeftSixth: topLeftSixthShortcutView,
.topCenterSixth: topCenterSixthShortcutView,
.topRightSixth: topRightSixthShortcutView,
.bottomLeftSixth: bottomLeftSixthShortcutView,
.bottomCenterSixth: bottomCenterSixthShortcutView,
.bottomRightSixth: bottomRightSixthShortcutView
]
for (action, view) in actionsToViews {
view.setAssociatedUserDefaultsKey(action.name, withTransformerName: MASDictionaryTransformerName)
}
if Defaults.allowAnyShortcut.enabled {
let passThroughValidator = PassthroughShortcutValidator()
actionsToViews.values.forEach { $0.shortcutValidator = passThroughValidator }
}
subscribeToAllowAnyShortcutToggle()
additionalShortcutsStackView.isHidden = true
}
@IBAction func toggleShowMore(_ sender: NSButton) {
additionalShortcutsStackView.isHidden = !additionalShortcutsStackView.isHidden
showMoreButton.title = additionalShortcutsStackView.isHidden
? "▶︎ ⋯" : "▼"
}
private func subscribeToAllowAnyShortcutToggle() {
Notification.Name.allowAnyShortcut.onPost { notification in
guard let enabled = notification.object as? Bool else { return }
let validator = enabled ? PassthroughShortcutValidator() : MASShortcutValidator()
self.actionsToViews.values.forEach { $0.shortcutValidator = validator }
}
}
}
class PassthroughShortcutValidator: MASShortcutValidator {
override func isShortcutValid(_ shortcut: MASShortcut!) -> Bool {
return true
}
override func isShortcutAlreadyTaken(bySystem shortcut: MASShortcut!, explanation: AutoreleasingUnsafeMutablePointer!) -> Bool {
return false
}
override func isShortcut(_ shortcut: MASShortcut!, alreadyTakenIn menu: NSMenu!, explanation: AutoreleasingUnsafeMutablePointer!) -> Bool {
return false
}
}
================================================
FILE: Rectangle/PrefsWindow/SettingsViewController.swift
================================================
//
// SettingsViewController.swift
// Rectangle
//
// Created by Ryan Hanson on 8/24/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
import ServiceManagement
import Sparkle
import MASShortcut
class SettingsViewController: NSViewController {
@IBOutlet weak var launchOnLoginCheckbox: NSButton!
@IBOutlet weak var versionLabel: NSTextField!
@IBOutlet weak var hideMenuBarIconCheckbox: NSButton!
@IBOutlet weak var subsequentExecutionPopUpButton: NSPopUpButton!
@IBOutlet weak var allowAnyShortcutCheckbox: NSButton!
@IBOutlet weak var checkForUpdatesAutomaticallyCheckbox: NSButton!
@IBOutlet weak var checkForUpdatesButton: NSButton!
@IBOutlet weak var gapSlider: NSSlider!
@IBOutlet weak var gapLabel: NSTextField!
@IBOutlet weak var cursorAcrossCheckbox: NSButton!
@IBOutlet weak var useCursorScreenDetectionCheckbox: NSButton!
@IBOutlet weak var doubleClickTitleBarCheckbox: NSButton!
@IBOutlet weak var todoCheckbox: NSButton!
@IBOutlet weak var todoView: NSStackView!
@IBOutlet weak var todoAppWidthField: AutoSaveFloatField!
@IBOutlet weak var todoAppWidthUnitPopUpButton: NSPopUpButton!
@IBOutlet weak var todoAppSidePopUpButton: NSPopUpButton!
@IBOutlet weak var toggleTodoShortcutView: MASShortcutView!
@IBOutlet weak var reflowTodoShortcutView: MASShortcutView!
@IBOutlet weak var stageView: NSStackView!
@IBOutlet weak var stageSlider: NSSlider!
@IBOutlet weak var stageLabel: NSTextField!
@IBOutlet weak var cycleSizesView: NSStackView!
@IBOutlet var cycleSizesViewHeightConstraint: NSLayoutConstraint!
@IBOutlet var todoViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var extraSettingsButton: NSButton!
private var aboutTodoWindowController: NSWindowController?
private var extraSettingsPopover: NSPopover?
private var cycleSizeCheckboxes = [NSButton]()
@IBAction func toggleLaunchOnLogin(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
if #available(macOS 13, *) {
LaunchOnLogin.isEnabled = newSetting
} else {
let smLoginSuccess = SMLoginItemSetEnabled(AppDelegate.launcherAppId as CFString, newSetting)
if !smLoginSuccess {
Logger.log("Unable to set launch at login preference. Attempting one more time.")
SMLoginItemSetEnabled(AppDelegate.launcherAppId as CFString, newSetting)
}
}
Defaults.launchOnLogin.enabled = newSetting
}
@IBAction func toggleHideMenuBarIcon(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
Defaults.hideMenuBarIcon.enabled = newSetting
RectangleStatusItem.instance.refreshVisibility()
}
@IBAction func setSubsequentExecutionBehavior(_ sender: NSPopUpButton) {
let tag = sender.selectedTag()
guard let mode = SubsequentExecutionMode(rawValue: tag) else {
Logger.log("Expected a pop up button to have a selected item with a valid tag matching a value of SubsequentExecutionMode. Got: \(String(describing: tag))")
return
}
Defaults.subsequentExecutionMode.value = mode
initializeCycleSizesView(animated: true)
}
@IBAction func gapSliderChanged(_ sender: NSSlider) {
gapLabel.stringValue = "\(sender.intValue) px"
if let event = NSApp.currentEvent {
if event.type == .leftMouseUp || event.type == .keyDown {
if Float(sender.intValue) != Defaults.gapSize.value {
Defaults.gapSize.value = Float(sender.intValue)
}
}
}
}
@IBAction func toggleCursorMove(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
Defaults.moveCursorAcrossDisplays.enabled = newSetting
}
@IBAction func toggleUseCursorScreenDetection(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
Defaults.useCursorScreenDetection.enabled = newSetting
}
@IBAction func toggleAllowAnyShortcut(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
Defaults.allowAnyShortcut.enabled = newSetting
Notification.Name.allowAnyShortcut.post(object: newSetting)
}
@objc func toggleShowAdditionalSizesInMenu(_ sender: NSButton) {
let enabled: Bool = sender.state == .on
Defaults.showAdditionalSizesInMenu.enabled = enabled
Notification.Name.showAdditionalSizesInMenuChanged.post()
}
@IBAction func checkForUpdates(_ sender: Any) {
AppDelegate.instance.updaterController?.checkForUpdates(sender)
}
@IBAction func toggleDoubleClickTitleBar(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
if newSetting && !TitleBarManager.systemSettingDisabled {
var openSystemSettingsButtonName = NSLocalizedString("iWV-c2-BJD.title", tableName: "Main", value: "Open System Preferences", comment: "")
if #available(macOS 13, *) {
openSystemSettingsButtonName = NSLocalizedString(
"Open System Settings", tableName: "Main", value: "", comment: "")
}
let conflictTitleText = NSLocalizedString(
"Conflict with system setting", tableName: "Main", value: "", comment: "")
let conflictDescriptionText = NSLocalizedString(
"To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting.", tableName: "Main", value: "", comment: "")
let closeText = NSLocalizedString("DVo-aG-piG.title", tableName: "Main", value: "Close", comment: "")
let response = AlertUtil.twoButtonAlert(question: conflictTitleText, text: conflictDescriptionText, confirmText: openSystemSettingsButtonName, cancelText: closeText)
if response == .alertFirstButtonReturn {
NSWorkspace.shared.open(URL(string:"x-apple.systempreferences:com.apple.preference.dock")!)
}
}
Defaults.doubleClickTitleBar.value = (newSetting ? WindowAction.maximize.rawValue : -1) + 1
Notification.Name.windowTitleBar.post()
}
@IBAction func toggleTodoMode(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
Defaults.todo.enabled = newSetting
showHideTodoModeSettings(animated: true)
Notification.Name.todoMenuToggled.post()
}
@IBAction func showTodoModeHelp(_ sender: Any) {
if aboutTodoWindowController == nil {
aboutTodoWindowController = NSStoryboard(name: "Main", bundle: nil).instantiateController(withIdentifier: "AboutTodoWindowController") as? NSWindowController
}
NSApp.activate(ignoringOtherApps: true)
aboutTodoWindowController?.showWindow(self)
}
@IBAction func setTodoWidthUnit(_ sender: NSPopUpButton) {
let tag = sender.selectedTag()
guard let unit = TodoSidebarWidthUnit(rawValue: tag) else {
Logger.log("Expected a pop up button to have a selected item with a valid tag matching a value of TodoSidebarWidthUnit. Got: \(String(describing: tag))")
return
}
Defaults.todoSidebarWidthUnit.value = unit
TodoManager.refreshTodoScreen()
if let visibleFrameWidth = TodoManager.todoScreen?.visibleFrame.width {
let newValue = TodoManager.convert(width: Defaults.todoSidebarWidth.cgFloat, toUnit: unit, visibleFrameWidth: visibleFrameWidth)
Defaults.todoSidebarWidth.value = Float(newValue)
todoAppWidthField.stringValue = "\(newValue)"
}
TodoManager.moveAllIfNeeded(false)
}
@IBAction func setTodoAppSide(_ sender: NSPopUpButton) {
let tag = sender.selectedTag()
guard let side = TodoSidebarSide(rawValue: tag) else {
Logger.log("Expected a pop up button to have a selected item with a valid tag matching a value of TodoSidebarSide. Got: \(String(describing: tag))")
return
}
Defaults.todoSidebarSide.value = side
TodoManager.moveAllIfNeeded(false)
}
@IBAction func stageSliderChanged(_ sender: NSSlider) {
stageLabel.stringValue = "\(sender.intValue) px"
if let event = NSApp.currentEvent {
if event.type == .leftMouseUp || event.type == .keyDown {
let value: Float = sender.floatValue == 0 ? -1 : sender.floatValue
if value != Defaults.stageSize.value {
Defaults.stageSize.value = value
}
}
}
}
@IBAction func restoreDefaults(_ sender: Any) {
// Ask user if they want to restore to Rectangle or Spectacle defaults
let currentDefaults = Defaults.alternateDefaultShortcuts.enabled ? "Rectangle" : "Spectacle"
let defaultShortcutsTitle = NSLocalizedString("Default Shortcuts", tableName: "Main", value: "", comment: "")
let currentlyUsingText = NSLocalizedString("Currently using: ", tableName: "Main", value: "", comment: "")
let cancelText = NSLocalizedString("Cancel", tableName: "Main", value: "", comment: "")
let response = AlertUtil.threeButtonAlert(question: defaultShortcutsTitle, text: currentlyUsingText + currentDefaults, buttonOneText: "Rectangle", buttonTwoText: "Spectacle", buttonThreeText: cancelText)
if response == .alertThirdButtonReturn { return }
// Restore default shortcuts
WindowAction.active.forEach { UserDefaults.standard.removeObject(forKey: $0.name) }
let rectangleDefaults = response == .alertFirstButtonReturn
if rectangleDefaults != Defaults.alternateDefaultShortcuts.enabled {
Defaults.alternateDefaultShortcuts.enabled = rectangleDefaults
Notification.Name.changeDefaults.post()
}
// Restore snap areas
Defaults.portraitSnapAreas.typedValue = nil
Defaults.landscapeSnapAreas.typedValue = nil
Notification.Name.defaultSnapAreas.post()
}
@IBAction func exportConfig(_ sender: NSButton) {
Notification.Name.windowSnapping.post(object: false)
let savePanel = NSSavePanel()
savePanel.allowedFileTypes = ["json"]
savePanel.nameFieldStringValue = "RectangleConfig"
let response = savePanel.runModal()
if response == .OK, let url = savePanel.url {
do {
if let jsonString = Defaults.encoded() {
try jsonString.write(to: url, atomically: false, encoding: .utf8)
}
}
catch {
Logger.log(error.localizedDescription)
}
}
Notification.Name.windowSnapping.post(object: true)
}
@IBAction func importConfig(_ sender: NSButton) {
Notification.Name.windowSnapping.post(object: false)
let openPanel = NSOpenPanel()
openPanel.allowedFileTypes = ["json"]
let response = openPanel.runModal()
if response == .OK, let url = openPanel.url {
Defaults.load(fileUrl: url)
}
Notification.Name.windowSnapping.post(object: true)
}
@IBAction func showExtraSettings(_ sender: NSButton) {
if extraSettingsPopover == nil {
let popover = NSPopover()
popover.behavior = .transient
let viewController = NSViewController()
let mainStackView = NSStackView()
mainStackView.orientation = .vertical
mainStackView.alignment = .leading
mainStackView.spacing = 5
mainStackView.translatesAutoresizingMaskIntoConstraints = false
let headerLabel = NSTextField(labelWithString: NSLocalizedString("Extra Shortcuts", tableName: "Main", value: "", comment: ""))
headerLabel.font = NSFont.boldSystemFont(ofSize: NSFont.systemFontSize)
headerLabel.alignment = .center
headerLabel.translatesAutoresizingMaskIntoConstraints = false
let largerWidthLabel = NSTextField(labelWithString: NSLocalizedString("Larger Width", tableName: "Main", value: "", comment: ""))
largerWidthLabel.alignment = .right
let smallerWidthLabel = NSTextField(labelWithString: NSLocalizedString("Smaller Width", tableName: "Main", value: "", comment: ""))
smallerWidthLabel.alignment = .right
let widthStepLabel = NSTextField(labelWithString: NSLocalizedString("Width Step (px)", tableName: "Main", value: "", comment: ""))
widthStepLabel.alignment = .right
let topVerticalThirdLabel = NSTextField(labelWithString: NSLocalizedString("Top Third", tableName: "Main", value: "", comment: ""))
topVerticalThirdLabel.alignment = .right
let middleVerticalThirdLabel = NSTextField(labelWithString: NSLocalizedString("Middle Third", tableName: "Main", value: "", comment: ""))
middleVerticalThirdLabel.alignment = .right
let bottomVerticalThirdLabel = NSTextField(labelWithString: NSLocalizedString("Bottom Third", tableName: "Main", value: "", comment: ""))
bottomVerticalThirdLabel.alignment = .right
let topVerticalTwoThirdsLabel = NSTextField(labelWithString: NSLocalizedString("Top Two Thirds", tableName: "Main", value: "", comment: ""))
topVerticalTwoThirdsLabel.alignment = .right
let bottomVerticalTwoThirdsLabel = NSTextField(labelWithString: NSLocalizedString("Bottom Two Thirds", tableName: "Main", value: "", comment: ""))
bottomVerticalTwoThirdsLabel.alignment = .right
let topLeftEighthLabel = NSTextField(labelWithString: NSLocalizedString("Top Left Eighth", tableName: "Main", value: "", comment: ""))
topLeftEighthLabel.alignment = .right
let topCenterLeftEighthLabel = NSTextField(labelWithString: NSLocalizedString("Top Center Left Eighth", tableName: "Main", value: "", comment: ""))
topCenterLeftEighthLabel.alignment = .right
let topCenterRightEighthLabel = NSTextField(labelWithString: NSLocalizedString("Top Center Right Eighth", tableName: "Main", value: "", comment: ""))
topCenterRightEighthLabel.alignment = .right
let topRightEighthLabel = NSTextField(labelWithString: NSLocalizedString("Top Right Eighth", tableName: "Main", value: "", comment: ""))
topRightEighthLabel.alignment = .right
let bottomLeftEighthLabel = NSTextField(labelWithString: NSLocalizedString("Bottom Left Eighth", tableName: "Main", value: "", comment: ""))
bottomLeftEighthLabel.alignment = .right
let bottomCenterLeftEighthLabel = NSTextField(labelWithString: NSLocalizedString("Bottom Center Left Eighth", tableName: "Main", value: "", comment: ""))
bottomCenterLeftEighthLabel.alignment = .right
let bottomCenterRightEighthLabel = NSTextField(labelWithString: NSLocalizedString("Bottom Center Right Eighth", tableName: "Main", value: "", comment: ""))
bottomCenterRightEighthLabel.alignment = .right
let bottomRightEighthLabel = NSTextField(labelWithString: NSLocalizedString("Bottom Right Eighth", tableName: "Main", value: "", comment: ""))
bottomRightEighthLabel.alignment = .right
largerWidthLabel.translatesAutoresizingMaskIntoConstraints = false
smallerWidthLabel.translatesAutoresizingMaskIntoConstraints = false
widthStepLabel.translatesAutoresizingMaskIntoConstraints = false
topVerticalThirdLabel.translatesAutoresizingMaskIntoConstraints = false
middleVerticalThirdLabel.translatesAutoresizingMaskIntoConstraints = false
bottomVerticalThirdLabel.translatesAutoresizingMaskIntoConstraints = false
topVerticalTwoThirdsLabel.translatesAutoresizingMaskIntoConstraints = false
bottomVerticalTwoThirdsLabel.translatesAutoresizingMaskIntoConstraints = false
topLeftEighthLabel.translatesAutoresizingMaskIntoConstraints = false
topCenterLeftEighthLabel.translatesAutoresizingMaskIntoConstraints = false
topCenterRightEighthLabel.translatesAutoresizingMaskIntoConstraints = false
topRightEighthLabel.translatesAutoresizingMaskIntoConstraints = false
bottomLeftEighthLabel.translatesAutoresizingMaskIntoConstraints = false
bottomCenterLeftEighthLabel.translatesAutoresizingMaskIntoConstraints = false
bottomCenterRightEighthLabel.translatesAutoresizingMaskIntoConstraints = false
bottomRightEighthLabel.translatesAutoresizingMaskIntoConstraints = false
let largerWidthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let smallerWidthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let topVerticalThirdShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let middleVerticalThirdShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let bottomVerticalThirdShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let topVerticalTwoThirdsShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let bottomVerticalTwoThirdsShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let topLeftEighthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let topCenterLeftEighthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let topCenterRightEighthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let topRightEighthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let bottomLeftEighthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let bottomCenterLeftEighthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let bottomCenterRightEighthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let bottomRightEighthShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let widthStepField = AutoSaveFloatField(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
widthStepField.stringValue = String(Int(Defaults.widthStepSize.value))
widthStepField.delegate = self
widthStepField.defaults = Defaults.widthStepSize
widthStepField.translatesAutoresizingMaskIntoConstraints = false
widthStepField.refusesFirstResponder = true
widthStepField.alignment = .right
let integerFormatter = NumberFormatter()
integerFormatter.allowsFloats = false
integerFormatter.minimum = 1
widthStepField.formatter = integerFormatter
let splitRatioHeaderLabel = NSTextField(labelWithString: NSLocalizedString("Half Split Ratios", tableName: "Main", value: "", comment: ""))
splitRatioHeaderLabel.font = NSFont.boldSystemFont(ofSize: NSFont.systemFontSize)
splitRatioHeaderLabel.alignment = .center
splitRatioHeaderLabel.translatesAutoresizingMaskIntoConstraints = false
let hSplitLabel = NSTextField(labelWithString: NSLocalizedString("Horizontal (L/R, %)", tableName: "Main", value: "", comment: ""))
hSplitLabel.alignment = .right
hSplitLabel.translatesAutoresizingMaskIntoConstraints = false
let vSplitLabel = NSTextField(labelWithString: NSLocalizedString("Vertical (T/B, %)", tableName: "Main", value: "", comment: ""))
vSplitLabel.alignment = .right
vSplitLabel.translatesAutoresizingMaskIntoConstraints = false
let percentFormatter = NumberFormatter()
percentFormatter.allowsFloats = false
percentFormatter.minimum = 1
percentFormatter.maximum = 99
let hSplitField = AutoSaveFloatField(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
hSplitField.stringValue = String(Int(Defaults.horizontalSplitRatio.value))
hSplitField.delegate = self
hSplitField.defaults = Defaults.horizontalSplitRatio
hSplitField.fallbackValue = 50
hSplitField.translatesAutoresizingMaskIntoConstraints = false
hSplitField.refusesFirstResponder = true
hSplitField.alignment = .right
hSplitField.formatter = percentFormatter
let vSplitField = AutoSaveFloatField(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
vSplitField.stringValue = String(Int(Defaults.verticalSplitRatio.value))
vSplitField.delegate = self
vSplitField.defaults = Defaults.verticalSplitRatio
vSplitField.fallbackValue = 50
vSplitField.translatesAutoresizingMaskIntoConstraints = false
vSplitField.refusesFirstResponder = true
vSplitField.alignment = .right
vSplitField.formatter = percentFormatter
largerWidthShortcutView.setAssociatedUserDefaultsKey(WindowAction.largerWidth.name, withTransformerName: MASDictionaryTransformerName)
smallerWidthShortcutView.setAssociatedUserDefaultsKey(WindowAction.smallerWidth.name, withTransformerName: MASDictionaryTransformerName)
topVerticalThirdShortcutView.setAssociatedUserDefaultsKey(WindowAction.topVerticalThird.name, withTransformerName: MASDictionaryTransformerName)
middleVerticalThirdShortcutView.setAssociatedUserDefaultsKey(WindowAction.middleVerticalThird.name, withTransformerName: MASDictionaryTransformerName)
bottomVerticalThirdShortcutView.setAssociatedUserDefaultsKey(WindowAction.bottomVerticalThird.name, withTransformerName: MASDictionaryTransformerName)
topVerticalTwoThirdsShortcutView.setAssociatedUserDefaultsKey(WindowAction.topVerticalTwoThirds.name, withTransformerName: MASDictionaryTransformerName)
bottomVerticalTwoThirdsShortcutView.setAssociatedUserDefaultsKey(WindowAction.bottomVerticalTwoThirds.name, withTransformerName: MASDictionaryTransformerName)
topLeftEighthShortcutView.setAssociatedUserDefaultsKey(WindowAction.topLeftEighth.name, withTransformerName: MASDictionaryTransformerName)
topCenterLeftEighthShortcutView.setAssociatedUserDefaultsKey(WindowAction.topCenterLeftEighth.name, withTransformerName: MASDictionaryTransformerName)
topCenterRightEighthShortcutView.setAssociatedUserDefaultsKey(WindowAction.topCenterRightEighth.name, withTransformerName: MASDictionaryTransformerName)
topRightEighthShortcutView.setAssociatedUserDefaultsKey(WindowAction.topRightEighth.name, withTransformerName: MASDictionaryTransformerName)
bottomLeftEighthShortcutView.setAssociatedUserDefaultsKey(WindowAction.bottomLeftEighth.name, withTransformerName: MASDictionaryTransformerName)
bottomCenterLeftEighthShortcutView.setAssociatedUserDefaultsKey(WindowAction.bottomCenterLeftEighth.name, withTransformerName: MASDictionaryTransformerName)
bottomCenterRightEighthShortcutView.setAssociatedUserDefaultsKey(WindowAction.bottomCenterRightEighth.name, withTransformerName: MASDictionaryTransformerName)
bottomRightEighthShortcutView.setAssociatedUserDefaultsKey(WindowAction.bottomRightEighth.name, withTransformerName: MASDictionaryTransformerName)
if Defaults.allowAnyShortcut.enabled {
let passThroughValidator = PassthroughShortcutValidator()
largerWidthShortcutView.shortcutValidator = passThroughValidator
smallerWidthShortcutView.shortcutValidator = passThroughValidator
topVerticalThirdShortcutView.shortcutValidator = passThroughValidator
middleVerticalThirdShortcutView.shortcutValidator = passThroughValidator
bottomVerticalThirdShortcutView.shortcutValidator = passThroughValidator
topVerticalTwoThirdsShortcutView.shortcutValidator = passThroughValidator
bottomVerticalTwoThirdsShortcutView.shortcutValidator = passThroughValidator
topLeftEighthShortcutView.shortcutValidator = passThroughValidator
topCenterLeftEighthShortcutView.shortcutValidator = passThroughValidator
topCenterRightEighthShortcutView.shortcutValidator = passThroughValidator
topRightEighthShortcutView.shortcutValidator = passThroughValidator
bottomLeftEighthShortcutView.shortcutValidator = passThroughValidator
bottomCenterLeftEighthShortcutView.shortcutValidator = passThroughValidator
bottomCenterRightEighthShortcutView.shortcutValidator = passThroughValidator
bottomRightEighthShortcutView.shortcutValidator = passThroughValidator
}
let largerWidthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
largerWidthIcon.image = WindowAction.largerWidth.image
largerWidthIcon.image?.size = NSSize(width: 21, height: 14)
let smallerWidthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
smallerWidthIcon.image = WindowAction.smallerWidth.image
smallerWidthIcon.image?.size = NSSize(width: 21, height: 14)
let topVerticalThirdIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
topVerticalThirdIcon.image = WindowAction.topVerticalThird.image
topVerticalThirdIcon.image?.size = NSSize(width: 21, height: 14)
let middleVerticalThirdIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
middleVerticalThirdIcon.image = WindowAction.middleVerticalThird.image
middleVerticalThirdIcon.image?.size = NSSize(width: 21, height: 14)
let bottomVerticalThirdIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
bottomVerticalThirdIcon.image = WindowAction.bottomVerticalThird.image
bottomVerticalThirdIcon.image?.size = NSSize(width: 21, height: 14)
let topVerticalTwoThirdsIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
topVerticalTwoThirdsIcon.image = WindowAction.topVerticalTwoThirds.image
topVerticalTwoThirdsIcon.image?.size = NSSize(width: 21, height: 14)
let bottomVerticalTwoThirdsIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
bottomVerticalTwoThirdsIcon.image = WindowAction.bottomVerticalTwoThirds.image
bottomVerticalTwoThirdsIcon.image?.size = NSSize(width: 21, height: 14)
let topLeftEighthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
topLeftEighthIcon.image = WindowAction.topLeftEighth.image
topLeftEighthIcon.image?.size = NSSize(width: 21, height: 14)
let topCenterLeftEighthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
topCenterLeftEighthIcon.image = WindowAction.topCenterLeftEighth.image
topCenterLeftEighthIcon.image?.size = NSSize(width: 21, height: 14)
let topCenterRightEighthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
topCenterRightEighthIcon.image = WindowAction.topCenterRightEighth.image
topCenterRightEighthIcon.image?.size = NSSize(width: 21, height: 14)
let topRightEighthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
topRightEighthIcon.image = WindowAction.topRightEighth.image
topRightEighthIcon.image?.size = NSSize(width: 21, height: 14)
let bottomLeftEighthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
bottomLeftEighthIcon.image = WindowAction.bottomLeftEighth.image
bottomLeftEighthIcon.image?.size = NSSize(width: 21, height: 14)
let bottomCenterLeftEighthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
bottomCenterLeftEighthIcon.image = WindowAction.bottomCenterLeftEighth.image
bottomCenterLeftEighthIcon.image?.size = NSSize(width: 21, height: 14)
let bottomCenterRightEighthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
bottomCenterRightEighthIcon.image = WindowAction.bottomCenterRightEighth.image
bottomCenterRightEighthIcon.image?.size = NSSize(width: 21, height: 14)
let bottomRightEighthIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
bottomRightEighthIcon.image = WindowAction.bottomRightEighth.image
bottomRightEighthIcon.image?.size = NSSize(width: 21, height: 14)
let largerWidthLabelStack = NSStackView()
largerWidthLabelStack.orientation = .horizontal
largerWidthLabelStack.alignment = .centerY
largerWidthLabelStack.spacing = 8
largerWidthLabelStack.addArrangedSubview(largerWidthLabel)
largerWidthLabelStack.addArrangedSubview(largerWidthIcon)
let smallerWidthLabelStack = NSStackView()
smallerWidthLabelStack.orientation = .horizontal
smallerWidthLabelStack.alignment = .centerY
smallerWidthLabelStack.spacing = 8
smallerWidthLabelStack.addArrangedSubview(smallerWidthLabel)
smallerWidthLabelStack.addArrangedSubview(smallerWidthIcon)
let topVerticalThirdLabelStack = NSStackView()
topVerticalThirdLabelStack.orientation = .horizontal
topVerticalThirdLabelStack.alignment = .centerY
topVerticalThirdLabelStack.spacing = 8
topVerticalThirdLabelStack.addArrangedSubview(topVerticalThirdLabel)
topVerticalThirdLabelStack.addArrangedSubview(topVerticalThirdIcon)
let middleVerticalThirdLabelStack = NSStackView()
middleVerticalThirdLabelStack.orientation = .horizontal
middleVerticalThirdLabelStack.alignment = .centerY
middleVerticalThirdLabelStack.spacing = 8
middleVerticalThirdLabelStack.addArrangedSubview(middleVerticalThirdLabel)
middleVerticalThirdLabelStack.addArrangedSubview(middleVerticalThirdIcon)
let bottomVerticalThirdLabelStack = NSStackView()
bottomVerticalThirdLabelStack.orientation = .horizontal
bottomVerticalThirdLabelStack.alignment = .centerY
bottomVerticalThirdLabelStack.spacing = 8
bottomVerticalThirdLabelStack.addArrangedSubview(bottomVerticalThirdLabel)
bottomVerticalThirdLabelStack.addArrangedSubview(bottomVerticalThirdIcon)
let topVerticalTwoThirdsLabelStack = NSStackView()
topVerticalTwoThirdsLabelStack.orientation = .horizontal
topVerticalTwoThirdsLabelStack.alignment = .centerY
topVerticalTwoThirdsLabelStack.spacing = 8
topVerticalTwoThirdsLabelStack.addArrangedSubview(topVerticalTwoThirdsLabel)
topVerticalTwoThirdsLabelStack.addArrangedSubview(topVerticalTwoThirdsIcon)
let bottomVerticalTwoThirdsLabelStack = NSStackView()
bottomVerticalTwoThirdsLabelStack.orientation = .horizontal
bottomVerticalTwoThirdsLabelStack.alignment = .centerY
bottomVerticalTwoThirdsLabelStack.spacing = 8
bottomVerticalTwoThirdsLabelStack.addArrangedSubview(bottomVerticalTwoThirdsLabel)
bottomVerticalTwoThirdsLabelStack.addArrangedSubview(bottomVerticalTwoThirdsIcon)
let topLeftEighthLabelStack = NSStackView()
topLeftEighthLabelStack.orientation = .horizontal
topLeftEighthLabelStack.alignment = .centerY
topLeftEighthLabelStack.spacing = 8
topLeftEighthLabelStack.addArrangedSubview(topLeftEighthLabel)
topLeftEighthLabelStack.addArrangedSubview(topLeftEighthIcon)
let topCenterLeftEighthLabelStack = NSStackView()
topCenterLeftEighthLabelStack.orientation = .horizontal
topCenterLeftEighthLabelStack.alignment = .centerY
topCenterLeftEighthLabelStack.spacing = 8
topCenterLeftEighthLabelStack.addArrangedSubview(topCenterLeftEighthLabel)
topCenterLeftEighthLabelStack.addArrangedSubview(topCenterLeftEighthIcon)
let topCenterRightEighthLabelStack = NSStackView()
topCenterRightEighthLabelStack.orientation = .horizontal
topCenterRightEighthLabelStack.alignment = .centerY
topCenterRightEighthLabelStack.spacing = 8
topCenterRightEighthLabelStack.addArrangedSubview(topCenterRightEighthLabel)
topCenterRightEighthLabelStack.addArrangedSubview(topCenterRightEighthIcon)
let topRightEighthLabelStack = NSStackView()
topRightEighthLabelStack.orientation = .horizontal
topRightEighthLabelStack.alignment = .centerY
topRightEighthLabelStack.spacing = 8
topRightEighthLabelStack.addArrangedSubview(topRightEighthLabel)
topRightEighthLabelStack.addArrangedSubview(topRightEighthIcon)
let bottomLeftEighthLabelStack = NSStackView()
bottomLeftEighthLabelStack.orientation = .horizontal
bottomLeftEighthLabelStack.alignment = .centerY
bottomLeftEighthLabelStack.spacing = 8
bottomLeftEighthLabelStack.addArrangedSubview(bottomLeftEighthLabel)
bottomLeftEighthLabelStack.addArrangedSubview(bottomLeftEighthIcon)
let bottomCenterLeftEighthLabelStack = NSStackView()
bottomCenterLeftEighthLabelStack.orientation = .horizontal
bottomCenterLeftEighthLabelStack.alignment = .centerY
bottomCenterLeftEighthLabelStack.spacing = 8
bottomCenterLeftEighthLabelStack.addArrangedSubview(bottomCenterLeftEighthLabel)
bottomCenterLeftEighthLabelStack.addArrangedSubview(bottomCenterLeftEighthIcon)
let bottomCenterRightEighthLabelStack = NSStackView()
bottomCenterRightEighthLabelStack.orientation = .horizontal
bottomCenterRightEighthLabelStack.alignment = .centerY
bottomCenterRightEighthLabelStack.spacing = 8
bottomCenterRightEighthLabelStack.addArrangedSubview(bottomCenterRightEighthLabel)
bottomCenterRightEighthLabelStack.addArrangedSubview(bottomCenterRightEighthIcon)
let bottomRightEighthLabelStack = NSStackView()
bottomRightEighthLabelStack.orientation = .horizontal
bottomRightEighthLabelStack.alignment = .centerY
bottomRightEighthLabelStack.spacing = 8
bottomRightEighthLabelStack.addArrangedSubview(bottomRightEighthLabel)
bottomRightEighthLabelStack.addArrangedSubview(bottomRightEighthIcon)
let largerWidthRow = NSStackView()
largerWidthRow.orientation = .horizontal
largerWidthRow.alignment = .centerY
largerWidthRow.spacing = 18
largerWidthRow.addArrangedSubview(largerWidthLabelStack)
largerWidthRow.addArrangedSubview(largerWidthShortcutView)
let smallerWidthRow = NSStackView()
smallerWidthRow.orientation = .horizontal
smallerWidthRow.alignment = .centerY
smallerWidthRow.spacing = 18
smallerWidthRow.addArrangedSubview(smallerWidthLabelStack)
smallerWidthRow.addArrangedSubview(smallerWidthShortcutView)
let widthStepRow = NSStackView()
widthStepRow.orientation = .horizontal
widthStepRow.alignment = .centerY
widthStepRow.spacing = 18
widthStepRow.addArrangedSubview(widthStepLabel)
widthStepRow.addArrangedSubview(widthStepField)
let hSplitRow = NSStackView()
hSplitRow.orientation = .horizontal
hSplitRow.alignment = .centerY
hSplitRow.spacing = 18
hSplitRow.addArrangedSubview(hSplitLabel)
hSplitRow.addArrangedSubview(hSplitField)
let vSplitRow = NSStackView()
vSplitRow.orientation = .horizontal
vSplitRow.alignment = .centerY
vSplitRow.spacing = 18
vSplitRow.addArrangedSubview(vSplitLabel)
vSplitRow.addArrangedSubview(vSplitField)
let topVerticalThirdRow = NSStackView()
topVerticalThirdRow.orientation = .horizontal
topVerticalThirdRow.alignment = .centerY
topVerticalThirdRow.spacing = 18
topVerticalThirdRow.addArrangedSubview(topVerticalThirdLabelStack)
topVerticalThirdRow.addArrangedSubview(topVerticalThirdShortcutView)
let middleVerticalThirdRow = NSStackView()
middleVerticalThirdRow.orientation = .horizontal
middleVerticalThirdRow.alignment = .centerY
middleVerticalThirdRow.spacing = 18
middleVerticalThirdRow.addArrangedSubview(middleVerticalThirdLabelStack)
middleVerticalThirdRow.addArrangedSubview(middleVerticalThirdShortcutView)
let bottomVerticalThirdRow = NSStackView()
bottomVerticalThirdRow.orientation = .horizontal
bottomVerticalThirdRow.alignment = .centerY
bottomVerticalThirdRow.spacing = 18
bottomVerticalThirdRow.addArrangedSubview(bottomVerticalThirdLabelStack)
bottomVerticalThirdRow.addArrangedSubview(bottomVerticalThirdShortcutView)
let topVerticalTwoThirdsRow = NSStackView()
topVerticalTwoThirdsRow.orientation = .horizontal
topVerticalTwoThirdsRow.alignment = .centerY
topVerticalTwoThirdsRow.spacing = 18
topVerticalTwoThirdsRow.addArrangedSubview(topVerticalTwoThirdsLabelStack)
topVerticalTwoThirdsRow.addArrangedSubview(topVerticalTwoThirdsShortcutView)
let bottomVerticalTwoThirdsRow = NSStackView()
bottomVerticalTwoThirdsRow.orientation = .horizontal
bottomVerticalTwoThirdsRow.alignment = .centerY
bottomVerticalTwoThirdsRow.spacing = 18
bottomVerticalTwoThirdsRow.addArrangedSubview(bottomVerticalTwoThirdsLabelStack)
bottomVerticalTwoThirdsRow.addArrangedSubview(bottomVerticalTwoThirdsShortcutView)
let topLeftEighthRow = NSStackView()
topLeftEighthRow.orientation = .horizontal
topLeftEighthRow.alignment = .centerY
topLeftEighthRow.spacing = 18
topLeftEighthRow.addArrangedSubview(topLeftEighthLabelStack)
topLeftEighthRow.addArrangedSubview(topLeftEighthShortcutView)
let topCenterLeftEighthRow = NSStackView()
topCenterLeftEighthRow.orientation = .horizontal
topCenterLeftEighthRow.alignment = .centerY
topCenterLeftEighthRow.spacing = 18
topCenterLeftEighthRow.addArrangedSubview(topCenterLeftEighthLabelStack)
topCenterLeftEighthRow.addArrangedSubview(topCenterLeftEighthShortcutView)
let topCenterRightEighthRow = NSStackView()
topCenterRightEighthRow.orientation = .horizontal
topCenterRightEighthRow.alignment = .centerY
topCenterRightEighthRow.spacing = 18
topCenterRightEighthRow.addArrangedSubview(topCenterRightEighthLabelStack)
topCenterRightEighthRow.addArrangedSubview(topCenterRightEighthShortcutView)
let topRightEighthRow = NSStackView()
topRightEighthRow.orientation = .horizontal
topRightEighthRow.alignment = .centerY
topRightEighthRow.spacing = 18
topRightEighthRow.addArrangedSubview(topRightEighthLabelStack)
topRightEighthRow.addArrangedSubview(topRightEighthShortcutView)
let bottomLeftEighthRow = NSStackView()
bottomLeftEighthRow.orientation = .horizontal
bottomLeftEighthRow.alignment = .centerY
bottomLeftEighthRow.spacing = 18
bottomLeftEighthRow.addArrangedSubview(bottomLeftEighthLabelStack)
bottomLeftEighthRow.addArrangedSubview(bottomLeftEighthShortcutView)
let bottomCenterLeftEighthRow = NSStackView()
bottomCenterLeftEighthRow.orientation = .horizontal
bottomCenterLeftEighthRow.alignment = .centerY
bottomCenterLeftEighthRow.spacing = 18
bottomCenterLeftEighthRow.addArrangedSubview(bottomCenterLeftEighthLabelStack)
bottomCenterLeftEighthRow.addArrangedSubview(bottomCenterLeftEighthShortcutView)
let bottomCenterRightEighthRow = NSStackView()
bottomCenterRightEighthRow.orientation = .horizontal
bottomCenterRightEighthRow.alignment = .centerY
bottomCenterRightEighthRow.spacing = 18
bottomCenterRightEighthRow.addArrangedSubview(bottomCenterRightEighthLabelStack)
bottomCenterRightEighthRow.addArrangedSubview(bottomCenterRightEighthShortcutView)
let bottomRightEighthRow = NSStackView()
bottomRightEighthRow.orientation = .horizontal
bottomRightEighthRow.alignment = .centerY
bottomRightEighthRow.spacing = 18
bottomRightEighthRow.addArrangedSubview(bottomRightEighthLabelStack)
bottomRightEighthRow.addArrangedSubview(bottomRightEighthShortcutView)
mainStackView.addArrangedSubview(headerLabel)
mainStackView.setCustomSpacing(10, after: headerLabel)
mainStackView.addArrangedSubview(largerWidthRow)
mainStackView.addArrangedSubview(smallerWidthRow)
mainStackView.addArrangedSubview(widthStepRow)
mainStackView.addArrangedSubview(topVerticalThirdRow)
mainStackView.addArrangedSubview(middleVerticalThirdRow)
mainStackView.addArrangedSubview(bottomVerticalThirdRow)
mainStackView.addArrangedSubview(topVerticalTwoThirdsRow)
mainStackView.addArrangedSubview(bottomVerticalTwoThirdsRow)
// Grid Positions - cycling shortcuts for larger grids
let showAdditionalSizesCheckbox = NSButton(checkboxWithTitle: NSLocalizedString("Show additional sizes in menu", tableName: "Main", value: "", comment: ""), target: self, action: #selector(toggleShowAdditionalSizesInMenu(_:)))
showAdditionalSizesCheckbox.state = Defaults.showAdditionalSizesInMenu.userEnabled ? .on : .off
showAdditionalSizesCheckbox.translatesAutoresizingMaskIntoConstraints = false
showAdditionalSizesCheckbox.alignment = .left
showAdditionalSizesCheckbox.imageHugsTitle = true
//
let gridHeaderLabel = NSTextField(labelWithString: NSLocalizedString("Grid Positions", tableName: "Main", value: "", comment: ""))
gridHeaderLabel.font = NSFont.boldSystemFont(ofSize: NSFont.systemFontSize)
gridHeaderLabel.alignment = .center
gridHeaderLabel.translatesAutoresizingMaskIntoConstraints = false
let cyclingHintLabel = NSTextField(wrappingLabelWithString: NSLocalizedString("Press the shortcut repeatedly to cycle through all positions in the grid.", tableName: "Main", value: "", comment: ""))
cyclingHintLabel.font = NSFont.systemFont(ofSize: NSFont.smallSystemFontSize)
cyclingHintLabel.textColor = .secondaryLabelColor
cyclingHintLabel.alignment = .center
cyclingHintLabel.translatesAutoresizingMaskIntoConstraints = false
// Cycling shortcut rows - Ninths, Twelfths, Sixteenths
let ninthsCyclingLabel = NSTextField(labelWithString: NSLocalizedString("Ninths (3\u{00d7}3)", tableName: "Main", value: "", comment: ""))
ninthsCyclingLabel.alignment = .right
ninthsCyclingLabel.translatesAutoresizingMaskIntoConstraints = false
let twelfthsCyclingLabel = NSTextField(labelWithString: NSLocalizedString("Twelfths (4\u{00d7}3)", tableName: "Main", value: "", comment: ""))
twelfthsCyclingLabel.alignment = .right
twelfthsCyclingLabel.translatesAutoresizingMaskIntoConstraints = false
let sixteenthsCyclingLabel = NSTextField(labelWithString: NSLocalizedString("Sixteenths (4\u{00d7}4)", tableName: "Main", value: "", comment: ""))
sixteenthsCyclingLabel.alignment = .right
sixteenthsCyclingLabel.translatesAutoresizingMaskIntoConstraints = false
let ninthsCyclingShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let twelfthsCyclingShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
let sixteenthsCyclingShortcutView = MASShortcutView(frame: NSRect(x: 0, y: 0, width: 160, height: 19))
ninthsCyclingShortcutView.setAssociatedUserDefaultsKey(WindowAction.topLeftNinth.name, withTransformerName: MASDictionaryTransformerName)
twelfthsCyclingShortcutView.setAssociatedUserDefaultsKey(WindowAction.topLeftTwelfth.name, withTransformerName: MASDictionaryTransformerName)
sixteenthsCyclingShortcutView.setAssociatedUserDefaultsKey(WindowAction.topLeftSixteenth.name, withTransformerName: MASDictionaryTransformerName)
let ninthsCyclingIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
ninthsCyclingIcon.image = WindowAction.topLeftNinth.image
ninthsCyclingIcon.image?.size = NSSize(width: 21, height: 14)
let twelfthsCyclingIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
twelfthsCyclingIcon.image = WindowAction.topLeftTwelfth.image
twelfthsCyclingIcon.image?.size = NSSize(width: 21, height: 14)
let sixteenthsCyclingIcon = NSImageView(frame: NSRect(x: 0, y: 0, width: 21, height: 14))
sixteenthsCyclingIcon.image = WindowAction.topLeftSixteenth.image
sixteenthsCyclingIcon.image?.size = NSSize(width: 21, height: 14)
func makeLabelStack(_ label: NSTextField, _ icon: NSImageView) -> NSStackView {
let stack = NSStackView()
stack.orientation = .horizontal
stack.alignment = .centerY
stack.spacing = 8
stack.addArrangedSubview(label)
stack.addArrangedSubview(icon)
return stack
}
func makeRow(_ labelStack: NSStackView, _ shortcutView: MASShortcutView) -> NSStackView {
let row = NSStackView()
row.orientation = .horizontal
row.alignment = .centerY
row.spacing = 18
row.addArrangedSubview(labelStack)
row.addArrangedSubview(shortcutView)
return row
}
let ninthsCyclingRow = makeRow(makeLabelStack(ninthsCyclingLabel, ninthsCyclingIcon), ninthsCyclingShortcutView)
let twelfthsCyclingRow = makeRow(makeLabelStack(twelfthsCyclingLabel, twelfthsCyclingIcon), twelfthsCyclingShortcutView)
let sixteenthsCyclingRow = makeRow(makeLabelStack(sixteenthsCyclingLabel, sixteenthsCyclingIcon), sixteenthsCyclingShortcutView)
if Defaults.allowAnyShortcut.enabled {
let passThroughValidator = PassthroughShortcutValidator()
ninthsCyclingShortcutView.shortcutValidator = passThroughValidator
twelfthsCyclingShortcutView.shortcutValidator = passThroughValidator
sixteenthsCyclingShortcutView.shortcutValidator = passThroughValidator
}
mainStackView.addArrangedSubview(gridHeaderLabel)
mainStackView.setCustomSpacing(4, after: gridHeaderLabel)
mainStackView.addArrangedSubview(showAdditionalSizesCheckbox)
mainStackView.setCustomSpacing(8, after: showAdditionalSizesCheckbox)
mainStackView.addArrangedSubview(cyclingHintLabel)
mainStackView.setCustomSpacing(8, after: cyclingHintLabel)
mainStackView.addArrangedSubview(topLeftEighthRow)
mainStackView.addArrangedSubview(topCenterLeftEighthRow)
mainStackView.addArrangedSubview(topCenterRightEighthRow)
mainStackView.addArrangedSubview(topRightEighthRow)
mainStackView.addArrangedSubview(bottomLeftEighthRow)
mainStackView.addArrangedSubview(bottomCenterLeftEighthRow)
mainStackView.addArrangedSubview(bottomCenterRightEighthRow)
mainStackView.addArrangedSubview(bottomRightEighthRow)
mainStackView.addArrangedSubview(ninthsCyclingRow)
mainStackView.addArrangedSubview(twelfthsCyclingRow)
mainStackView.addArrangedSubview(sixteenthsCyclingRow)
mainStackView.addArrangedSubview(splitRatioHeaderLabel)
mainStackView.setCustomSpacing(10, after: splitRatioHeaderLabel)
mainStackView.addArrangedSubview(hSplitRow)
mainStackView.addArrangedSubview(vSplitRow)
NSLayoutConstraint.activate([
headerLabel.widthAnchor.constraint(equalTo: mainStackView.widthAnchor),
splitRatioHeaderLabel.widthAnchor.constraint(equalTo: mainStackView.widthAnchor),
largerWidthLabel.widthAnchor.constraint(equalTo: smallerWidthLabel.widthAnchor),
smallerWidthLabel.widthAnchor.constraint(equalTo: widthStepLabel.widthAnchor),
widthStepLabel.widthAnchor.constraint(equalTo: topVerticalThirdLabel.widthAnchor),
topVerticalThirdLabel.widthAnchor.constraint(equalTo: middleVerticalThirdLabel.widthAnchor),
middleVerticalThirdLabel.widthAnchor.constraint(equalTo: bottomVerticalThirdLabel.widthAnchor),
bottomVerticalThirdLabel.widthAnchor.constraint(equalTo: topVerticalTwoThirdsLabel.widthAnchor),
topVerticalTwoThirdsLabel.widthAnchor.constraint(equalTo: bottomVerticalTwoThirdsLabel.widthAnchor),
bottomVerticalTwoThirdsLabel.widthAnchor.constraint(equalTo: topLeftEighthLabel.widthAnchor),
topLeftEighthLabel.widthAnchor.constraint(equalTo: topCenterLeftEighthLabel.widthAnchor),
topCenterLeftEighthLabel.widthAnchor.constraint(equalTo: topCenterRightEighthLabel.widthAnchor),
topCenterRightEighthLabel.widthAnchor.constraint(equalTo: topRightEighthLabel.widthAnchor),
topRightEighthLabel.widthAnchor.constraint(equalTo: bottomLeftEighthLabel.widthAnchor),
bottomLeftEighthLabel.widthAnchor.constraint(equalTo: bottomCenterLeftEighthLabel.widthAnchor),
bottomCenterLeftEighthLabel.widthAnchor.constraint(equalTo: bottomCenterRightEighthLabel.widthAnchor),
bottomCenterRightEighthLabel.widthAnchor.constraint(equalTo: bottomRightEighthLabel.widthAnchor),
bottomRightEighthLabel.widthAnchor.constraint(equalTo: ninthsCyclingLabel.widthAnchor),
ninthsCyclingLabel.widthAnchor.constraint(equalTo: twelfthsCyclingLabel.widthAnchor),
twelfthsCyclingLabel.widthAnchor.constraint(equalTo: sixteenthsCyclingLabel.widthAnchor),
sixteenthsCyclingLabel.widthAnchor.constraint(equalTo: hSplitLabel.widthAnchor),
hSplitLabel.widthAnchor.constraint(equalTo: vSplitLabel.widthAnchor),
largerWidthLabelStack.widthAnchor.constraint(equalTo: smallerWidthLabelStack.widthAnchor),
largerWidthShortcutView.widthAnchor.constraint(equalToConstant: 160),
smallerWidthShortcutView.widthAnchor.constraint(equalToConstant: 160),
widthStepField.widthAnchor.constraint(equalToConstant: 160),
topVerticalThirdShortcutView.widthAnchor.constraint(equalToConstant: 160),
middleVerticalThirdShortcutView.widthAnchor.constraint(equalToConstant: 160),
bottomVerticalThirdShortcutView.widthAnchor.constraint(equalToConstant: 160),
topVerticalTwoThirdsShortcutView.widthAnchor.constraint(equalToConstant: 160),
bottomVerticalTwoThirdsShortcutView.widthAnchor.constraint(equalToConstant: 160),
topLeftEighthShortcutView.widthAnchor.constraint(equalToConstant: 160),
topCenterLeftEighthShortcutView.widthAnchor.constraint(equalToConstant: 160),
topCenterRightEighthShortcutView.widthAnchor.constraint(equalToConstant: 160),
topRightEighthShortcutView.widthAnchor.constraint(equalToConstant: 160),
bottomLeftEighthShortcutView.widthAnchor.constraint(equalToConstant: 160),
bottomCenterLeftEighthShortcutView.widthAnchor.constraint(equalToConstant: 160),
bottomCenterRightEighthShortcutView.widthAnchor.constraint(equalToConstant: 160),
bottomRightEighthShortcutView.widthAnchor.constraint(equalToConstant: 160),
ninthsCyclingShortcutView.widthAnchor.constraint(equalToConstant: 160),
twelfthsCyclingShortcutView.widthAnchor.constraint(equalToConstant: 160),
sixteenthsCyclingShortcutView.widthAnchor.constraint(equalToConstant: 160),
widthStepField.trailingAnchor.constraint(equalTo: largerWidthShortcutView.trailingAnchor),
hSplitField.widthAnchor.constraint(equalToConstant: 160),
vSplitField.widthAnchor.constraint(equalToConstant: 160),
showAdditionalSizesCheckbox.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
smallerWidthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
topVerticalThirdShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
middleVerticalThirdShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
bottomVerticalThirdShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
topVerticalTwoThirdsShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
bottomVerticalTwoThirdsShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
topLeftEighthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
topCenterLeftEighthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
topCenterRightEighthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
topRightEighthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
bottomLeftEighthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
bottomCenterLeftEighthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
bottomCenterRightEighthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
bottomRightEighthShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
ninthsCyclingShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
twelfthsCyclingShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
sixteenthsCyclingShortcutView.leadingAnchor.constraint(equalTo: largerWidthShortcutView.leadingAnchor),
gridHeaderLabel.widthAnchor.constraint(equalTo: mainStackView.widthAnchor),
cyclingHintLabel.widthAnchor.constraint(equalTo: mainStackView.widthAnchor, constant: -20),
hSplitField.trailingAnchor.constraint(equalTo: largerWidthShortcutView.trailingAnchor),
vSplitField.trailingAnchor.constraint(equalTo: largerWidthShortcutView.trailingAnchor)
])
let containerView = NSView()
containerView.addSubview(mainStackView)
NSLayoutConstraint.activate([
mainStackView.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 10),
mainStackView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: -10),
mainStackView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 15),
mainStackView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -15)
])
viewController.view = containerView
popover.contentViewController = viewController
extraSettingsPopover = popover
}
extraSettingsPopover?.show(relativeTo: sender.bounds, of: sender, preferredEdge: .maxY)
}
override func awakeFromNib() {
initializeToggles()
checkForUpdatesAutomaticallyCheckbox.bind(.value, to: AppDelegate.instance.updaterController.updater, withKeyPath: "automaticallyChecksForUpdates", options: nil)
let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
versionLabel.stringValue = "v" + appVersionString + " (" + buildString + ")"
updateCheckForUpdatesTitle()
initializeTodoModeSettings()
self.cycleSizeCheckboxes.forEach {
$0.removeFromSuperview()
}
let cycleSizeCheckboxes = makeCycleSizeCheckboxes()
cycleSizeCheckboxes.forEach { checkbox in
cycleSizesView.addArrangedSubview(checkbox)
}
self.cycleSizeCheckboxes = cycleSizeCheckboxes
initializeCycleSizesView(animated: false)
Notification.Name.configImported.onPost(using: {_ in
self.initializeTodoModeSettings()
self.initializeToggles()
self.initializeCycleSizesView(animated: false)
})
Notification.Name.menuBarIconHidden.onPost(using: {_ in
self.hideMenuBarIconCheckbox.state = .on
})
Notification.Name.updateAvailability.onPost { _ in
self.updateCheckForUpdatesTitle()
}
}
func updateCheckForUpdatesTitle() {
checkForUpdatesButton.title = AppDelegate.instance.hasPendingUpdate ? "Update Available…".localized : "Check for Updates…".localized(key: "74m-kw-w1f.title")
}
func initializeTodoModeSettings() {
todoCheckbox.state = Defaults.todo.userEnabled ? .on : .off
todoAppWidthField.stringValue = String(Defaults.todoSidebarWidth.value)
todoAppWidthField.delegate = self
todoAppWidthField.defaults = Defaults.todoSidebarWidth
todoAppWidthField.defaultsSetAction = {
TodoManager.moveAllIfNeeded(false)
}
todoAppWidthUnitPopUpButton.selectItem(withTag: Defaults.todoSidebarWidthUnit.value.rawValue)
todoAppSidePopUpButton.selectItem(withTag: Defaults.todoSidebarSide.value.rawValue)
TodoManager.initToggleShortcut()
TodoManager.initReflowShortcut()
toggleTodoShortcutView.setAssociatedUserDefaultsKey(TodoManager.toggleDefaultsKey, withTransformerName: MASDictionaryTransformerName)
reflowTodoShortcutView.setAssociatedUserDefaultsKey(TodoManager.reflowDefaultsKey, withTransformerName: MASDictionaryTransformerName)
showHideTodoModeSettings(animated: false)
}
private func showHideTodoModeSettings(animated: Bool) {
setVisibility(shown: Defaults.todo.userEnabled, ofView: todoView, withConstraint: todoViewHeightConstraint, animated: animated)
}
func initializeToggles() {
checkForUpdatesAutomaticallyCheckbox.state = Defaults.SUEnableAutomaticChecks.enabled ? .on : .off
launchOnLoginCheckbox.state = Defaults.launchOnLogin.enabled ? .on : .off
hideMenuBarIconCheckbox.state = Defaults.hideMenuBarIcon.enabled ? .on : .off
subsequentExecutionPopUpButton.selectItem(withTag: Defaults.subsequentExecutionMode.value.rawValue)
allowAnyShortcutCheckbox.state = Defaults.allowAnyShortcut.enabled ? .on : .off
gapSlider.intValue = Int32(Defaults.gapSize.value)
gapLabel.stringValue = "\(gapSlider.intValue) px"
gapSlider.isContinuous = true
cursorAcrossCheckbox.state = Defaults.moveCursorAcrossDisplays.userEnabled ? .on : .off
useCursorScreenDetectionCheckbox.isHidden = !Defaults.useCursorScreenDetection.enabled
useCursorScreenDetectionCheckbox.state = Defaults.useCursorScreenDetection.enabled ? .on : .off
doubleClickTitleBarCheckbox.state = WindowAction(rawValue: Defaults.doubleClickTitleBar.value - 1) != nil ? .on : .off
if StageUtil.stageCapable {
stageSlider.intValue = Int32(Defaults.stageSize.value)
stageSlider.isContinuous = true
stageLabel.stringValue = "\(stageSlider.intValue) px"
} else {
stageView.isHidden = true
}
setToggleStatesForCycleSizeCheckboxes()
}
private func initializeCycleSizesView(animated: Bool = false) {
let showOptionsView = Defaults.subsequentExecutionMode.resizes
if showOptionsView {
setToggleStatesForCycleSizeCheckboxes()
}
setVisibility(shown: showOptionsView, ofView: cycleSizesView, withConstraint: cycleSizesViewHeightConstraint, animated: animated)
}
private func setVisibility(shown: Bool, ofView view: NSView, withConstraint constraint: NSLayoutConstraint, animated: Bool) {
if shown {
view.isHidden = false
constraint.isActive = false
animateChanges(animated: animated) {
view.animator().alphaValue = 1
}
} else {
animateChanges(animated: animated) {
view.isHidden = true
constraint.isActive = true
}
DispatchQueue.main.async {
view.alphaValue = 0
}
}
}
private func animateChanges(animated: Bool, block: () -> Void) {
if animated {
view.layoutSubtreeIfNeeded()
NSAnimationContext.runAnimationGroup({ context in
context.duration = 0.3
context.allowsImplicitAnimation = true
block()
view.layoutSubtreeIfNeeded()
}, completionHandler: nil)
} else {
block()
}
}
private func makeCycleSizeCheckboxes() -> [NSButton] {
CycleSize.sortedSizes.map { division in
let button = NSButton(checkboxWithTitle: division.title, target: self, action: #selector(didCheckCycleSizeCheckbox(sender:)))
button.tag = division.rawValue
button.setContentCompressionResistancePriority(.required, for: .vertical)
return button
}
}
@objc private func didCheckCycleSizeCheckbox(sender: Any?) {
guard let checkbox = sender as? NSButton else {
Logger.log("Expected action to be sent from NSButton. Instead, sender is: \(String(describing: sender))")
return
}
let rawValue = checkbox.tag
guard let cycleSize = CycleSize(rawValue: rawValue) else {
Logger.log("Expected tag of cycle size checkbox to match a value of CycleSize. Got: \(String(describing: rawValue))")
return
}
// If selected cycle sizes has not been changed, write the defaults.
if !Defaults.cycleSizesIsChanged.enabled {
Defaults.selectedCycleSizes.value = CycleSize.defaultSizes
}
Defaults.cycleSizesIsChanged.enabled = true
if checkbox.state == .on {
Defaults.selectedCycleSizes.value.insert(cycleSize)
} else {
Defaults.selectedCycleSizes.value.remove(cycleSize)
}
}
private func setToggleStatesForCycleSizeCheckboxes() {
let useDefaultCycleSizes = !Defaults.cycleSizesIsChanged.enabled
let cycleSizes = useDefaultCycleSizes ? CycleSize.defaultSizes : Defaults.selectedCycleSizes.value
cycleSizeCheckboxes.forEach { checkbox in
guard let cycleSizeForCheckbox = CycleSize(rawValue: checkbox.tag) else {
return
}
let isAlwaysEnabled = cycleSizeForCheckbox.isAlwaysEnabled
let isChecked = isAlwaysEnabled || cycleSizes.contains(cycleSizeForCheckbox)
checkbox.state = isChecked ? .on : .off
// Show that the box cannot be unchecked.
if isAlwaysEnabled {
checkbox.isEnabled = false
}
}
}
}
extension SettingsViewController {
static func freshController() -> SettingsViewController {
let storyboard = NSStoryboard(name: "Main", bundle: nil)
let identifier = "SettingsViewController"
guard let viewController = storyboard.instantiateController(withIdentifier: identifier) as? SettingsViewController else {
fatalError("Unable to find ViewController - Check Main.storyboard")
}
return viewController
}
}
extension SettingsViewController: NSTextFieldDelegate {
func controlTextDidChange(_ obj: Notification) {
guard let sender = obj.object as? AutoSaveFloatField,
let defaults: FloatDefault = sender.defaults else { return }
Debounce.input(sender.floatValue, comparedAgainst: sender.floatValue) { floatValue in
defaults.value = floatValue
sender.defaultsSetAction?()
}
}
func controlTextDidEndEditing(_ obj: Notification) {
guard let sender = obj.object as? AutoSaveFloatField,
let defaults: FloatDefault = sender.defaults else { return }
if sender.stringValue.isEmpty {
let fallback = sender.fallbackValue
sender.stringValue = "\(Int(fallback))"
defaults.value = fallback
sender.defaultsSetAction?()
}
}
}
class AutoSaveFloatField: NSTextField {
var defaults: FloatDefault?
var defaultsSetAction: (() -> Void)?
var fallbackValue: Float = 30
}
================================================
FILE: Rectangle/PrefsWindow/SnapAreaViewController.swift
================================================
//
// SnapAreaViewController.swift
// Rectangle
//
// Created by Ryan Hanson on 8/13/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Cocoa
class SnapAreaViewController: NSViewController {
@IBOutlet weak var windowSnappingCheckbox: NSButton!
@IBOutlet weak var unsnapRestoreButton: NSButton!
@IBOutlet weak var animateFootprintCheckbox: NSButton!
@IBOutlet weak var hapticFeedbackCheckbox: NSButton!
@IBOutlet weak var missionControlDraggingCheckbox: NSButton!
@IBOutlet weak var topLeftLandscapeSelect: NSPopUpButton!
@IBOutlet weak var topLandscapeSelect: NSPopUpButton!
@IBOutlet weak var topRightLandscapeSelect: NSPopUpButton!
@IBOutlet weak var leftLandscapeSelect: NSPopUpButton!
@IBOutlet weak var rightLandscapeSelect: NSPopUpButton!
@IBOutlet weak var bottomLeftLandscapeSelect: NSPopUpButton!
@IBOutlet weak var bottomLandscapeSelect: NSPopUpButton!
@IBOutlet weak var bottomRightLandscapeSelect: NSPopUpButton!
@IBOutlet weak var portraitStackView: NSStackView!
@IBOutlet weak var topLeftPortraitSelect: NSPopUpButton!
@IBOutlet weak var topPortraitSelect: NSPopUpButton!
@IBOutlet weak var topRightPortraitSelect: NSPopUpButton!
@IBOutlet weak var leftPortraitSelect: NSPopUpButton!
@IBOutlet weak var rightPortraitSelect: NSPopUpButton!
@IBOutlet weak var bottomLeftPortraitSelect: NSPopUpButton!
@IBOutlet weak var bottomPortraitSelect: NSPopUpButton!
@IBOutlet weak var bottomRightPortraitSelect: NSPopUpButton!
@IBAction func toggleWindowSnapping(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
Defaults.windowSnapping.enabled = newSetting
Notification.Name.windowSnapping.post(object: newSetting)
if newSetting {
MacTilingDefaults.checkForBuiltInTiling(skipIfAlreadyNotified: false)
}
}
@IBAction func toggleUnsnapRestore(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
Defaults.unsnapRestore.enabled = newSetting
}
@IBAction func toggleAnimateFootprint(_ sender: NSButton) {
let newSetting: Float = sender.state == .on ? 0.75 : 0
Defaults.footprintAnimationDurationMultiplier.value = newSetting
}
@IBAction func toggleHapticFeedback(_ sender: NSButton) {
let newSetting: Bool = sender.state == .on
Defaults.hapticFeedbackOnSnap.enabled = newSetting
}
@IBAction func toggleMissionControlDragging(_ sender: NSButton) {
let newSetting: Bool = sender.state == .off
Defaults.missionControlDragging.enabled = newSetting
Notification.Name.missionControlDragging.post(object: newSetting)
}
@IBAction func setLandscapeSnapArea(_ sender: NSPopUpButton) {
setSnapArea(sender: sender, type: .landscape)
}
@IBAction func setPortraitSnapArea(_ sender: NSPopUpButton) {
setSnapArea(sender: sender, type: .portrait)
}
private func setSnapArea(sender: NSPopUpButton, type: DisplayOrientation) {
guard let directional = Directional(rawValue: sender.tag) else { return }
let selectedTag = sender.selectedTag()
var snapAreaConfig: SnapAreaConfig?
if selectedTag < -1, let compound = CompoundSnapArea(rawValue: selectedTag) {
snapAreaConfig = SnapAreaConfig(compound: compound)
} else if selectedTag > -1, let action = WindowAction(rawValue: selectedTag) {
snapAreaConfig = SnapAreaConfig(action: action)
}
SnapAreaModel.instance.setConfig(type: type, directional: directional, snapAreaConfig: snapAreaConfig)
}
override func viewDidLoad() {
windowSnappingCheckbox.state = Defaults.windowSnapping.userDisabled ? .off : .on
unsnapRestoreButton.state = Defaults.unsnapRestore.userDisabled ? .off : .on
animateFootprintCheckbox.state = Defaults.footprintAnimationDurationMultiplier.value > 0 ? .on : .off
hapticFeedbackCheckbox.state = Defaults.hapticFeedbackOnSnap.userEnabled ? .on : .off
missionControlDraggingCheckbox.state = Defaults.missionControlDragging.userDisabled ? .on : .off
missionControlDraggingCheckbox.isHidden = !Defaults.missionControlDragging.userDisabled
loadSnapAreas()
showHidePortrait()
Notification.Name.configImported.onPost(using: { [weak self] _ in
self?.loadSnapAreas()
})
Notification.Name.defaultSnapAreas.onPost(using: { [weak self] _ in
self?.loadSnapAreas()
})
Notification.Name.appWillBecomeActive.onPost() { [weak self] _ in
self?.showHidePortrait()
}
Notification.Name.windowSnapping.onPost { [weak self] _ in
self?.windowSnappingCheckbox.state = Defaults.windowSnapping.userDisabled ? .off : .on
}
NotificationCenter.default.addObserver(forName: NSApplication.didChangeScreenParametersNotification, object: nil, queue: nil) { [weak self] _ in
self?.showHidePortrait()
}
}
func showHidePortrait() {
portraitStackView.isHidden = !NSScreen.portraitDisplayConnected
}
func loadSnapAreas() {
let landscapeSelects: [NSPopUpButton] = [
topLeftLandscapeSelect,
topLandscapeSelect,
topRightLandscapeSelect,
leftLandscapeSelect,
rightLandscapeSelect,
bottomLeftLandscapeSelect,
bottomLandscapeSelect,
bottomRightLandscapeSelect
]
let portraitSelects: [NSPopUpButton] = [
topLeftPortraitSelect,
topPortraitSelect,
topRightPortraitSelect,
leftPortraitSelect,
rightPortraitSelect,
bottomLeftPortraitSelect,
bottomPortraitSelect,
bottomRightPortraitSelect
]
landscapeSelects.forEach { configure(select: $0, orientation: .landscape)}
portraitSelects.forEach { configure(select: $0, orientation: .portrait)}
}
private func configure(select: NSPopUpButton, orientation: DisplayOrientation) {
guard let directional = Directional(rawValue: select.tag) else { return }
let snapAreaConfig = orientation == .landscape
? SnapAreaModel.instance.landscape[directional]
: SnapAreaModel.instance.portrait[directional]
select.removeAllItems()
select.addItem(withTitle: "-")
select.menu?.items.first?.tag = -1
let selectedTag = snapAreaConfig?.action?.rawValue ?? snapAreaConfig?.compound?.rawValue ?? -1
for compoundSnapArea in CompoundSnapArea.all {
guard compoundSnapArea.compatibleOrientation.contains(orientation), compoundSnapArea.compatibleDirectionals.contains(directional) else { continue }
let item = NSMenuItem(title: compoundSnapArea.displayName, action: nil, keyEquivalent: "")
item.tag = compoundSnapArea.rawValue
select.menu?.addItem(item)
if selectedTag == item.tag {
select.select(item)
}
}
select.menu?.addItem(NSMenuItem.separator())
for windowAction in WindowAction.active {
if windowAction.isDragSnappable,
let name = windowAction.displayName {
let item = NSMenuItem(title: name, action: nil, keyEquivalent: "")
item.tag = windowAction.rawValue
item.image = windowAction.image.copy() as? NSImage
item.image?.size.height = 12
item.image?.size.width = 18
select.menu?.addItem(item)
if selectedTag == item.tag {
select.select(item)
}
}
}
}
}
================================================
FILE: Rectangle/Rectangle-Bridging-Header.h
================================================
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import
AXError _AXUIElementGetWindow(AXUIElementRef element, uint32_t *identifier);
================================================
FILE: Rectangle/Rectangle.entitlements
================================================
================================================
FILE: Rectangle/RectangleRelease.entitlements
================================================
================================================
FILE: Rectangle/RectangleStatusItem.swift
================================================
//
// RectangleStatusItem.swift
// Rectangle
//
// Created by Ryan Hanson on 6/11/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class RectangleStatusItem {
static let instance = RectangleStatusItem()
private var nsStatusItem: NSStatusItem?
private var added: Bool = false
public var statusMenu: NSMenu? {
didSet {
nsStatusItem?.menu = statusMenu
}
}
private var isVisibleObserver: NSKeyValueObservation?
private init() {}
public func refreshVisibility() {
if Defaults.hideMenuBarIcon.enabled {
remove()
} else {
add()
}
}
public func openMenu() {
if !added {
add()
}
nsStatusItem?.button?.performClick(self)
refreshVisibility()
}
private func add() {
added = true
nsStatusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
nsStatusItem?.menu = self.statusMenu
nsStatusItem?.button?.image = NSImage(named: "StatusTemplate")
nsStatusItem?.behavior = .removalAllowed
isVisibleObserver = nsStatusItem?.observe(\.isVisible, options: [.old, .new]) { nsStatusItem, change in
if change.oldValue == true && change.newValue == false {
Notification.Name.menuBarIconHidden.post()
Defaults.hideMenuBarIcon.enabled = true
}
}
nsStatusItem?.isVisible = true
}
private func remove() {
added = false
guard let nsStatusItem = nsStatusItem else { return }
NSStatusBar.system.removeStatusItem(nsStatusItem)
}
}
================================================
FILE: Rectangle/ScreenDetection.swift
================================================
//
// ScreenDetection.swift
// Rectangle
//
// Created by Ryan Hanson on 6/12/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class ScreenDetection {
func detectScreens(using frontmostWindowElement: AccessibilityElement?) -> UsableScreens? {
let screens = NSScreen.screens
guard let firstScreen = screens.first else { return nil }
if screens.count == 1 {
let adjacentScreens = Defaults.traverseSingleScreen.enabled == true
? AdjacentScreens(prev: firstScreen, next: firstScreen)
: nil
return UsableScreens(currentScreen: firstScreen, adjacentScreens: adjacentScreens, numScreens: screens.count, screensOrdered: [firstScreen])
}
let screensOrdered = order(screens: screens)
guard let sourceScreen: NSScreen = screenContaining(frontmostWindowElement?.frame ?? CGRect.zero, screens: screensOrdered) else {
let adjacentScreens = AdjacentScreens(prev: firstScreen, next: firstScreen)
return UsableScreens(currentScreen: firstScreen, adjacentScreens: adjacentScreens, numScreens: screens.count, screensOrdered: screensOrdered)
}
let adjacentScreens = adjacent(toFrameOfScreen: sourceScreen.frame, screens: screensOrdered)
return UsableScreens(currentScreen: sourceScreen, adjacentScreens: adjacentScreens, numScreens: screens.count, screensOrdered: screensOrdered)
}
func detectScreensAtCursor() -> UsableScreens? {
let screens = NSScreen.screens
if screens.count == 1 {
return detectScreens(using: nil)
}
let screensOrdered = order(screens: screens)
guard let cursorScreen = screens.first(where: { $0.frame.contains(NSEvent.mouseLocation)})
else {
return detectScreens(using: nil)
}
let adjacentScreens = adjacent(toFrameOfScreen: cursorScreen.frame, screens: screensOrdered)
return UsableScreens(currentScreen: cursorScreen, adjacentScreens: adjacentScreens, numScreens: screens.count, screensOrdered: screensOrdered)
}
func screenContaining(_ rect: CGRect, screens: [NSScreen]) -> NSScreen? {
var result: NSScreen? = NSScreen.main
var largestPercentageOfRectWithinFrameOfScreen: CGFloat = 0.0
for currentScreen in screens {
let currentFrameOfScreen = NSRectToCGRect(currentScreen.frame)
let normalizedRect: CGRect = rect.screenFlipped
if currentFrameOfScreen.contains(normalizedRect) {
result = currentScreen
break
}
let percentageOfRectWithinCurrentFrameOfScreen: CGFloat = percentageOf(normalizedRect, withinFrameOfScreen: currentFrameOfScreen)
if percentageOfRectWithinCurrentFrameOfScreen > largestPercentageOfRectWithinFrameOfScreen {
largestPercentageOfRectWithinFrameOfScreen = percentageOfRectWithinCurrentFrameOfScreen
result = currentScreen
}
}
return result
}
func percentageOf(_ rect: CGRect, withinFrameOfScreen frameOfScreen: CGRect) -> CGFloat {
let intersectionOfRectAndFrameOfScreen: CGRect = rect.intersection(frameOfScreen)
var result: CGFloat = 0.0
if !intersectionOfRectAndFrameOfScreen.isNull {
result = computeAreaOfRect(rect: intersectionOfRectAndFrameOfScreen) / computeAreaOfRect(rect: rect)
}
return result
}
func adjacent(toFrameOfScreen frameOfScreen: CGRect, screens: [NSScreen]) -> AdjacentScreens? {
if screens.count == 2 {
let otherScreen = screens.first(where: { screen in
let frame = NSRectToCGRect(screen.frame)
return !frame.equalTo(frameOfScreen)
})
if let otherScreen = otherScreen {
return AdjacentScreens(prev: otherScreen, next: otherScreen)
}
} else if screens.count > 2 {
let currentScreenIndex = screens.firstIndex(where: { screen in
let frame = NSRectToCGRect(screen.frame)
return frame.equalTo(frameOfScreen)
})
if let currentScreenIndex = currentScreenIndex {
let nextIndex = currentScreenIndex == screens.count - 1
? 0
: currentScreenIndex + 1
let prevIndex = currentScreenIndex == 0
? screens.count - 1
: currentScreenIndex - 1
return AdjacentScreens(prev: screens[prevIndex], next: screens[nextIndex])
}
}
return nil
}
func order(screens: [NSScreen]) -> [NSScreen] {
if Defaults.screensOrderedByX.userEnabled {
let screensOrderedByX = screens.sorted(by: { screen1, screen2 in
return screen1.frame.origin.x < screen2.frame.origin.x
})
return screensOrderedByX
}
let sortedScreens = screens.sorted(by: { screen1, screen2 in
if screen2.frame.maxY <= screen1.frame.minY {
return true
}
if screen1.frame.maxY <= screen2.frame.minY {
return false
}
return screen1.frame.minX < screen2.frame.minX
})
return sortedScreens
}
private func computeAreaOfRect(rect: CGRect) -> CGFloat {
return rect.size.width * rect.size.height
}
}
struct UsableScreens {
let currentScreen: NSScreen
let adjacentScreens: AdjacentScreens?
let frameOfCurrentScreen: CGRect
let numScreens: Int
let screensOrdered: [NSScreen]
init(currentScreen: NSScreen, adjacentScreens: AdjacentScreens? = nil, numScreens: Int, screensOrdered: [NSScreen]? = nil) {
self.currentScreen = currentScreen
self.adjacentScreens = adjacentScreens
self.frameOfCurrentScreen = currentScreen.frame
self.numScreens = numScreens
self.screensOrdered = screensOrdered ?? [currentScreen]
}
}
struct AdjacentScreens {
let prev: NSScreen
let next: NSScreen
}
extension NSScreen {
func adjustedVisibleFrame(_ ignoreTodo: Bool = false, _ ignoreStage: Bool = false) -> CGRect {
var newFrame = visibleFrame
if !ignoreStage && Defaults.stageSize.value > 0 {
if StageUtil.stageCapable && StageUtil.stageEnabled && StageUtil.stageStripShow && StageUtil.isStageStripVisible(self) {
let stageSize = Defaults.stageSize.value < 1
? newFrame.size.width * Defaults.stageSize.cgFloat
: Defaults.stageSize.cgFloat
if StageUtil.stageStripPosition == .left {
newFrame.origin.x += stageSize
}
newFrame.size.width -= stageSize
}
}
if !ignoreTodo, Defaults.todo.userEnabled, Defaults.todoMode.enabled, TodoManager.todoScreen == self, TodoManager.hasTodoWindow() {
let sidebarWidth = TodoManager.getSidebarWidth(visibleFrameWidth: visibleFrame.width)
newFrame.size.width -= sidebarWidth
if Defaults.todoSidebarSide.value == .left {
newFrame.origin.x += sidebarWidth
}
}
if Defaults.screenEdgeGapsOnMainScreenOnly.enabled, self != NSScreen.screens.first {
return newFrame
}
newFrame.origin.x += Defaults.screenEdgeGapLeft.cgFloat
newFrame.origin.y += Defaults.screenEdgeGapBottom.cgFloat
newFrame.size.width -= (Defaults.screenEdgeGapLeft.cgFloat + Defaults.screenEdgeGapRight.cgFloat)
if #available(macOS 12.0, *), self.safeAreaInsets.top != 0, Defaults.screenEdgeGapTopNotch.value != 0 {
newFrame.size.height -= (Defaults.screenEdgeGapTopNotch.cgFloat + Defaults.screenEdgeGapBottom.cgFloat)
} else {
newFrame.size.height -= (Defaults.screenEdgeGapTop.cgFloat + Defaults.screenEdgeGapBottom.cgFloat)
}
return newFrame
}
static var portraitDisplayConnected: Bool {
NSScreen.screens.contains(where: {!$0.frame.isLandscape})
}
}
================================================
FILE: Rectangle/ShortcutManager.swift
================================================
//
// ShortcutManager.swift
// Rectangle
//
// Created by Ryan Hanson on 6/12/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
import MASShortcut
class ShortcutManager {
let windowManager: WindowManager
init(windowManager: WindowManager) {
self.windowManager = windowManager
MASShortcutBinder.shared()?.bindingOptions = [NSBindingOption.valueTransformerName: MASDictionaryTransformerName]
registerDefaults()
bindShortcuts()
subscribeAll(selector: #selector(windowActionTriggered))
Notification.Name.changeDefaults.onPost { _ in self.registerDefaults() }
}
public func reloadFromDefaults() {
unsubscribe()
unbindShortcuts()
registerDefaults()
bindShortcuts()
subscribeAll(selector: #selector(windowActionTriggered))
}
public func bindShortcuts() {
for action in WindowAction.active {
MASShortcutBinder.shared()?.bindShortcut(withDefaultsKey: action.name, toAction: action.post)
}
}
public func unbindShortcuts() {
for action in WindowAction.active {
MASShortcutBinder.shared()?.breakBinding(withDefaultsKey: action.name)
}
}
public func getKeyEquivalent(action: WindowAction) -> (String?, NSEvent.ModifierFlags)? {
guard let masShortcut = MASShortcutBinder.shared()?.value(forKey: action.name) as? MASShortcut else { return nil }
return (masShortcut.keyCodeStringForKeyEquivalent, masShortcut.modifierFlags)
}
deinit {
unsubscribe()
}
private func registerDefaults() {
let defaultShortcuts = WindowAction.active.reduce(into: [String: MASShortcut]()) { dict, windowAction in
guard let defaultShortcut = Defaults.alternateDefaultShortcuts.enabled
? windowAction.alternateDefault
: windowAction.spectacleDefault
else { return }
let shortcut = MASShortcut(keyCode: defaultShortcut.keyCode, modifierFlags: NSEvent.ModifierFlags(rawValue: defaultShortcut.modifierFlags))
dict[windowAction.name] = shortcut
}
MASShortcutBinder.shared()?.registerDefaultShortcuts(defaultShortcuts)
}
@objc func windowActionTriggered(notification: NSNotification) {
guard var parameters = notification.object as? ExecutionParameters else { return }
if MultiWindowManager.execute(parameters: parameters) {
return
}
if TodoManager.execute(parameters: parameters) {
return
}
// Check if repeat cycles displays
if Defaults.subsequentExecutionMode.value == .cycleMonitor,
parameters.action.classification != .size,
parameters.action.classification != .display {
guard let windowElement = parameters.windowElement ?? AccessibilityElement.getFrontWindowElement(),
let windowId = parameters.windowId ?? windowElement.getWindowId()
else {
NSSound.beep()
return
}
if isRepeatAction(parameters: parameters, windowElement: windowElement, windowId: windowId) {
if let screen = ScreenDetection().detectScreens(using: windowElement)?.adjacentScreens?.next{
parameters = ExecutionParameters(parameters.action, updateRestoreRect: parameters.updateRestoreRect, screen: screen, windowElement: windowElement, windowId: windowId)
// Bypass any other subsequent action by removing the last action
AppDelegate.windowHistory.lastRectangleActions.removeValue(forKey: windowId)
}
}
}
windowManager.execute(parameters)
}
private func isRepeatAction(parameters: ExecutionParameters, windowElement: AccessibilityElement, windowId: CGWindowID) -> Bool {
if parameters.action == .maximize {
if ScreenDetection().detectScreens(using: windowElement)?.currentScreen.visibleFrame.size == windowElement.frame.size {
return true
}
}
if parameters.action == AppDelegate.windowHistory.lastRectangleActions[windowId]?.action {
return true
}
return false
}
private func subscribe(notification: WindowAction, selector: Selector) {
NotificationCenter.default.addObserver(self, selector: selector, name: notification.notificationName, object: nil)
}
private func unsubscribe() {
NotificationCenter.default.removeObserver(self)
}
private func subscribeAll(selector: Selector) {
for windowAction in WindowAction.active {
subscribe(notification: windowAction, selector: selector)
}
}
}
================================================
FILE: Rectangle/Snapping/CompoundSnapArea/CompoundSnapArea.swift
================================================
//
// CompoundSnapArea.swift
// Rectangle
//
// Created by Ryan Hanson on 8/23/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
enum CompoundSnapArea: Int, Codable {
case leftTopBottomHalf = -2, rightTopBottomHalf = -3, thirds = -4, portraitThirdsSide = -5, halves = -6, topSixths = -7, bottomSixths = -8, fourths = -9, portraitTopBottomHalves = -10, topEighths = -11, bottomEighths = -12
static let all = [leftTopBottomHalf, rightTopBottomHalf, thirds, portraitThirdsSide, halves, topSixths, bottomSixths, fourths, portraitTopBottomHalves, topEighths, bottomEighths]
static let leftCompoundCalculation = LeftTopBottomHalfCalculation()
static let rightCompoundCalculation = RightTopBottomHalfCalculation()
static let thirdsCompoundCalculation = ThirdsCompoundCalculation()
static let portraitSideThirdsCalculation = PortraitSideThirdsCompoundCalculation()
static let leftRightHalvesCalculation = LeftRightHalvesCompoundCalculation()
static let topSixthsCalculation = TopSixthsCompoundCalculation()
static let bottomSixthsCalculation = BottomSixthsCompoundCalculation()
static let fourthsColumnCalculation = FourthsColumnCompoundCalculation()
static let portraitTopBottomCalculation = TopBottomHalvesCalculation()
static let topEighthsCalculation = TopEighthsCompoundCalculation()
static let bottomEighthsCalculation = BottomEighthsCompoundCalculation()
var displayName: String {
switch self {
case .leftTopBottomHalf:
return NSLocalizedString("Left half, top/bottom half near corners", tableName: "Main", value: "", comment: "")
case .rightTopBottomHalf:
return NSLocalizedString("Right half, top/bottom half near corners", tableName: "Main", value: "", comment: "")
case .thirds:
return NSLocalizedString("Thirds, drag toward center for two thirds", tableName: "Main", value: "", comment: "")
case .portraitThirdsSide:
return NSLocalizedString("Thirds, top/bottom half near corners", tableName: "Main", value: "", comment: "")
case .halves:
return NSLocalizedString("Left or right half", tableName: "Main", value: "", comment: "")
case .topSixths:
return NSLocalizedString("Top sixths from corners; maximize", tableName: "Main", value: "", comment: "")
case .bottomSixths:
return NSLocalizedString("Bottom sixths from corners; thirds", tableName: "Main", value: "", comment: "")
case .fourths:
return NSLocalizedString("Fourths columns", tableName: "Main", value: "", comment: "")
case .portraitTopBottomHalves:
return NSLocalizedString("Top/bottom halves", tableName: "Main", value: "", comment: "")
case .topEighths:
return NSLocalizedString("Top eighths from corners; maximize", tableName: "Main", value: "", comment: "")
case .bottomEighths:
return NSLocalizedString("Bottom eighths from corners; thirds", tableName: "Main", value: "", comment: "")
}
}
var calculation: CompoundSnapAreaCalculation {
switch self {
case .leftTopBottomHalf:
return Self.leftCompoundCalculation
case .rightTopBottomHalf:
return Self.rightCompoundCalculation
case .thirds:
return Self.thirdsCompoundCalculation
case .portraitThirdsSide:
return Self.portraitSideThirdsCalculation
case .halves:
return Self.leftRightHalvesCalculation
case .topSixths:
return Self.topSixthsCalculation
case .bottomSixths:
return Self.bottomSixthsCalculation
case .fourths:
return Self.fourthsColumnCalculation
case .portraitTopBottomHalves:
return Self.portraitTopBottomCalculation
case .topEighths:
return Self.topEighthsCalculation
case .bottomEighths:
return Self.bottomEighthsCalculation
}
}
var compatibleDirectionals: [Directional] {
switch self {
case .leftTopBottomHalf:
return [.l]
case .rightTopBottomHalf:
return [.r]
case .thirds:
return [.t, .b]
case .portraitThirdsSide:
return [.l, .r]
case .halves:
return [.t, .b]
case .topSixths:
return [.t]
case .bottomSixths:
return [.b]
case .fourths:
return [.t, .b]
case .portraitTopBottomHalves:
return [.l, .r]
case .topEighths:
return [.t]
case .bottomEighths:
return [.b]
}
}
var compatibleOrientation: [DisplayOrientation] {
switch self {
case .leftTopBottomHalf, .rightTopBottomHalf, .halves:
return [.portrait, .landscape]
case .portraitThirdsSide, .portraitTopBottomHalves:
return [.portrait]
case .thirds, .topSixths, .bottomSixths, .fourths, .topEighths, .bottomEighths:
return [.landscape]
}
}
}
protocol CompoundSnapAreaCalculation {
func snapArea(cursorLocation: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea?
}
================================================
FILE: Rectangle/Snapping/CompoundSnapArea/EighthsCompoundCalculation.swift
================================================
//
// EighthsCompoundCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
struct TopEighthsCompoundCalculation: CompoundSnapAreaCalculation {
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
guard let priorAction = priorSnapArea?.action
else { return SnapArea(screen: screen, directional: directional, action: .maximize) }
let frame = screen.frame
let quarterWidth = floor(frame.width / 4)
if loc.x <= frame.minX + quarterWidth {
if priorAction == .topLeft || priorAction == .topLeftEighth || priorAction == .topCenterLeftEighth {
return SnapArea(screen: screen, directional: directional, action: .topLeftEighth)
}
}
if loc.x >= frame.minX + quarterWidth, loc.x <= frame.midX {
if priorAction == .topLeftEighth || priorAction == .topCenterLeftEighth || priorAction == .topCenterRightEighth {
return SnapArea(screen: screen, directional: directional, action: .topCenterLeftEighth)
}
}
if loc.x >= frame.midX, loc.x <= frame.maxX - quarterWidth {
if priorAction == .topCenterLeftEighth || priorAction == .topCenterRightEighth || priorAction == .topRightEighth {
return SnapArea(screen: screen, directional: directional, action: .topCenterRightEighth)
}
}
if loc.x >= frame.maxX - quarterWidth {
if priorAction == .topRight || priorAction == .topRightEighth || priorAction == .topCenterRightEighth {
return SnapArea(screen: screen, directional: directional, action: .topRightEighth)
}
}
if priorAction == .topLeftEighth || priorAction == .topCenterLeftEighth || priorAction == .topCenterRightEighth || priorAction == .topRightEighth {
return SnapArea(screen: screen, directional: directional, action: .maximize)
}
return SnapArea(screen: screen, directional: directional, action: .maximize)
}
}
struct BottomEighthsCompoundCalculation: CompoundSnapAreaCalculation {
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
guard let priorAction = priorSnapArea?.action else {
return CompoundSnapArea.thirdsCompoundCalculation.snapArea(cursorLocation: loc, screen: screen, directional: directional, priorSnapArea: priorSnapArea)
}
let frame = screen.frame
let quarterWidth = floor(frame.width / 4)
if loc.x <= frame.minX + quarterWidth {
if priorAction == .bottomLeft || priorAction == .bottomLeftEighth || priorAction == .bottomCenterLeftEighth {
return SnapArea(screen: screen, directional: directional, action: .bottomLeftEighth)
}
}
if loc.x >= frame.minX + quarterWidth, loc.x <= frame.midX {
if priorAction == .bottomLeftEighth || priorAction == .bottomCenterLeftEighth || priorAction == .bottomCenterRightEighth {
return SnapArea(screen: screen, directional: directional, action: .bottomCenterLeftEighth)
}
}
if loc.x >= frame.midX, loc.x <= frame.maxX - quarterWidth {
if priorAction == .bottomCenterLeftEighth || priorAction == .bottomCenterRightEighth || priorAction == .bottomRightEighth {
return SnapArea(screen: screen, directional: directional, action: .bottomCenterRightEighth)
}
}
if loc.x >= frame.maxX - quarterWidth {
if priorAction == .bottomRight || priorAction == .bottomRightEighth || priorAction == .bottomCenterRightEighth {
return SnapArea(screen: screen, directional: directional, action: .bottomRightEighth)
}
}
return CompoundSnapArea.thirdsCompoundCalculation.snapArea(cursorLocation: loc, screen: screen, directional: directional, priorSnapArea: priorSnapArea)
}
}
================================================
FILE: Rectangle/Snapping/CompoundSnapArea/FourthsCompoundCalculation.swift
================================================
//
// FourthsCompoundCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 8/24/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
struct FourthsColumnCompoundCalculation: CompoundSnapAreaCalculation {
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
let frame = screen.frame
let quarterWidth = floor(frame.width / 4)
// check first quarter column
if loc.x <= frame.minX + quarterWidth {
return SnapArea(screen: screen, directional: directional, action: .firstFourth)
}
// check second quarter column
if loc.x >= frame.minX + quarterWidth && loc.x <= frame.maxX - quarterWidth*2 {
if let priorAction = priorSnapArea?.action {
if priorAction == .firstFourth || priorAction == .firstThreeFourths {
return SnapArea(screen: screen, directional: directional, action: .firstThreeFourths)
}
if priorAction == .thirdFourth || priorAction == .lastThreeFourths || priorAction == .centerHalf {
return SnapArea(screen: screen, directional: directional, action: .centerHalf)
}
}
return SnapArea(screen: screen, directional: directional, action: .secondFourth)
}
// check third quarter column
if loc.x >= frame.minX + quarterWidth * 2 && loc.x <= frame.maxX - quarterWidth {
if let priorAction = priorSnapArea?.action {
if priorAction == .lastFourth || priorAction == .lastThreeFourths {
return SnapArea(screen: screen, directional: directional, action: .lastThreeFourths)
}
if priorAction == .secondFourth || priorAction == .firstThreeFourths || priorAction == .centerHalf {
return SnapArea(screen: screen, directional: directional, action: .centerHalf)
}
}
return SnapArea(screen: screen, directional: directional, action: .thirdFourth)
}
// check fourth quarter column
if loc.x >= frame.minX + quarterWidth * 2 {
return SnapArea(screen: screen, directional: directional, action: .lastFourth)
}
return nil
}
}
================================================
FILE: Rectangle/Snapping/CompoundSnapArea/HalvesCompoundCalculation.swift
================================================
//
// HalvesCompoundCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 8/23/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
struct LeftTopBottomHalfCalculation: CompoundSnapAreaCalculation {
private let marginTop = Defaults.snapEdgeMarginTop.cgFloat
private let marginBottom = Defaults.snapEdgeMarginBottom.cgFloat
private let ignoredSnapAreas = SnapAreaOption(rawValue: Defaults.ignoredSnapAreas.value)
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
let frame = screen.frame
let shortEdgeSize = CGFloat(Defaults.shortEdgeSnapAreaSize.value)
if loc.y <= frame.minY + marginBottom + shortEdgeSize {
if !ignoredSnapAreas.contains(.bottomLeftShort) {
return SnapArea(screen: screen, directional: directional, action: .bottomHalf)
}
}
if loc.y >= frame.maxY - marginTop - shortEdgeSize {
if !ignoredSnapAreas.contains(.topLeftShort) {
return SnapArea(screen: screen, directional: directional, action: .topHalf)
}
}
return SnapArea(screen: screen, directional: directional, action: .leftHalf)
}
}
struct RightTopBottomHalfCalculation: CompoundSnapAreaCalculation {
private let marginTop = Defaults.snapEdgeMarginTop.cgFloat
private let marginBottom = Defaults.snapEdgeMarginBottom.cgFloat
private let ignoredSnapAreas = SnapAreaOption(rawValue: Defaults.ignoredSnapAreas.value)
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
let frame = screen.frame
let shortEdgeSize = CGFloat(Defaults.shortEdgeSnapAreaSize.value)
if loc.y <= frame.minY + marginBottom + shortEdgeSize {
if !ignoredSnapAreas.contains(.bottomRightShort) {
return SnapArea(screen: screen, directional: directional, action: .bottomHalf)
}
}
if loc.y >= frame.maxY - marginTop - shortEdgeSize {
if !ignoredSnapAreas.contains(.topRightShort) {
return SnapArea(screen: screen, directional: directional, action: .topHalf)
}
}
return SnapArea(screen: screen, directional: directional, action: .rightHalf)
}
}
struct LeftRightHalvesCompoundCalculation: CompoundSnapAreaCalculation {
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
return loc.x < screen.frame.maxX - (screen.frame.width / 2)
? SnapArea(screen: screen, directional: directional, action: .leftHalf)
: SnapArea(screen: screen, directional: directional, action: .rightHalf)
}
}
struct TopBottomHalvesCalculation: CompoundSnapAreaCalculation {
private let marginTop = Defaults.snapEdgeMarginTop.cgFloat
private let marginBottom = Defaults.snapEdgeMarginBottom.cgFloat
private let ignoredSnapAreas = SnapAreaOption(rawValue: Defaults.ignoredSnapAreas.value)
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
let frame = screen.frame
let halfHeight = floor(frame.height / 2)
let shortEdgeSize = Defaults.shortEdgeSnapAreaSize.cgFloat
if loc.y <= frame.minY + marginBottom + shortEdgeSize {
let snapAreaOption: SnapAreaOption = loc.x < frame.midX ? .bottomLeftShort : .bottomRightShort
if !ignoredSnapAreas.contains(snapAreaOption) {
return SnapArea(screen: screen, directional: directional, action: .bottomHalf)
}
}
if loc.y >= frame.maxY - marginTop - shortEdgeSize {
let snapAreaOption: SnapAreaOption = loc.x < frame.midX ? .topLeftShort : .topRightShort
if !ignoredSnapAreas.contains(snapAreaOption) {
return SnapArea(screen: screen, directional: directional, action: .topHalf)
}
}
if loc.y >= frame.minY && loc.y <= frame.minY + halfHeight {
return SnapArea(screen: screen, directional: directional, action: .bottomHalf)
}
if loc.y > frame.minY + halfHeight && loc.y <= frame.maxY {
return SnapArea(screen: screen, directional: directional, action: .topHalf)
}
return nil
}
}
================================================
FILE: Rectangle/Snapping/CompoundSnapArea/SixthsCompoundCalculation.swift
================================================
//
// SixthsCompoundCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 8/23/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
struct TopSixthsCompoundCalculation: CompoundSnapAreaCalculation {
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
guard let priorAction = priorSnapArea?.action
else { return SnapArea(screen: screen, directional: directional, action: .maximize) }
let frame = screen.frame
let thirdWidth = floor(frame.width / 3)
if loc.x <= frame.minX + thirdWidth {
if priorAction == .topLeft || priorAction == .topLeftSixth || priorAction == .topCenterSixth {
return SnapArea(screen: screen, directional: directional, action: .topLeftSixth)
}
}
if loc.x >= frame.maxX - thirdWidth {
if priorAction == .topRight || priorAction == .topRightSixth || priorAction == .topCenterSixth {
return SnapArea(screen: screen, directional: directional, action: .topRightSixth)
}
}
if priorAction == .topLeftSixth || priorAction == .topRightSixth || priorAction == .topCenterSixth {
return SnapArea(screen: screen, directional: directional, action: .topCenterSixth)
} else {
return SnapArea(screen: screen, directional: directional, action: .maximize)
}
}
}
struct BottomSixthsCompoundCalculation: CompoundSnapAreaCalculation {
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
guard let priorAction = priorSnapArea?.action else {
return CompoundSnapArea.thirdsCompoundCalculation.snapArea(cursorLocation: loc, screen: screen, directional: directional, priorSnapArea: priorSnapArea)
}
let frame = screen.frame
let thirdWidth = floor(frame.width / 3)
if loc.x <= frame.minX + thirdWidth {
if priorAction == .bottomLeft || priorAction == .bottomLeftSixth || priorAction == .bottomCenterSixth {
return SnapArea(screen: screen, directional: directional, action: .bottomLeftSixth)
}
}
if loc.x >= frame.minX + thirdWidth, loc.x <= frame.maxX - thirdWidth {
if priorAction == .bottomRightSixth || priorAction == .bottomLeftSixth || priorAction == .bottomCenterSixth {
return SnapArea(screen: screen, directional: directional, action: .bottomCenterSixth)
}
}
if loc.x >= frame.minX + thirdWidth {
if priorAction == .bottomRight || priorAction == .bottomRightSixth || priorAction == .bottomCenterSixth {
return SnapArea(screen: screen, directional: directional, action: .bottomRightSixth)
}
}
return CompoundSnapArea.thirdsCompoundCalculation.snapArea(cursorLocation: loc, screen: screen, directional: directional, priorSnapArea: priorSnapArea)
}
}
================================================
FILE: Rectangle/Snapping/CompoundSnapArea/ThirdsCompoundCalculation.swift
================================================
//
// ThirdsCompoundCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 8/23/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
struct ThirdsCompoundCalculation: CompoundSnapAreaCalculation {
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
let frame = screen.frame
let thirdWidth = floor(frame.width / 3)
if loc.x <= frame.minX + thirdWidth {
return SnapArea(screen: screen, directional: directional, action: .firstThird)
}
if loc.x >= frame.minX + thirdWidth && loc.x <= frame.maxX - thirdWidth{
if let priorAction = priorSnapArea?.action {
let action: WindowAction
switch priorAction {
case .firstThird, .firstTwoThirds:
action = .firstTwoThirds
case .lastThird, .lastTwoThirds:
action = .lastTwoThirds
default: action = .centerThird
}
return SnapArea(screen: screen, directional: directional, action: action)
}
return SnapArea(screen: screen, directional: directional, action: .centerThird)
}
if loc.x >= frame.minX + thirdWidth {
return SnapArea(screen: screen, directional: directional, action: .lastThird)
}
return nil
}
}
struct PortraitSideThirdsCompoundCalculation: CompoundSnapAreaCalculation {
private let marginTop = Defaults.snapEdgeMarginTop.cgFloat
private let marginBottom = Defaults.snapEdgeMarginBottom.cgFloat
private let ignoredSnapAreas = SnapAreaOption(rawValue: Defaults.ignoredSnapAreas.value)
func snapArea(cursorLocation loc: NSPoint, screen: NSScreen, directional: Directional, priorSnapArea: SnapArea?) -> SnapArea? {
let frame = screen.frame
let thirdHeight = floor(frame.height / 3)
let shortEdgeSize = Defaults.shortEdgeSnapAreaSize.cgFloat
if loc.y <= frame.minY + marginBottom + shortEdgeSize {
let snapAreaOption: SnapAreaOption = loc.x < frame.midX ? .bottomLeftShort : .bottomRightShort
if !ignoredSnapAreas.contains(snapAreaOption) {
return SnapArea(screen: screen, directional: directional, action: .bottomHalf)
}
}
if loc.y >= frame.maxY - marginTop - shortEdgeSize {
let snapAreaOption: SnapAreaOption = loc.x < frame.midX ? .topLeftShort : .topRightShort
if !ignoredSnapAreas.contains(snapAreaOption) {
return SnapArea(screen: screen, directional: directional, action: .topHalf)
}
}
if loc.y >= frame.minY && loc.y <= frame.minY + thirdHeight {
return SnapArea(screen: screen, directional: directional, action: .lastThird)
}
if loc.y >= frame.minY + thirdHeight && loc.y <= frame.maxY - thirdHeight {
if let priorAction = priorSnapArea?.action {
let action: WindowAction
switch priorAction {
case .firstThird, .firstTwoThirds:
action = .firstTwoThirds
case .lastThird, .lastTwoThirds:
action = .lastTwoThirds
default: action = .centerThird
}
return SnapArea(screen: screen, directional: directional, action: action)
}
return SnapArea(screen: screen, directional: directional, action: .centerThird)
}
if loc.y >= frame.minY + thirdHeight && loc.y <= frame.maxY {
return SnapArea(screen: screen, directional: directional, action: .firstThird)
}
return nil
}
}
================================================
FILE: Rectangle/Snapping/FootprintWindow.swift
================================================
//
// FootprintWindow.swift
// Rectangle
//
// Created by Ryan Hanson on 10/17/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Cocoa
class FootprintWindow: NSWindow {
private var orderOutCanceled = false
init() {
let initialRect = NSRect(x: 0, y: 0, width: 0, height: 0)
super.init(contentRect: initialRect, styleMask: .titled, backing: .buffered, defer: false)
title = "Rectangle"
isOpaque = false
level = .modalPanel
hasShadow = false
isReleasedWhenClosed = false
alphaValue = Defaults.footprintFade.userDisabled
? CGFloat(Defaults.footprintAlpha.value)
: 0
styleMask.insert(.fullSizeContentView)
titleVisibility = .hidden
titlebarAppearsTransparent = true
collectionBehavior.insert(.transient)
standardWindowButton(.closeButton)?.isHidden = true
standardWindowButton(.miniaturizeButton)?.isHidden = true
standardWindowButton(.zoomButton)?.isHidden = true
standardWindowButton(.toolbarButton)?.isHidden = true
let boxView = NSBox()
boxView.boxType = .custom
boxView.borderColor = .lightGray
boxView.borderWidth = CGFloat(Defaults.footprintBorderWidth.value)
if #available(macOS 26.0, *) {
boxView.cornerRadius = 16
} else if #available(macOS 11.0, *) {
boxView.cornerRadius = 10
} else {
boxView.cornerRadius = 5
}
boxView.wantsLayer = true
boxView.fillColor = Defaults.footprintColor.typedValue?.nsColor ?? NSColor.black
contentView = boxView
}
override var isVisible: Bool {
// Workaround for footprint getting pushed off of Stage Manager
if StageUtil.stageCapable && StageUtil.stageEnabled && StageUtil.stageStripShow {
return true
}
return realIsVisible
}
var realIsVisible: Bool {
if Defaults.footprintFade.userDisabled {
return super.isVisible
} else {
return alphaValue == Defaults.footprintAlpha.cgFloat
}
}
override func orderFront(_ sender: Any?) {
if Defaults.footprintFade.userDisabled {
super.orderFront(sender)
} else {
orderOutCanceled = true
super.orderFront(sender)
animator().alphaValue = Defaults.footprintAlpha.cgFloat
}
}
override func orderOut(_ sender: Any?) {
if Defaults.footprintFade.userDisabled {
super.orderOut(nil)
} else {
orderOutCanceled = false
NSAnimationContext.runAnimationGroup { changes in
animator().alphaValue = 0.0
} completionHandler: {
if !self.orderOutCanceled {
super.orderOut(nil)
}
}
}
}
}
================================================
FILE: Rectangle/Snapping/SnapAreaModel.swift
================================================
//
// SnapAreaModel.swift
// Rectangle
//
// Created by Ryan Hanson on 8/19/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class SnapAreaModel {
static let instance = SnapAreaModel()
private init() {}
static let defaultLandscape: [Directional:SnapAreaConfig] = [
.tl: SnapAreaConfig(action: .topLeft),
.t: SnapAreaConfig(action: .maximize),
.tr: SnapAreaConfig(action: .topRight),
.l: SnapAreaConfig(compound: .leftTopBottomHalf),
.r: SnapAreaConfig(compound: .rightTopBottomHalf),
.bl: SnapAreaConfig(action: .bottomLeft),
.b: SnapAreaConfig(compound: .thirds),
.br: SnapAreaConfig(action: .bottomRight)
]
static let defaultPortrait: [Directional:SnapAreaConfig] = [
.tl: SnapAreaConfig(action: .topLeft),
.t: SnapAreaConfig(action: .maximize),
.tr: SnapAreaConfig(action: .topRight),
.l: SnapAreaConfig(compound: .portraitThirdsSide),
.r: SnapAreaConfig(compound: .portraitThirdsSide),
.bl: SnapAreaConfig(action: .bottomLeft),
.b: SnapAreaConfig(compound: .halves),
.br: SnapAreaConfig(action: .bottomRight)
]
var landscape: [Directional:SnapAreaConfig] {
Defaults.landscapeSnapAreas.typedValue ?? SnapAreaModel.defaultLandscape
}
var portrait: [Directional:SnapAreaConfig] {
Defaults.portraitSnapAreas.typedValue ?? SnapAreaModel.defaultPortrait
}
var isTopConfigured: Bool {
if let landscapeTop = landscape[.t] {
if landscapeTop.action != nil || landscapeTop.compound != nil {
return true
}
}
if NSScreen.portraitDisplayConnected, let portraitTop = portrait[.t] {
if portraitTop.action != nil || portraitTop.compound != nil {
return true
}
}
return false
}
func setConfig(type: DisplayOrientation, directional: Directional, snapAreaConfig: SnapAreaConfig?) {
switch type {
case .landscape: setLandscape(directional: directional, snapAreaConfig: snapAreaConfig)
case .portrait: setPortrait(directional: directional, snapAreaConfig: snapAreaConfig)
}
}
func setLandscape(directional: Directional, snapAreaConfig: SnapAreaConfig?) {
var newConfig = landscape
newConfig[directional] = snapAreaConfig
Defaults.landscapeSnapAreas.typedValue = newConfig
}
func setPortrait(directional: Directional, snapAreaConfig: SnapAreaConfig?) {
var newConfig = portrait
newConfig[directional] = snapAreaConfig
Defaults.portraitSnapAreas.typedValue = newConfig
}
func migrate() {
if Defaults.sixthsSnapArea.userEnabled {
setLandscape(directional: .t, snapAreaConfig: SnapAreaConfig(compound: .topSixths))
setLandscape(directional: .b, snapAreaConfig: SnapAreaConfig(compound: .bottomSixths))
}
let ignoredSnapAreas = SnapAreaOption(rawValue: Defaults.ignoredSnapAreas.value)
guard ignoredSnapAreas.rawValue > 0 else { return }
let directionalToSnapAreaOption: [Directional: SnapAreaOption] = [
.tl: .topLeft,
.t: .top,
.tr: .topRight,
.l: .left,
.r: .right,
.bl: .bottomLeft,
.b: .bottom,
.br: .bottomRight
]
for directional in Directional.cases {
if let option = directionalToSnapAreaOption[directional] {
if ignoredSnapAreas.contains(option) {
setLandscape(directional: directional, snapAreaConfig: nil)
setPortrait(directional: directional, snapAreaConfig: nil)
}
}
}
if ignoredSnapAreas.contains(.bottomLeftShort) && ignoredSnapAreas.contains(.topLeftShort) {
setLandscape(directional: .l, snapAreaConfig: SnapAreaConfig(action: .leftHalf))
}
if ignoredSnapAreas.contains(.bottomRightShort) && ignoredSnapAreas.contains(.topRightShort) {
setLandscape(directional: .r, snapAreaConfig: SnapAreaConfig(action: .rightHalf))
}
}
}
enum DisplayOrientation {
case landscape, portrait
}
struct SnapAreaConfig: Codable {
let compound: CompoundSnapArea?
let action: WindowAction?
init(compound: CompoundSnapArea? = nil, action: WindowAction? = nil) {
self.compound = compound
self.action = action
}
}
enum Directional: Int, Codable {
case tl = 1,
t = 2,
tr = 3,
l = 4,
r = 5,
bl = 6,
b = 7,
br = 8,
c = 9
static var cases = [tl, t, tr, l, r, bl, b, br]
}
struct SnapAreaOption: OptionSet, Hashable {
let rawValue: Int
static let top = SnapAreaOption(rawValue: 1 << 0)
static let bottom = SnapAreaOption(rawValue: 1 << 1)
static let left = SnapAreaOption(rawValue: 1 << 2)
static let right = SnapAreaOption(rawValue: 1 << 3)
static let topLeft = SnapAreaOption(rawValue: 1 << 4)
static let topRight = SnapAreaOption(rawValue: 1 << 5)
static let bottomLeft = SnapAreaOption(rawValue: 1 << 6)
static let bottomRight = SnapAreaOption(rawValue: 1 << 7)
static let topLeftShort = SnapAreaOption(rawValue: 1 << 8)
static let topRightShort = SnapAreaOption(rawValue: 1 << 9)
static let bottomLeftShort = SnapAreaOption(rawValue: 1 << 10)
static let bottomRightShort = SnapAreaOption(rawValue: 1 << 11)
static let all: SnapAreaOption = [.top, .bottom, .left, .right, .topLeft, .topRight, .bottomLeft, .bottomRight, .topLeftShort, .topRightShort, .bottomLeftShort, .bottomRightShort]
static let none: SnapAreaOption = []
}
================================================
FILE: Rectangle/Snapping/SnappingManager.swift
================================================
//
// SnappingManager.swift
// Rectangle
//
// Created by Ryan Hanson on 9/4/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
struct SnapArea: Equatable {
let screen: NSScreen
let directional: Directional
let action: WindowAction
}
class SnappingManager {
private let fullIgnoreIds: [String] = Defaults.fullIgnoreBundleIds.typedValue ?? ["com.install4j",
"com.mathworks.matlab",
"com.live2d.cubism.CECubismEditorApp",
"com.aquafold.datastudio.DataStudio",
"com.adobe.illustrator",
"com.adobe.AfterEffects"]
var eventMonitor: EventMonitor?
var windowElement: AccessibilityElement?
var windowId: CGWindowID?
var windowIdAttempt: Int = 0
var lastWindowIdAttempt: TimeInterval?
var windowMoving: Bool = false
var isFullScreen: Bool = false
var allowListening: Bool = true
var initialWindowRect: CGRect?
var currentSnapArea: SnapArea?
var dragPrevY: Double?
var dragRestrictionExpirationTimestamp: UInt64 = 0
var dragRestrictionExpired: Bool { DispatchTime.now().uptimeMilliseconds > dragRestrictionExpirationTimestamp }
var box: FootprintWindow?
let screenDetection = ScreenDetection()
private let marginTop = Defaults.snapEdgeMarginTop.cgFloat
private let marginBottom = Defaults.snapEdgeMarginBottom.cgFloat
private let marginLeft = Defaults.snapEdgeMarginLeft.cgFloat
private let marginRight = Defaults.snapEdgeMarginRight.cgFloat
init() {
if Defaults.windowSnapping.enabled != false {
enableSnapping()
}
registerWorkspaceChangeNote()
Notification.Name.windowSnapping.onPost { notification in
if let enabled = notification.object as? Bool {
self.allowListening = enabled
}
self.toggleListening()
}
Notification.Name.missionControlDragging.onPost { notification in
self.stopEventMonitor()
self.startEventMonitor()
}
Notification.Name.frontAppChanged.onPost(using: frontAppChanged)
}
func frontAppChanged(notification: Notification) {
if ApplicationToggle.shortcutsDisabled {
DispatchQueue.main.async {
if !Defaults.ignoreDragSnapToo.userDisabled {
self.allowListening = false
self.toggleListening()
} else {
for id in self.fullIgnoreIds {
if ApplicationToggle.frontAppId?.starts(with: id) == true {
self.allowListening = false
self.toggleListening()
break
}
}
}
}
} else {
allowListening = true
checkFullScreen()
}
}
func toggleListening() {
if allowListening, !isFullScreen, !Defaults.windowSnapping.userDisabled {
enableSnapping()
} else {
disableSnapping()
}
}
private func registerWorkspaceChangeNote() {
NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(receiveWorkspaceNote(_:)), name: NSWorkspace.activeSpaceDidChangeNotification, object: nil)
checkFullScreen()
}
func checkFullScreen() {
isFullScreen = AccessibilityElement.getFrontWindowElement()?.isFullScreen == true
toggleListening()
}
@objc func receiveWorkspaceNote(_ notification: Notification) {
checkFullScreen()
}
public func reloadFromDefaults() {
if Defaults.windowSnapping.userDisabled {
if eventMonitor?.running == true {
disableSnapping()
}
} else {
if eventMonitor?.running == true {
if Defaults.missionControlDragging.userDisabled != (eventMonitor is ActiveEventMonitor) {
stopEventMonitor()
startEventMonitor()
}
} else {
enableSnapping()
}
}
}
private func enableSnapping() {
if box == nil {
box = FootprintWindow()
}
if eventMonitor == nil {
startEventMonitor()
}
}
private func disableSnapping() {
box = nil
stopEventMonitor()
}
private func startEventMonitor() {
let mask: NSEvent.EventTypeMask = [.leftMouseDown, .leftMouseUp, .leftMouseDragged]
eventMonitor = Defaults.missionControlDragging.userDisabled ? ActiveEventMonitor(mask: mask, filterer: filter, handler: handle) : PassiveEventMonitor(mask: mask, handler: handle)
eventMonitor?.start()
}
private func stopEventMonitor() {
eventMonitor?.stop()
eventMonitor = nil
}
func filter(event: NSEvent) -> Bool {
switch event.type {
case .leftMouseUp:
dragPrevY = nil
case .leftMouseDragged:
if let cgEvent = event.cgEvent, let screen = NSScreen.main {
let minY = screen.frame.screenFlipped.minY
if cgEvent.location.y == minY && dragPrevY == minY {
if event.deltaY < -Defaults.missionControlDraggingAllowedOffscreenDistance.cgFloat {
cgEvent.location.y = minY + 1
dragRestrictionExpirationTimestamp = DispatchTime.now().uptimeMilliseconds + UInt64(Defaults.missionControlDraggingDisallowedDuration.value)
} else if !dragRestrictionExpired {
cgEvent.location.y = minY + 1
}
}
dragPrevY = cgEvent.location.y
}
default:
break
}
return false
}
func canSnap(_ event: NSEvent) -> Bool {
if Defaults.snapModifiers.value > 0 {
if event.modifierFlags.intersection(.deviceIndependentFlagsMask).rawValue != Defaults.snapModifiers.value {
return false
}
}
if let windowId = windowId {
if StageUtil.stageCapable && StageUtil.stageEnabled && StageUtil.getStageStripWindowGroup(windowId) != nil {
return false
}
}
return true
}
func handle(event: NSEvent) {
switch event.type {
case .leftMouseDown:
if !Defaults.obtainWindowOnClick.userDisabled {
windowElement = AccessibilityElement.getWindowElementUnderCursor()
windowId = windowElement?.getWindowId()
initialWindowRect = windowElement?.frame
}
case .leftMouseUp:
if let currentSnapArea = self.currentSnapArea {
box?.orderOut(nil)
currentSnapArea.action.postSnap(windowElement: windowElement, windowId: windowId, screen: currentSnapArea.screen)
self.currentSnapArea = nil
} else {
// it's possible that the window has moved, but the mouse dragged events are not getting the updated window position
// this typically only happens if the user is dragging and dropping windows really quickly
// in this scenario, the footprint doesn't display but the snap will still occur, as long as the window position is updated as of mouse up.
if let currentRect = windowElement?.frame,
let windowId = windowId,
currentRect.size == initialWindowRect?.size,
currentRect.origin != initialWindowRect?.origin {
unsnapRestore(windowId: windowId, currentRect: currentRect, cursorLoc: event.cgEvent?.location)
if let snapArea = snapAreaContainingCursor(priorSnapArea: currentSnapArea) {
box?.orderOut(nil)
if canSnap(event) {
snapArea.action.postSnap(windowElement: windowElement, windowId: windowId, screen: snapArea.screen)
}
self.currentSnapArea = nil
}
}
}
windowElement = nil
windowId = nil
windowMoving = false
initialWindowRect = nil
windowIdAttempt = 0
lastWindowIdAttempt = nil
case .leftMouseDragged:
if windowId == nil, windowIdAttempt < 20 {
if let lastWindowIdAttempt = lastWindowIdAttempt {
if event.timestamp - lastWindowIdAttempt < 0.1 {
return
}
}
if windowElement == nil {
windowElement = AccessibilityElement.getWindowElementUnderCursor()
}
windowId = windowElement?.getWindowId()
initialWindowRect = windowElement?.frame
windowIdAttempt += 1
lastWindowIdAttempt = event.timestamp
}
guard let currentRect = windowElement?.frame,
let windowId = windowId
else { return }
if !windowMoving {
if let initialWindowRect, (currentRect.size == initialWindowRect.size || currentRect.numSharedEdges(withRect: initialWindowRect) < 2) {
if currentRect.origin != initialWindowRect.origin {
windowMoving = true
unsnapRestore(windowId: windowId, currentRect: currentRect, cursorLoc: event.cgEvent?.location)
}
}
else {
AppDelegate.windowHistory.lastRectangleActions.removeValue(forKey: windowId)
}
}
if windowMoving {
if !canSnap(event) {
if currentSnapArea != nil {
box?.orderOut(nil)
currentSnapArea = nil
}
return
}
if let snapArea = snapAreaContainingCursor(priorSnapArea: currentSnapArea) {
if snapArea == currentSnapArea {
return
}
if Defaults.hapticFeedbackOnSnap.userEnabled {
NSHapticFeedbackManager.defaultPerformer.perform(.alignment, performanceTime: .now)
}
let currentWindow = Window(id: windowId, rect: currentRect)
if let newBoxRect = getBoxRect(hotSpot: snapArea, currentWindow: currentWindow) {
if box == nil {
box = FootprintWindow()
}
if Defaults.footprintAnimationDurationMultiplier.value > 0 {
if !box!.realIsVisible, let origin = getFootprintAnimationOrigin(snapArea, newBoxRect) {
let frame = CGRect(origin: origin, size: .zero)
box!.setFrame(frame, display: false)
}
} else {
box!.setFrame(newBoxRect, display: true)
}
box!.orderFront(nil)
if Defaults.footprintAnimationDurationMultiplier.value > 0 {
NSAnimationContext.runAnimationGroup { changes in
changes.duration = getFootprintAnimationDuration(box!, newBoxRect)
box!.animator().setFrame(newBoxRect, display: true)
}
}
}
currentSnapArea = snapArea
} else {
if currentSnapArea != nil {
box?.orderOut(nil)
currentSnapArea = nil
}
}
}
default:
return
}
}
func unsnapRestore(windowId: CGWindowID, currentRect: CGRect, cursorLoc: CGPoint?) {
if Defaults.unsnapRestore.enabled != false {
// if window was put there by rectangle, restore size
if let lastRect = AppDelegate.windowHistory.lastRectangleActions[windowId]?.rect,
lastRect == initialWindowRect,
let restoreRect = AppDelegate.windowHistory.restoreRects[windowId] {
if let windowElement = windowElement {
if #available(macOS 12, *) { // earlier versions of macOS would stutter the reposition when dragging the window
var newRect = currentRect
newRect.size = restoreRect.size
if let cursorLoc = cursorLoc {
if !newRect.contains(cursorLoc) { // keep the same maxX if possible
newRect.origin = CGPoint(x: currentRect.maxX - newRect.width, y: newRect.minY)
if !newRect.contains(cursorLoc) { // still doesn't contain cursor
newRect.origin = CGPoint(x: cursorLoc.x - (newRect.width / 2), y: newRect.minY)
}
}
}
windowElement.setFrame(newRect, adjustSizeFirst: false)
} else {
windowElement.size = restoreRect.size
}
}
AppDelegate.windowHistory.lastRectangleActions.removeValue(forKey: windowId)
} else {
AppDelegate.windowHistory.restoreRects[windowId] = initialWindowRect
}
}
}
func getFootprintAnimationDuration(_ box: FootprintWindow, _ boxRect: CGRect) -> Double {
return box.animationResizeTime(boxRect) * Double(Defaults.footprintAnimationDurationMultiplier.value)
}
func getFootprintAnimationOrigin(_ snapArea: SnapArea, _ boxRect: CGRect) -> CGPoint? {
switch snapArea.directional {
case .tl:
return CGPoint(x: boxRect.minX, y: boxRect.maxY)
case .t:
return CGPoint(x: boxRect.midX, y: boxRect.maxY)
case .tr:
return CGPoint(x: boxRect.maxX, y: boxRect.maxY)
case .l:
return CGPoint(x: boxRect.minX, y: boxRect.midY)
case .r:
return CGPoint(x: boxRect.maxX, y: boxRect.midY)
case .bl:
return CGPoint(x: boxRect.minX, y: boxRect.minY)
case .b:
return CGPoint(x: boxRect.midX, y: boxRect.minY)
case .br:
return CGPoint(x: boxRect.maxX, y: boxRect.minY)
default:
return nil
}
}
func getBoxRect(hotSpot: SnapArea, currentWindow: Window) -> CGRect? {
if let calculation = WindowCalculationFactory.calculationsByAction[hotSpot.action] {
let ignoreTodo = TodoManager.isTodoWindow(currentWindow.id)
let rectCalcParams = RectCalculationParameters(window: currentWindow, visibleFrameOfScreen: hotSpot.screen.adjustedVisibleFrame(ignoreTodo), action: hotSpot.action, lastAction: nil)
let rectResult = calculation.calculateRect(rectCalcParams)
let gapsApplicable = hotSpot.action.gapsApplicable
if Defaults.gapSize.value > 0, gapsApplicable != .none {
let gapSharedEdges = rectResult.subAction?.gapSharedEdge ?? hotSpot.action.gapSharedEdge
return GapCalculation.applyGaps(rectResult.rect, dimension: gapsApplicable, sharedEdges: gapSharedEdges, gapSize: Defaults.gapSize.value)
}
return rectResult.rect
}
return nil
}
func snapAreaContainingCursor(priorSnapArea: SnapArea?) -> SnapArea? {
let loc = NSEvent.mouseLocation
for screen in NSScreen.screens {
guard let directional = directionalLocationOfCursor(loc: loc, screen: screen)
else { continue }
if let windowId = windowId, Defaults.todo.userEnabled && Defaults.todoMode.enabled && TodoManager.isTodoWindow(windowId) {
if Defaults.todoSidebarSide.value == .left && directional == .l {
return SnapArea(screen: screen, directional: directional, action: .leftTodo)
}
if Defaults.todoSidebarSide.value == .right && directional == .r {
return SnapArea(screen: screen, directional: directional, action: .rightTodo)
}
}
let config = screen.frame.isLandscape
? SnapAreaModel.instance.landscape[directional]
: SnapAreaModel.instance.portrait[directional]
if let action = config?.action {
return SnapArea(screen: screen, directional: directional, action: action)
}
if let compound = config?.compound {
return compound.calculation.snapArea(cursorLocation: loc, screen: screen, directional: directional, priorSnapArea: priorSnapArea)
}
}
return nil
}
func directionalLocationOfCursor(loc: NSPoint, screen: NSScreen) -> Directional? {
let frame = screen.frame
let cornerSize = Defaults.cornerSnapAreaSize.cgFloat
/// cgrect contains doesn't include max edges, so manually compare
guard loc.x >= frame.minX,
loc.x <= frame.maxX,
loc.y >= frame.minY,
loc.y <= frame.maxY
else { return nil }
if loc.x < frame.minX + marginLeft + cornerSize {
if loc.y >= frame.maxY - marginTop - cornerSize {
return .tl
}
if loc.y <= frame.minY + marginBottom + cornerSize {
return .bl
}
if loc.x < frame.minX + marginLeft {
return .l
}
}
if loc.x > frame.maxX - marginRight - cornerSize {
if loc.y >= frame.maxY - marginTop - cornerSize {
return .tr
}
if loc.y <= frame.minY + marginBottom + cornerSize {
return .br
}
if loc.x > frame.maxX - marginRight {
return .r
}
}
if loc.y > frame.maxY - marginTop {
return .t
}
if loc.y < frame.minY + marginBottom {
return .b
}
return nil
}
}
================================================
FILE: Rectangle/SubsequentExecutionMode.swift
================================================
//
// SubsequentExecutionMode.swift
// Rectangle
//
// Created by Ryan Hanson on 8/15/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
enum SubsequentExecutionMode: Int {
case resize = 0 // based on Spectacle
case acrossMonitor = 1
case none = 2
case acrossAndResize = 3 // across monitor for right/left, spectacle resize for all else
case cycleMonitor = 4
case resizeAndCycleQuadrants = 5
}
class SubsequentExecutionDefault: Default {
public private(set) var key: String = "subsequentExecutionMode"
private var initialized = false
var value: SubsequentExecutionMode {
didSet {
if initialized {
UserDefaults.standard.set(value.rawValue, forKey: key)
}
}
}
init() {
let intValue = UserDefaults.standard.integer(forKey: key)
value = SubsequentExecutionMode(rawValue: intValue) ?? .resize
initialized = true
}
var resizes: Bool {
switch value {
case .resize, .acrossAndResize, .resizeAndCycleQuadrants: return true
default: return false
}
}
var cyclesQuadrantPositions: Bool {
switch value {
case .resizeAndCycleQuadrants: return true
default: return false
}
}
var traversesDisplays: Bool {
switch value {
case .acrossMonitor, .acrossAndResize: return true
default: return false
}
}
func load(from codable: CodableDefault) {
if let int = codable.int,
let mode = SubsequentExecutionMode(rawValue: int) {
value = mode
}
}
func toCodable() -> CodableDefault {
return CodableDefault(int: value.rawValue)
}
}
================================================
FILE: Rectangle/TitleBarManager.swift
================================================
//
// TitleBarManager.swift
// Rectangle
//
// Copyright © 2023 Ryan Hanson. All rights reserved.
//
import Foundation
class TitleBarManager {
private var eventMonitor: EventMonitor!
private var lastEventNumber: Int?
init() {
eventMonitor = PassiveEventMonitor(mask: .leftMouseUp, handler: handle)
toggleListening()
Notification.Name.windowTitleBar.onPost { notification in
self.toggleListening()
}
Notification.Name.configImported.onPost { notification in
self.toggleListening()
}
}
private func toggleListening() {
if WindowAction(rawValue: Defaults.doubleClickTitleBar.value - 1) != nil {
eventMonitor.start()
} else {
eventMonitor.stop()
}
}
private func handle(_ event: NSEvent) {
guard
event.type == .leftMouseUp,
event.clickCount == 2,
event.eventNumber != lastEventNumber,
TitleBarManager.systemSettingDisabled,
let action = WindowAction(rawValue: Defaults.doubleClickTitleBar.value - 1),
case let location = NSEvent.mouseLocation.screenFlipped,
let element = AccessibilityElement(location)?.getSelfOrChildElementRecursively(location),
let windowElement = element.windowElement,
var titleBarFrame = windowElement.titleBarFrame
else {
return
}
lastEventNumber = event.eventNumber
var bundleIdentifier: String?
if let pid = element.pid {
bundleIdentifier = NSRunningApplication(processIdentifier: pid)?.bundleIdentifier
}
if let toolbarFrame = windowElement.getChildElement(.toolbar)?.frame, toolbarFrame != .null {
if let bundleIdentifier,
let toolbarIgnoredIds = Defaults.doubleClickToolBarIgnoredApps.typedValue,
toolbarIgnoredIds.contains(bundleIdentifier) {
// don't add the toolbar frame to the title bar
} else {
titleBarFrame = titleBarFrame.union(toolbarFrame)
}
}
guard
titleBarFrame.contains(location),
element.isWindow == true || element.isToolbar == true || element.isGroup == true || element.isTabGroup == true || element.isStaticText == true
else {
return
}
if let bundleIdentifier,
let ignoredApps = Defaults.doubleClickTitleBarIgnoredApps.typedValue,
ignoredApps.contains(bundleIdentifier) {
return
}
if Defaults.doubleClickTitleBarRestore.enabled != false,
let windowId = windowElement.windowId,
case let windowFrame = windowElement.frame,
windowFrame != .null,
let historyAction = AppDelegate.windowHistory.lastRectangleActions[windowId],
historyAction.action == action,
historyAction.rect == windowFrame {
WindowAction.restore.postTitleBar(windowElement: windowElement)
return
}
action.postTitleBar(windowElement: windowElement)
}
}
extension TitleBarManager {
static var systemSettingDisabled: Bool {
UserDefaults(suiteName: ".GlobalPreferences")?.string(forKey: "AppleActionOnDoubleClick") == "None"
}
}
================================================
FILE: Rectangle/TodoMode/TodoManager.swift
================================================
//
// TodoManager.swift
// Rectangle
//
// Created by Ryan Hanson on 1/18/21.
// Copyright © 2021 Ryan Hanson. All rights reserved.
//
import Cocoa
import MASShortcut
class TodoManager {
private static var todoWindowId: CGWindowID?
static var todoScreen : NSScreen?
static let toggleDefaultsKey = "toggleTodo"
static let reflowDefaultsKey = "reflowTodo"
static let defaultsKeys = [toggleDefaultsKey, reflowDefaultsKey]
static func setTodoMode(_ enabled: Bool, _ bringToFront: Bool = true) {
Defaults.todoMode.enabled = enabled
registerUnregisterReflowShortcut()
moveAllIfNeeded(bringToFront)
}
static func initToggleShortcut() {
if UserDefaults.standard.dictionary(forKey: toggleDefaultsKey) == nil {
guard let dictTransformer = ValueTransformer(forName: NSValueTransformerName(rawValue: MASDictionaryTransformerName)) else { return }
let toggleShortcut = MASShortcut(keyCode: kVK_ANSI_B,
modifierFlags: [NSEvent.ModifierFlags.control, NSEvent.ModifierFlags.option])
let toggleShortcutDict = dictTransformer.reverseTransformedValue(toggleShortcut)
UserDefaults.standard.set(toggleShortcutDict, forKey: toggleDefaultsKey)
}
}
static func initReflowShortcut() {
if UserDefaults.standard.dictionary(forKey: reflowDefaultsKey) == nil {
guard let dictTransformer = ValueTransformer(forName: NSValueTransformerName(rawValue: MASDictionaryTransformerName)) else { return }
let reflowShortcut = MASShortcut(keyCode: kVK_ANSI_N,
modifierFlags: [NSEvent.ModifierFlags.control, NSEvent.ModifierFlags.option])
let reflowShortcutDict = dictTransformer.reverseTransformedValue(reflowShortcut)
UserDefaults.standard.set(reflowShortcutDict, forKey: reflowDefaultsKey)
}
}
private static func registerToggleShortcut() {
MASShortcutBinder.shared()?.bindShortcut(withDefaultsKey: toggleDefaultsKey, toAction: {
let enabled = !Defaults.todoMode.enabled
setTodoMode(enabled)
})
}
private static func registerReflowShortcut() {
MASShortcutBinder.shared()?.bindShortcut(withDefaultsKey: reflowDefaultsKey, toAction: {
moveAll()
})
}
private static func unregisterToggleShortcut() {
MASShortcutBinder.shared()?.breakBinding(withDefaultsKey: toggleDefaultsKey)
}
private static func unregisterReflowShortcut() {
MASShortcutBinder.shared()?.breakBinding(withDefaultsKey: reflowDefaultsKey)
}
static func registerUnregisterToggleShortcut() {
if Defaults.todo.userEnabled {
registerToggleShortcut()
} else {
unregisterToggleShortcut()
}
}
static func registerUnregisterReflowShortcut() {
if Defaults.todo.userEnabled && Defaults.todoMode.enabled {
registerReflowShortcut()
} else {
unregisterReflowShortcut()
}
}
static func getToggleKeyDisplay() -> (String?, NSEvent.ModifierFlags)? {
guard
let shortcutDict = UserDefaults.standard.dictionary(forKey: toggleDefaultsKey),
let dictTransformer = ValueTransformer(forName: NSValueTransformerName(rawValue: MASDictionaryTransformerName)),
let shortcut = dictTransformer.transformedValue(shortcutDict) as? MASShortcut
else {
return nil
}
return (shortcut.keyCodeStringForKeyEquivalent, shortcut.modifierFlags)
}
static func getReflowKeyDisplay() -> (String?, NSEvent.ModifierFlags)? {
guard
let shortcutDict = UserDefaults.standard.dictionary(forKey: reflowDefaultsKey),
let dictTransformer = ValueTransformer(forName: NSValueTransformerName(rawValue: MASDictionaryTransformerName)),
let shortcut = dictTransformer.transformedValue(shortcutDict) as? MASShortcut
else {
return nil
}
return (shortcut.keyCodeStringForKeyEquivalent, shortcut.modifierFlags)
}
private static func getTodoWindowElement() -> AccessibilityElement? {
guard let bundleId = Defaults.todoApplication.value, let windowElements = AccessibilityElement(bundleId)?.windowElements else {
todoWindowId = nil
return nil
}
if let windowId = todoWindowId, !(windowElements.contains { $0.windowId == windowId }) {
todoWindowId = nil
}
if todoWindowId == nil {
todoWindowId = windowElements.first?.windowId
}
if let windowId = todoWindowId, let windowElement = (windowElements.first { $0.windowId == windowId }) {
return windowElement
}
todoWindowId = nil
return nil
}
static func hasTodoWindow() -> Bool {
return getTodoWindowElement() != nil
}
static func isTodoWindowFront() -> Bool {
guard let windowElement = AccessibilityElement.getFrontWindowElement() else { return false }
return isTodoWindow(windowElement)
}
static func isTodoWindow(_ windowElement: AccessibilityElement) -> Bool {
guard let windowId = windowElement.windowId else { return false }
return isTodoWindow(windowId)
}
static func isTodoWindow(_ windowId: CGWindowID) -> Bool {
return getTodoWindowElement()?.windowId == windowId
}
static func resetTodoWindow() {
todoWindowId = nil
_ = getTodoWindowElement()
}
static func moveAll(_ bringToFront: Bool = true) {
TodoManager.refreshTodoScreen()
let pid = ProcessInfo.processInfo.processIdentifier
// Avoid footprint window
let windows = AccessibilityElement.getAllWindowElements().filter { $0.pid != pid }
if let todoWindow = getTodoWindowElement() {
if let screen = TodoManager.todoScreen {
let sd = ScreenDetection()
var adjustedVisibleFrame = screen.adjustedVisibleFrame()
// Clear all windows from the todo app sidebar
for w in windows {
let wScreen = sd.detectScreens(using: w)?.currentScreen
if w.getWindowId() != todoWindow.getWindowId() &&
wScreen == TodoManager.todoScreen {
shiftWindowOffSidebar(w, screenVisibleFrame: adjustedVisibleFrame)
}
}
adjustedVisibleFrame = screen.adjustedVisibleFrame(true)
let sidebarWidth = getSidebarWidth(visibleFrameWidth: adjustedVisibleFrame.width)
var sharedEdge: Edge
var rect = adjustedVisibleFrame
let isRightSide = Defaults.todoSidebarSide.value == .right
sharedEdge = isRightSide ? .left : .right
if isRightSide {
rect.origin.x = adjustedVisibleFrame.maxX - sidebarWidth
}
rect.size.width = sidebarWidth
rect = rect.screenFlipped
if Defaults.gapSize.value > 0 {
rect = GapCalculation.applyGaps(rect, sharedEdges: sharedEdge, gapSize: Defaults.gapSize.value)
}
todoWindow.setFrame(rect)
}
if bringToFront {
todoWindow.bringToFront()
}
}
}
static func getSidebarWidth(visibleFrameWidth: CGFloat) -> CGFloat {
var sidebarWidth = Defaults.todoSidebarWidth.cgFloat
if sidebarWidth > 0 && sidebarWidth <= 1 {
sidebarWidth = sidebarWidth * visibleFrameWidth
} else if Defaults.todoSidebarWidthUnit.value == .pct {
sidebarWidth = convert(width: sidebarWidth, toUnit: .pixels, visibleFrameWidth: visibleFrameWidth)
}
return sidebarWidth
}
static func convert(width: CGFloat, toUnit unit: TodoSidebarWidthUnit, visibleFrameWidth: CGFloat) -> CGFloat {
unit == .pixels
? ((width * 0.01) * visibleFrameWidth).rounded()
: ((width / visibleFrameWidth) * 100).rounded()
}
static func moveAllIfNeeded(_ bringToFront: Bool = true) {
guard Defaults.todo.userEnabled && Defaults.todoMode.enabled else { return }
moveAll(bringToFront)
}
static func refreshTodoScreen() {
let todoWindow = getTodoWindowElement()
let screens = ScreenDetection().detectScreens(using: todoWindow)
TodoManager.todoScreen = screens?.currentScreen
}
private static func shiftWindowOffSidebar(_ w: AccessibilityElement, screenVisibleFrame: CGRect) {
var rect = w.frame
let halfGapWidth = CGFloat(Defaults.gapSize.value) / 2
let screenVisibleFrameMinX = screenVisibleFrame.minX + halfGapWidth
let screenVisibleFrameMaxX = screenVisibleFrame.maxX - halfGapWidth
if Defaults.todoSidebarSide.value == .left && rect.minX < screenVisibleFrameMinX {
// Shift it to the right
rect.origin.x = min(screenVisibleFrame.maxX - rect.width, rect.origin.x + (screenVisibleFrameMinX - rect.minX))
// If it's still too wide, scale it down
if rect.minX < screenVisibleFrameMinX {
let widthDiff = screenVisibleFrameMinX - rect.minX
rect.origin.x += widthDiff
rect.size.width -= widthDiff
}
w.setFrame(rect)
} else if Defaults.todoSidebarSide.value == .right && rect.maxX > screenVisibleFrameMaxX {
// Shift it to the left
rect.origin.x = min(rect.origin.x, max(screenVisibleFrame.minX, rect.origin.x - (rect.maxX - screenVisibleFrameMaxX)))
// If it's still too wide, scale it down
if rect.maxX > screenVisibleFrameMaxX {
rect.size.width -= rect.maxX - screenVisibleFrameMaxX
}
w.setFrame(rect)
}
}
static func execute(parameters: ExecutionParameters) -> Bool {
if [.leftTodo, .rightTodo].contains(parameters.action) {
moveAll()
return true
}
return false
}
}
enum TodoSidebarSide: Int {
case right = 1
case left = 2
}
enum TodoSidebarWidthUnit: Int, CustomStringConvertible {
case pixels = 1
case pct = 2
var description: String {
switch self {
case .pixels:
return "px"
case .pct:
return "%"
}
}
}
================================================
FILE: Rectangle/Utilities/AXExtension.swift
================================================
//
// AXExtension.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
extension NSAccessibility.Attribute {
static let enhancedUserInterface = NSAccessibility.Attribute(rawValue: "AXEnhancedUserInterface")
static let windowIds = NSAccessibility.Attribute(rawValue: "AXWindowsIDs")
}
extension AXValue {
func toValue() -> T? {
let pointer = UnsafeMutablePointer.allocate(capacity: 1)
let success = AXValueGetValue(self, AXValueGetType(self), pointer)
let value = pointer.pointee
pointer.deallocate()
return success ? value : nil
}
static func from(value: T, type: AXValueType) -> AXValue? {
var value = value
return withUnsafePointer(to: &value) { valuePointer in
AXValueCreate(type, valuePointer)
}
}
}
extension AXUIElement {
static let systemWide = AXUIElementCreateSystemWide()
func isValueSettable(_ attribute: NSAccessibility.Attribute) -> Bool? {
var isSettable = DarwinBoolean(false)
let result = AXUIElementIsAttributeSettable(self, attribute.rawValue as CFString, &isSettable)
guard result == .success else { return nil }
return isSettable.boolValue
}
func getValue(_ attribute: NSAccessibility.Attribute) -> AnyObject? {
var value: AnyObject?
let result = AXUIElementCopyAttributeValue(self, attribute.rawValue as CFString, &value)
guard result == .success else { return nil }
return value
}
func getWrappedValue(_ attribute: NSAccessibility.Attribute) -> T? {
guard let value = getValue(attribute), CFGetTypeID(value) == AXValueGetTypeID() else { return nil }
return (value as! AXValue).toValue()
}
private func setValue(_ attribute: NSAccessibility.Attribute, _ value: AnyObject) {
AXUIElementSetAttributeValue(self, attribute.rawValue as CFString, value)
}
func setValue(_ attribute: NSAccessibility.Attribute, _ value: Bool) {
setValue(attribute, value as CFBoolean)
}
private func setWrappedValue(_ attribute: NSAccessibility.Attribute, _ value: T, _ type: AXValueType) {
guard let value = AXValue.from(value: value, type: type) else { return }
setValue(attribute, value)
}
func setValue(_ attribute: NSAccessibility.Attribute, _ value: CGPoint) {
setWrappedValue(attribute, value, .cgPoint)
}
func setValue(_ attribute: NSAccessibility.Attribute, _ value: CGSize) {
setWrappedValue(attribute, value, .cgSize)
}
func getElementAtPosition(_ position: CGPoint) -> AXUIElement? {
var element: AXUIElement?
let result = AXUIElementCopyElementAtPosition(self, Float(position.x), Float(position.y), &element)
guard result == .success else { return nil }
return element
}
func getPid() -> pid_t? {
var pid = pid_t(0)
let result = AXUIElementGetPid(self, &pid)
guard result == .success else { return nil }
return pid
}
func getWindowId() -> CGWindowID? {
var windowId = CGWindowID(0)
let result = _AXUIElementGetWindow(self, &windowId)
guard result == .success else { return nil }
return windowId
}
}
================================================
FILE: Rectangle/Utilities/AlertUtil.swift
================================================
//
// AlertUtil.swift
// Rectangle
//
// Created by Ryan Hanson on 4/26/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Cocoa
class AlertUtil {
static func oneButtonAlert(question: String, text: String, confirmText: String = "OK") {
let alert = NSAlert()
alert.messageText = question
alert.informativeText = text
alert.alertStyle = .warning
alert.addButton(withTitle: confirmText)
alert.runModal()
}
static func twoButtonAlert(question: String, text: String, confirmText: String = "OK", cancelText: String = "Cancel") -> NSApplication.ModalResponse {
let alert = NSAlert()
alert.messageText = question
alert.informativeText = text
alert.alertStyle = .warning
alert.addButton(withTitle: confirmText)
alert.addButton(withTitle: cancelText)
return alert.runModal()
}
static func threeButtonAlert(question: String, text: String, buttonOneText: String, buttonTwoText: String, buttonThreeText: String) -> NSApplication.ModalResponse {
let alert = NSAlert()
alert.messageText = question
alert.informativeText = text
alert.alertStyle = .warning
alert.addButton(withTitle: buttonOneText)
alert.addButton(withTitle: buttonTwoText)
alert.addButton(withTitle: buttonThreeText)
return alert.runModal()
}
}
================================================
FILE: Rectangle/Utilities/CFExtension.swift
================================================
//
// CFExtension.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
extension CFArray {
func getValue(_ index: CFIndex) -> T {
return unsafeBitCast(CFArrayGetValueAtIndex(self, index), to: T.self)
}
func getCount() -> CFIndex {
return CFArrayGetCount(self)
}
}
extension CFDictionary {
func getValue(_ key: CFString) -> T {
return unsafeBitCast(CFDictionaryGetValue(self, unsafeBitCast(key, to: UnsafeRawPointer.self)), to: T.self)
}
}
================================================
FILE: Rectangle/Utilities/CGExtension.swift
================================================
//
// CGExtension.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
extension CGPoint {
var screenFlipped: CGPoint {
.init(x: x, y: NSScreen.screens[0].frame.maxY - y)
}
}
extension CGRect {
var screenFlipped: CGRect {
guard !isNull else {
return self
}
return .init(origin: .init(x: origin.x, y: NSScreen.screens[0].frame.maxY - maxY), size: size)
}
var isLandscape: Bool { width > height }
var centerPoint: CGPoint {
NSMakePoint(NSMidX(self), NSMidY(self))
}
func numSharedEdges(withRect rect: CGRect) -> Int {
var sharedEdgeCount = 0
if minX == rect.minX { sharedEdgeCount += 1 }
if maxX == rect.maxX { sharedEdgeCount += 1 }
if minY == rect.minY { sharedEdgeCount += 1 }
if maxY == rect.maxY { sharedEdgeCount += 1 }
return sharedEdgeCount
}
}
================================================
FILE: Rectangle/Utilities/CUtil.swift
================================================
//
// CUtil.swift
// Rectangle
//
// Created by Ryan Hanson on 6/12/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class CUtil {
// bridge object into a pointer to pass into C function
static func bridge(obj : T) -> UnsafeMutableRawPointer {
return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque())
}
// bridge pointer back into an object within C function
static func bridge(ptr : UnsafeMutableRawPointer) -> T {
return Unmanaged.fromOpaque(ptr).takeUnretainedValue()
}
}
================================================
FILE: Rectangle/Utilities/Debounce.swift
================================================
//
// Debounce.swift
// Rectangle
//
// Created by Ryan Hanson on 10/7/21.
// Copyright © 2021 Ryan Hanson. All rights reserved.
//
import Foundation
import Dispatch
class Debounce {
private init() {}
static func input(_ input: T,
comparedAgainst current: @escaping @autoclosure () -> (T),
perform: @escaping (T) -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
if input == current() { perform(input) }
}
}
}
================================================
FILE: Rectangle/Utilities/DispatchTimeExtension.swift
================================================
//
// DispatchTimeExtension.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
extension DispatchTime {
var uptimeMilliseconds: UInt64 { uptimeNanoseconds / 1_000_000 }
}
================================================
FILE: Rectangle/Utilities/EventMonitor.swift
================================================
//
// EventMonitor.swift
// Rectangle
//
// Created by Ryan Hanson on 9/4/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
protocol EventMonitor {
var running: Bool { get }
func start()
func stop()
}
public class PassiveEventMonitor: EventMonitor {
private var localMonitor: Any?
private var globalMonitor: Any?
private let mask: NSEvent.EventTypeMask
private let handler: (NSEvent) -> Void
var running: Bool { localMonitor != nil && globalMonitor != nil }
public init(mask: NSEvent.EventTypeMask, handler: @escaping (NSEvent) -> Void) {
self.mask = mask
self.handler = handler
}
deinit {
stop()
}
public func start() {
localMonitor = NSEvent.addLocalMonitorForEvents(matching: mask) { event in
self.handler(event)
return event
}
globalMonitor = NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler)
}
public func stop() {
if localMonitor != nil {
NSEvent.removeMonitor(localMonitor!)
localMonitor = nil
}
if globalMonitor != nil {
NSEvent.removeMonitor(globalMonitor!)
globalMonitor = nil
}
}
}
public class ActiveEventMonitor: EventMonitor {
private var tap: CFMachPort?
private var thread: RunLoopThread?
private let mask: NSEvent.EventTypeMask
public let filterer: (NSEvent) -> Bool
public let handler: (NSEvent) -> Void
var running: Bool { tap != nil }
public init(mask: NSEvent.EventTypeMask, filterer: @escaping (NSEvent) -> Bool, handler: @escaping (NSEvent) -> Void) {
self.mask = mask
self.filterer = filterer
self.handler = handler
}
deinit {
stop()
}
public func start() {
tap = CGEvent.tapCreate(tap: .cgSessionEventTap, place: .headInsertEventTap, options: .defaultTap, eventsOfInterest: mask.rawValue, callback: tapCallback, userInfo: CUtil.bridge(obj: self))
if let tap = tap {
thread = RunLoopThread(mode: .default, qualityOfService: .userInteractive, start: true)
thread!.runLoop!.add(tap, forMode: .default)
}
}
public func stop() {
if let tap = tap {
thread!.runLoop!.remove(tap, forMode: .default)
thread!.cancel()
thread = nil
CGEvent.tapEnable(tap: tap, enable: false)
}
tap = nil
}
}
fileprivate func tapCallback(proxy: CGEventTapProxy, type: CGEventType, event: CGEvent, refcon: UnsafeMutableRawPointer?) -> Unmanaged? {
var filtered = false
if let ptr = refcon {
let eventMonitor = CUtil.bridge(ptr: ptr) as ActiveEventMonitor
if type == .tapDisabledByTimeout || type == .tapDisabledByUserInput {
eventMonitor.stop()
eventMonitor.start()
} else {
if let nsEvent = NSEvent(cgEvent: event) {
filtered = eventMonitor.filterer(nsEvent)
DispatchQueue.main.async { eventMonitor.handler(nsEvent) }
}
}
}
return filtered ? nil : Unmanaged.passUnretained(event)
}
================================================
FILE: Rectangle/Utilities/MASShortcutMigration.swift
================================================
//
// MASShortcutMigration.swift
// Rectangle
//
// Created by Ryan Hanson on 12/22/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
import MASShortcut
class MASShortcutMigration {
static func migrate() {
guard let dataTransformer = ValueTransformer(forName: .secureUnarchiveFromDataTransformerName) else { return }
guard let dictTransformer = ValueTransformer(forName: NSValueTransformerName(rawValue: MASDictionaryTransformerName)) else { return }
for action in WindowAction.active {
if let dataValue = UserDefaults.standard.data(forKey: action.name) {
if let shortcut = dataTransformer.transformedValue(dataValue) {
let dictValue = dictTransformer.reverseTransformedValue(shortcut)
UserDefaults.standard.setValue(dictValue, forKey: action.name)
}
}
}
}
}
================================================
FILE: Rectangle/Utilities/MacTilingDefaults.swift
================================================
//
// MacTilingDefaults.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
/// Read / disable the user defaults values for the macOS built-in window tiling, added in macOS 15 Sequoia.
/// These are toggled in the Desktop & Dock System Settings Pane:
enum MacTilingDefaults: String {
case tilingByEdgeDrag = "EnableTilingByEdgeDrag"
case tilingOptionAccelerator = "EnableTilingOptionAccelerator"
case tiledWindowMargins = "EnableTiledWindowMargins"
case topTilingByEdgeDrag = "EnableTopTilingByEdgeDrag"
var enabled: Bool {
guard #available(macOS 15, *), let defaults = UserDefaults(suiteName: "com.apple.WindowManager")
else {
return false
}
if defaults.object(forKey: self.rawValue) == nil { // These are enabled by default
return true
}
return defaults.bool(forKey: self.rawValue)
}
func disable() {
guard let defaults = UserDefaults(suiteName: "com.apple.WindowManager")
else {
return
}
defaults.set(false, forKey: self.rawValue)
defaults.synchronize()
}
static func openSystemSettings() {
NSWorkspace.shared.open(URL(string:"x-apple.systempreferences:com.apple.preference.Desktop-Settings.extension")!)
}
static func checkForBuiltInTiling(skipIfAlreadyNotified: Bool) {
guard #available(macOS 15, *), !Defaults.windowSnapping.userDisabled
else { return }
let isStandardTilingConflicting = (tilingByEdgeDrag.enabled || tilingOptionAccelerator.enabled)
let shouldSkipStandardCheck = skipIfAlreadyNotified && Defaults.internalTilingNotified.enabled
if isStandardTilingConflicting && !shouldSkipStandardCheck {
resolveStandardTilingConflict()
} else if isTopTilingConflicting {
resolveTopTilingConflict()
}
Defaults.internalTilingNotified.enabled = true
}
private static func resolveTopTilingConflict() {
Logger.log("Automatically disabling macOS top edge tiling to resolve conflict with macOS.")
topTilingByEdgeDrag.disable()
if !Defaults.internalTilingNotified.enabled {
// First time running Rectangle & only has drag to top enabled in macOS
let result = AlertUtil.twoButtonAlert(
question: "Top screen edge tiling in macOS is now disabled".localized,
text: "To adjust macOS tiling, go to System Settings → Desktop & Dock → Windows".localized,
cancelText: "Open System Settings".localized)
if result == .alertSecondButtonReturn {
openSystemSettings()
}
}
}
private static var isTopTilingConflicting: Bool {
guard #available(macOS 15.1, *) else { return false }
return topTilingByEdgeDrag.enabled && SnapAreaModel.instance.isTopConfigured
}
private static func resolveStandardTilingConflict() {
let result = AlertUtil.threeButtonAlert(
question: "Conflict with macOS tiling".localized,
text: "Drag to screen edge tiling is enabled in both Rectangle and macOS.".localized,
buttonOneText: "Disable in macOS".localized,
buttonTwoText: "Disable in Rectangle".localized,
buttonThreeText: "Dismiss".localized)
switch result {
case .alertFirstButtonReturn:
disableMacTiling()
let result = AlertUtil.twoButtonAlert(
question: "Tiling in macOS has been disabled".localized,
text: "To re-enable it, go to System Settings → Desktop & Dock → Windows".localized,
cancelText: "Open System Settings".localized)
if result == .alertSecondButtonReturn {
openSystemSettings()
}
case .alertSecondButtonReturn:
Defaults.windowSnapping.enabled = false
Notification.Name.windowSnapping.post(object: false)
let result = AlertUtil.twoButtonAlert(
question: "Tiling in Rectangle has been disabled".localized,
text: "To adjust macOS tiling, go to System Settings → Desktop & Dock → Windows".localized,
cancelText: "Open System Settings".localized)
if result == .alertSecondButtonReturn {
openSystemSettings()
}
default:
break
}
}
private static func disableMacTiling() {
tilingByEdgeDrag.disable()
tilingOptionAccelerator.disable()
topTilingByEdgeDrag.disable()
}
}
================================================
FILE: Rectangle/Utilities/NSImageExtension.swift
================================================
//
// NSImageExtension.swift
// Rectangle
//
// Created by Ryan Hanson on 4/9/21.
// Copyright © 2021 Ryan Hanson. All rights reserved.
//
import Cocoa
extension NSImage {
func rotated(by degrees: CGFloat) -> NSImage {
let sinDegrees = abs(sin(degrees * CGFloat.pi / 180.0))
let cosDegrees = abs(cos(degrees * CGFloat.pi / 180.0))
let newSize = CGSize(width: size.height * sinDegrees + size.width * cosDegrees,
height: size.width * sinDegrees + size.height * cosDegrees)
let imageBounds = NSRect(x: (newSize.width - size.width) / 2,
y: (newSize.height - size.height) / 2,
width: size.width, height: size.height)
let otherTransform = NSAffineTransform()
otherTransform.translateX(by: newSize.width / 2, yBy: newSize.height / 2)
otherTransform.rotate(byDegrees: degrees)
otherTransform.translateX(by: -newSize.width / 2, yBy: -newSize.height / 2)
let rotatedImage = NSImage(size: newSize)
rotatedImage.lockFocus()
otherTransform.concat()
draw(in: imageBounds, from: CGRect.zero, operation: NSCompositingOperation.copy, fraction: 1.0)
rotatedImage.unlockFocus()
return rotatedImage
}
}
================================================
FILE: Rectangle/Utilities/NotificationExtension.swift
================================================
//
// NotificationExtension.swift
// Rectangle
//
// Created by Ryan Hanson on 12/23/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Cocoa
extension Notification.Name {
static let configImported = Notification.Name("configImported")
static let windowSnapping = Notification.Name("windowSnapping")
static let frontAppChanged = Notification.Name("frontAppChanged")
static let allowAnyShortcut = Notification.Name("allowAnyShortcutToggle")
static let changeDefaults = Notification.Name("changeDefaults")
static let todoMenuToggled = Notification.Name("todoMenuToggled")
static let appWillBecomeActive = Notification.Name("appWillBecomeActive")
static let missionControlDragging = Notification.Name("missionControlDragging")
static let menuBarIconHidden = Notification.Name("menuBarIconHidden")
static let windowTitleBar = Notification.Name("windowTitleBar")
static let defaultSnapAreas = Notification.Name("defaultSnapAreas")
static let updateAvailability = Notification.Name("updateAvailability")
static let showAdditionalSizesInMenuChanged = Notification.Name("showAdditionalSizesInMenuChanged")
func post(
center: NotificationCenter = NotificationCenter.default,
object: Any? = nil,
userInfo: [AnyHashable : Any]? = nil) {
center.post(name: self, object: object, userInfo: userInfo)
}
@discardableResult
func onPost(
center: NotificationCenter = NotificationCenter.default,
object: Any? = nil,
queue: OperationQueue? = nil,
using: @escaping (Notification) -> Void)
-> NSObjectProtocol {
return center.addObserver(
forName: self,
object: object,
queue: queue,
using: using)
}
}
================================================
FILE: Rectangle/Utilities/RunLoopThread.swift
================================================
//
// RunLoopThread.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class RunLoopThread: Thread {
private let startSemaphore = DispatchSemaphore(value: 0)
private let mode: RunLoop.Mode
private(set) var runLoop: RunLoop?
init(mode: RunLoop.Mode, qualityOfService: QualityOfService? = nil, start: Bool = false) {
self.mode = mode
super.init()
if let qualityOfService = qualityOfService { self.qualityOfService = qualityOfService }
if start { self.start() }
}
override func start() {
super.start()
startSemaphore.wait()
}
override func main() {
runLoop = RunLoop.current
startSemaphore.signal()
while !isCancelled {
if !runLoop!.run(mode: mode, before: .distantFuture) {
Thread.sleep(forTimeInterval: 0.1)
}
}
}
}
================================================
FILE: Rectangle/Utilities/SequenceExtension.swift
================================================
//
// SequenceExtension.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
extension Sequence {
func uniqueMap(_ transform: (Element) -> T) -> [T] where T: Hashable {
var set = Set()
var array = Array()
for element in self {
let element = transform(element)
if set.insert(element).inserted {
array.append(element)
}
}
return array
}
}
================================================
FILE: Rectangle/Utilities/StageUtil.swift
================================================
//
// StageUtil.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class StageUtil {
private static let windowManagerDefaults = UserDefaults(suiteName: "com.apple.WindowManager")
private static let dockDefaults = UserDefaults(suiteName: "com.apple.dock")
static var stageCapable: Bool {
guard #available(macOS 13, *) else {
return false
}
return true
}
static var stageEnabled: Bool {
guard let value = windowManagerDefaults?.object(forKey: "GloballyEnabled") as? Bool else {
return false
}
return value
}
static var stageStripShow: Bool {
guard let value = windowManagerDefaults?.object(forKey: "AutoHide") as? Bool else {
return false
}
return !value
}
static var stageStripPosition: StageStripPosition {
switch dockDefaults?.string(forKey: "orientation") {
case "left":
return .right
case "right":
return .left
default: // bottom
var isRTL = false
if #available(macOS 13, *), Locale.current.language.characterDirection == .rightToLeft {
isRTL = true
}
return isRTL ? .right : .left
}
}
static func isStageStripVisible(_ screen: NSScreen? = .main) -> Bool {
guard let screen else {
return false
}
let infos = WindowUtil.getWindowList().filter { info in
guard info.processName == "WindowManager" else {
return false
}
let frame = info.frame.screenFlipped
let screens = NSScreen.screens.filter { $0.frame.minY <= frame.minY && frame.maxY <= $0.frame.maxY }
var infoScreen: NSScreen?
if stageStripPosition == .left {
infoScreen = screens.min { abs(frame.minX - $0.frame.minX) < abs(frame.minX - $1.frame.minX) }
} else {
infoScreen = screens.min { abs($0.frame.maxX - frame.maxX) < abs($1.frame.maxX - frame.maxX) }
}
return infoScreen == screen
}
// A single window could be for the dragged window
return infos.count >= 2
}
private static func getStageStripWindowGroups(_ screen: NSScreen? = .main) -> [[CGWindowID]] {
guard
let screen,
let appElement = AccessibilityElement("com.apple.WindowManager"),
let stripElements = appElement.getChildElements(.group),
let stripElement = (stripElements.first {
let frame = $0.frame.screenFlipped
return !frame.isNull && screen.frame.contains(frame)
}),
let groupElements = stripElement.getChildElement(.list)?.getChildElements(.button)
else {
return []
}
return groupElements.compactMap { $0.windowIds }
}
static func getStageStripWindowGroup(_ windowId: CGWindowID, _ screen: NSScreen? = .main) -> [CGWindowID]? {
return getStageStripWindowGroups(screen).first { $0.contains(windowId) }
}
}
enum StageStripPosition {
case left
case right
}
================================================
FILE: Rectangle/Utilities/StringExtension.swift
================================================
//
// StringExtension.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
extension String {
var localized: String {
NSLocalizedString(self, tableName: "Main", comment: "")
}
func localized(key: String) -> String {
NSLocalizedString(key, tableName: "Main", value: self, comment: "")
}
}
================================================
FILE: Rectangle/Utilities/TimeoutCache.swift
================================================
//
// TimeoutCache.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TimeoutCache {
private let timeout: UInt64
private var head: Entry?
private var tail: Entry?
private var cache = [Key: Entry]()
private var purgeRestrictionExpirationTimestamp: UInt64 = 0
private var purgeRestrictionExpired: Bool { DispatchTime.now().uptimeMilliseconds > purgeRestrictionExpirationTimestamp }
init(timeout: UInt64) {
self.timeout = timeout
}
subscript(key: Key) -> Value? {
get {
guard let entry = cache[key], !entry.expired else {
remove(key)
return nil
}
return entry.value
}
set {
remove(key)
purge()
guard let value = newValue else { return }
let expirationTimestamp = DispatchTime.now().uptimeMilliseconds + timeout
let entry = Entry(key: key, value: value, expirationTimestamp: expirationTimestamp, previous: tail)
entry.previous?.next = entry
if head == nil { head = entry }
tail = entry
cache[key] = entry
}
}
private func remove(_ key: Key) {
guard let entry = cache[key] else { return }
cache[key] = nil
if entry === tail { tail = entry.previous }
if entry === head { head = entry.next }
entry.previous?.next = entry.next
entry.next?.previous = entry.previous
}
private func purge() {
guard purgeRestrictionExpired else { return }
var entry = head
while entry != nil && entry!.expired {
remove(entry!.key)
entry = entry!.next
}
purgeRestrictionExpirationTimestamp = DispatchTime.now().uptimeMilliseconds + (100 * timeout)
}
private class Entry {
let key: Key
let value: Value
let expirationTimestamp: UInt64
var previous: Entry?
var next: Entry?
var expired: Bool { DispatchTime.now().uptimeMilliseconds > expirationTimestamp }
init(key: Key, value: Value, expirationTimestamp: UInt64, previous: Entry?) {
self.key = key
self.value = value
self.expirationTimestamp = expirationTimestamp
self.previous = previous
}
}
}
================================================
FILE: Rectangle/Utilities/WindowUtil.swift
================================================
//
// WindowUtil.swift
// Rectangle
//
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class WindowUtil {
private static var windowListCache = TimeoutCache<[CGWindowID]?, [WindowInfo]>(timeout: 100)
static func getWindowList(ids: [CGWindowID]? = nil, all: Bool = false) -> [WindowInfo] {
if let infos = windowListCache[ids] {
return infos
}
var infos = [WindowInfo]()
var rawInfos: CFArray?
if let ids {
let values = UnsafeMutablePointer.allocate(capacity: ids.count)
for (i, id) in ids.enumerated() {
values[i] = UnsafeRawPointer(bitPattern: UInt(id))
}
let rawIds = CFArrayCreate(kCFAllocatorDefault, values, ids.count, nil)
rawInfos = CGWindowListCreateDescriptionFromArray(rawIds)
} else {
rawInfos = CGWindowListCopyWindowInfo([all ? .optionAll : .optionOnScreenOnly, .excludeDesktopElements], kCGNullWindowID)
}
if let rawInfos {
let count = rawInfos.getCount()
for i in 0.. 94 {
return Shortcut( ctrl|alt, kVK_ANSI_R )
}
return nil
default: return nil
}
}
var image: NSImage {
switch self {
case .leftHalf: return NSImage(imageLiteralResourceName: "leftHalfTemplate")
case .rightHalf: return NSImage(imageLiteralResourceName: "rightHalfTemplate")
case .maximize: return NSImage(imageLiteralResourceName: "maximizeTemplate")
case .maximizeHeight: return NSImage(imageLiteralResourceName: "maximizeHeightTemplate")
case .previousDisplay: return NSImage(imageLiteralResourceName: "prevDisplayTemplate")
case .nextDisplay: return NSImage(imageLiteralResourceName: "nextDisplayTemplate")
case .larger: return NSImage(imageLiteralResourceName: "makeLargerTemplate")
case .smaller: return NSImage(imageLiteralResourceName: "makeSmallerTemplate")
case .bottomHalf: return NSImage(imageLiteralResourceName: "bottomHalfTemplate")
case .topHalf: return NSImage(imageLiteralResourceName: "topHalfTemplate")
case .center: return NSImage(imageLiteralResourceName: "centerTemplate")
case .bottomLeft: return NSImage(imageLiteralResourceName: "bottomLeftTemplate")
case .bottomRight: return NSImage(imageLiteralResourceName: "bottomRightTemplate")
case .topLeft: return NSImage(imageLiteralResourceName: "topLeftTemplate")
case .topRight: return NSImage(imageLiteralResourceName: "topRightTemplate")
case .restore: return NSImage(imageLiteralResourceName: "restoreTemplate")
case .firstThird: return NSImage(imageLiteralResourceName: "firstThirdTemplate")
case .firstTwoThirds: return NSImage(imageLiteralResourceName: "firstTwoThirdsTemplate")
case .centerThird: return NSImage(imageLiteralResourceName: "centerThirdTemplate")
case .centerTwoThirds: return NSImage(imageLiteralResourceName: "centerTwoThirdsTemplate")
case .lastTwoThirds: return NSImage(imageLiteralResourceName: "lastTwoThirdsTemplate")
case .lastThird: return NSImage(imageLiteralResourceName: "lastThirdTemplate")
case .moveLeft: return NSImage(imageLiteralResourceName: "moveLeftTemplate")
case .moveRight: return NSImage(imageLiteralResourceName: "moveRightTemplate")
case .moveUp: return NSImage(imageLiteralResourceName: "moveUpTemplate")
case .moveDown: return NSImage(imageLiteralResourceName: "moveDownTemplate")
case .almostMaximize: return NSImage(imageLiteralResourceName: "almostMaximizeTemplate")
case .centerHalf: return NSImage(imageLiteralResourceName: "halfWidthCenterTemplate")
case .firstFourth: return NSImage(imageLiteralResourceName: "leftFourthTemplate")
case .secondFourth: return NSImage(imageLiteralResourceName: "centerLeftFourthTemplate")
case .thirdFourth: return NSImage(imageLiteralResourceName: "centerRightFourthTemplate")
case .lastFourth: return NSImage(imageLiteralResourceName: "rightFourthTemplate")
case .firstThreeFourths: return NSImage(imageLiteralResourceName: "firstThreeFourthsTemplate")
case .centerThreeFourths: return NSImage(imageLiteralResourceName: "centerThreeFourthsTemplate")
case .lastThreeFourths: return NSImage(imageLiteralResourceName: "lastThreeFourthsTemplate")
case .topLeftSixth: return NSImage(imageLiteralResourceName: "topLeftSixthTemplate")
case .topCenterSixth: return NSImage(imageLiteralResourceName: "topCenterSixthTemplate")
case .topRightSixth: return NSImage(imageLiteralResourceName: "topRightSixthTemplate")
case .bottomLeftSixth: return NSImage(imageLiteralResourceName: "bottomLeftSixthTemplate")
case .bottomCenterSixth: return NSImage(imageLiteralResourceName: "bottomCenterSixthTemplate")
case .bottomRightSixth: return NSImage(imageLiteralResourceName: "bottomRightSixthTemplate")
case .topLeftNinth: return NSImage(imageLiteralResourceName: "topLeftNinthTemplate")
case .topCenterNinth: return NSImage(imageLiteralResourceName: "topCenterNinthTemplate")
case .topRightNinth: return NSImage(imageLiteralResourceName: "topRightNinthTemplate")
case .middleLeftNinth: return NSImage(imageLiteralResourceName: "middleLeftNinthTemplate")
case .middleCenterNinth: return NSImage(imageLiteralResourceName: "middleCenterNinthTemplate")
case .middleRightNinth: return NSImage(imageLiteralResourceName: "middleRightNinthTemplate")
case .bottomLeftNinth: return NSImage(imageLiteralResourceName: "bottomLeftNinthTemplate")
case .bottomCenterNinth: return NSImage(imageLiteralResourceName: "bottomCenterNinthTemplate")
case .bottomRightNinth: return NSImage(imageLiteralResourceName: "bottomRightNinthTemplate")
case .topLeftThird: return NSImage()
case .topRightThird: return NSImage()
case .bottomLeftThird: return NSImage()
case .bottomRightThird: return NSImage()
case .topLeftEighth: return NSImage(imageLiteralResourceName: "tlEighthTemplate")
case .topCenterLeftEighth: return NSImage(imageLiteralResourceName: "ctlEighthTemplate")
case .topCenterRightEighth: return NSImage(imageLiteralResourceName: "ctrEighthTemplate")
case .topRightEighth: return NSImage(imageLiteralResourceName: "trEighthTemplate")
case .bottomLeftEighth: return NSImage(imageLiteralResourceName: "blEighthTemplate")
case .bottomCenterLeftEighth: return NSImage(imageLiteralResourceName: "cblEighthTemplate")
case .bottomCenterRightEighth: return NSImage(imageLiteralResourceName: "cbrEighthTemplate")
case .bottomRightEighth: return NSImage(imageLiteralResourceName: "brEighthTemplate")
case .doubleHeightUp: return NSImage()
case .doubleHeightDown: return NSImage()
case .doubleWidthLeft: return NSImage()
case .doubleWidthRight: return NSImage()
case .halveHeightUp: return NSImage()
case .halveHeightDown: return NSImage()
case .halveWidthLeft: return NSImage()
case .halveWidthRight: return NSImage()
case .specified, .reverseAll: return NSImage()
case .tileAll: return NSImage()
case .cascadeAll: return NSImage()
case .leftTodo: return NSImage()
case .rightTodo: return NSImage()
case .cascadeActiveApp: return NSImage()
case .tileActiveApp: return NSImage()
case .centerProminently: return NSImage()
case .largerWidth: return NSImage(imageLiteralResourceName: "largerWidthTemplate")
case .smallerWidth: return NSImage(imageLiteralResourceName: "smallerWidthTemplate")
case .largerHeight: return NSImage()
case .smallerHeight: return NSImage()
case .topVerticalThird: return NSImage(imageLiteralResourceName: "topThirdTemplate")
case .middleVerticalThird: return NSImage(imageLiteralResourceName: "centerThirdHorizontalTemplate")
case .bottomVerticalThird: return NSImage(imageLiteralResourceName: "bottomThirdTemplate")
case .topVerticalTwoThirds: return NSImage(imageLiteralResourceName: "topTwoThirdsTemplate")
case .bottomVerticalTwoThirds: return NSImage(imageLiteralResourceName: "bottomTwoThirdsTemplate")
case .topLeftTwelfth: return NSImage(imageLiteralResourceName: "topLeftTwelfthTemplate")
case .topCenterLeftTwelfth: return NSImage(imageLiteralResourceName: "topCenterLeftTwelfthTemplate")
case .topCenterRightTwelfth: return NSImage(imageLiteralResourceName: "topCenterRightTwelfthTemplate")
case .topRightTwelfth: return NSImage(imageLiteralResourceName: "topRightTwelfthTemplate")
case .middleLeftTwelfth: return NSImage(imageLiteralResourceName: "middleLeftTwelfthTemplate")
case .middleCenterLeftTwelfth: return NSImage(imageLiteralResourceName: "middleCenterLeftTwelfthTemplate")
case .middleCenterRightTwelfth: return NSImage(imageLiteralResourceName: "middleCenterRightTwelfthTemplate")
case .middleRightTwelfth: return NSImage(imageLiteralResourceName: "middleRightTwelfthTemplate")
case .bottomLeftTwelfth: return NSImage(imageLiteralResourceName: "bottomLeftTwelfthTemplate")
case .bottomCenterLeftTwelfth: return NSImage(imageLiteralResourceName: "bottomCenterLeftTwelfthTemplate")
case .bottomCenterRightTwelfth: return NSImage(imageLiteralResourceName: "bottomCenterRightTwelfthTemplate")
case .bottomRightTwelfth: return NSImage(imageLiteralResourceName: "bottomRightTwelfthTemplate")
case .topLeftSixteenth: return NSImage(imageLiteralResourceName: "topLeftSixteenthTemplate")
case .topCenterLeftSixteenth: return NSImage(imageLiteralResourceName: "topCenterLeftSixteenthTemplate")
case .topCenterRightSixteenth: return NSImage(imageLiteralResourceName: "topCenterRightSixteenthTemplate")
case .topRightSixteenth: return NSImage(imageLiteralResourceName: "topRightSixteenthTemplate")
case .upperMiddleLeftSixteenth: return NSImage(imageLiteralResourceName: "upperMiddleLeftSixteenthTemplate")
case .upperMiddleCenterLeftSixteenth: return NSImage(imageLiteralResourceName: "upperMiddleCenterLeftSixteenthTemplate")
case .upperMiddleCenterRightSixteenth: return NSImage(imageLiteralResourceName: "upperMiddleCenterRightSixteenthTemplate")
case .upperMiddleRightSixteenth: return NSImage(imageLiteralResourceName: "upperMiddleRightSixteenthTemplate")
case .lowerMiddleLeftSixteenth: return NSImage(imageLiteralResourceName: "lowerMiddleLeftSixteenthTemplate")
case .lowerMiddleCenterLeftSixteenth: return NSImage(imageLiteralResourceName: "lowerMiddleCenterLeftSixteenthTemplate")
case .lowerMiddleCenterRightSixteenth: return NSImage(imageLiteralResourceName: "lowerMiddleCenterRightSixteenthTemplate")
case .lowerMiddleRightSixteenth: return NSImage(imageLiteralResourceName: "lowerMiddleRightSixteenthTemplate")
case .bottomLeftSixteenth: return NSImage(imageLiteralResourceName: "bottomLeftSixteenthTemplate")
case .bottomCenterLeftSixteenth: return NSImage(imageLiteralResourceName: "bottomCenterLeftSixteenthTemplate")
case .bottomCenterRightSixteenth: return NSImage(imageLiteralResourceName: "bottomCenterRightSixteenthTemplate")
case .bottomRightSixteenth: return NSImage(imageLiteralResourceName: "bottomRightSixteenthTemplate")
}
}
var gapSharedEdge: Edge {
switch self {
case .leftHalf: return .right
case .rightHalf: return .left
case .bottomHalf: return .top
case .topHalf: return .bottom
case .bottomLeft: return [.top, .right]
case .bottomRight: return [.top, .left]
case .topLeft: return [.bottom, .right]
case .topRight: return [.bottom, .left]
case .moveUp: return Defaults.resizeOnDirectionalMove.enabled ? .bottom : .none
case .moveDown: return Defaults.resizeOnDirectionalMove.enabled ? .top : .none
case .moveLeft: return Defaults.resizeOnDirectionalMove.enabled ? .right : .none
case .moveRight: return Defaults.resizeOnDirectionalMove.enabled ? .left : .none
default:
return .none
}
}
var gapsApplicable: Dimension {
switch self {
case .leftHalf, .rightHalf, .bottomHalf, .topHalf, .centerHalf, .bottomLeft, .bottomRight, .topLeft, .topRight, .firstThird, .firstTwoThirds, .centerThird, .centerTwoThirds, .lastTwoThirds, .lastThird,
.firstFourth, .secondFourth, .thirdFourth, .lastFourth, .firstThreeFourths, .centerThreeFourths, .lastThreeFourths, .topLeftSixth, .topCenterSixth, .topRightSixth, .bottomLeftSixth, .bottomCenterSixth, .bottomRightSixth,
.topLeftNinth, .topCenterNinth, .topRightNinth, .middleLeftNinth, .middleCenterNinth, .middleRightNinth, .bottomLeftNinth, .bottomCenterNinth, .bottomRightNinth,
.topLeftThird, .topRightThird, .bottomLeftThird, .bottomRightThird,
.topLeftEighth, .topCenterLeftEighth, .topCenterRightEighth, .topRightEighth,
.bottomLeftEighth, .bottomCenterLeftEighth, .bottomCenterRightEighth, .bottomRightEighth,
.topLeftTwelfth, .topCenterLeftTwelfth, .topCenterRightTwelfth, .topRightTwelfth,
.middleLeftTwelfth, .middleCenterLeftTwelfth, .middleCenterRightTwelfth, .middleRightTwelfth,
.bottomLeftTwelfth, .bottomCenterLeftTwelfth, .bottomCenterRightTwelfth, .bottomRightTwelfth,
.topLeftSixteenth, .topCenterLeftSixteenth, .topCenterRightSixteenth, .topRightSixteenth,
.upperMiddleLeftSixteenth, .upperMiddleCenterLeftSixteenth, .upperMiddleCenterRightSixteenth, .upperMiddleRightSixteenth,
.lowerMiddleLeftSixteenth, .lowerMiddleCenterLeftSixteenth, .lowerMiddleCenterRightSixteenth, .lowerMiddleRightSixteenth,
.bottomLeftSixteenth, .bottomCenterLeftSixteenth, .bottomCenterRightSixteenth, .bottomRightSixteenth,
.doubleHeightUp, .doubleHeightDown, .doubleWidthLeft, .doubleWidthRight,
.halveHeightUp, .halveHeightDown, .halveWidthLeft, .halveWidthRight,
.leftTodo, .rightTodo,
.topVerticalThird, .middleVerticalThird, .bottomVerticalThird, .topVerticalTwoThirds, .bottomVerticalTwoThirds:
return .both
case .moveUp, .moveDown:
return Defaults.resizeOnDirectionalMove.enabled ? .vertical : .none;
case .moveLeft, .moveRight:
return Defaults.resizeOnDirectionalMove.enabled ? .horizontal : .none;
case .maximize:
return Defaults.applyGapsToMaximize.userDisabled ? .none : .both;
case .maximizeHeight:
return Defaults.applyGapsToMaximizeHeight.userDisabled ? .none : .vertical;
case .almostMaximize, .previousDisplay, .nextDisplay, .larger, .smaller, .largerWidth, .smallerWidth, .largerHeight, .smallerHeight, .center, .centerProminently, .restore, .specified, .reverseAll, .tileAll, .cascadeAll, .cascadeActiveApp, .tileActiveApp:
return .none
}
}
var category: WindowActionCategory? { // used to specify a submenu
switch self {
case .firstThird, .centerThird, .lastThird, .firstTwoThirds, .centerTwoThirds, .lastTwoThirds: return .thirds
case .firstFourth, .secondFourth, .thirdFourth, .lastFourth, .firstThreeFourths, .centerThreeFourths, .lastThreeFourths: return .fourths
case .topLeftSixth, .topCenterSixth, .topRightSixth, .bottomLeftSixth, .bottomCenterSixth, .bottomRightSixth: return .sixths
case .topLeftEighth, .topCenterLeftEighth, .topCenterRightEighth, .topRightEighth, .bottomLeftEighth, .bottomCenterLeftEighth, .bottomCenterRightEighth, .bottomRightEighth: return .eighths
case .topLeftNinth, .topCenterNinth, .topRightNinth, .middleLeftNinth, .middleCenterNinth, .middleRightNinth, .bottomLeftNinth, .bottomCenterNinth, .bottomRightNinth: return .ninths
case .topLeftTwelfth, .topCenterLeftTwelfth, .topCenterRightTwelfth, .topRightTwelfth, .middleLeftTwelfth, .middleCenterLeftTwelfth, .middleCenterRightTwelfth, .middleRightTwelfth, .bottomLeftTwelfth, .bottomCenterLeftTwelfth, .bottomCenterRightTwelfth, .bottomRightTwelfth: return .twelfths
case .topLeftSixteenth, .topCenterLeftSixteenth, .topCenterRightSixteenth, .topRightSixteenth, .upperMiddleLeftSixteenth, .upperMiddleCenterLeftSixteenth, .upperMiddleCenterRightSixteenth, .upperMiddleRightSixteenth, .lowerMiddleLeftSixteenth, .lowerMiddleCenterLeftSixteenth, .lowerMiddleCenterRightSixteenth, .lowerMiddleRightSixteenth, .bottomLeftSixteenth, .bottomCenterLeftSixteenth, .bottomCenterRightSixteenth, .bottomRightSixteenth: return .sixteenths
case .moveUp, .moveDown, .moveLeft, .moveRight: return .move
case .almostMaximize, .maximizeHeight, .larger, .smaller, .largerWidth, .smallerWidth, .largerHeight, .smallerHeight: return .size
default: return nil
}
}
var classification: WindowActionCategory? {
switch self {
case .firstThird, .firstTwoThirds, .centerThird, .centerTwoThirds, .lastTwoThirds, .lastThird:
return .thirds
case .smaller, .larger, .smallerWidth, .largerWidth, .smallerHeight, .largerHeight:
return .size
case .previousDisplay, .nextDisplay:
return .display
default: return nil
}
}
}
enum SubWindowAction {
case leftThird,
centerVerticalThird,
rightThird,
leftTwoThirds,
rightTwoThirds,
topThird,
centerHorizontalThird,
bottomThird,
topTwoThirds,
bottomTwoThirds,
leftFourth,
centerLeftFourth,
centerRightFourth,
rightFourth,
topFourth,
centerTopFourth,
centerBottomFourth,
bottomFourth,
rightThreeFourths,
bottomThreeFourths,
leftThreeFourths,
topThreeFourths,
centerVerticalThreeFourths,
centerHorizontalThreeFourths,
centerVerticalHalf,
centerHorizontalHalf,
topLeftSixthLandscape,
topCenterSixthLandscape,
topRightSixthLandscape,
bottomLeftSixthLandscape,
bottomCenterSixthLandscape,
bottomRightSixthLandscape,
topLeftSixthPortrait,
topRightSixthPortrait,
leftCenterSixthPortrait,
rightCenterSixthPortrait,
bottomLeftSixthPortrait,
bottomRightSixthPortrait,
topLeftTwoSixthsLandscape,
topLeftTwoSixthsPortrait,
topRightTwoSixthsLandscape,
topRightTwoSixthsPortrait,
bottomLeftTwoSixthsLandscape,
bottomLeftTwoSixthsPortrait,
bottomRightTwoSixthsLandscape,
bottomRightTwoSixthsPortrait,
topLeftNinth,
topCenterNinth,
topRightNinth,
middleLeftNinth,
middleCenterNinth,
middleRightNinth,
bottomLeftNinth,
bottomCenterNinth,
bottomRightNinth,
topLeftThird,
topRightThird,
bottomLeftThird,
bottomRightThird,
topLeftQuarter,
topRightQuarter,
bottomLeftQuarter,
bottomRightQuarter,
topLeftEighth,
topCenterLeftEighth,
topCenterRightEighth,
topRightEighth,
bottomLeftEighth,
bottomCenterLeftEighth,
bottomCenterRightEighth,
bottomRightEighth,
topLeftTwelfth,
topCenterLeftTwelfth,
topCenterRightTwelfth,
topRightTwelfth,
middleLeftTwelfth,
middleCenterLeftTwelfth,
middleCenterRightTwelfth,
middleRightTwelfth,
bottomLeftTwelfth,
bottomCenterLeftTwelfth,
bottomCenterRightTwelfth,
bottomRightTwelfth,
topLeftSixteenth,
topCenterLeftSixteenth,
topCenterRightSixteenth,
topRightSixteenth,
upperMiddleLeftSixteenth,
upperMiddleCenterLeftSixteenth,
upperMiddleCenterRightSixteenth,
upperMiddleRightSixteenth,
lowerMiddleLeftSixteenth,
lowerMiddleCenterLeftSixteenth,
lowerMiddleCenterRightSixteenth,
lowerMiddleRightSixteenth,
bottomLeftSixteenth,
bottomCenterLeftSixteenth,
bottomCenterRightSixteenth,
bottomRightSixteenth,
maximize,
leftTodo,
rightTodo
var gapSharedEdge: Edge {
switch self {
case .leftThird: return .right
case .centerVerticalThird: return [.right, .left]
case .rightThird: return .left
case .leftTwoThirds: return .right
case .rightTwoThirds: return .left
case .topThird: return .bottom
case .centerHorizontalThird: return [.top, .bottom]
case .bottomThird: return .top
case .topTwoThirds: return .bottom
case .bottomTwoThirds: return .top
case .leftFourth: return .right
case .centerLeftFourth: return [.right, .left]
case .centerRightFourth: return [.right, .left]
case .rightFourth: return .left
case .topFourth: return .bottom
case .centerTopFourth: return [.top, .bottom]
case .centerBottomFourth: return [.top, .bottom]
case .bottomFourth: return .top
case .rightThreeFourths: return .left
case .bottomThreeFourths: return .top
case .leftThreeFourths: return .right
case .topThreeFourths: return .bottom
case .centerVerticalThreeFourths: return [.right, .left]
case .centerHorizontalThreeFourths: return [.top, .bottom]
case .centerVerticalHalf: return [.right, .left]
case .centerHorizontalHalf: return [.top, .bottom]
case .topLeftSixthLandscape: return [.right, .bottom]
case .topCenterSixthLandscape: return [.right, .left, .bottom]
case .topRightSixthLandscape: return [.left, .bottom]
case .bottomLeftSixthLandscape: return [.top, .right]
case .bottomCenterSixthLandscape: return [.left, .right, .top]
case .bottomRightSixthLandscape: return [.left, .top]
case .topLeftSixthPortrait: return [.right, .bottom]
case .topRightSixthPortrait: return [.left, .bottom]
case .leftCenterSixthPortrait: return [.top, .bottom, .right]
case .rightCenterSixthPortrait: return [.left, .top, .bottom]
case .bottomLeftSixthPortrait: return [.top, .right]
case .bottomRightSixthPortrait: return [.left, .top]
case .topLeftTwoSixthsLandscape: return [.right, .bottom]
case .topLeftTwoSixthsPortrait: return [.right, .bottom]
case .topRightTwoSixthsLandscape: return [.left, .bottom]
case .topRightTwoSixthsPortrait: return [.left, .bottom]
case .bottomLeftTwoSixthsLandscape: return [.right, .top]
case .bottomLeftTwoSixthsPortrait: return [.right, .top]
case .bottomRightTwoSixthsLandscape: return [.left, .top]
case .bottomRightTwoSixthsPortrait: return [.left, .top]
case .topLeftNinth: return [.right, .bottom]
case .topCenterNinth: return [.right, .left, .bottom]
case .topRightNinth: return [.left, .bottom]
case .middleLeftNinth: return [.top, .right, .bottom]
case .middleCenterNinth: return [.top, .right, .bottom, .left]
case .middleRightNinth: return [.left, .top, .bottom]
case .bottomLeftNinth: return [.top, .right]
case .bottomCenterNinth: return [.left, .top, .right]
case .bottomRightNinth: return [.left, .top]
case .topLeftThird: return [.right, .bottom]
case .topRightThird: return [.left, .bottom]
case .bottomLeftThird: return [.right, .top]
case .bottomRightThird: return [.left, .top]
case .topLeftQuarter: return [.right, .bottom]
case .topRightQuarter: return [.left, .bottom]
case .bottomLeftQuarter: return [.right, .top]
case .bottomRightQuarter: return [.left, .top]
case .topLeftEighth: return [.right, .bottom]
case .topCenterLeftEighth: return [.right, .left, .bottom]
case .topCenterRightEighth: return [.right, .left, .bottom]
case .topRightEighth: return [.left, .bottom]
case .bottomLeftEighth: return [.right, .top]
case .bottomCenterLeftEighth: return [.right, .left, .top]
case .bottomCenterRightEighth: return [.right, .left, .top]
case .bottomRightEighth: return [.left, .top]
case .topLeftTwelfth: return [.right, .bottom]
case .topCenterLeftTwelfth: return [.right, .left, .bottom]
case .topCenterRightTwelfth: return [.right, .left, .bottom]
case .topRightTwelfth: return [.left, .bottom]
case .middleLeftTwelfth: return [.top, .right, .bottom]
case .middleCenterLeftTwelfth: return [.top, .right, .bottom, .left]
case .middleCenterRightTwelfth: return [.top, .right, .bottom, .left]
case .middleRightTwelfth: return [.left, .top, .bottom]
case .bottomLeftTwelfth: return [.top, .right]
case .bottomCenterLeftTwelfth: return [.left, .top, .right]
case .bottomCenterRightTwelfth: return [.left, .top, .right]
case .bottomRightTwelfth: return [.left, .top]
case .topLeftSixteenth: return [.right, .bottom]
case .topCenterLeftSixteenth: return [.right, .left, .bottom]
case .topCenterRightSixteenth: return [.right, .left, .bottom]
case .topRightSixteenth: return [.left, .bottom]
case .upperMiddleLeftSixteenth: return [.top, .right, .bottom]
case .upperMiddleCenterLeftSixteenth: return [.top, .right, .bottom, .left]
case .upperMiddleCenterRightSixteenth: return [.top, .right, .bottom, .left]
case .upperMiddleRightSixteenth: return [.left, .top, .bottom]
case .lowerMiddleLeftSixteenth: return [.top, .right, .bottom]
case .lowerMiddleCenterLeftSixteenth: return [.top, .right, .bottom, .left]
case .lowerMiddleCenterRightSixteenth: return [.top, .right, .bottom, .left]
case .lowerMiddleRightSixteenth: return [.left, .top, .bottom]
case .bottomLeftSixteenth: return [.top, .right]
case .bottomCenterLeftSixteenth: return [.left, .top, .right]
case .bottomCenterRightSixteenth: return [.left, .top, .right]
case .bottomRightSixteenth: return [.left, .top]
case .maximize: return .none
case .leftTodo: return .right
case .rightTodo: return .left
}
}
}
struct Shortcut: Codable {
let keyCode: Int
let modifierFlags: UInt
init(_ modifierFlags: UInt, _ keyCode: Int) {
self.keyCode = keyCode
self.modifierFlags = modifierFlags
}
init(masShortcut: MASShortcut) {
self.keyCode = masShortcut.keyCode
self.modifierFlags = masShortcut.modifierFlags.rawValue
}
func toMASSHortcut() -> MASShortcut {
MASShortcut(keyCode: keyCode, modifierFlags: NSEvent.ModifierFlags(rawValue: modifierFlags))
}
func displayString() -> String {
let masShortcut = toMASSHortcut()
return masShortcut.modifierFlagsString + (masShortcut.keyCodeString ?? "")
}
}
================================================
FILE: Rectangle/WindowActionCategory.swift
================================================
//
// WindowActionCategory.swift
// Rectangle
//
// Created by Ryan Hanson on 10/3/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
enum WindowActionCategory {
case halves, corners, thirds, max, size, display, move, other, sixths, fourths, eighths, ninths, twelfths, sixteenths
var menuOrder: Int {
switch self {
case .size: return 0
case .move: return 1
case .thirds: return 2
case .fourths: return 3
case .sixths: return 4
case .eighths: return 5
case .ninths: return 6
case .twelfths: return 7
case .sixteenths: return 8
default: return 99
}
}
var displayName: String {
switch self {
case .halves:
return NSLocalizedString("Halves", tableName: "Main", value: "", comment: "")
case .corners:
return NSLocalizedString("Corners", tableName: "Main", value: "", comment: "")
case .thirds:
return NSLocalizedString("Thirds", tableName: "Main", value: "", comment: "")
case .max:
return NSLocalizedString("Maximize", tableName: "Main", value: "", comment: "")
case .size:
return NSLocalizedString("Size", tableName: "Main", value: "", comment: "")
case .display:
return NSLocalizedString("Display", tableName: "Main", value: "", comment: "")
case .other:
return NSLocalizedString("Other", tableName: "Main", value: "", comment: "")
case .move:
return NSLocalizedString("Move to Edge", tableName: "Main", value: "", comment: "")
case .fourths:
return NSLocalizedString("Fourths", tableName: "Main", value: "", comment: "")
case .sixths:
return NSLocalizedString("Sixths", tableName: "Main", value: "", comment: "")
case .eighths:
return NSLocalizedString("Eighths", tableName: "Main", value: "", comment: "")
case .ninths:
return NSLocalizedString("Ninths", tableName: "Main", value: "Ninths", comment: "")
case .twelfths:
return NSLocalizedString("Twelfths", tableName: "Main", value: "Twelfths", comment: "")
case .sixteenths:
return NSLocalizedString("Sixteenths", tableName: "Main", value: "Sixteenths", comment: "")
}
}
}
================================================
FILE: Rectangle/WindowCalculation/AlmostMaximizeCalculation.swift
================================================
//
// AlmostMaximizeCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class AlmostMaximizeCalculation: WindowCalculation {
let almostMaximizeHeight: CGFloat
let almostMaximizeWidth: CGFloat
override init() {
let defaultHeight = Defaults.almostMaximizeHeight.value
almostMaximizeHeight = (defaultHeight <= 0 || defaultHeight > 1)
? 0.9
: CGFloat(defaultHeight)
let defaultWidth = Defaults.almostMaximizeWidth.value
almostMaximizeWidth = (defaultWidth <= 0 || defaultWidth > 1)
? 0.9
: CGFloat(defaultWidth)
}
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var calculatedWindowRect = visibleFrameOfScreen
// Resize
calculatedWindowRect.size.height = round(visibleFrameOfScreen.height * almostMaximizeHeight)
calculatedWindowRect.size.width = round(visibleFrameOfScreen.width * almostMaximizeWidth)
// Center
calculatedWindowRect.origin.x = round((visibleFrameOfScreen.width - calculatedWindowRect.width) / 2.0) + visibleFrameOfScreen.minX
calculatedWindowRect.origin.y = round((visibleFrameOfScreen.height - calculatedWindowRect.height) / 2.0) + visibleFrameOfScreen.minY
return RectResult(calculatedWindowRect)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomCenterLeftEighthCalculation.swift
================================================
//
// BottomCenterLeftEighthCalculation.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomCenterLeftEighthCalculation: WindowCalculation, OrientationAware, EighthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomCenterLeftEighth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomCenterLeftEighth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = floor(visibleFrameOfScreen.maxY - (visibleFrameOfScreen.height * 0.75))
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomCenterLeftEighth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomCenterLeftSixteenthCalculation.swift
================================================
//
// BottomCenterLeftSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomCenterLeftSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomCenterLeftSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomCenterLeftSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomCenterLeftSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomCenterLeftTwelfthCalculation.swift
================================================
//
// BottomCenterLeftTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomCenterLeftTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomCenterLeftTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomCenterLeftTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomCenterLeftTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomCenterNinthCalculation.swift
================================================
//
// BottomCenterNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomCenterNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomCenterNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomCenterNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomCenterNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomCenterRightEighthCalculation.swift
================================================
//
// BottomCenterRightEighthCalculation.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomCenterRightEighthCalculation: WindowCalculation, OrientationAware, EighthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomCenterRightEighth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + (2.0 * rect.width)
return RectResult(rect, subAction: .bottomCenterRightEighth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomCenterRightEighth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomCenterRightSixteenthCalculation.swift
================================================
//
// BottomCenterRightSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomCenterRightSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomCenterRightSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 2
return RectResult(rect, subAction: .bottomCenterRightSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 2
return RectResult(rect, subAction: .bottomCenterRightSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomCenterRightTwelfthCalculation.swift
================================================
//
// BottomCenterRightTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomCenterRightTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomCenterRightTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 4.0) * 2.0
return RectResult(rect, subAction: .bottomCenterRightTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomCenterRightTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomCenterSixthCalculation.swift
================================================
//
// BottomCenterCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomCenterSixthCalculation: WindowCalculation, OrientationAware {
private let bottomRightTwoSixths = BottomRightTwoSixthsCalculation()
private let bottomLeftTwoSixths = BottomLeftTwoSixthsCalculation()
private let topRightTwoSixths = TopRightTwoSixthsCalculation()
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction,
params.action == .bottomCenterSixth
else {
return orientationBasedRect(visibleFrameOfScreen)
}
let calc: SimpleCalc
switch lastSubAction{
case .bottomCenterSixthLandscape, .rightCenterSixthPortrait:
calc = bottomRightTwoSixths.orientationBasedRect
case .bottomRightTwoSixthsLandscape:
calc = bottomLeftTwoSixths.orientationBasedRect
case .bottomRightTwoSixthsPortrait:
calc = topRightTwoSixths.orientationBasedRect
default: calc = orientationBasedRect
}
return calc(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.x = visibleFrameOfScreen.origin.x + rect.width
return RectResult(rect, subAction: .bottomCenterSixthLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.x = visibleFrameOfScreen.origin.x + rect.width
rect.origin.y = visibleFrameOfScreen.origin.y + rect.height
return RectResult(rect, subAction: .rightCenterSixthPortrait)
}
}
class BottomRightTwoSixthsCalculation: WindowCalculation, OrientationAware {
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * 2.0 / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
return RectResult(rect, subAction: .bottomRightTwoSixthsLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height * 2.0 / 3.0)
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
return RectResult(rect, subAction: .bottomRightTwoSixthsPortrait)
}
}
class BottomLeftTwoSixthsCalculation: WindowCalculation, OrientationAware {
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * 2.0 / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
return RectResult(rect, subAction: .bottomLeftTwoSixthsLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height * 2.0 / 3.0)
return RectResult(rect, subAction: .bottomLeftTwoSixthsPortrait)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomHalfCalculation.swift
================================================
//
// BottomHalfCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomHalfCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
if params.lastAction == nil || !Defaults.subsequentExecutionMode.resizes {
return calculateFirstRect(params)
}
return calculateRepeatedRect(params)
}
func calculateFirstRect(_ params: RectCalculationParameters) -> RectResult {
return calculateFractionalRect(params, fraction: 1.0 - Defaults.verticalSplitRatio.value / 100.0)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height * CGFloat(fraction))
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomLeftEighthCalculation.swift
================================================
//
// BottomLeftEighthCalculation.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomLeftEighthCalculation: WindowCalculation, OrientationAware, EighthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomLeftEighth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftEighth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = floor(visibleFrameOfScreen.maxY - (visibleFrameOfScreen.height * 0.75))
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftEighth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomLeftNinthCalculation.swift
================================================
//
// BottomLeftNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomLeftNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomLeftNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomLeftSixteenthCalculation.swift
================================================
//
// BottomLeftSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomLeftSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomLeftSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomLeftSixthCalculation.swift
================================================
//
// BottomLeftSixthCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomLeftSixthCalculation: WindowCalculation, OrientationAware, SixthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomLeftSixth
&& lastSubAction != .bottomLeftSixthLandscape
&& lastSubAction != .bottomLeftSixthPortrait {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
return RectResult(rect, subAction: .bottomLeftSixthLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
return RectResult(rect, subAction: .bottomLeftSixthPortrait)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomLeftThirdCalculation.swift
================================================
//
// BottomLeftThirdCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomLeftThirdCalculation: WindowCalculation, OrientationAware, HorizontalThirdsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomLeftThird {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(2.0 * visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftThird)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(2.0 * visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomLeftTwelfthCalculation.swift
================================================
//
// BottomLeftTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomLeftTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomLeftTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .bottomLeftTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - (3.0 * rect.height)
rect.origin.x = visibleFrameOfScreen.minX + (2.0 * rect.width)
return RectResult(rect, subAction: .bottomLeftTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomRightEighthCalculation.swift
================================================
//
// BottomRightEighthCalculation.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomRightEighthCalculation: WindowCalculation, OrientationAware, EighthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomRightEighth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + (3.0 * rect.width)
return RectResult(rect, subAction: .bottomRightEighth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .bottomRightEighth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomRightNinthCalculation.swift
================================================
//
// BottomRightNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomRightNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomRightNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .bottomRightNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .bottomRightNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomRightSixteenthCalculation.swift
================================================
//
// BottomRightSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomRightSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomRightSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 3
return RectResult(rect, subAction: .bottomRightSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 3
return RectResult(rect, subAction: .bottomRightSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomRightSixthCalculation.swift
================================================
//
// BottomRightSixthCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomRightSixthCalculation: WindowCalculation, OrientationAware, SixthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomRightSixth
&& lastSubAction != .bottomRightSixthLandscape
&& lastSubAction != .bottomRightSixthPortrait {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .left) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.x = visibleFrameOfScreen.origin.x + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .bottomRightSixthLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.x = visibleFrameOfScreen.origin.x + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .bottomRightSixthPortrait)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomRightThirdCalculation.swift
================================================
//
// BottomRightThirdCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomRightThirdCalculation: WindowCalculation, OrientationAware, HorizontalThirdsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomRightThird {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(2.0 * visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width / 3.0
return RectResult(rect, subAction: .bottomRightThird)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(2.0 * visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width / 2.0
return RectResult(rect, subAction: .bottomRightThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomRightTwelfthCalculation.swift
================================================
//
// BottomRightTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class BottomRightTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .bottomRightTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 4.0) * 3.0
return RectResult(rect, subAction: .bottomRightTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 3.0) * 2.0
return RectResult(rect, subAction: .bottomRightTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomVerticalThirdCalculation.swift
================================================
//
// BottomVerticalThirdCalculation.swift
// Rectangle
//
// Created on 12/22/25.
//
import Foundation
class BottomVerticalThirdCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return calculateBottomThird(visibleFrameOfScreen)
}
var calculation: WindowCalculation?
if last.action == .bottomVerticalThird {
switch lastSubAction {
case .centerVerticalThird:
calculation = WindowCalculationFactory.topVerticalThirdCalculation
case .bottomThird:
calculation = WindowCalculationFactory.middleVerticalThirdCalculation
default:
break
}
}
else if last.action == .topVerticalThird {
switch lastSubAction {
case .bottomThird:
calculation = WindowCalculationFactory.middleVerticalThirdCalculation
default:
break
}
}
if let calculation = calculation {
return calculation.calculateRect(params)
}
return calculateBottomThird(visibleFrameOfScreen)
}
func calculateBottomThird(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
return RectResult(rect, subAction: .bottomThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/BottomVerticalTwoThirdsCalculation.swift
================================================
//
// BottomVerticalTwoThirdsCalculation.swift
// Rectangle
//
// Created on 12/22/25.
//
import Foundation
class BottomVerticalTwoThirdsCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return calculateBottomTwoThirds(visibleFrameOfScreen)
}
if lastSubAction == .bottomTwoThirds {
return WindowCalculationFactory.topVerticalTwoThirdsCalculation.calculateRect(params)
}
return calculateBottomTwoThirds(visibleFrameOfScreen)
}
func calculateBottomTwoThirds(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height * 2 / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
return RectResult(rect, subAction: .bottomTwoThirds)
}
}
================================================
FILE: Rectangle/WindowCalculation/CenterCalculation.swift
================================================
//
// CenterCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class CenterCalculation: WindowCalculation {
override func calculate(_ params: WindowCalculationParameters) -> WindowCalculationResult? {
var screenFrame: CGRect?
if !Defaults.alwaysAccountForStage.userEnabled {
screenFrame = params.usableScreens.currentScreen.adjustedVisibleFrame(params.ignoreTodo, true)
}
let rectResult = calculateRect(params.asRectParams(visibleFrame: screenFrame))
let resultingAction: WindowAction = rectResult.resultingAction ?? params.action
return WindowCalculationResult(rect: rectResult.rect,
screen: params.usableScreens.currentScreen,
resultingAction: resultingAction,
resultingScreenFrame: screenFrame)
}
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var calculatedWindowRect = params.window.rect
let heightExceeded = params.window.rect.height > visibleFrameOfScreen.height
let widthExceeded = params.window.rect.width > visibleFrameOfScreen.width
if heightExceeded && widthExceeded {
return RectResult(visibleFrameOfScreen, resultingAction: .maximize)
}
if heightExceeded {
calculatedWindowRect.size.height = visibleFrameOfScreen.height
calculatedWindowRect.origin.y = visibleFrameOfScreen.minY
} else {
calculatedWindowRect.origin.y = round((visibleFrameOfScreen.height - params.window.rect.height) / 2.0) + visibleFrameOfScreen.minY
}
if widthExceeded {
calculatedWindowRect.size.width = visibleFrameOfScreen.width
calculatedWindowRect.origin.x = visibleFrameOfScreen.minX
} else {
calculatedWindowRect.origin.x = round((visibleFrameOfScreen.width - params.window.rect.width) / 2.0) + visibleFrameOfScreen.minX
}
return RectResult(calculatedWindowRect)
}
}
================================================
FILE: Rectangle/WindowCalculation/CenterHalfCalculation.swift
================================================
//
// AlmostMaximizeCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class CenterHalfCalculation: WindowCalculation, OrientationAware, RepeatedExecutionsInThirdsCalculation {
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
return visibleFrameOfScreen.isLandscape
? landscapeRect(visibleFrameOfScreen, fraction: fraction)
: portraitRect(visibleFrameOfScreen, fraction: fraction)
}
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
if (params.lastAction != nil && Defaults.subsequentExecutionMode.resizes) || Defaults.centerHalfCycles.userEnabled {
return calculateRepeatedRect(params)
}
return orientationBasedRect(params.visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect, fraction: Float) -> RectResult {
var rect = visibleFrameOfScreen
// Resize
rect.size.height = visibleFrameOfScreen.height
rect.size.width = round(visibleFrameOfScreen.width * CGFloat(fraction))
// Center
rect.origin.x = round((visibleFrameOfScreen.width - rect.width) / 2.0) + visibleFrameOfScreen.minX
rect.origin.y = round((visibleFrameOfScreen.height - rect.height) / 2.0) + visibleFrameOfScreen.minY
return RectResult(rect, subAction: .centerVerticalHalf)
}
func portraitRect(_ visibleFrameOfScreen: CGRect, fraction: Float) -> RectResult {
var rect = visibleFrameOfScreen
// Resize
rect.size.width = visibleFrameOfScreen.width
rect.size.height = round(visibleFrameOfScreen.height * CGFloat(fraction))
// Center
rect.origin.x = round((visibleFrameOfScreen.width - rect.width) / 2.0) + visibleFrameOfScreen.minX
rect.origin.y = round((visibleFrameOfScreen.height - rect.height) / 2.0) + visibleFrameOfScreen.minY
return RectResult(rect, subAction: .centerHorizontalHalf)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
return landscapeRect(visibleFrameOfScreen, fraction: 0.5)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
return portraitRect(visibleFrameOfScreen, fraction: 0.5)
}
}
================================================
FILE: Rectangle/WindowCalculation/CenterProminentlyCalculation.swift
================================================
//
// CenterProminentlyCalculation.swift
// Rectangle
//
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class CenterProminentlyCalculation: WindowCalculation {
override func calculate(_ params: WindowCalculationParameters) -> WindowCalculationResult? {
var screenFrame: CGRect?
if !Defaults.alwaysAccountForStage.userEnabled {
screenFrame = params.usableScreens.currentScreen.adjustedVisibleFrame(params.ignoreTodo, true)
}
let rectResult = calculateRect(params.asRectParams(visibleFrame: screenFrame))
let resultingAction: WindowAction = rectResult.resultingAction ?? params.action
return WindowCalculationResult(rect: rectResult.rect,
screen: params.usableScreens.currentScreen,
resultingAction: resultingAction,
resultingScreenFrame: screenFrame)
}
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let rectResult = WindowCalculationFactory.centerCalculation.calculateRect(params)
var rect = rectResult.rect
rect.origin.y += -0.25 * rect.height + 0.25 * params.visibleFrameOfScreen.height
return RectResult(rect, resultingAction: rectResult.resultingAction)
}
}
================================================
FILE: Rectangle/WindowCalculation/CenterThirdCalculation.swift
================================================
//
// HorizCenterThirdCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class CenterThirdCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 3.0)
rect.origin.y = visibleFrameOfScreen.minY
rect.size.width = visibleFrameOfScreen.width / 3.0
rect.size.height = visibleFrameOfScreen.height
return RectResult(rect, subAction: .centerVerticalThird)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.origin.x = visibleFrameOfScreen.minX
rect.origin.y = visibleFrameOfScreen.minY + floor(visibleFrameOfScreen.height / 3.0)
rect.size.width = visibleFrameOfScreen.width
rect.size.height = visibleFrameOfScreen.height / 3.0
return RectResult(rect, subAction: .centerHorizontalThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/CenterThreeFourthsCalculation.swift
================================================
//
// CenterThreeFourthsCalculation.swift
// Rectangle
//
// Created by Tom Grimwood-Taylor on 26/07/2025.
// Copyright © 2025 Ryan Hanson. All rights reserved.
//
import Foundation
class CenterThreeFourthsCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 4.0) / 2
rect.origin.y = visibleFrameOfScreen.minY
rect.size.width = visibleFrameOfScreen.width / 4.0 * 3
rect.size.height = visibleFrameOfScreen.height
return RectResult(rect, subAction: .centerVerticalThreeFourths)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.origin.x = visibleFrameOfScreen.minX
rect.origin.y = visibleFrameOfScreen.minY + floor(visibleFrameOfScreen.height / 4.0) / 2
rect.size.width = visibleFrameOfScreen.width
rect.size.height = visibleFrameOfScreen.height / 4.0 * 3
return RectResult(rect, subAction: .centerHorizontalThreeFourths)
}
}
================================================
FILE: Rectangle/WindowCalculation/CenterTwoThirdsCalculation.swift
================================================
//
// CenterTwoThirdsCalculation.swift
// Rectangle
//
// Created by Mikhail Savin on 7/14/25.
// Copyright © 2025 Mikhail Savin. All rights reserved.
//
import Foundation
class CenterTwoThirdsCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 3.0) / 2
rect.origin.y = visibleFrameOfScreen.minY
rect.size.width = visibleFrameOfScreen.width / 3.0 * 2
rect.size.height = visibleFrameOfScreen.height
return RectResult(rect, subAction: .centerVerticalThird)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.origin.x = visibleFrameOfScreen.minX
rect.origin.y = visibleFrameOfScreen.minY + floor(visibleFrameOfScreen.height / 3.0) / 2
rect.size.width = visibleFrameOfScreen.width
rect.size.height = visibleFrameOfScreen.height / 3.0 * 2
return RectResult(rect, subAction: .centerHorizontalThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/ChangeSizeCalculation.swift
================================================
//
// ChangeSizeCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class ChangeSizeCalculation: WindowCalculation, ChangeWindowDimensionCalculation {
let screenEdgeGapSize: CGFloat
let sizeOffsetAbs: CGFloat
let curtainChangeSize = Defaults.curtainChangeSize.enabled != false
var widthOffsetAbs: CGFloat {
CGFloat(Defaults.widthStepSize.value)
}
override init() {
let windowGapSize = Defaults.gapSize.value
screenEdgeGapSize = (windowGapSize <= 0) ? 5.0 : CGFloat(windowGapSize)
let defaultSizeOffset = Defaults.sizeOffset.value
sizeOffsetAbs = (defaultSizeOffset <= 0)
? 30.0
: CGFloat(defaultSizeOffset)
}
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let sizeOffset: CGFloat
switch params.action {
case .larger, .largerHeight:
sizeOffset = sizeOffsetAbs
case .smaller, .smallerHeight:
sizeOffset = -sizeOffsetAbs
case .largerWidth:
sizeOffset = widthOffsetAbs
case .smallerWidth:
sizeOffset = -widthOffsetAbs
default:
sizeOffset = 0
}
let visibleFrameOfScreen = params.visibleFrameOfScreen
let window = params.window
// Calculate Width
var resizedWindowRect = window.rect
if [.larger, .smaller, .largerWidth, .smallerWidth].contains(params.action) {
resizedWindowRect.size.width = resizedWindowRect.width + sizeOffset
resizedWindowRect.origin.x = resizedWindowRect.minX - floor(sizeOffset / 2.0)
if curtainChangeSize {
resizedWindowRect = againstLeftAndRightScreenEdges(
originalWindowRect: window.rect,
resizedWindowRect: resizedWindowRect,
visibleFrameOfScreen: visibleFrameOfScreen
)
}
if resizedWindowRect.width >= visibleFrameOfScreen.width {
resizedWindowRect.size.width = visibleFrameOfScreen.width
}
}
// Calculate Height
if [.larger, .smaller, .largerHeight, .smallerHeight].contains(params.action) {
resizedWindowRect.size.height = resizedWindowRect.height + sizeOffset
resizedWindowRect.origin.y = resizedWindowRect.minY - floor(sizeOffset / 2.0)
if curtainChangeSize, params.action != .smallerHeight {
resizedWindowRect = againstTopAndBottomScreenEdges(
originalWindowRect: window.rect,
resizedWindowRect: resizedWindowRect,
visibleFrameOfScreen: visibleFrameOfScreen
)
}
if resizedWindowRect.height >= visibleFrameOfScreen.height {
resizedWindowRect.size.height = visibleFrameOfScreen.height
resizedWindowRect.origin.y = params.window.rect.minY
}
}
if againstAllScreenEdges(windowRect: window.rect, visibleFrameOfScreen: visibleFrameOfScreen) && (sizeOffset < 0) {
resizedWindowRect.size.width = params.window.rect.width + sizeOffset
resizedWindowRect.origin.x = params.window.rect.origin.x - floor(sizeOffset / 2.0)
resizedWindowRect.size.height = params.window.rect.height + sizeOffset
resizedWindowRect.origin.y = params.window.rect.origin.y - floor(sizeOffset / 2.0)
}
if [.smaller, .smallerWidth, .smallerHeight].contains(params.action), resizedWindowRectIsTooSmall(windowRect: resizedWindowRect, visibleFrameOfScreen: visibleFrameOfScreen) {
resizedWindowRect = window.rect
}
return RectResult(resizedWindowRect)
}
private func againstScreenEdge(_ gap: CGFloat) -> Bool {
return abs(gap) <= screenEdgeGapSize
}
private func againstLeftScreenEdge(_ windowRect: CGRect, _ visibleFrameOfScreen: CGRect) -> Bool {
return againstScreenEdge(windowRect.minX - visibleFrameOfScreen.minX)
}
private func againstRightScreenEdge(_ windowRect: CGRect, _ visibleFrameOfScreen: CGRect) -> Bool {
return againstScreenEdge(windowRect.maxX - visibleFrameOfScreen.maxX)
}
private func againstTopScreenEdge(_ windowRect: CGRect, _ visibleFrameOfScreen: CGRect) -> Bool {
return againstScreenEdge(windowRect.maxY - visibleFrameOfScreen.maxY)
}
private func againstBottomScreenEdge(_ windowRect: CGRect, _ visibleFrameOfScreen: CGRect) -> Bool {
return againstScreenEdge(windowRect.minY - visibleFrameOfScreen.minY)
}
private func againstAllScreenEdges(windowRect: CGRect, visibleFrameOfScreen: CGRect) -> Bool {
return (againstLeftScreenEdge(windowRect, visibleFrameOfScreen)
&& againstRightScreenEdge(windowRect, visibleFrameOfScreen)
&& againstTopScreenEdge(windowRect, visibleFrameOfScreen)
&& againstBottomScreenEdge(windowRect, visibleFrameOfScreen))
}
private func againstLeftAndRightScreenEdges(originalWindowRect: CGRect, resizedWindowRect: CGRect, visibleFrameOfScreen: CGRect) -> CGRect {
var adjustedWindowRect = resizedWindowRect
if againstRightScreenEdge(originalWindowRect, visibleFrameOfScreen) {
adjustedWindowRect.origin.x = visibleFrameOfScreen.maxX - adjustedWindowRect.width - CGFloat(Defaults.gapSize.value)
if againstLeftScreenEdge(originalWindowRect, visibleFrameOfScreen) {
adjustedWindowRect.size.width = visibleFrameOfScreen.width - (CGFloat(Defaults.gapSize.value) * 2)
}
}
if againstLeftScreenEdge(originalWindowRect, visibleFrameOfScreen) {
adjustedWindowRect.origin.x = visibleFrameOfScreen.minX + CGFloat(Defaults.gapSize.value)
}
return adjustedWindowRect
}
private func againstTopAndBottomScreenEdges(originalWindowRect: CGRect, resizedWindowRect: CGRect, visibleFrameOfScreen: CGRect) -> CGRect{
var adjustedWindowRect = resizedWindowRect
if againstTopScreenEdge(originalWindowRect, visibleFrameOfScreen) {
adjustedWindowRect.origin.y = visibleFrameOfScreen.maxY - adjustedWindowRect.height - CGFloat(Defaults.gapSize.value)
if againstBottomScreenEdge(originalWindowRect, visibleFrameOfScreen) {
adjustedWindowRect.size.height = visibleFrameOfScreen.height - (CGFloat(Defaults.gapSize.value) * 2)
}
}
if againstBottomScreenEdge(originalWindowRect, visibleFrameOfScreen) {
adjustedWindowRect.origin.y = visibleFrameOfScreen.minY + CGFloat(Defaults.gapSize.value)
}
return adjustedWindowRect
}
}
================================================
FILE: Rectangle/WindowCalculation/ChangeWindowDimensionCalculation.swift
================================================
//
// MinimumWindowDimensionAware.swift
// Rectangle
//
// Created by Isaac Young on 23/04/24.
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
protocol ChangeWindowDimensionCalculation {
func resizedWindowRectIsTooSmall(windowRect: CGRect, visibleFrameOfScreen: CGRect) -> Bool;
}
extension ChangeWindowDimensionCalculation {
private func minimumWindowWidth() -> CGFloat {
let defaultWidth = Defaults.minimumWindowWidth.value
return (defaultWidth <= 0 || defaultWidth > 1)
? 0.25
: CGFloat(defaultWidth)
}
private func minimumWindowHeight() -> CGFloat {
let defaultHeight = Defaults.minimumWindowHeight.value
return (defaultHeight <= 0 || defaultHeight > 1)
? 0.25
: CGFloat(defaultHeight)
}
func resizedWindowRectIsTooSmall(windowRect: CGRect, visibleFrameOfScreen: CGRect) -> Bool {
let minimumWindowRectWidth = floor(visibleFrameOfScreen.width * minimumWindowWidth())
let minimumWindowRectHeight = floor(visibleFrameOfScreen.height * minimumWindowHeight())
return (windowRect.width <= minimumWindowRectWidth) || (windowRect.height <= minimumWindowRectHeight)
}
}
================================================
FILE: Rectangle/WindowCalculation/EighthsRepeated.swift
================================================
//
// EighthsRepeated.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
protocol EighthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc?
}
extension EighthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc? {
if direction == .left {
switch subAction {
case .topLeftEighth:
return WindowCalculationFactory.bottomRightEighthCalculation.orientationBasedRect
case .topCenterLeftEighth:
return WindowCalculationFactory.topLeftEighthCalculation.orientationBasedRect
case .topCenterRightEighth:
return WindowCalculationFactory.topCenterLeftEighthCalculation.orientationBasedRect
case .topRightEighth:
return WindowCalculationFactory.topCenterRightEighthCalculation.orientationBasedRect
case .bottomLeftEighth:
return WindowCalculationFactory.topRightEighthCalculation.orientationBasedRect
case .bottomCenterLeftEighth:
return WindowCalculationFactory.bottomLeftEighthCalculation.orientationBasedRect
case .bottomCenterRightEighth:
return WindowCalculationFactory.bottomCenterLeftEighthCalculation.orientationBasedRect
case .bottomRightEighth:
return WindowCalculationFactory.bottomCenterRightEighthCalculation.orientationBasedRect
default: break
}
}
else if direction == .right {
switch subAction {
case .topLeftEighth:
return WindowCalculationFactory.topCenterLeftEighthCalculation.orientationBasedRect
case .topCenterLeftEighth:
return WindowCalculationFactory.topCenterRightEighthCalculation.orientationBasedRect
case .topCenterRightEighth:
return WindowCalculationFactory.topRightEighthCalculation.orientationBasedRect
case .topRightEighth:
return WindowCalculationFactory.bottomLeftEighthCalculation.orientationBasedRect
case .bottomLeftEighth:
return WindowCalculationFactory.bottomCenterLeftEighthCalculation.orientationBasedRect
case .bottomCenterLeftEighth:
return WindowCalculationFactory.bottomCenterRightEighthCalculation.orientationBasedRect
case .bottomCenterRightEighth:
return WindowCalculationFactory.bottomRightEighthCalculation.orientationBasedRect
case .bottomRightEighth:
return WindowCalculationFactory.topLeftEighthCalculation.orientationBasedRect
default: break
}
}
return nil
}
}
================================================
FILE: Rectangle/WindowCalculation/FirstFourthCalculation.swift
================================================
//
// LeftThirdCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class FirstFourthCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
params.action == .firstFourth,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
var calculation: WindowCalculation?
if last.action == .firstFourth {
switch lastSubAction {
case .topFourth, .leftFourth:
calculation = WindowCalculationFactory.secondFourthCalculation
case .centerTopFourth, .centerLeftFourth:
calculation = WindowCalculationFactory.thirdFourthCalculation
case .centerBottomFourth, .centerRightFourth:
calculation = WindowCalculationFactory.lastFourthCalculation
default:
break
}
} else if last.action == .lastFourth {
switch lastSubAction {
case .leftFourth, .topFourth:
calculation = WindowCalculationFactory.secondFourthCalculation
default:
break
}
}
if let calculation = calculation {
return calculation.calculateRect(params)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
return RectResult(rect, subAction: .leftFourth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.origin.y + visibleFrameOfScreen.height - rect.height
return RectResult(rect, subAction: .topFourth)
}
}
================================================
FILE: Rectangle/WindowCalculation/FirstThirdCalculation.swift
================================================
//
// LeftThirdCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class FirstThirdCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return orientationBasedRect(visibleFrameOfScreen)
}
var calculation: WindowCalculation?
if last.action == .firstThird {
switch lastSubAction {
case .topThird, .leftThird:
calculation = WindowCalculationFactory.centerThirdCalculation
case .centerHorizontalThird, .centerVerticalThird:
calculation = WindowCalculationFactory.lastThirdCalculation
default:
break
}
} else if last.action == .lastThird {
switch lastSubAction {
case .topThird, .leftThird:
calculation = WindowCalculationFactory.centerThirdCalculation
default:
break
}
}
if let calculation = calculation {
return calculation.calculateRect(params)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
return RectResult(rect, subAction: .leftThird)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + visibleFrameOfScreen.height - rect.height
return RectResult(rect, subAction: .topThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/FirstThreeFourthsCalculation.swift
================================================
//
// FirstThreeFourthsCalculation.swift
// Rectangle
//
// Created by Björn Orri Sæmundsson on 26.06.21.
// Copyright © 2021 Ryan Hanson. All rights reserved.
//
import Foundation
class FirstThreeFourthsCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return orientationBasedRect(visibleFrameOfScreen)
}
if lastSubAction == .leftThreeFourths || lastSubAction == .topThreeFourths {
return WindowCalculationFactory.lastThreeFourthsCalculation.orientationBasedRect(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * 3 / 4.0)
return RectResult(rect, subAction: .leftThreeFourths)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height * 3 / 4.0)
rect.origin.y = visibleFrameOfScreen.origin.y + visibleFrameOfScreen.height - rect.height
return RectResult(rect, subAction: .topThreeFourths)
}
}
================================================
FILE: Rectangle/WindowCalculation/FirstTwoThirdsCalculation.swift
================================================
//
// LeftTwoThirdsCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class FirstTwoThirdsCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return orientationBasedRect(visibleFrameOfScreen)
}
if lastSubAction == .leftTwoThirds || lastSubAction == .topTwoThirds {
return WindowCalculationFactory.lastTwoThirdsCalculation.orientationBasedRect(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * 2 / 3.0)
return RectResult(rect, subAction: .leftTwoThirds)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height * 2 / 3.0)
rect.origin.y = visibleFrameOfScreen.origin.y + visibleFrameOfScreen.height - rect.height
return RectResult(rect, subAction: .topTwoThirds)
}
}
================================================
FILE: Rectangle/WindowCalculation/GapCalculation.swift
================================================
//
// GapCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 1/14/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class GapCalculation {
static func applyGaps(_ rect: CGRect, dimension: Dimension = .both, sharedEdges: Edge = .none, gapSize: Float) -> CGRect {
let cgGapSize = CGFloat(gapSize)
let halfGapSize = cgGapSize / 2
var withGaps = rect.insetBy(
dx: dimension.contains(.horizontal) ? cgGapSize : 0,
dy: dimension.contains(.vertical) ? cgGapSize : 0
)
if dimension.contains(.horizontal) {
if sharedEdges.contains(.left) {
withGaps.origin.x -= halfGapSize
withGaps.size.width += halfGapSize
}
if sharedEdges.contains(.right) {
withGaps.size.width += halfGapSize
}
}
if dimension.contains(.vertical) {
if sharedEdges.contains(.bottom) {
withGaps.origin.y -= halfGapSize
withGaps.size.height += halfGapSize
}
if sharedEdges.contains(.top) {
withGaps.size.height += halfGapSize
}
}
return withGaps
}
}
struct Dimension: OptionSet {
let rawValue: Int
static let horizontal = Dimension(rawValue: 1 << 0)
static let vertical = Dimension(rawValue: 1 << 1)
static let both: Dimension = [.horizontal, .vertical]
static let none: Dimension = []
}
struct Edge: OptionSet {
let rawValue: Int
static let left = Edge(rawValue: 1 << 0)
static let right = Edge(rawValue: 1 << 1)
static let top = Edge(rawValue: 1 << 2)
static let bottom = Edge(rawValue: 1 << 3)
static let all: Edge = [.left, .right, .top, .bottom]
static let none: Edge = []
}
================================================
FILE: Rectangle/WindowCalculation/HalfOrDoubleDimensionCalculation.swift
================================================
//
// HalfOrDoubleDimensionCalculation.swift
// Rectangle
//
// Created by Isaac Young on 23/04/24.
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class HalfOrDoubleDimensionCalculation: WindowCalculation, ChangeWindowDimensionCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let window = params.window
let resizedWindowRect = resized(window.rect, with: params.action)
var resizedAndMovedWindowRect = repositionedIfRequired(original: window.rect, resized: resizedWindowRect, after: params.action)
let visibleFrameOfScreen = params.visibleFrameOfScreen
if isSizeReducing(params.action), resizedWindowRectIsTooSmall(windowRect: resizedAndMovedWindowRect, visibleFrameOfScreen: visibleFrameOfScreen) {
resizedAndMovedWindowRect = window.rect
}
return RectResult(resizedAndMovedWindowRect)
}
private func isSizeReducing(_ action: WindowAction) -> Bool {
switch (action) {
case .halveHeightUp, .halveHeightDown, .halveWidthLeft, .halveWidthRight:
return true
default:
return false
}
}
private func resized(_ windowRect: CGRect, with action: WindowAction) -> CGRect {
var resized = windowRect
switch (action) {
case .halveHeightUp, .halveHeightDown:
resized.size.height = resized.height * 0.5
case .halveWidthLeft, .halveWidthRight:
resized.size.width = resized.width * 0.5
case .doubleHeightUp, .doubleHeightDown:
resized.size.height = resized.height * 2.0
case .doubleWidthLeft, .doubleWidthRight:
resized.size.width = resized.width * 2.0
default:
break
}
return resized
}
private func repositionedIfRequired(original originalWindowRect: CGRect, resized resizedWindowRect: CGRect, after action: WindowAction) -> CGRect {
switch (action) {
case .halveHeightUp:
return resizedWindowRect.offsetBy(dx: 0, dy: resizedWindowRect.height)
case .halveWidthRight:
return resizedWindowRect.offsetBy(dx: resizedWindowRect.width, dy: 0)
case .doubleHeightDown:
return resizedWindowRect.offsetBy(dx: 0, dy: -originalWindowRect.height)
case .doubleWidthLeft:
return resizedWindowRect.offsetBy(dx: -originalWindowRect.width, dy: 0)
default:
return resizedWindowRect
}
}
}
================================================
FILE: Rectangle/WindowCalculation/HorizontalThirdsRepeated.swift
================================================
//
// HorizontalThirdsRepeated.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
protocol HorizontalThirdsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc?
}
extension HorizontalThirdsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc? {
if direction == .left {
switch subAction {
case .topLeftThird:
return WindowCalculationFactory.bottomRightThirdCalculation.orientationBasedRect
case .topRightThird:
return WindowCalculationFactory.topLeftThirdCalculation.orientationBasedRect
case .bottomLeftThird:
return WindowCalculationFactory.topRightThirdCalculation.orientationBasedRect
case .bottomRightThird:
return WindowCalculationFactory.bottomLeftThirdCalculation.orientationBasedRect
default: break
}
}
else if direction == .right {
switch subAction {
case .topLeftThird:
return WindowCalculationFactory.topRightThirdCalculation.orientationBasedRect
case .topRightThird:
return WindowCalculationFactory.bottomLeftThirdCalculation.orientationBasedRect
case .bottomLeftThird:
return WindowCalculationFactory.bottomRightThirdCalculation.orientationBasedRect
case .bottomRightThird:
return WindowCalculationFactory.topLeftThirdCalculation.orientationBasedRect
default: break
}
}
return nil
}
}
================================================
FILE: Rectangle/WindowCalculation/LastFourthCalculation.swift
================================================
//
// LastFourthCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class LastFourthCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return orientationBasedRect(visibleFrameOfScreen)
}
var calculation: WindowCalculation?
if last.action == .lastFourth {
switch lastSubAction {
case .bottomFourth, .rightFourth:
calculation = WindowCalculationFactory.thirdFourthCalculation
case .centerBottomFourth, .centerRightFourth:
calculation = WindowCalculationFactory.secondFourthCalculation
case .centerTopFourth, .centerLeftFourth:
calculation = WindowCalculationFactory.firstFourthCalculation
default:
break
}
} else if last.action == .firstFourth {
switch lastSubAction {
case .bottomFourth, .rightFourth:
calculation = WindowCalculationFactory.thirdFourthCalculation
default:
break
}
}
if let calculation = calculation {
return calculation.calculateRect(params)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.origin.x = visibleFrameOfScreen.origin.x + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .rightFourth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
return RectResult(rect, subAction: .bottomFourth)
}
}
================================================
FILE: Rectangle/WindowCalculation/LastThirdCalculation.swift
================================================
//
// RightThirdCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class LastThirdCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return orientationBasedRect(visibleFrameOfScreen)
}
var calculation: WindowCalculation?
if last.action == .lastThird {
switch lastSubAction {
case .bottomThird, .rightThird:
calculation = WindowCalculationFactory.centerThirdCalculation
case .centerHorizontalThird, .centerVerticalThird:
calculation = WindowCalculationFactory.firstThirdCalculation
default:
break
}
} else if last.action == .firstThird {
switch lastSubAction {
case .bottomThird, .rightThird:
calculation = WindowCalculationFactory.centerThirdCalculation
default:
break
}
}
if let calculation = calculation {
return calculation.calculateRect(params)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.origin.x = visibleFrameOfScreen.origin.x + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .rightThird)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
return RectResult(rect, subAction: .bottomThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/LastThreeFourthsCalculation.swift
================================================
//
// LastThreeFourthsCalculation.swift
// Rectangle
//
// Created by Björn Orri Sæmundsson on 26.06.21.
// Copyright © 2021 Ryan Hanson. All rights reserved.
//
import Foundation
class LastThreeFourthsCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return orientationBasedRect(visibleFrameOfScreen)
}
if lastSubAction == .rightThreeFourths || lastSubAction == .bottomThreeFourths {
return WindowCalculationFactory.firstThreeFourthsCalculation.orientationBasedRect(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * 3 / 4.0)
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .rightThreeFourths)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height * 3 / 4.0)
return RectResult(rect, subAction: .bottomThreeFourths)
}
}
================================================
FILE: Rectangle/WindowCalculation/LastTwoThirdsCalculation.swift
================================================
//
// RightTwoThirdsCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class LastTwoThirdsCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return orientationBasedRect(visibleFrameOfScreen)
}
if lastSubAction == .rightTwoThirds || lastSubAction == .bottomTwoThirds {
return WindowCalculationFactory.firstTwoThirdsCalculation.orientationBasedRect(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * 2 / 3.0)
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .rightTwoThirds)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height * 2 / 3.0)
return RectResult(rect, subAction: .bottomTwoThirds)
}
}
================================================
FILE: Rectangle/WindowCalculation/LeftRightHalfCalculation.swift
================================================
//
// LeftHalfCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/13/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class LeftRightHalfCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation {
override func calculate(_ params: WindowCalculationParameters) -> WindowCalculationResult? {
let usableScreens = params.usableScreens
switch Defaults.subsequentExecutionMode.value {
case .acrossMonitor:
return calculateAcrossDisplays(params)
case .acrossAndResize:
if usableScreens.numScreens == 1 {
return calculateResize(params)
}
return calculateAcrossDisplays(params)
case .resize, .resizeAndCycleQuadrants:
return calculateResize(params)
case .none, .cycleMonitor:
let screen = usableScreens.currentScreen
let oneHalfRect = calculateFirstRect(params.asRectParams())
return WindowCalculationResult(rect: oneHalfRect.rect, screen: screen, resultingAction: params.action)
}
}
func calculateFirstRect(_ params: RectCalculationParameters) -> RectResult {
let ratio = Defaults.horizontalSplitRatio.value / 100.0
let fraction = params.action == .rightHalf ? 1.0 - ratio : ratio
return calculateFractionalRect(params, fraction: fraction)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * CGFloat(fraction))
if params.action == .rightHalf {
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
}
return RectResult(rect)
}
func calculateResize(_ params: WindowCalculationParameters) -> WindowCalculationResult? {
let screen = params.usableScreens.currentScreen
let rectResult: RectResult = calculateRepeatedRect(params.asRectParams())
return WindowCalculationResult(rect: rectResult.rect, screen: screen, resultingAction: params.action)
}
func calculateAcrossDisplays(_ params: WindowCalculationParameters) -> WindowCalculationResult? {
let screen = params.usableScreens.currentScreen
return params.action == .rightHalf
? calculateRightAcrossDisplays(params, screen: screen)
: calculateLeftAcrossDisplays(params, screen: screen)
}
func calculateLeftAcrossDisplays(_ params: WindowCalculationParameters, screen: NSScreen) -> WindowCalculationResult? {
if isRepeatedCommand(params) {
if let prevScreen = params.usableScreens.adjacentScreens?.prev {
if Defaults.subsequentExecutionMode.value == .acrossAndResize && prevScreen == params.usableScreens.screensOrdered.last {
return calculateResize(params)
}
return calculateRightAcrossDisplays(params.withDifferentAction(.rightHalf), screen: prevScreen)
}
}
let oneHalfRect = calculateFirstRect(params.asRectParams(visibleFrame: screen.adjustedVisibleFrame(params.ignoreTodo), differentAction: .leftHalf))
return WindowCalculationResult(rect: oneHalfRect.rect, screen: screen, resultingAction: .leftHalf)
}
func calculateRightAcrossDisplays(_ params: WindowCalculationParameters, screen: NSScreen) -> WindowCalculationResult? {
if isRepeatedCommand(params) {
if let nextScreen = params.usableScreens.adjacentScreens?.next {
if Defaults.subsequentExecutionMode.value == .acrossAndResize && nextScreen == params.usableScreens.screensOrdered.first {
return calculateResize(params)
}
return calculateLeftAcrossDisplays(params.withDifferentAction(.leftHalf), screen: nextScreen)
}
}
let oneHalfRect = calculateFirstRect(params.asRectParams(visibleFrame: screen.adjustedVisibleFrame(params.ignoreTodo), differentAction: .rightHalf))
return WindowCalculationResult(rect: oneHalfRect.rect, screen: screen, resultingAction: .rightHalf)
}
// Used to draw box for snapping
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let ratio = CGFloat(Defaults.horizontalSplitRatio.value / 100.0)
var rect = params.visibleFrameOfScreen
let leftWidth = floor(rect.width * ratio)
if params.action == .leftHalf {
rect.size.width = leftWidth
} else {
rect.size.width = rect.width - leftWidth
rect.origin.x += leftWidth
}
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/LeftTodoCalculation.swift
================================================
//
// LeftTodoCalculation.swift
// Rectangle
//
// Copyright © 2023 Ryan Hanson. All rights reserved.
//
import Foundation
final class LeftTodoCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var calculatedWindowRect = visibleFrameOfScreen
let sidebarWidth = TodoManager.getSidebarWidth(visibleFrameWidth: visibleFrameOfScreen.width)
calculatedWindowRect.size.width = sidebarWidth
return RectResult(calculatedWindowRect, subAction: .leftTodo)
}
}
================================================
FILE: Rectangle/WindowCalculation/LowerLeftCalculation.swift
================================================
//
// LowerLeftCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class LowerLeftCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation, QuartersRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
if Defaults.subsequentExecutionMode.cyclesQuadrantPositions {
if let last = params.lastAction,
let lastSubAction = last.subAction,
last.action == .bottomLeft || lastSubAction == .bottomLeftQuarter {
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(params.visibleFrameOfScreen)
}
}
return quarterRect(params.visibleFrameOfScreen)
}
if params.lastAction == nil || !Defaults.subsequentExecutionMode.resizes {
return calculateFirstRect(params)
}
return calculateRepeatedRect(params)
}
func quarterRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
return RectResult(rect, subAction: .bottomLeftQuarter)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * CGFloat(fraction))
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/LowerMiddleCenterLeftSixteenthCalculation.swift
================================================
//
// LowerMiddleCenterLeftSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class LowerMiddleCenterLeftSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .lowerMiddleCenterLeftSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .lowerMiddleCenterLeftSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .lowerMiddleCenterLeftSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/LowerMiddleCenterRightSixteenthCalculation.swift
================================================
//
// LowerMiddleCenterRightSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class LowerMiddleCenterRightSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .lowerMiddleCenterRightSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 2
return RectResult(rect, subAction: .lowerMiddleCenterRightSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 2
return RectResult(rect, subAction: .lowerMiddleCenterRightSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/LowerMiddleLeftSixteenthCalculation.swift
================================================
//
// LowerMiddleLeftSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class LowerMiddleLeftSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .lowerMiddleLeftSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .lowerMiddleLeftSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .lowerMiddleLeftSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/LowerMiddleRightSixteenthCalculation.swift
================================================
//
// LowerMiddleRightSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class LowerMiddleRightSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .lowerMiddleRightSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 3
return RectResult(rect, subAction: .lowerMiddleRightSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 3
return RectResult(rect, subAction: .lowerMiddleRightSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/LowerRightCalculation.swift
================================================
//
// LowerRightCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class LowerRightCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation, QuartersRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
if Defaults.subsequentExecutionMode.cyclesQuadrantPositions {
if let last = params.lastAction,
let lastSubAction = last.subAction,
last.action == .bottomRight || lastSubAction == .bottomRightQuarter {
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(params.visibleFrameOfScreen)
}
}
return quarterRect(params.visibleFrameOfScreen)
}
if params.lastAction == nil || !Defaults.subsequentExecutionMode.resizes {
return calculateFirstRect(params)
}
return calculateRepeatedRect(params)
}
func quarterRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
return RectResult(rect, subAction: .bottomRightQuarter)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * CGFloat(fraction))
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/MaximizeCalculation.swift
================================================
//
// MaximizeCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class MaximizeCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
return RectResult(visibleFrameOfScreen)
}
}
================================================
FILE: Rectangle/WindowCalculation/MaximizeHeightCalculation.swift
================================================
//
// MaximizeHeightCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class MaximizeHeightCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var maxHeightRect = params.window.rect
maxHeightRect.origin.y = visibleFrameOfScreen.minY
maxHeightRect.size.height = visibleFrameOfScreen.height
return RectResult(maxHeightRect)
}
}
================================================
FILE: Rectangle/WindowCalculation/MiddleCenterLeftTwelfthCalculation.swift
================================================
//
// MiddleCenterLeftTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class MiddleCenterLeftTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .middleCenterLeftTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .middleCenterLeftTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - (2.0 * rect.height)
rect.origin.x = visibleFrameOfScreen.minX + (2.0 * rect.width)
return RectResult(rect, subAction: .middleCenterLeftTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/MiddleCenterNinthCalculation.swift
================================================
//
// MiddleCenterNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class MiddleCenterNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .middleCenterNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .middleCenterNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .middleCenterNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/MiddleCenterRightTwelfthCalculation.swift
================================================
//
// MiddleCenterRightTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class MiddleCenterRightTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .middleCenterRightTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 4.0) * 2.0
return RectResult(rect, subAction: .middleCenterRightTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - (3.0 * rect.height)
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .middleCenterRightTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/MiddleLeftNinthCalculation.swift
================================================
//
// MiddleLeftNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class MiddleLeftNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .middleLeftNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .middleLeftNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .middleLeftNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/MiddleLeftTwelfthCalculation.swift
================================================
//
// MiddleLeftTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class MiddleLeftTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .middleLeftTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .middleLeftTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - (2.0 * rect.height)
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .middleLeftTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/MiddleRightNinthCalculation.swift
================================================
//
// MiddleRightNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class MiddleRightNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .middleRightNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .middleRightNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .middleRightNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/MiddleRightTwelfthCalculation.swift
================================================
//
// MiddleRightTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class MiddleRightTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .middleRightTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 4.0) * 3.0
return RectResult(rect, subAction: .middleRightTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - (3.0 * rect.height)
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .middleRightTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/MiddleVerticalThirdCalculation.swift
================================================
//
// MiddleVerticalThirdCalculation.swift
// Rectangle
//
// Created on 12/22/25.
//
import Foundation
class MiddleVerticalThirdCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
return calculateMiddleThird(visibleFrameOfScreen)
}
func calculateMiddleThird(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.origin.x = visibleFrameOfScreen.minX
rect.origin.y = visibleFrameOfScreen.minY + floor(visibleFrameOfScreen.height / 3.0)
rect.size.width = visibleFrameOfScreen.width
rect.size.height = visibleFrameOfScreen.height / 3.0
return RectResult(rect, subAction: .centerVerticalThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/MoveLeftRightCalculation.swift
================================================
//
// MoveLeftRightCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
// Applicable options:
// Defaults.subsequentExecutionMode.traversesDisplays
// Defaults.centeredDirectionalMove.enabled
// Defaults.resizeOnDirectionalMove.enabled (resizes in thirds, or just to half-width if traversesDisplays is enabled
class MoveLeftRightCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation {
override func calculate(_ params: WindowCalculationParameters) -> WindowCalculationResult? {
var screen = params.usableScreens.currentScreen
var action = params.action
let canTraverseDisplays = Defaults.subsequentExecutionMode.traversesDisplays && params.usableScreens.numScreens > 1
let rectResult: RectResult
if canTraverseDisplays && isRepeatedCommand(params) {
if action == .moveLeft {
if let prevScreen = params.usableScreens.adjacentScreens?.prev {
screen = prevScreen
}
action = .moveRight
} else {
if let nextScreen = params.usableScreens.adjacentScreens?.next {
screen = nextScreen
}
action = .moveLeft
}
rectResult = calculateRect(params.asRectParams(visibleFrame: screen.adjustedVisibleFrame(params.ignoreTodo), differentAction: action))
} else {
rectResult = calculateRect(params.asRectParams())
}
return WindowCalculationResult(rect: rectResult.rect, screen: screen, resultingAction: action)
}
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
calculateRect(params, newDisplay: false)
}
func calculateRect(_ params: RectCalculationParameters, newDisplay: Bool) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var calculatedWindowRect: CGRect
if newDisplay && Defaults.resizeOnDirectionalMove.enabled {
calculatedWindowRect = calculateFirstRect(params).rect
} else if Defaults.resizeOnDirectionalMove.enabled {
calculatedWindowRect = calculateRepeatedRect(params).rect
} else {
calculatedWindowRect = calculateGenericRect(params).rect
}
if Defaults.centeredDirectionalMove.enabled != false {
calculatedWindowRect.origin.y = round((visibleFrameOfScreen.height - calculatedWindowRect.height) / 2.0) + visibleFrameOfScreen.minY
}
if params.window.rect.height >= visibleFrameOfScreen.height {
calculatedWindowRect.size.height = visibleFrameOfScreen.height
calculatedWindowRect.origin.y = visibleFrameOfScreen.minY
}
return RectResult(calculatedWindowRect)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
return calculateGenericRect(params, fraction: fraction)
}
func calculateGenericRect(_ params: RectCalculationParameters, fraction: Float? = nil) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = params.window.rect
if let requestedFraction = fraction {
rect.size.width = floor(visibleFrameOfScreen.width * CGFloat(requestedFraction))
}
if params.action == .moveRight {
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
} else {
rect.origin.x = visibleFrameOfScreen.minX
}
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/MoveUpDownCalculation.swift
================================================
//
// MoveUpDownCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 7/26/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class MoveUpDownCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var calculatedWindowRect: CGRect
if Defaults.resizeOnDirectionalMove.enabled {
calculatedWindowRect = calculateRepeatedRect(params).rect
} else {
calculatedWindowRect = calculateGenericRect(params).rect
}
if Defaults.centeredDirectionalMove.enabled != false {
calculatedWindowRect.origin.x = round((visibleFrameOfScreen.width - calculatedWindowRect.width) / 2.0) + visibleFrameOfScreen.minX
}
if params.window.rect.width >= visibleFrameOfScreen.width {
calculatedWindowRect.size.width = visibleFrameOfScreen.width
calculatedWindowRect.origin.x = visibleFrameOfScreen.minX
}
return RectResult(calculatedWindowRect)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
return calculateGenericRect(params, fraction: fraction)
}
func calculateGenericRect(_ params: RectCalculationParameters, fraction: Float? = nil) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = params.window.rect
if let requestedFraction = fraction {
rect.size.height = floor(visibleFrameOfScreen.height * CGFloat(requestedFraction))
}
if params.action == .moveUp {
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
} else {
rect.origin.y = visibleFrameOfScreen.minY
}
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/NextPrevDisplayCalculation.swift
================================================
//
// NextPrevDisplayCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 8/19/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class NextPrevDisplayCalculation: WindowCalculation {
override func calculate(_ params: WindowCalculationParameters) -> WindowCalculationResult? {
let usableScreens = params.usableScreens
guard usableScreens.numScreens > 1 else { return nil }
var screen: NSScreen?
if params.action == .nextDisplay {
screen = usableScreens.adjacentScreens?.next
} else if params.action == .previousDisplay {
screen = usableScreens.adjacentScreens?.prev
}
if let screen = screen {
let rectParams = params.asRectParams(visibleFrame: screen.adjustedVisibleFrame(params.ignoreTodo))
if Defaults.attemptMatchOnNextPrevDisplay.userEnabled {
if let lastAction = params.lastAction,
let calculation = WindowCalculationFactory.calculationsByAction[lastAction.action] {
AppDelegate.windowHistory.lastRectangleActions.removeValue(forKey: params.window.id)
let newCalculationParams = RectCalculationParameters(
window: rectParams.window,
visibleFrameOfScreen: rectParams.visibleFrameOfScreen,
action: lastAction.action,
lastAction: nil)
let rectResult = calculation.calculateRect(newCalculationParams)
return WindowCalculationResult(rect: rectResult.rect, screen: screen, resultingAction: lastAction.action)
}
}
let rectResult = calculateRect(rectParams)
let resultingAction: WindowAction = rectResult.resultingAction ?? params.action
return WindowCalculationResult(rect: rectResult.rect, screen: screen, resultingAction: resultingAction)
}
return nil
}
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
if params.lastAction?.action == .maximize && !Defaults.autoMaximize.userDisabled {
let rectResult = WindowCalculationFactory.maximizeCalculation.calculateRect(params)
return RectResult(rectResult.rect, resultingAction: .maximize)
}
return WindowCalculationFactory.centerCalculation.calculateRect(params)
}
}
================================================
FILE: Rectangle/WindowCalculation/NinthsRepeated.swift
================================================
//
// NinthsRepeated.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
protocol NinthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc?
}
extension NinthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc? {
if direction == .left {
switch subAction {
case .topLeftNinth:
return WindowCalculationFactory.bottomRightNinthCalculation.orientationBasedRect
case .topCenterNinth:
return WindowCalculationFactory.topLeftNinthCalculation.orientationBasedRect
case .topRightNinth:
return WindowCalculationFactory.topCenterNinthCalculation.orientationBasedRect
case .middleLeftNinth:
return WindowCalculationFactory.topRightNinthCalculation.orientationBasedRect
case .middleCenterNinth:
return WindowCalculationFactory.middleLeftNinthCalculation.orientationBasedRect
case .middleRightNinth:
return WindowCalculationFactory.middleCenterNinthCalculation.orientationBasedRect
case .bottomLeftNinth:
return WindowCalculationFactory.middleRightNinthCalculation.orientationBasedRect
case .bottomCenterNinth:
return WindowCalculationFactory.bottomLeftNinthCalculation.orientationBasedRect
case .bottomRightNinth:
return WindowCalculationFactory.bottomCenterNinthCalculation.orientationBasedRect
default: break
}
}
else if direction == .right {
switch subAction {
case .topLeftNinth:
return WindowCalculationFactory.topCenterNinthCalculation.orientationBasedRect
case .topCenterNinth:
return WindowCalculationFactory.topRightNinthCalculation.orientationBasedRect
case .topRightNinth:
return WindowCalculationFactory.middleLeftNinthCalculation.orientationBasedRect
case .middleLeftNinth:
return WindowCalculationFactory.middleCenterNinthCalculation.orientationBasedRect
case .middleCenterNinth:
return WindowCalculationFactory.middleRightNinthCalculation.orientationBasedRect
case .middleRightNinth:
return WindowCalculationFactory.bottomLeftNinthCalculation.orientationBasedRect
case .bottomLeftNinth:
return WindowCalculationFactory.bottomCenterNinthCalculation.orientationBasedRect
case .bottomCenterNinth:
return WindowCalculationFactory.bottomRightNinthCalculation.orientationBasedRect
case .bottomRightNinth:
return WindowCalculationFactory.topLeftNinthCalculation.orientationBasedRect
default: break
}
}
return nil
}
}
================================================
FILE: Rectangle/WindowCalculation/OrientationAware.swift
================================================
//
// OrientationAware.swift
// Rectangle
//
// Created by Ryan Hanson on 9/23/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
typealias SimpleCalc = (_ visibleFrameOfScreen: CGRect) -> RectResult
protocol OrientationAware {
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult
func orientationBasedRect(_ visibleFrameOfScreen: CGRect) -> RectResult
}
extension OrientationAware {
func orientationBasedRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
return visibleFrameOfScreen.isLandscape
? landscapeRect(visibleFrameOfScreen)
: portraitRect(visibleFrameOfScreen)
}
}
================================================
FILE: Rectangle/WindowCalculation/QuartersRepeated.swift
================================================
//
// QuartersRepeated.swift
// Rectangle
//
// Copyright © 2026 Ryan Hanson. All rights reserved.
//
import Foundation
protocol QuartersRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc?
}
extension QuartersRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc? {
if direction == .left {
switch subAction {
case .topLeftQuarter:
return WindowCalculationFactory.lowerRightCalculation.quarterRect
case .topRightQuarter:
return WindowCalculationFactory.upperLeftCalculation.quarterRect
case .bottomLeftQuarter:
return WindowCalculationFactory.upperRightCalculation.quarterRect
case .bottomRightQuarter:
return WindowCalculationFactory.lowerLeftCalculation.quarterRect
default: break
}
}
else if direction == .right {
switch subAction {
case .topLeftQuarter:
return WindowCalculationFactory.upperRightCalculation.quarterRect
case .topRightQuarter:
return WindowCalculationFactory.lowerLeftCalculation.quarterRect
case .bottomLeftQuarter:
return WindowCalculationFactory.lowerRightCalculation.quarterRect
case .bottomRightQuarter:
return WindowCalculationFactory.upperLeftCalculation.quarterRect
default: break
}
}
return nil
}
}
================================================
FILE: Rectangle/WindowCalculation/RepeatedExecutionsCalculation.swift
================================================
//
// RepeatedExecutionsCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 10/18/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
protocol RepeatedExecutionsCalculation {
func calculateFirstRect(_ params: RectCalculationParameters) -> RectResult
func calculateRect(for cycleDivision: CycleSize, params: RectCalculationParameters) -> RectResult
}
extension RepeatedExecutionsCalculation {
func calculateRepeatedRect(_ params: RectCalculationParameters) -> RectResult {
guard let count = params.lastAction?.count,
params.lastAction?.action == params.action
else {
return calculateFirstRect(params)
}
let useDefaultPositions = !Defaults.cycleSizesIsChanged.enabled
let positions = useDefaultPositions ? CycleSize.defaultSizes : Defaults.selectedCycleSizes.value
let sortedPositions = CycleSize.sortedSizes
.filter { positions.contains($0) }
let position = count % sortedPositions.count
return calculateRect(for: sortedPositions[position], params: params)
}
}
================================================
FILE: Rectangle/WindowCalculation/RepeatedExecutionsInThirdsCalculation.swift
================================================
//
// RepeatedExecutionsInThirdsCalculation.swift
// Rectangle
//
// Created by Charlie Harding on 12/06/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
protocol RepeatedExecutionsInThirdsCalculation: RepeatedExecutionsCalculation {
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult
}
extension RepeatedExecutionsInThirdsCalculation {
func calculateFirstRect(_ params: RectCalculationParameters) -> RectResult {
return calculateFractionalRect(params, fraction: 1 / 2.0)
}
func calculateRect(for cycleDivision: CycleSize, params: RectCalculationParameters) -> RectResult {
let fraction = cycleDivision.fraction
return calculateFractionalRect(params, fraction: fraction)
}
}
================================================
FILE: Rectangle/WindowCalculation/RightTodoCalculation.swift
================================================
//
// RightTodoCalculation.swift
// Rectangle
//
// Copyright © 2023 Ryan Hanson. All rights reserved.
//
import Foundation
final class RightTodoCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var calculatedWindowRect = visibleFrameOfScreen
let sidebarWidth = TodoManager.getSidebarWidth(visibleFrameWidth: visibleFrameOfScreen.width)
calculatedWindowRect.origin.x = visibleFrameOfScreen.maxX - sidebarWidth
calculatedWindowRect.size.width = sidebarWidth
return RectResult(calculatedWindowRect, subAction: .rightTodo)
}
}
================================================
FILE: Rectangle/WindowCalculation/SecondFourthCalculation.swift
================================================
//
// SecondFourthCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class SecondFourthCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction,
last.action == .secondFourth
else {
return orientationBasedRect(visibleFrameOfScreen)
}
let calc: SimpleCalc
switch lastSubAction {
case .centerLeftFourth:
calc = WindowCalculationFactory.lastThreeFourthsCalculation.landscapeRect
case .centerTopFourth:
calc = WindowCalculationFactory.lastThreeFourthsCalculation.portraitRect
case .rightThreeFourths:
calc = WindowCalculationFactory.centerHalfCalculation.landscapeRect
case .bottomThreeFourths:
calc = WindowCalculationFactory.centerHalfCalculation.portraitRect
default:
calc = orientationBasedRect
}
return calc(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .centerLeftFourth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + visibleFrameOfScreen.height - (rect.height * 2.0)
return RectResult(rect, subAction: .centerTopFourth)
}
}
================================================
FILE: Rectangle/WindowCalculation/SixteenthsRepeated.swift
================================================
//
// SixteenthsRepeated.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
protocol SixteenthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc?
}
extension SixteenthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc? {
if direction == .left {
switch subAction {
case .topLeftSixteenth:
return WindowCalculationFactory.bottomRightSixteenthCalculation.orientationBasedRect
case .topCenterLeftSixteenth:
return WindowCalculationFactory.topLeftSixteenthCalculation.orientationBasedRect
case .topCenterRightSixteenth:
return WindowCalculationFactory.topCenterLeftSixteenthCalculation.orientationBasedRect
case .topRightSixteenth:
return WindowCalculationFactory.topCenterRightSixteenthCalculation.orientationBasedRect
case .upperMiddleLeftSixteenth:
return WindowCalculationFactory.topRightSixteenthCalculation.orientationBasedRect
case .upperMiddleCenterLeftSixteenth:
return WindowCalculationFactory.upperMiddleLeftSixteenthCalculation.orientationBasedRect
case .upperMiddleCenterRightSixteenth:
return WindowCalculationFactory.upperMiddleCenterLeftSixteenthCalculation.orientationBasedRect
case .upperMiddleRightSixteenth:
return WindowCalculationFactory.upperMiddleCenterRightSixteenthCalculation.orientationBasedRect
case .lowerMiddleLeftSixteenth:
return WindowCalculationFactory.upperMiddleRightSixteenthCalculation.orientationBasedRect
case .lowerMiddleCenterLeftSixteenth:
return WindowCalculationFactory.lowerMiddleLeftSixteenthCalculation.orientationBasedRect
case .lowerMiddleCenterRightSixteenth:
return WindowCalculationFactory.lowerMiddleCenterLeftSixteenthCalculation.orientationBasedRect
case .lowerMiddleRightSixteenth:
return WindowCalculationFactory.lowerMiddleCenterRightSixteenthCalculation.orientationBasedRect
case .bottomLeftSixteenth:
return WindowCalculationFactory.lowerMiddleRightSixteenthCalculation.orientationBasedRect
case .bottomCenterLeftSixteenth:
return WindowCalculationFactory.bottomLeftSixteenthCalculation.orientationBasedRect
case .bottomCenterRightSixteenth:
return WindowCalculationFactory.bottomCenterLeftSixteenthCalculation.orientationBasedRect
case .bottomRightSixteenth:
return WindowCalculationFactory.bottomCenterRightSixteenthCalculation.orientationBasedRect
default: break
}
}
else if direction == .right {
switch subAction {
case .topLeftSixteenth:
return WindowCalculationFactory.topCenterLeftSixteenthCalculation.orientationBasedRect
case .topCenterLeftSixteenth:
return WindowCalculationFactory.topCenterRightSixteenthCalculation.orientationBasedRect
case .topCenterRightSixteenth:
return WindowCalculationFactory.topRightSixteenthCalculation.orientationBasedRect
case .topRightSixteenth:
return WindowCalculationFactory.upperMiddleLeftSixteenthCalculation.orientationBasedRect
case .upperMiddleLeftSixteenth:
return WindowCalculationFactory.upperMiddleCenterLeftSixteenthCalculation.orientationBasedRect
case .upperMiddleCenterLeftSixteenth:
return WindowCalculationFactory.upperMiddleCenterRightSixteenthCalculation.orientationBasedRect
case .upperMiddleCenterRightSixteenth:
return WindowCalculationFactory.upperMiddleRightSixteenthCalculation.orientationBasedRect
case .upperMiddleRightSixteenth:
return WindowCalculationFactory.lowerMiddleLeftSixteenthCalculation.orientationBasedRect
case .lowerMiddleLeftSixteenth:
return WindowCalculationFactory.lowerMiddleCenterLeftSixteenthCalculation.orientationBasedRect
case .lowerMiddleCenterLeftSixteenth:
return WindowCalculationFactory.lowerMiddleCenterRightSixteenthCalculation.orientationBasedRect
case .lowerMiddleCenterRightSixteenth:
return WindowCalculationFactory.lowerMiddleRightSixteenthCalculation.orientationBasedRect
case .lowerMiddleRightSixteenth:
return WindowCalculationFactory.bottomLeftSixteenthCalculation.orientationBasedRect
case .bottomLeftSixteenth:
return WindowCalculationFactory.bottomCenterLeftSixteenthCalculation.orientationBasedRect
case .bottomCenterLeftSixteenth:
return WindowCalculationFactory.bottomCenterRightSixteenthCalculation.orientationBasedRect
case .bottomCenterRightSixteenth:
return WindowCalculationFactory.bottomRightSixteenthCalculation.orientationBasedRect
case .bottomRightSixteenth:
return WindowCalculationFactory.topLeftSixteenthCalculation.orientationBasedRect
default: break
}
}
return nil
}
}
================================================
FILE: Rectangle/WindowCalculation/SixthsRepeated.swift
================================================
//
// SixthsRepeated.swift
// Rectangle
//
// Created by Ryan Hanson on 9/26/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
protocol SixthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc?
}
enum Direction {
case left, right
}
extension SixthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc? {
if direction == .left {
switch subAction {
case .topLeftSixthLandscape:
return WindowCalculationFactory.bottomRightSixthCalculation.orientationBasedRect
case .topCenterSixthLandscape:
return WindowCalculationFactory.topLeftSixthCalculation.orientationBasedRect
case .topRightSixthLandscape:
return WindowCalculationFactory.topCenterSixthCalculation.orientationBasedRect
case .bottomLeftSixthLandscape:
return WindowCalculationFactory.topRightSixthCalculation.orientationBasedRect
case .bottomCenterSixthLandscape:
return WindowCalculationFactory.bottomLeftSixthCalculation.orientationBasedRect
case .bottomRightSixthLandscape:
return WindowCalculationFactory.bottomCenterSixthCalculation.orientationBasedRect
case .topLeftSixthPortrait:
return WindowCalculationFactory.bottomRightSixthCalculation.orientationBasedRect
case .topRightSixthPortrait:
return WindowCalculationFactory.topLeftSixthCalculation.orientationBasedRect
case .leftCenterSixthPortrait:
return WindowCalculationFactory.topRightSixthCalculation.orientationBasedRect
case .rightCenterSixthPortrait:
return WindowCalculationFactory.topCenterSixthCalculation.orientationBasedRect
case .bottomLeftSixthPortrait:
return WindowCalculationFactory.bottomCenterSixthCalculation.orientationBasedRect
case .bottomRightSixthPortrait:
return WindowCalculationFactory.bottomLeftSixthCalculation.orientationBasedRect
default: break
}
}
else if direction == .right {
switch subAction {
case .topLeftSixthLandscape:
return WindowCalculationFactory.topCenterSixthCalculation.orientationBasedRect
case .topCenterSixthLandscape:
return WindowCalculationFactory.topRightSixthCalculation.orientationBasedRect
case .topRightSixthLandscape:
return WindowCalculationFactory.bottomLeftSixthCalculation.orientationBasedRect
case .bottomLeftSixthLandscape:
return WindowCalculationFactory.bottomCenterSixthCalculation.orientationBasedRect
case .bottomCenterSixthLandscape:
return WindowCalculationFactory.bottomRightSixthCalculation.orientationBasedRect
case .bottomRightSixthLandscape:
return WindowCalculationFactory.topLeftSixthCalculation.orientationBasedRect
case .topLeftSixthPortrait:
return WindowCalculationFactory.topRightSixthCalculation.orientationBasedRect
case .topRightSixthPortrait:
return WindowCalculationFactory.topCenterSixthCalculation.orientationBasedRect
case .leftCenterSixthPortrait:
return WindowCalculationFactory.bottomCenterSixthCalculation.orientationBasedRect
case .rightCenterSixthPortrait:
return WindowCalculationFactory.bottomLeftSixthCalculation.orientationBasedRect
case .bottomLeftSixthPortrait:
return WindowCalculationFactory.bottomRightSixthCalculation.orientationBasedRect
case .bottomRightSixthPortrait:
return WindowCalculationFactory.topLeftSixthCalculation.orientationBasedRect
default: break
}
}
return nil
}
}
================================================
FILE: Rectangle/WindowCalculation/SpecifiedCalculation.swift
================================================
import Foundation
final class SpecifiedCalculation: WindowCalculation {
private let specifiedHeight: CGFloat
private let specifiedWidth: CGFloat
override init() {
specifiedHeight = CGFloat(Defaults.specifiedHeight.value)
specifiedWidth = CGFloat(Defaults.specifiedWidth.value)
}
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var calculatedWindowRect = visibleFrameOfScreen
// Resize
calculatedWindowRect.size.height = specifiedHeight <= 1
? visibleFrameOfScreen.height * specifiedHeight
: round(specifiedHeight)
calculatedWindowRect.size.width = specifiedWidth <= 1
? visibleFrameOfScreen.width * specifiedWidth
: min(visibleFrameOfScreen.width, round(specifiedWidth))
// Center
calculatedWindowRect.origin.x = round((visibleFrameOfScreen.width - calculatedWindowRect.width) / 2.0) + visibleFrameOfScreen.minX
calculatedWindowRect.origin.y = round((visibleFrameOfScreen.height - calculatedWindowRect.height) / 2.0) + visibleFrameOfScreen.minY
return RectResult(calculatedWindowRect)
}
}
================================================
FILE: Rectangle/WindowCalculation/ThirdFourthCalculation.swift
================================================
//
// ThirdFourthCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class ThirdFourthCalculation: WindowCalculation, OrientationAware {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction,
last.action == .thirdFourth
else {
return orientationBasedRect(visibleFrameOfScreen)
}
let calc: SimpleCalc
switch lastSubAction {
case .centerRightFourth:
calc = WindowCalculationFactory.firstThreeFourthsCalculation.landscapeRect
case .centerBottomFourth:
calc = WindowCalculationFactory.firstThreeFourthsCalculation.portraitRect
case .leftThreeFourths:
calc = WindowCalculationFactory.centerHalfCalculation.landscapeRect
case .topThreeFourths:
calc = WindowCalculationFactory.centerHalfCalculation.portraitRect
default:
calc = orientationBasedRect
}
return calc(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.origin.x = visibleFrameOfScreen.minX + (rect.width * 2)
return RectResult(rect, subAction: .centerRightFourth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.minY + visibleFrameOfScreen.height - (rect.height * 3.0)
return RectResult(rect, subAction: .centerBottomFourth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopCenterLeftEighthCalculation.swift
================================================
//
// TopCenterLeftEighthCalculation.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopCenterLeftEighthCalculation: WindowCalculation, OrientationAware, EighthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topCenterLeftEighth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topCenterLeftEighth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topCenterLeftEighth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopCenterLeftSixteenthCalculation.swift
================================================
//
// TopCenterLeftSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class TopCenterLeftSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topCenterLeftSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topCenterLeftSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topCenterLeftSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopCenterLeftTwelfthCalculation.swift
================================================
//
// TopCenterLeftTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class TopCenterLeftTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topCenterLeftTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topCenterLeftTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topCenterLeftTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopCenterNinthCalculation.swift
================================================
//
// TopCenterNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopCenterNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topCenterNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topCenterNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topCenterNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopCenterRightEighthCalculation.swift
================================================
//
// TopCenterRightEighthCalculation.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopCenterRightEighthCalculation: WindowCalculation, OrientationAware, EighthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topCenterRightEighth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + (2.0 * rect.width)
return RectResult(rect, subAction: .topCenterRightEighth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - (visibleFrameOfScreen.height / 2.0)
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topCenterRightEighth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopCenterRightSixteenthCalculation.swift
================================================
//
// TopCenterRightSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class TopCenterRightSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topCenterRightSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 2
return RectResult(rect, subAction: .topCenterRightSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 2
return RectResult(rect, subAction: .topCenterRightSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopCenterRightTwelfthCalculation.swift
================================================
//
// TopCenterRightTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class TopCenterRightTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topCenterRightTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 4.0) * 2.0
return RectResult(rect, subAction: .topCenterRightTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 3.0) * 2.0
return RectResult(rect, subAction: .topCenterRightTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopCenterSixthCalculation.swift
================================================
//
// TopCenterSixthCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class TopCenterSixthCalculation: WindowCalculation, OrientationAware {
private let topRightTwoSixths = TopRightTwoSixthsCalculation()
private let topLeftTwoSixths = TopLeftTwoSixthsCalculation()
private let bottomLeftTwoSixths = BottomLeftTwoSixthsCalculation()
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction,
params.action == .topCenterSixth
else {
return orientationBasedRect(visibleFrameOfScreen)
}
let calc: SimpleCalc
switch lastSubAction{
case .topCenterSixthLandscape:
calc = topRightTwoSixths.orientationBasedRect
case .leftCenterSixthPortrait:
calc = bottomLeftTwoSixths.orientationBasedRect
case .topRightTwoSixthsLandscape, .bottomLeftTwoSixthsPortrait:
calc = topLeftTwoSixths.orientationBasedRect
default: calc = orientationBasedRect
}
return calc(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.x = visibleFrameOfScreen.minX + rect.width
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topCenterSixthLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + rect.height
return RectResult(rect, subAction: .leftCenterSixthPortrait)
}
}
class TopRightTwoSixthsCalculation: WindowCalculation, OrientationAware {
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * 2.0 / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topRightTwoSixthsLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height * 2.0 / 3.0)
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topRightTwoSixthsPortrait)
}
}
class TopLeftTwoSixthsCalculation: WindowCalculation, OrientationAware {
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * 2.0 / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topLeftTwoSixthsLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height * 2.0 / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topLeftTwoSixthsPortrait)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopHalfCalculation.swift
================================================
//
// TopHalfCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class TopHalfCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
if params.lastAction == nil || !Defaults.subsequentExecutionMode.resizes {
return calculateFirstRect(params)
}
return calculateRepeatedRect(params)
}
func calculateFirstRect(_ params: RectCalculationParameters) -> RectResult {
return calculateFractionalRect(params, fraction: Defaults.verticalSplitRatio.value / 100.0)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height * CGFloat(fraction))
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopLeftEighthCalculation.swift
================================================
//
// TopLeftEighthCalculation.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopLeftEighthCalculation: WindowCalculation, OrientationAware, EighthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topLeftEighth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftEighth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftEighth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopLeftNinthCalculation.swift
================================================
//
// TopLeftNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopLeftNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topLeftNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopLeftSixteenthCalculation.swift
================================================
//
// TopLeftSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class TopLeftSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topLeftSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopLeftSixthCalculation.swift
================================================
//
// TopLeftSixthCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class TopLeftSixthCalculation: WindowCalculation, OrientationAware, SixthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topLeftSixth
&& lastSubAction != .topLeftSixthLandscape
&& lastSubAction != .topLeftSixthPortrait {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topLeftSixthLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topLeftSixthPortrait)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopLeftThirdCalculation.swift
================================================
//
// TopLeftThirdCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopLeftThirdCalculation: WindowCalculation, OrientationAware, HorizontalThirdsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topLeftThird {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(2.0 * visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - visibleFrameOfScreen.height / 2.0
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftThird)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(2.0 * visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - visibleFrameOfScreen.height / 3.0
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopLeftTwelfthCalculation.swift
================================================
//
// TopLeftTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class TopLeftTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topLeftTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topLeftTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopRightEighthCalculation.swift
================================================
//
// TopRightEighthCalculation.swift
// Rectangle
//
// Created by Johannes Trussell Rasch on 2022-02-18.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopRightEighthCalculation: WindowCalculation, OrientationAware, EighthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topRightEighth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + (3.0 * rect.width)
return RectResult(rect, subAction: .topRightEighth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - (visibleFrameOfScreen.height / 2.0)
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .topRightEighth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopRightNinthCalculation.swift
================================================
//
// TopRightNinthCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopRightNinthCalculation: WindowCalculation, OrientationAware, NinthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topRightNinth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .topRightNinth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
return RectResult(rect, subAction: .topRightNinth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopRightSixteenthCalculation.swift
================================================
//
// TopRightSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class TopRightSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topRightSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 3
return RectResult(rect, subAction: .topRightSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 3
return RectResult(rect, subAction: .topRightSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopRightSixthCalculation.swift
================================================
//
// TopRightSixthCalculation.swift
// Rectangle
//
// Created by Ryan Hanson on 9/16/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
class TopRightSixthCalculation: WindowCalculation, OrientationAware, SixthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topRightSixth
&& lastSubAction != .topRightSixthLandscape
&& lastSubAction != .topRightSixthPortrait {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .left) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - rect.width
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topRightSixthLandscape)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.x = visibleFrameOfScreen.minX + rect.width
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topRightSixthPortrait)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopRightThirdCalculation.swift
================================================
//
// TopRightThirdCalculation.swift
// Rectangle
//
// Created by Daniel Schultz on 1/2/22.
// Copyright © 2022 Ryan Hanson. All rights reserved.
//
import Foundation
class TopRightThirdCalculation: WindowCalculation, OrientationAware, HorizontalThirdsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topRightThird {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(2.0 * visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width / 3.0
return RectResult(rect, subAction: .topRightThird)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(2.0 * visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - visibleFrameOfScreen.height / 3.0
rect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width / 2.0
return RectResult(rect, subAction: .topRightThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopRightTwelfthCalculation.swift
================================================
//
// TopRightTwelfthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class TopRightTwelfthCalculation: WindowCalculation, OrientationAware, TwelfthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .topRightTwelfth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
rect.origin.x = visibleFrameOfScreen.minX + floor(visibleFrameOfScreen.width / 4.0) * 3.0
return RectResult(rect, subAction: .topRightTwelfth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 3.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - (2.0 * rect.height)
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .topRightTwelfth)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopVerticalThirdCalculation.swift
================================================
//
// TopVerticalThirdCalculation.swift
// Rectangle
//
// Created on 12/22/25.
//
import Foundation
class TopVerticalThirdCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return calculateTopThird(visibleFrameOfScreen)
}
var calculation: WindowCalculation?
if last.action == .topVerticalThird {
switch lastSubAction {
case .topThird:
calculation = WindowCalculationFactory.middleVerticalThirdCalculation
case .centerVerticalThird:
calculation = WindowCalculationFactory.bottomVerticalThirdCalculation
default:
break
}
}
else if last.action == .bottomVerticalThird {
switch lastSubAction {
case .topThird:
calculation = WindowCalculationFactory.middleVerticalThirdCalculation
default:
break
}
}
if let calculation = calculation {
return calculation.calculateRect(params)
}
return calculateTopThird(visibleFrameOfScreen)
}
func calculateTopThird(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height / 3.0)
rect.origin.y = visibleFrameOfScreen.minY + visibleFrameOfScreen.height - rect.height
return RectResult(rect, subAction: .topThird)
}
}
================================================
FILE: Rectangle/WindowCalculation/TopVerticalTwoThirdsCalculation.swift
================================================
//
// TopVerticalTwoThirdsCalculation.swift
// Rectangle
//
// Created on 12/22/25.
//
import Foundation
class TopVerticalTwoThirdsCalculation: WindowCalculation {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction, let lastSubAction = last.subAction else {
return calculateTopTwoThirds(visibleFrameOfScreen)
}
if lastSubAction == .topTwoThirds {
return WindowCalculationFactory.bottomVerticalTwoThirdsCalculation.calculateRect(params)
}
return calculateTopTwoThirds(visibleFrameOfScreen)
}
func calculateTopTwoThirds(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.height = floor(visibleFrameOfScreen.height * 2 / 3.0)
rect.origin.y = visibleFrameOfScreen.origin.y + visibleFrameOfScreen.height - rect.height
return RectResult(rect, subAction: .topTwoThirds)
}
}
================================================
FILE: Rectangle/WindowCalculation/TwelfthsRepeated.swift
================================================
//
// TwelfthsRepeated.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
protocol TwelfthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc?
}
extension TwelfthsRepeated {
func nextCalculation(subAction: SubWindowAction, direction: Direction) -> SimpleCalc? {
if direction == .left {
switch subAction {
case .topLeftTwelfth:
return WindowCalculationFactory.bottomRightTwelfthCalculation.orientationBasedRect
case .topCenterLeftTwelfth:
return WindowCalculationFactory.topLeftTwelfthCalculation.orientationBasedRect
case .topCenterRightTwelfth:
return WindowCalculationFactory.topCenterLeftTwelfthCalculation.orientationBasedRect
case .topRightTwelfth:
return WindowCalculationFactory.topCenterRightTwelfthCalculation.orientationBasedRect
case .middleLeftTwelfth:
return WindowCalculationFactory.topRightTwelfthCalculation.orientationBasedRect
case .middleCenterLeftTwelfth:
return WindowCalculationFactory.middleLeftTwelfthCalculation.orientationBasedRect
case .middleCenterRightTwelfth:
return WindowCalculationFactory.middleCenterLeftTwelfthCalculation.orientationBasedRect
case .middleRightTwelfth:
return WindowCalculationFactory.middleCenterRightTwelfthCalculation.orientationBasedRect
case .bottomLeftTwelfth:
return WindowCalculationFactory.middleRightTwelfthCalculation.orientationBasedRect
case .bottomCenterLeftTwelfth:
return WindowCalculationFactory.bottomLeftTwelfthCalculation.orientationBasedRect
case .bottomCenterRightTwelfth:
return WindowCalculationFactory.bottomCenterLeftTwelfthCalculation.orientationBasedRect
case .bottomRightTwelfth:
return WindowCalculationFactory.bottomCenterRightTwelfthCalculation.orientationBasedRect
default: break
}
}
else if direction == .right {
switch subAction {
case .topLeftTwelfth:
return WindowCalculationFactory.topCenterLeftTwelfthCalculation.orientationBasedRect
case .topCenterLeftTwelfth:
return WindowCalculationFactory.topCenterRightTwelfthCalculation.orientationBasedRect
case .topCenterRightTwelfth:
return WindowCalculationFactory.topRightTwelfthCalculation.orientationBasedRect
case .topRightTwelfth:
return WindowCalculationFactory.middleLeftTwelfthCalculation.orientationBasedRect
case .middleLeftTwelfth:
return WindowCalculationFactory.middleCenterLeftTwelfthCalculation.orientationBasedRect
case .middleCenterLeftTwelfth:
return WindowCalculationFactory.middleCenterRightTwelfthCalculation.orientationBasedRect
case .middleCenterRightTwelfth:
return WindowCalculationFactory.middleRightTwelfthCalculation.orientationBasedRect
case .middleRightTwelfth:
return WindowCalculationFactory.bottomLeftTwelfthCalculation.orientationBasedRect
case .bottomLeftTwelfth:
return WindowCalculationFactory.bottomCenterLeftTwelfthCalculation.orientationBasedRect
case .bottomCenterLeftTwelfth:
return WindowCalculationFactory.bottomCenterRightTwelfthCalculation.orientationBasedRect
case .bottomCenterRightTwelfth:
return WindowCalculationFactory.bottomRightTwelfthCalculation.orientationBasedRect
case .bottomRightTwelfth:
return WindowCalculationFactory.topLeftTwelfthCalculation.orientationBasedRect
default: break
}
}
return nil
}
}
================================================
FILE: Rectangle/WindowCalculation/UpperLeftCalculation.swift
================================================
//
// UpperLeftCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class UpperLeftCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation, QuartersRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
if Defaults.subsequentExecutionMode.cyclesQuadrantPositions {
if let last = params.lastAction,
let lastSubAction = last.subAction,
last.action == .topLeft || lastSubAction == .topLeftQuarter {
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(params.visibleFrameOfScreen)
}
}
return quarterRect(params.visibleFrameOfScreen)
}
if params.lastAction == nil || !Defaults.subsequentExecutionMode.resizes {
return calculateFirstRect(params)
}
return calculateRepeatedRect(params)
}
func quarterRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topLeftQuarter)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * CGFloat(fraction))
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/UpperMiddleCenterLeftSixteenthCalculation.swift
================================================
//
// UpperMiddleCenterLeftSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class UpperMiddleCenterLeftSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .upperMiddleCenterLeftSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height * 2
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .upperMiddleCenterLeftSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height * 2
rect.origin.x = visibleFrameOfScreen.minX + rect.width
return RectResult(rect, subAction: .upperMiddleCenterLeftSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/UpperMiddleCenterRightSixteenthCalculation.swift
================================================
//
// UpperMiddleCenterRightSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class UpperMiddleCenterRightSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .upperMiddleCenterRightSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height * 2
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 2
return RectResult(rect, subAction: .upperMiddleCenterRightSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height * 2
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 2
return RectResult(rect, subAction: .upperMiddleCenterRightSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/UpperMiddleLeftSixteenthCalculation.swift
================================================
//
// UpperMiddleLeftSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class UpperMiddleLeftSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .upperMiddleLeftSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height * 2
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .upperMiddleLeftSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height * 2
rect.origin.x = visibleFrameOfScreen.minX
return RectResult(rect, subAction: .upperMiddleLeftSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/UpperMiddleRightSixteenthCalculation.swift
================================================
//
// UpperMiddleRightSixteenthCalculation.swift
// Rectangle
//
// Copyright © 2024 Ryan Hanson. All rights reserved.
//
import Foundation
class UpperMiddleRightSixteenthCalculation: WindowCalculation, OrientationAware, SixteenthsRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
guard Defaults.subsequentExecutionMode.value != .none,
let last = params.lastAction,
let lastSubAction = last.subAction
else {
return orientationBasedRect(visibleFrameOfScreen)
}
if last.action != .upperMiddleRightSixteenth {
return orientationBasedRect(visibleFrameOfScreen)
}
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(visibleFrameOfScreen)
}
return orientationBasedRect(visibleFrameOfScreen)
}
func landscapeRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height * 2
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 3
return RectResult(rect, subAction: .upperMiddleRightSixteenth)
}
func portraitRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 4.0)
rect.size.height = floor(visibleFrameOfScreen.height / 4.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height * 2
rect.origin.x = visibleFrameOfScreen.minX + rect.width * 3
return RectResult(rect, subAction: .upperMiddleRightSixteenth)
}
}
================================================
FILE: Rectangle/WindowCalculation/UpperRightCalculation.swift
================================================
//
// UpperRightCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class UpperRightCalculation: WindowCalculation, RepeatedExecutionsInThirdsCalculation, QuartersRepeated {
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
if Defaults.subsequentExecutionMode.cyclesQuadrantPositions {
if let last = params.lastAction,
let lastSubAction = last.subAction,
last.action == .topRight || lastSubAction == .topRightQuarter {
if let calculation = self.nextCalculation(subAction: lastSubAction, direction: .right) {
return calculation(params.visibleFrameOfScreen)
}
}
return quarterRect(params.visibleFrameOfScreen)
}
if params.lastAction == nil || !Defaults.subsequentExecutionMode.resizes {
return calculateFirstRect(params)
}
return calculateRepeatedRect(params)
}
func quarterRect(_ visibleFrameOfScreen: CGRect) -> RectResult {
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width / 2.0)
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect, subAction: .topRightQuarter)
}
func calculateFractionalRect(_ params: RectCalculationParameters, fraction: Float) -> RectResult {
let visibleFrameOfScreen = params.visibleFrameOfScreen
var rect = visibleFrameOfScreen
rect.size.width = floor(visibleFrameOfScreen.width * CGFloat(fraction))
rect.origin.x = visibleFrameOfScreen.maxX - rect.width
rect.size.height = floor(visibleFrameOfScreen.height / 2.0)
rect.origin.y = visibleFrameOfScreen.maxY - rect.height
return RectResult(rect)
}
}
================================================
FILE: Rectangle/WindowCalculation/WindowCalculation.swift
================================================
//
// WindowCalculation.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/13/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
protocol Calculation {
func calculate(_ params: WindowCalculationParameters) -> WindowCalculationResult?
func calculateRect(_ params: RectCalculationParameters) -> RectResult
}
class WindowCalculation: Calculation {
func calculate(_ params: WindowCalculationParameters) -> WindowCalculationResult? {
let rectResult = calculateRect(params.asRectParams())
if rectResult.rect.isNull {
return nil
}
return WindowCalculationResult(rect: rectResult.rect, screen: params.usableScreens.currentScreen, resultingAction: params.action, resultingSubAction: rectResult.subAction)
}
func calculateRect(_ params: RectCalculationParameters) -> RectResult {
RectResult(.null)
}
func rectCenteredWithinRect(_ rect1: CGRect, _ rect2: CGRect) -> Bool {
let centeredMidX = abs(rect2.midX - rect1.midX) <= 1.0
let centeredMidY = abs(rect2.midY - rect1.midY) <= 1.0
return rect1.contains(rect2) && centeredMidX && centeredMidY
}
func rectFitsWithinRect(rect1: CGRect, rect2: CGRect) -> Bool {
(rect1.width <= rect2.width) && (rect1.height <= rect2.height)
}
func isRepeatedCommand(_ params: WindowCalculationParameters) -> Bool {
if let lastAction = params.lastAction, lastAction.action == params.action {
let normalizedLastRect = lastAction.rect.screenFlipped
return normalizedLastRect == params.window.rect
}
return false
}
}
struct Window {
let id: CGWindowID
let rect: CGRect
}
struct WindowCalculationParameters {
let window: Window
let usableScreens: UsableScreens
let action: WindowAction
let lastAction: RectangleAction?
let ignoreTodo: Bool
func asRectParams(visibleFrame: CGRect? = nil, differentAction: WindowAction? = nil) -> RectCalculationParameters {
RectCalculationParameters(window: window,
visibleFrameOfScreen: visibleFrame ?? usableScreens.currentScreen.adjustedVisibleFrame(ignoreTodo),
action: differentAction ?? action,
lastAction: lastAction)
}
func withDifferentAction(_ differentAction: WindowAction) -> WindowCalculationParameters {
.init(window: window,
usableScreens: usableScreens,
action: differentAction,
lastAction: lastAction,
ignoreTodo: ignoreTodo)
}
}
struct RectCalculationParameters {
let window: Window
let visibleFrameOfScreen: CGRect
let action: WindowAction
let lastAction: RectangleAction?
}
struct RectResult {
let rect: CGRect
let resultingAction: WindowAction?
let subAction: SubWindowAction?
init(_ rect: CGRect, resultingAction: WindowAction? = nil, subAction: SubWindowAction? = nil) {
self.rect = rect
self.resultingAction = resultingAction
self.subAction = subAction
}
}
struct WindowCalculationResult {
var rect: CGRect
let screen: NSScreen
let resultingAction: WindowAction
let resultingSubAction: SubWindowAction?
let resultingScreenFrame: CGRect?
init(rect: CGRect,
screen: NSScreen,
resultingAction: WindowAction,
resultingSubAction: SubWindowAction? = nil,
resultingScreenFrame: CGRect? = nil) {
self.rect = rect
self.screen = screen
self.resultingAction = resultingAction
self.resultingSubAction = resultingSubAction
self.resultingScreenFrame = resultingScreenFrame
}
}
class WindowCalculationFactory {
static let leftHalfCalculation = LeftRightHalfCalculation()
static let rightHalfCalculation = LeftRightHalfCalculation()
static let centerHalfCalculation = CenterHalfCalculation()
static let bottomHalfCalculation = BottomHalfCalculation()
static let topHalfCalculation = TopHalfCalculation()
static let centerCalculation = CenterCalculation()
static let centerProminentlyCalculation = CenterProminentlyCalculation()
static let nextPrevDisplayCalculation = NextPrevDisplayCalculation()
static let maximizeCalculation = MaximizeCalculation()
static let changeSizeCalculation = ChangeSizeCalculation()
static let halfOrDoubleDimensionCalculation = HalfOrDoubleDimensionCalculation()
static let lowerLeftCalculation = LowerLeftCalculation()
static let lowerRightCalculation = LowerRightCalculation()
static let upperLeftCalculation = UpperLeftCalculation()
static let upperRightCalculation = UpperRightCalculation()
static let maxHeightCalculation = MaximizeHeightCalculation()
static let firstThirdCalculation = FirstThirdCalculation()
static let firstTwoThirdsCalculation = FirstTwoThirdsCalculation()
static let centerThirdCalculation = CenterThirdCalculation()
static let centerTwoThirdsCalculation = CenterTwoThirdsCalculation()
static let lastTwoThirdsCalculation = LastTwoThirdsCalculation()
static let lastThirdCalculation = LastThirdCalculation()
static let moveLeftRightCalculation = MoveLeftRightCalculation()
static let moveUpCalculation = MoveUpDownCalculation()
static let moveDownCalculation = MoveUpDownCalculation()
static let almostMaximizeCalculation = AlmostMaximizeCalculation()
static let firstFourthCalculation = FirstFourthCalculation()
static let secondFourthCalculation = SecondFourthCalculation()
static let thirdFourthCalculation = ThirdFourthCalculation()
static let lastFourthCalculation = LastFourthCalculation()
static let firstThreeFourthsCalculation = FirstThreeFourthsCalculation()
static let centerThreeFourthsCalculation = CenterThreeFourthsCalculation()
static let lastThreeFourthsCalculation = LastThreeFourthsCalculation()
static let topLeftSixthCalculation = TopLeftSixthCalculation()
static let topCenterSixthCalculation = TopCenterSixthCalculation()
static let topRightSixthCalculation = TopRightSixthCalculation()
static let bottomLeftSixthCalculation = BottomLeftSixthCalculation()
static let bottomCenterSixthCalculation = BottomCenterSixthCalculation()
static let bottomRightSixthCalculation = BottomRightSixthCalculation()
static let topLeftNinthCalculation = TopLeftNinthCalculation()
static let topCenterNinthCalculation = TopCenterNinthCalculation()
static let topRightNinthCalculation = TopRightNinthCalculation()
static let middleLeftNinthCalculation = MiddleLeftNinthCalculation()
static let middleCenterNinthCalculation = MiddleCenterNinthCalculation()
static let middleRightNinthCalculation = MiddleRightNinthCalculation()
static let bottomLeftNinthCalculation = BottomLeftNinthCalculation()
static let bottomCenterNinthCalculation = BottomCenterNinthCalculation()
static let bottomRightNinthCalculation = BottomRightNinthCalculation()
static let topLeftThirdCalculation = TopLeftThirdCalculation()
static let topRightThirdCalculation = TopRightThirdCalculation()
static let bottomLeftThirdCalculation = BottomLeftThirdCalculation()
static let bottomRightThirdCalculation = BottomRightThirdCalculation()
static let topLeftEighthCalculation = TopLeftEighthCalculation()
static let topCenterLeftEighthCalculation = TopCenterLeftEighthCalculation()
static let topCenterRightEighthCalculation = TopCenterRightEighthCalculation()
static let topRightEighthCalculation = TopRightEighthCalculation()
static let bottomLeftEighthCalculation = BottomLeftEighthCalculation()
static let bottomCenterLeftEighthCalculation = BottomCenterLeftEighthCalculation()
static let bottomCenterRightEighthCalculation = BottomCenterRightEighthCalculation()
static let bottomRightEighthCalculation = BottomRightEighthCalculation()
static let specifiedCalculation = SpecifiedCalculation()
static let leftTodoCalculation = LeftTodoCalculation()
static let rightTodoCalculation = RightTodoCalculation()
static let bottomVerticalTwoThirdsCalculation = BottomVerticalTwoThirdsCalculation()
static let topVerticalTwoThirdsCalculation = TopVerticalTwoThirdsCalculation()
static let bottomVerticalThirdCalculation = BottomVerticalThirdCalculation()
static let topVerticalThirdCalculation = TopVerticalThirdCalculation()
static let middleVerticalThirdCalculation = MiddleVerticalThirdCalculation()
static let topLeftTwelfthCalculation = TopLeftTwelfthCalculation()
static let topCenterLeftTwelfthCalculation = TopCenterLeftTwelfthCalculation()
static let topCenterRightTwelfthCalculation = TopCenterRightTwelfthCalculation()
static let topRightTwelfthCalculation = TopRightTwelfthCalculation()
static let middleLeftTwelfthCalculation = MiddleLeftTwelfthCalculation()
static let middleCenterLeftTwelfthCalculation = MiddleCenterLeftTwelfthCalculation()
static let middleCenterRightTwelfthCalculation = MiddleCenterRightTwelfthCalculation()
static let middleRightTwelfthCalculation = MiddleRightTwelfthCalculation()
static let bottomLeftTwelfthCalculation = BottomLeftTwelfthCalculation()
static let bottomCenterLeftTwelfthCalculation = BottomCenterLeftTwelfthCalculation()
static let bottomCenterRightTwelfthCalculation = BottomCenterRightTwelfthCalculation()
static let bottomRightTwelfthCalculation = BottomRightTwelfthCalculation()
static let topLeftSixteenthCalculation = TopLeftSixteenthCalculation()
static let topCenterLeftSixteenthCalculation = TopCenterLeftSixteenthCalculation()
static let topCenterRightSixteenthCalculation = TopCenterRightSixteenthCalculation()
static let topRightSixteenthCalculation = TopRightSixteenthCalculation()
static let upperMiddleLeftSixteenthCalculation = UpperMiddleLeftSixteenthCalculation()
static let upperMiddleCenterLeftSixteenthCalculation = UpperMiddleCenterLeftSixteenthCalculation()
static let upperMiddleCenterRightSixteenthCalculation = UpperMiddleCenterRightSixteenthCalculation()
static let upperMiddleRightSixteenthCalculation = UpperMiddleRightSixteenthCalculation()
static let lowerMiddleLeftSixteenthCalculation = LowerMiddleLeftSixteenthCalculation()
static let lowerMiddleCenterLeftSixteenthCalculation = LowerMiddleCenterLeftSixteenthCalculation()
static let lowerMiddleCenterRightSixteenthCalculation = LowerMiddleCenterRightSixteenthCalculation()
static let lowerMiddleRightSixteenthCalculation = LowerMiddleRightSixteenthCalculation()
static let bottomLeftSixteenthCalculation = BottomLeftSixteenthCalculation()
static let bottomCenterLeftSixteenthCalculation = BottomCenterLeftSixteenthCalculation()
static let bottomCenterRightSixteenthCalculation = BottomCenterRightSixteenthCalculation()
static let bottomRightSixteenthCalculation = BottomRightSixteenthCalculation()
static let calculationsByAction: [WindowAction: WindowCalculation] = [
.leftHalf: leftHalfCalculation,
.rightHalf: rightHalfCalculation,
.maximize: maximizeCalculation,
.maximizeHeight: maxHeightCalculation,
.previousDisplay: nextPrevDisplayCalculation,
.nextDisplay: nextPrevDisplayCalculation,
.larger: changeSizeCalculation,
.smaller: changeSizeCalculation,
.largerWidth: changeSizeCalculation,
.smallerWidth: changeSizeCalculation,
.largerHeight: changeSizeCalculation,
.smallerHeight: changeSizeCalculation,
.bottomHalf: bottomHalfCalculation,
.topHalf: topHalfCalculation,
.center: centerCalculation,
.centerProminently: centerProminentlyCalculation,
.bottomLeft: lowerLeftCalculation,
.bottomRight: lowerRightCalculation,
.topLeft: upperLeftCalculation,
.topRight: upperRightCalculation,
.firstThird: firstThirdCalculation,
.firstTwoThirds: firstTwoThirdsCalculation,
.centerThird: centerThirdCalculation,
.centerTwoThirds: centerTwoThirdsCalculation,
.lastTwoThirds: lastTwoThirdsCalculation,
.lastThird: lastThirdCalculation,
.moveLeft: moveLeftRightCalculation,
.moveRight: moveLeftRightCalculation,
.moveUp: moveUpCalculation,
.moveDown: moveDownCalculation,
.almostMaximize: almostMaximizeCalculation,
.centerHalf: centerHalfCalculation,
.firstFourth: firstFourthCalculation,
.secondFourth: secondFourthCalculation,
.thirdFourth: thirdFourthCalculation,
.lastFourth: lastFourthCalculation,
.firstThreeFourths: firstThreeFourthsCalculation,
.centerThreeFourths: centerThreeFourthsCalculation,
.lastThreeFourths: lastThreeFourthsCalculation,
.topLeftSixth: topLeftSixthCalculation,
.topCenterSixth: topCenterSixthCalculation,
.topRightSixth: topRightSixthCalculation,
.bottomLeftSixth: bottomLeftSixthCalculation,
.bottomCenterSixth: bottomCenterSixthCalculation,
.bottomRightSixth: bottomRightSixthCalculation,
.topLeftNinth: topLeftNinthCalculation,
.topCenterNinth: topCenterNinthCalculation,
.topRightNinth: topRightNinthCalculation,
.middleLeftNinth: middleLeftNinthCalculation,
.middleCenterNinth: middleCenterNinthCalculation,
.middleRightNinth: middleRightNinthCalculation,
.bottomLeftNinth: bottomLeftNinthCalculation,
.bottomCenterNinth: bottomCenterNinthCalculation,
.bottomRightNinth: bottomRightNinthCalculation,
.topLeftThird: topLeftThirdCalculation,
.topRightThird: topRightThirdCalculation,
.bottomLeftThird: bottomLeftThirdCalculation,
.bottomRightThird: bottomRightThirdCalculation,
.topLeftEighth: topLeftEighthCalculation,
.topCenterLeftEighth: topCenterLeftEighthCalculation,
.topCenterRightEighth: topCenterRightEighthCalculation,
.topRightEighth: topRightEighthCalculation,
.bottomLeftEighth: bottomLeftEighthCalculation,
.bottomCenterLeftEighth: bottomCenterLeftEighthCalculation,
.bottomCenterRightEighth: bottomCenterRightEighthCalculation,
.bottomRightEighth: bottomRightEighthCalculation,
.halveHeightUp: halfOrDoubleDimensionCalculation,
.halveHeightDown: halfOrDoubleDimensionCalculation,
.halveWidthLeft: halfOrDoubleDimensionCalculation,
.halveWidthRight: halfOrDoubleDimensionCalculation,
.doubleHeightUp: halfOrDoubleDimensionCalculation,
.doubleHeightDown: halfOrDoubleDimensionCalculation,
.doubleWidthLeft: halfOrDoubleDimensionCalculation,
.doubleWidthRight: halfOrDoubleDimensionCalculation,
.specified: specifiedCalculation,
.leftTodo: leftTodoCalculation,
.rightTodo: rightTodoCalculation,
.topVerticalThird: topVerticalThirdCalculation,
.middleVerticalThird: middleVerticalThirdCalculation,
.bottomVerticalThird: bottomVerticalThirdCalculation,
.topVerticalTwoThirds: topVerticalTwoThirdsCalculation,
.bottomVerticalTwoThirds: bottomVerticalTwoThirdsCalculation,
.topLeftTwelfth: topLeftTwelfthCalculation,
.topCenterLeftTwelfth: topCenterLeftTwelfthCalculation,
.topCenterRightTwelfth: topCenterRightTwelfthCalculation,
.topRightTwelfth: topRightTwelfthCalculation,
.middleLeftTwelfth: middleLeftTwelfthCalculation,
.middleCenterLeftTwelfth: middleCenterLeftTwelfthCalculation,
.middleCenterRightTwelfth: middleCenterRightTwelfthCalculation,
.middleRightTwelfth: middleRightTwelfthCalculation,
.bottomLeftTwelfth: bottomLeftTwelfthCalculation,
.bottomCenterLeftTwelfth: bottomCenterLeftTwelfthCalculation,
.bottomCenterRightTwelfth: bottomCenterRightTwelfthCalculation,
.bottomRightTwelfth: bottomRightTwelfthCalculation,
.topLeftSixteenth: topLeftSixteenthCalculation,
.topCenterLeftSixteenth: topCenterLeftSixteenthCalculation,
.topCenterRightSixteenth: topCenterRightSixteenthCalculation,
.topRightSixteenth: topRightSixteenthCalculation,
.upperMiddleLeftSixteenth: upperMiddleLeftSixteenthCalculation,
.upperMiddleCenterLeftSixteenth: upperMiddleCenterLeftSixteenthCalculation,
.upperMiddleCenterRightSixteenth: upperMiddleCenterRightSixteenthCalculation,
.upperMiddleRightSixteenth: upperMiddleRightSixteenthCalculation,
.lowerMiddleLeftSixteenth: lowerMiddleLeftSixteenthCalculation,
.lowerMiddleCenterLeftSixteenth: lowerMiddleCenterLeftSixteenthCalculation,
.lowerMiddleCenterRightSixteenth: lowerMiddleCenterRightSixteenthCalculation,
.lowerMiddleRightSixteenth: lowerMiddleRightSixteenthCalculation,
.bottomLeftSixteenth: bottomLeftSixteenthCalculation,
.bottomCenterLeftSixteenth: bottomCenterLeftSixteenthCalculation,
.bottomCenterRightSixteenth: bottomCenterRightSixteenthCalculation,
.bottomRightSixteenth: bottomRightSixteenthCalculation
// .restore: nil
]
}
================================================
FILE: Rectangle/WindowHistory.swift
================================================
//
// WindowHistory.swift
// Rectangle
//
// Created by Ryan Hanson on 9/6/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class WindowHistory {
var restoreRects = [CGWindowID: CGRect]() // the last window frame that the user positioned
var lastRectangleActions = [CGWindowID: RectangleAction]() // the last window frame that this app positioned
}
================================================
FILE: Rectangle/WindowManager.swift
================================================
//
// WindowManager.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/12/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
class WindowManager {
private let screenDetection = ScreenDetection()
private let standardWindowMoverChain: [WindowMover]
private let fixedSizeWindowMoverChain: [WindowMover]
init() {
standardWindowMoverChain = [
StandardWindowMover(),
BestEffortWindowMover()
]
fixedSizeWindowMoverChain = [
CenteringFixedSizedWindowMover(),
BestEffortWindowMover()
]
}
private func recordAction(windowId: CGWindowID, resultingRect: CGRect, action: WindowAction, subAction: SubWindowAction?) {
let newCount: Int
if let lastRectangleAction = AppDelegate.windowHistory.lastRectangleActions[windowId], lastRectangleAction.action == action {
newCount = lastRectangleAction.count + 1
} else {
newCount = 1
}
AppDelegate.windowHistory.lastRectangleActions[windowId] = RectangleAction(
action: action,
subAction: subAction,
rect: resultingRect,
count: newCount
)
}
func execute(_ parameters: ExecutionParameters) {
guard let frontmostWindowElement = parameters.windowElement ?? AccessibilityElement.getFrontWindowElement(),
let windowId = parameters.windowId ?? frontmostWindowElement.getWindowId()
else {
NSSound.beep()
return
}
let action = parameters.action
if action == .restore {
if let restoreRect = AppDelegate.windowHistory.restoreRects[windowId] {
frontmostWindowElement.setFrame(restoreRect)
}
AppDelegate.windowHistory.lastRectangleActions.removeValue(forKey: windowId)
return
}
var screens: UsableScreens?
if let screen = parameters.screen {
screens = UsableScreens(currentScreen: screen, numScreens: 1)
} else {
screens = Defaults.useCursorScreenDetection.enabled
? screenDetection.detectScreensAtCursor()
: screenDetection.detectScreens(using: frontmostWindowElement)
}
guard let usableScreens = screens else {
NSSound.beep()
Logger.log("Unable to obtain usable screens")
return
}
let currentWindowRect: CGRect = frontmostWindowElement.frame
var lastRectangleAction = AppDelegate.windowHistory.lastRectangleActions[windowId]
let windowMovedExternally = currentWindowRect != lastRectangleAction?.rect
if windowMovedExternally {
lastRectangleAction = nil
AppDelegate.windowHistory.lastRectangleActions.removeValue(forKey: windowId)
}
if parameters.updateRestoreRect {
if AppDelegate.windowHistory.restoreRects[windowId] == nil
|| windowMovedExternally {
AppDelegate.windowHistory.restoreRects[windowId] = currentWindowRect
}
}
let ignoreTodo = TodoManager.isTodoWindow(windowId)
if frontmostWindowElement.isSheet == true
|| currentWindowRect.isNull
|| usableScreens.frameOfCurrentScreen.isNull
|| usableScreens.currentScreen.adjustedVisibleFrame(ignoreTodo).isNull {
NSSound.beep()
Logger.log("Window is not snappable or usable screen is not valid")
return
}
let currentNormalizedRect = currentWindowRect.screenFlipped
let currentWindow = Window(id: windowId, rect: currentNormalizedRect)
let windowCalculation = WindowCalculationFactory.calculationsByAction[action]
let calculationParams = WindowCalculationParameters(window: currentWindow, usableScreens: usableScreens, action: action, lastAction: lastRectangleAction, ignoreTodo: ignoreTodo)
guard var calcResult = windowCalculation?.calculate(calculationParams) else {
NSSound.beep()
Logger.log("Nil calculation result")
return
}
let gapsApplicable = calcResult.resultingAction.gapsApplicable
if Defaults.gapSize.value > 0, gapsApplicable != .none {
let gapSharedEdges = calcResult.resultingSubAction?.gapSharedEdge ?? calcResult.resultingAction.gapSharedEdge
calcResult.rect = GapCalculation.applyGaps(calcResult.rect, dimension: gapsApplicable, sharedEdges: gapSharedEdges, gapSize: Defaults.gapSize.value)
}
if currentNormalizedRect.equalTo(calcResult.rect) {
Logger.log("Current frame is equal to new frame")
recordAction(windowId: windowId, resultingRect: currentWindowRect, action: calcResult.resultingAction, subAction: calcResult.resultingSubAction)
return
}
let visibleFrameOfDestinationScreen = calcResult.resultingScreenFrame ?? calcResult.screen.adjustedVisibleFrame(ignoreTodo)
let isFixedSize = (!frontmostWindowElement.isResizable() && action.resizes) || frontmostWindowElement.isSystemDialog == true
let resultParameters = ResultParameters(windowId: windowId,
action: action,
windowElement: frontmostWindowElement,
calcResult: calcResult,
usableScreens: usableScreens,
visibleFrameOfScreen: visibleFrameOfDestinationScreen,
source: parameters.source,
isFixedSize: isFixedSize)
var resultingRect = apply(result: resultParameters)
let isMovedAcrossDisplays = usableScreens.currentScreen != calcResult.screen
if isMovedAcrossDisplays {
if calcResult.rect.height != resultingRect.height {
Logger.log("Window size wasn't applied perfectly across displays. Trying again.")
resultingRect = apply(result: resultParameters)
if calcResult.rect.height != resultingRect.height {
Logger.log("Final attempt to adjust across displays.")
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(25)) { [weak self] in
guard let self else { return }
let finalRect = self.apply(result: resultParameters)
self.windowMovedAcrossDisplays(windowElement: frontmostWindowElement, resultingRect: finalRect)
self.postProcess(result: resultParameters, resultingRect: finalRect)
}
return
}
}
windowMovedAcrossDisplays(windowElement: frontmostWindowElement, resultingRect: resultingRect)
}
postProcess(result: resultParameters, resultingRect: resultingRect)
}
/// Move/resize a window based on the calculation results.
/// - Returns: The rect of the window after applying the window action
func apply(result: ResultParameters) -> CGRect {
let windowMoverChain = result.isFixedSize
? fixedSizeWindowMoverChain
: standardWindowMoverChain
let newRect = result.calcResult.rect.screenFlipped
for windowMover in windowMoverChain {
windowMover.moveWindowRect(newRect,
frameOfScreen: result.usableScreens.frameOfCurrentScreen,
visibleFrameOfScreen: result.visibleFrameOfScreen,
frontmostWindowElement: result.windowElement,
action: result.action)
}
return result.windowElement.frame
}
func windowMovedAcrossDisplays(windowElement: AccessibilityElement, resultingRect: CGRect) {
windowElement.bringToFront(force: true)
if Defaults.moveCursorAcrossDisplays.userEnabled {
CGWarpMouseCursorPosition(resultingRect.centerPoint)
}
}
func postProcess(result: ResultParameters, resultingRect: CGRect) {
let calcResult = result.calcResult
if Defaults.moveCursor.userEnabled, result.source == .keyboardShortcut {
CGWarpMouseCursorPosition(resultingRect.centerPoint)
}
recordAction(windowId: result.windowId, resultingRect: resultingRect, action: calcResult.resultingAction, subAction: calcResult.resultingSubAction)
if Logger.logging {
var logItems = ["\(result.action.name)",
"display: \(result.visibleFrameOfScreen.debugDescription)",
"calculatedRect: \(result.calcResult.rect.screenFlipped.debugDescription)",
"resultRect: \(resultingRect.debugDescription)",
"srcScreen: \(result.usableScreens.currentScreen.localizedName)",
"destScreen: \(calcResult.screen.localizedName)"]
if let resultScreens = screenDetection.detectScreens(using: result.windowElement) {
logItems.append("resultScreen: \(resultScreens.currentScreen.localizedName)")
}
Logger.log(logItems.joined(separator: ", "))
}
}
struct ResultParameters {
let windowId: CGWindowID
let action: WindowAction
let windowElement: AccessibilityElement
let calcResult: WindowCalculationResult
let usableScreens: UsableScreens
let visibleFrameOfScreen: CGRect
let source: ExecutionSource
let isFixedSize: Bool
}
}
struct RectangleAction {
let action: WindowAction
let subAction: SubWindowAction?
let rect: CGRect
let count: Int
}
struct ExecutionParameters {
let action: WindowAction
let updateRestoreRect: Bool
let screen: NSScreen?
let windowElement: AccessibilityElement?
let windowId: CGWindowID?
let source: ExecutionSource
init(_ action: WindowAction, updateRestoreRect: Bool = true, screen: NSScreen? = nil, windowElement: AccessibilityElement? = nil, windowId: CGWindowID? = nil, source: ExecutionSource = .keyboardShortcut) {
self.action = action
self.updateRestoreRect = updateRestoreRect
self.screen = screen
self.windowElement = windowElement
self.windowId = windowId
self.source = source
}
}
enum ExecutionSource {
case keyboardShortcut, dragToSnap, menuItem, url, titleBar
}
================================================
FILE: Rectangle/WindowMover/BestEffortWindowMover.swift
================================================
//
// BestEffortWindowMover.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/13/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
/**
* After a window has been moved and resized, if the window could not be resized small enough to fit the intended size, then some of the window may appear off the screen. The BestEffortWindowMover will move the window so that it fits entirely on the screen.
*/
class BestEffortWindowMover: WindowMover {
func moveWindowRect(_ windowRect: CGRect, frameOfScreen: CGRect, visibleFrameOfScreen: CGRect, frontmostWindowElement: AccessibilityElement?, action: WindowAction?) {
guard let currentWindowRect: CGRect = frontmostWindowElement?.frame else { return }
if action?.allowedToExtendOutsideCurrentScreenArea == true && !NSScreen.screensHaveSeparateSpaces { return }
var adjustedWindowRect: CGRect = currentWindowRect
if adjustedWindowRect.minX < visibleFrameOfScreen.minX {
adjustedWindowRect.origin.x = visibleFrameOfScreen.minX
} else if adjustedWindowRect.minX + adjustedWindowRect.width > visibleFrameOfScreen.minX + visibleFrameOfScreen.width {
adjustedWindowRect.origin.x = visibleFrameOfScreen.minX + visibleFrameOfScreen.width - (adjustedWindowRect.width) - CGFloat(Defaults.gapSize.value)
}
adjustedWindowRect = adjustedWindowRect.screenFlipped
if adjustedWindowRect.minY < visibleFrameOfScreen.minY {
adjustedWindowRect.origin.y = visibleFrameOfScreen.minY
} else if adjustedWindowRect.minY + adjustedWindowRect.height > visibleFrameOfScreen.minY + visibleFrameOfScreen.height {
adjustedWindowRect.origin.y = visibleFrameOfScreen.minY + visibleFrameOfScreen.height - (adjustedWindowRect.height) - CGFloat(Defaults.gapSize.value)
}
adjustedWindowRect = adjustedWindowRect.screenFlipped
if !currentWindowRect.equalTo(adjustedWindowRect) {
frontmostWindowElement?.setFrame(adjustedWindowRect)
}
}
}
================================================
FILE: Rectangle/WindowMover/CenteringFixedSizedWindowMover.swift
================================================
//
// CenteringFixedSizedWindowMover.swift
// Rectangle
//
// Created by Ryan Hanson on 1/14/20.
// Copyright © 2020 Ryan Hanson. All rights reserved.
//
import Foundation
/**
If the window is fixed size, center it in the proposed window area
*/
class CenteringFixedSizedWindowMover: WindowMover {
func moveWindowRect(_ windowRect: CGRect, frameOfScreen: CGRect, visibleFrameOfScreen: CGRect, frontmostWindowElement: AccessibilityElement?, action: WindowAction?) {
guard let currentWindowRect: CGRect = frontmostWindowElement?.frame else { return }
var adjustedWindowRect: CGRect = currentWindowRect
if currentWindowRect.size.width != windowRect.width {
adjustedWindowRect.origin.x = round((windowRect.width - currentWindowRect.width) / 2.0) + windowRect.minX
}
if currentWindowRect.size.height != windowRect.height {
adjustedWindowRect.origin.y = round((windowRect.height - currentWindowRect.height) / 2.0) + windowRect.minY
}
if !adjustedWindowRect.equalTo(currentWindowRect) {
frontmostWindowElement?.setFrame(adjustedWindowRect)
}
}
}
================================================
FILE: Rectangle/WindowMover/QuantizedWindowMover.swift
================================================
//
// QuantizedWindowMover.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/13/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class QuantizedWindowMover: WindowMover {
func moveWindowRect(_ windowRect: CGRect, frameOfScreen: CGRect, visibleFrameOfScreen: CGRect, frontmostWindowElement: AccessibilityElement?, action: WindowAction?) {
guard var movedWindowRect: CGRect = frontmostWindowElement?.frame else { return }
if !movedWindowRect.equalTo(windowRect) {
var adjustedWindowRect: CGRect = windowRect
while movedWindowRect.width > windowRect.width || movedWindowRect.height > windowRect.height {
if movedWindowRect.width > windowRect.width {
adjustedWindowRect.size.width -= 2
}
if movedWindowRect.height > windowRect.height {
adjustedWindowRect.size.height -= 2
}
if adjustedWindowRect.width < windowRect.width * 0.85 || adjustedWindowRect.height < windowRect.height * 0.85 {
break
}
frontmostWindowElement?.setFrame(adjustedWindowRect)
if let frontMostRect = frontmostWindowElement?.frame {
movedWindowRect = frontMostRect
}
}
adjustedWindowRect.origin.x += floor((windowRect.size.width - (movedWindowRect.size.width)) / 2.0)
adjustedWindowRect.origin.y += floor((windowRect.size.height - (movedWindowRect.size.height)) / 2.0)
frontmostWindowElement?.setFrame(adjustedWindowRect)
}
}
}
================================================
FILE: Rectangle/WindowMover/StandardWindowMover.swift
================================================
//
// StandardWindowMover.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/13/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
class StandardWindowMover: WindowMover {
func moveWindowRect(_ windowRect: CGRect, frameOfScreen: CGRect, visibleFrameOfScreen: CGRect, frontmostWindowElement: AccessibilityElement?, action: WindowAction?) {
let previousWindowRect: CGRect? = frontmostWindowElement?.frame
if previousWindowRect?.isNull == true {
return
}
frontmostWindowElement?.setFrame(windowRect)
}
}
================================================
FILE: Rectangle/WindowMover/WindowMover.swift
================================================
//
// WindowMover.swift
// Rectangle, Ported from Spectacle
//
// Created by Ryan Hanson on 6/13/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Foundation
protocol WindowMover {
func moveWindowRect(_ windowRect: CGRect, frameOfScreen: CGRect, visibleFrameOfScreen: CGRect, frontmostWindowElement: AccessibilityElement?, action: WindowAction?)
}
================================================
FILE: Rectangle/mul.lproj/Main.xcstrings
================================================
{
"sourceLanguage" : "en",
"strings" : {
"0Ak-33-SM7.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Top Right\"; ObjectID = \"0Ak-33-SM7\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اعلى اليمين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "A dalt a la dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superior dreta"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vpravo nahoře"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Oben rechts"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Top Right"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arriba a la derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arriba a la derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "En haut à droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kanan Atas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "In alto a destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右上"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "오른쪽 위"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dešinėje viršuje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre høgre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtsboven"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre høgre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prawy górny róg"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Em cima, à direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Em cima, à direita"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dreapta Sus"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Справа вверху"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vpravo hore"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Övre högra"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sağ üst"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхній правий кут"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Góc trên bên phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右上"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右上"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右上"
}
}
}
},
"0eh-6G-rMp.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"0 px\"; ObjectID = \"0eh-6G-rMp\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "0 px"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 пкс"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 px"
}
}
}
},
"1b7-l0-nxx.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Find\"; ObjectID = \"1b7-l0-nxx\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يجد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hledat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Suchen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Find"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechercher"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Temukan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trova"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "検索"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "찾기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ieškoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoeken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Znajdź"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căutare"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Найти"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nájsť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bul"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Знайти"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tìm kiếm"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查找"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找"
}
}
}
},
"1Rc-Od-eP5.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Move Down\"; ObjectID = \"1Rc-Od-eP5\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحرك لأسفل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moure fins a baix"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moure fins a baix"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Přesunout dolů"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nach unten bewegen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Move Down"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover hasta abajo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover hasta abajo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Déplacer en bas"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Turunkan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sposta giù"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "下に移動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아래로 이동"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Žemyn"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt ned"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naar beneden"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt ned"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przesuń w dół"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para baixo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para baixo"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mută Jos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вниз"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Presunúť dole"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytta ner"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aşağı kenar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перемістити вниз"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đi xuống"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "向下移动"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "下移"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "下移"
}
}
}
},
"1tx-W0-xDw.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Lower\"; ObjectID = \"1tx-W0-xDw\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أدنى"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Més baix"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Més baix"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiefer"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Más bajo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Más bajo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abaisser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lebih Rendah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abbassa"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "下付き"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아래로"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apačioje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lager"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Niżej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижнее"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1tx-W0-xDw.title"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "变为小写"
}
}
}
},
"1ui-PL-TkR.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Snap windows by dragging\"; ObjectID = \"1ui-PL-TkR\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "التقط النوافذ عن طريق السحب"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajusta les finestres arrossegant"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajusta les finestres arrossegant"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Přichytávat okna tažením"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fenster zum Anordnen an Bildschirmrand ziehen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Snap windows by dragging"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajustar ventanas arrastrando"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajustar ventanas arrastrando"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redimensionner les fenêtres en les faisant glisser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jepret jendela dengan menyeret"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ridimensiona le finestre trascinandole"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ドラッグでウインドウをスナップ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "드래그하여 창 배치"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Langų užrakinimas perkeliant"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fest vinduet ved å dra"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Snap windows door te slepen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fest vindaguet ved å dra"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Złap okna poprzez przeciąganie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redimensionar janelas arrastando"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encaixar janelas arrastando"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deschide fereastra prin glisare"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Защелкивание окон путем перетаскивания"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prichytávať okná ťahaním"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fäst fönster genom att dra"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pencereleri sürükleyerek tuttur"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Прив'язувати вікна перетягуванням"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kéo để bố trí cửa sổ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "拖移以吸附窗口"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "拖移來貼齊視窗"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "拖移以貼齊視窗"
}
}
}
},
"1UK-8n-QPP.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Customize Toolbar…\"; ObjectID = \"1UK-8n-QPP\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تخصيص شريط الأدوات ..."
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Personalitzar la barra d'eines…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Personalitzar la barra d'eines…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Symbolleiste anpassen…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Personalizar la barra de herramientas…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Personalizar la barra de herramientas…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Personnaliser la barre d'outils…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesuaikan Bilah Alat…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Personalizza la barra strumenti…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ツールバーをカスタマイズ…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "도구 막대 사용자화…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Įrankių juostos nustatymai…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tilpass verktøyfeltet…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Werkbalk aanpassen…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tilpass verktøyfeltet…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dostosuj pasek narzędzi…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Personalizar barra de ferramentas…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Personalizar Toolbar…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Настройка Панели инструментов…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anpassa verktygsfältet…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tùy chỉnh thanh công cụ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自定义工具栏..."
}
}
}
},
"1Xt-HY-uBw.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Rectangle\"; ObjectID = \"1Xt-HY-uBw\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
}
}
},
"01Z-t3-cBm.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"If you repeat move or half actions, the window will move to the next display instead of 1/2, 2/3, and 1/3 size.\"; ObjectID = \"01Z-t3-cBm\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إذا كررت إجراء نقل أو نصف ، فستنتقل النافذة إلى الشاشة التالية بدلاً من حجم 1/2 و 2/3 و 1/3"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si repeteixes accions de meitat o desplaçar, la finestra es mourà a la següent pantalla en lloc d'ajustar-se a 1/2, 2/3 o 1/3 de la mida."
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si repeteixes accions de meitat o desplaçar, la finestra es mourà a la següent pantalla en lloc d'ajustar-se a 1/2, 2/3 o 1/3 de la mida."
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wechsle bei wiederholten Links- oder Rechts-Befehlen zum nächsten Monitor anstatt zwischen den Fenstergrößen 1/2, 2/3, und 1/3."
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "If you repeat move or half actions, the window will move to the next display instead of 1/2, 2/3, and 1/3 size."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si repites acciones de mitad o desplazar, la ventana se moverá a la siguiente pantalla en lugar de ajustarse a 1/2, 2/3 o 1/3 del tamaño."
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si repites acciones de mitad o desplazar, la ventana se moverá a la siguiente pantalla en lugar de ajustarse a 1/2, 2/3 o 1/3 del tamaño."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "En répétant une action de déplacement ou de moitié d'écran, la fenêtre sera déplacée sur le moniteur suivant au lieu d'alterner les tailles 1/2, 2/3, et 1/3."
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jika Anda mengulangi gerakan atau tindakan setengah, jendela akan berpindah ke tampilan berikutnya, bukan ukuran 1/2, 2/3, dan 1/3."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se ripeti lo spostamento o i mezzi spostamenti, la finestra si sposterà sullo schermo successivo invece che ridimensionarsi a 1/2, 2/3 o 1/3."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ウインドウを移動する動作や半分のサイズに変更する動作を繰り返すと、ウインドウをサイズ変更するのではなく、次のディスプレイに移動します。"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "이동하기 또는 절반 동작을 반복하면 창이 1/2, 2/3, 혹은 1/3 크기가 되는 대신, 다음 디스플레이로 이동합니다."
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jei pakartosite judėjimo ar pusės veiksmus, langas bus perkeltas į kitą ekraną, o ne į 1/2, 2/3 ir 1/3 dydį."
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om du gjentar flytt- eller halv-handlinger, vil vinduet flyttes til neste skjerm i stedet for 1/2-, 2/3- og 1/3-størrelser."
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dit geldt alleen voor verplaatsingen of halve acties. De helft van de acties zal geen 2/3 & 1/3 gedrag uitvoeren indien ingeschakeld."
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om du gjentek flytt- eller halv-handlingar, vil vindauget bli flytta til neste skjerm i staden for 1/2-, 2/3- og 1/3-storleik."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jeżeli powtórzysz akcję przenoszącą okno, bądź zmieniającą jego rozmiar, okno przeniesie się do następnego pulpitu zamiast zmniejszać się do 1/2, 2/3 bądź 1/3 swego rozmiaru."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Repetindo os comandos de movimento e divisão, a janela será movida para a próxima tela, em vez de diminuir para 1/2, 2/3 ou 1/3 do tamanho"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se repetir as ações de mover ou de metade, a janela passa para o ecrã seguinte, em vez de mudar de tamanho para 1/2, 2/3, and 1/3."
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "При повторе перемещения или изменения размеров до трети или половины окна оно будет перемещено на следующий экран вместо изменения размеров."
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pri opakovaní presunutia alebo skratiek pre polovice sa okno presunie na ďalší displej namiesto ½, ⅔ a ⅓ veľkosti."
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om du upprepar drag eller halva åtgärder, kommer fönstret att flyttas till nästa skärm i stället för 1/2-, 2/3- och 1/3-storlek."
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nếu bạn lặp lại thao tác di chuyển hoặc một nửa, cửa sổ sẽ chuyển sang màn hình hiển thị tiếp theo thay vì kích thước 1/2, 2/3 và 1/3."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "如果你重复移动或进行一半的移动操作,窗口将移动到下一个显示器,而不是 1 / 2、2 / 3 或 1 / 3 大小。"
}
}
}
},
"1zK-sf-CSX.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Version\"; ObjectID = \"1zK-sf-CSX\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verze"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Version"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Version"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Versión"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Versión"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Version"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Version"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Versione"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "バージョン"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "버전"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Version"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Versão"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Versão"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Versiune"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verzia"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sürüm"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Версія"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phiên bản"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "版本"
}
}
}
},
"2h7-ER-AoG.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Raise\"; ObjectID = \"2h7-ER-AoG\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يرفع"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eleva"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eleva"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Höher"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Elevación"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Elevación"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lever"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Angkat"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "上げる"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "올리기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pakelti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Løft"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verhogen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Løft"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Podnieś"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Levantar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Levantar"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Поднять"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Höja"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đưa lên"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "升高"
}
}
}
},
"2oI-Rn-ZJC.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Transformations\"; ObjectID = \"2oI-Rn-ZJC\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "التحولات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformacions"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformacions"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformationen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformaciones"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformaciones"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformations"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformasi"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trasformazioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "変換"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "변형"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformacijos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformasjoner"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformaties"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformasjonar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zmień"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformações"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformações"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Преобразования"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformationer"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chuyển đổi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "转换"
}
}
}
},
"2ue-Mv-5Wh.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"2ue-Mv-5Wh\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"2XJ-Ca-9di.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Spectacle\"; ObjectID = \"2XJ-Ca-9di\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Spectacle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectable"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectable"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle "
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "放大镜"
}
}
}
},
"2Zm-fl-PcC.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Repeated commands\"; ObjectID = \"2Zm-fl-PcC\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أوامر متكررة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ordres repetides"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ordres repetides"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opakované příkazy"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wiederholte Befehle"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Repeated commands"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comandos repetidos"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comandos repetidos"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Commandes répétées"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Perintah berulang"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comandi ripetuti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "コマンドを繰り返した際の挙動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "커맨드 반복 입력시"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kartojamos komandos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjentatte kommandoer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Repeated commands"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjentekne kommandoar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Repeated commands"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comandos repetidos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Repeated commands"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comenzi repetitive"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Повторяющиеся команды"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opakované príkazy"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upprepade kommandon"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yinelenen komutlar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Повторювані команди"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khi lệnh lặp lại"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重复命令"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "重複的指令"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "重複的指令"
}
}
}
},
"3GE-la-fAZ.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"move to adjacent on left/right, or cycle size on half\"; ObjectID = \"3GE-la-fAZ\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الانتقال إلى الحجم المجاور على اليسار / اليمين ، أو حجم الدورة على النصف"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "mou al costat adjacent a l'esquerra/dreta, o la mida del cicle a la meitat"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "mou al costat adjacent a l'esquerra/dreta, o la mida del cicle a la meitat"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "přesune na následující levou/pravou pozici"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zum benachbarten Bildschirm auf der linken/rechten Seite bewegen oder Größe auf die Hälfte einstellen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "move to adjacent on left/right, or cycle size on half"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "mover a adyacente en izquierda/derecha, o crear bucle de tamaño en mitades"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "mover a adyacente en izquierda/derecha, o crear bucle de tamaño en mitades"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "déplacer vers adjacent gauche/droite, ou scinder en deux"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "pindah ke yang berdekatan di kiri/kanan, atau ukuran siklus di setengah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "sposta nell'adiacente a sinistra/destra, o scorri dimensioni con azioni di mezzi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ウインドウを左右いずれかのディスプレイに移動させるか、サイズを半分にするのを繰り返す"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "인접한 왼쪽 또는 오른쪽 디스플레이로 이동, 절반 동작시 창 크기 순환"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "pereiti prie gretimo ekrano kairėje/dešinėje arba keisti pusės dydį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "flytt til nærmeste til venstre/høgre, eller gå gjennom størrelsene på halvdeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "move to adjacent on left/right, or cycle size on half"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "flytt til nærmaste til venstre/høgre, eller gå gjennom storleikane på halvdelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "move to adjacent on left/right, or cycle size on half"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "move to adjacent on left/right, or cycle size on half"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "move to adjacent on left/right, or cycle size on half"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "mută pe partea stângă/dreaptă adiacentă, sau permută între jumătăți"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "перейти к соседнему дисплею слева/справа или переключать размер половин"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "presunúť na vedľajšiu ľavú/pravú pozíciu alebo striedať polovice"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "flytta till intilliggande till vänster/höger, eller växla storlek på hälften"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "sağa/sola taşı veya yarım boyutlarda geçiş yap"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "перемістити на сусідній лівий/правий, або циклічно змінювати розмір на половину"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Di chuyển đến cạnh trái/phải, hoặc thay đổi tuần hoàn một nửa kích thước"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左/右移动到相邻,或半屏循环大小"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左/右移至相鄰,或一半循環大小"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左/右移到相鄰,或一半循環大小"
}
}
}
},
"3hZ-Cs-EZ6.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Disable fast dragging to Mission Control\"; ObjectID = \"3hZ-Cs-EZ6\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تعطيل السحب السريع إلى Mission Control"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schnelles Ziehen zu Mission Control deaktivieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Disable fast dragging to Mission Control"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desactivar el arrastre rápido hacia el Mission Control"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desactivar el arrastre rápido hacia el Mission Control"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Désactiver le glissement rapide vers Mission Control"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disattiva il trascinamento rapido in Mission Control"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mission Controlへの高速ドラッグを無効にする"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "미션 컨트롤에 빠른 드래그 비활성화"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Išjungti greitą vilkimą „Mission Control“"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slå av «raskt drag» til Mission Control"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slå av «raskt drag» til Mission Control"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Отключить быстрое перетаскивание в Mission Control"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vypnúť rýchle ťahanie do Mission Control"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Disable fast dragging to Mission Control"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hızlı sürükleme ile Mission Control'ün açılmasını devre dışı bırak"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вимкнути швидке перетягування до Mission Control"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tắt cơ chế kéo nhanh trong trình Điều khiển Tác vụ (Mission Control)"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "禁用快速拖移到调度中心"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "停用快速拖移至「指揮中心」"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "停用快速拖移到「指揮中心」"
}
}
}
},
"3IN-sU-3Bg.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Spelling\"; ObjectID = \"3IN-sU-3Bg\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الإملائية"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtschreibung"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografía"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografía"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Orthographe"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ejaan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スペル"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "맞춤법"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rašybos tikrinimas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stavekontroll"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spelling"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stavekontroll"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pisownia"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Правописание"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stavning"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đọc chính tả"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "拼写"
}
}
}
},
"3Om-Ey-2VK.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Use Default\"; ObjectID = \"3Om-Ey-2VK\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استخدم الافتراضي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ús per defecte"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ús per defecte"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standard verwenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uso Predeterminado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uso Predeterminado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utiliser la valeur par défaut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gunakan Bawaan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usa predefinito"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルトを使用"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기본값 사용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naudoti pagal nutylėjimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk standard"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gebruik standaard"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk standard"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Użyj domyślnych"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar Padrão"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar Padrão"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Использовать по умолчанию"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använd standard"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sử dụng mặc định"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用默认"
}
}
}
},
"3rS-ZA-NoH.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Speech\"; ObjectID = \"3rS-ZA-NoH\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "خطاب"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Veu"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Veu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprachausgabe"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voz"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voz"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Discours"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bicara"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voce"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スピーチ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "말하기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kalba"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tale"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spraak"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tale"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mowa"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voz"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fala"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Речь"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tal"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đọc"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "语音"
}
}
}
},
"3zd-xE-oWl.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"First Two Thirds\"; ObjectID = \"3zd-xE-oWl\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أول ثلثين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primers dos terços"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primers dos terços"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "První dvě třetiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zwei Drittel links"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "First Two Thirds"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeros dos tercios"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeros dos tercios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deux tiers du haut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dua Pertiga Pertama"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primi due terzi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "2/3にして左寄せ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "처음 2/3"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kairės dvi trečiosios"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Første to tredjedelar"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eerste tweederde deel"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fyrste to tredjedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dwie trzecie z lewej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeiros dois terços"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeiros Dois Terços"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primele Două Treimi"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Первые две трети"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prvé dve tretiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Första två tredjedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İlk iki üçte bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перші дві третини"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "2/3 đầu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左侧2/3"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左側2/3"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左側2/3"
}
}
}
},
"4EN-yA-p0u.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Find\"; ObjectID = \"4EN-yA-p0u\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يجد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hledat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Suchen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Find"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechercher"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Temukan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trova"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "検索"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "찾기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ieškoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoeken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Znajdź"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căutare"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Найти"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nájsť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bul"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Знайти"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tìm kiếm"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查找"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找"
}
}
}
},
"4J7-dP-txa.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Enter Full Screen\"; ObjectID = \"4J7-dP-txa\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أدخل ملء الشاشة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Entrar a pantalla completa"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Entrar a pantalla completa"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spustit režim celé obrazovky"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vollbildmodus"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Enter Full Screen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Entrar en pantalla completa"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Entrar en pantalla completa"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Passer en plein écran"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Masuk Layar Penuh"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Attiva modalità a schermo intero"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "フルスクリーンにする"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "전체 화면 시작"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Įveskite visą ekraną"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Åpne helskjerm"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ga naar volledig scherm"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opne heilskjerm"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pełny ekran"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Entrar em tela cheia"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Entrar em ecrã completo"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Intră în Ecran Complet"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перейти в полноэкранный режим"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobraziť na celej obrazovky"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Öppna helskärm"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tam Ekrana Geç"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перейти до повноекранного режиму"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toàn màn hình"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "进入全屏幕"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "進入全螢幕"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "進入全螢幕"
}
}
}
},
"4sb-4s-VLi.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Quit Rectangle\"; ObjectID = \"4sb-4s-VLi\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "قم بإنهاء المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sortir de Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sortir de Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukončit Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle beenden"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Quit Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salir de Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salir de Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quitter Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keluar Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esci da Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleを終了"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 종료"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Išeiti iš Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avslutt Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle stoppen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avslutt Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wyjdź z Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fechar Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sair do Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Închide Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выход из Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukončiť Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avsluta Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle'dan Çık"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вийти з Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thoát Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "退出 Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "結束 Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "結束Rectangle"
}
}
}
},
"5kV-Vb-QxS.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"About Rectangle\"; ObjectID = \"5kV-Vb-QxS\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "حول المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant a Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant a Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "O aplikaci Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Über Rectangle"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "About Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca de Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca de Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "À propos de Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tentang Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Informazioni su Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleについて"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 정보"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apie Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Over Rectangle"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sobre o Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sobre o Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Despre Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "О Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "O aplikácii Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle Hakkında"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Про Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Giới thiệu Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "关于 Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於 Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於Rectangle"
}
}
}
},
"5LN-YU-Bwy.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"px\"; ObjectID = \"5LN-YU-Bwy\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "px"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "px"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "px"
}
}
}
},
"5QF-Oa-p0T.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Edit\"; ObjectID = \"5QF-Oa-p0T\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يحرر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Edita"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Edita"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upravit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bearbeiten"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Edit"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Modifier"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunting"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Modifica"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "編集"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "편집"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redaguoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rediger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bewerken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rediger"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Edytuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editare"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Редактировать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upraviť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redigera"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Düzenle"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Редагувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chỉnh sửa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "编辑"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "編輯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "編輯"
}
}
}
},
"5Vv-lz-BsD.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Copy Style\"; ObjectID = \"5Vv-lz-BsD\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نسخ النمط"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Estil de còpia"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Estil de còpia"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stil kopieren"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Estilo de copia"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Estilo de copia"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Style de copie"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salin Gaya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copia stile"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スタイルをコピー"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스타일 복사하기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopijavimo stilius"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopier stil"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopieer stijl"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopier stil"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Styl kopiowania"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar estilo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar Estilo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Стиль копирования"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopiera stil"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sao chép phong cách"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "拷贝样式"
}
}
}
},
"5WR-Ui-uYB.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"5WR-Ui-uYB\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"6dh-zS-Vam.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Redo\"; ObjectID = \"6dh-zS-Vam\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إعادة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Refés"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Refés"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Znovu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wiederholen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Redo"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rehacer"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rehacer"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Refaire"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ulangi"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ripeti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "やり直し"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "실행 복귀"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kartoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjør på nytt"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opnieuw"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjer på nytt"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Powtórz"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Refazer"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Refazer"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reaplicare"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Повторить"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Znovu"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gör om"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yinele"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Повторити"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lặp lại hoàn tác"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重做"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "重做"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "重做"
}
}
}
},
"6DV-cd-fda.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Maximize Height\"; ObjectID = \"6DV-cd-fda\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تعظيم الارتفاع"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximitzar alçada"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximitzar alçada"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximalizovat výšku"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Höhe maximieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Maximize Height"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximise Height"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar altura"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar altura"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximiser la hauteur"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimalkan Tinggi"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Massimizza altezza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "高さを最大化"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "높이 최대화"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimalus aukštis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimer høgda"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximaliseer hoogte"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimer høgda"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksymalna wysokość"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar altura"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar Altura"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizează Înalțimea"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Максимизировать высоту"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximalizovať výšku"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximera höjden"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Azami Yükseklik"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Максимізувати висоту"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phóng to tối đa chiều cao"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "最大化高度"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "將高度放到最大"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "將高度放到最大"
}
}
}
},
"6e0-ji-qXw.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Todo app width\"; ObjectID = \"6e0-ji-qXw\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "عرض تطبيق Todo"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Amplada de l'aplicació Todo"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Amplada de l'aplicació Todo"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Šířka Todo aplikace"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fensterbreite der To-do-Anwendung"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Todo app width"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ancho de la aplicación 'Todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ancho de la aplicación 'Todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Largeur de l’application Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lebar aplikasi Todo"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Larghezza applicazione in evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ToDoアプリケーションのウインドウ幅"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 앱 폭"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo programos lango plotis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjerøliste-bredde"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo application width"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjereliste-breidde"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo application width"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo application width"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo application width"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lățimea aplicației Todo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ширина окна Todo приложения"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Šírka Todo aplikácie"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Att göra-applikationsbredd"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo uygulamasının genişliği"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ширина вікна Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chiều rộng của ứng dụng Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "待办应用程序宽度"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "待辦應用程式寬度"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "待辦應用程式寬度"
}
}
}
},
"6HX-rn-VIp.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Last Fourth\"; ObjectID = \"6HX-rn-VIp\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الرابع الأخير"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Darrer quart"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Darrer quart"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Poslední čtvrtina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viertes Viertel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Last Fourth"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Last Quarter"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cuarto cuarto"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cuarto cuarto"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dernier quart"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperempat Terakhir"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultimo quarto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左から4番目"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "네번째 1/4"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paskutinė ketvirtis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siste fjerdedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Laatste kwart"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siste fjerdedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ostatnia ćwiartka"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Último quarto"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Último Quarto"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultimul Sfert"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Последняя четверть"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Posledná štvrtina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sista fjärde"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Son Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Останній чверть"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/4 cuối"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右首1/4"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右首1/4"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右首1/4"
}
}
}
},
"6ma-hP-5xX.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Bottom Left\"; ObjectID = \"6ma-hP-5xX\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أسفل اليسار"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior esquerra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior esquerra"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vlevo dole"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Unten links"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Bottom Left"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abajo a la izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abajo a la izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "En bas à gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kiri Bawah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "In basso a sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左下"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽 아래"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apačioje kairėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre venstre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linksonder"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre venstre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lewy dolny róg"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior esquerdo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior Esquerda"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stânga Jos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Внизу слева"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vľavo dole"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre vänstra"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol Alt"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижній лівий кут"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Góc dưới bên trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左下"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左下"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左下"
}
}
}
},
"7YK-9Z-lzw.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Center Third\"; ObjectID = \"7YK-9Z-lzw\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "المركز الثالث"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercer central"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercer central"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prostřední třetina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mittleres Drittel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Center Third"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre Third"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercio central"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercio central"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers central"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tengah Ketiga"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terzo centrale"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3にして中央に表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "가운데 1/3"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrinė trečioji"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedel i midten"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Middelste derde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedel i midten"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna trzecia na środku"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terço central"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terço Central"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Treimea din Mijloc"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центральная треть"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prostredná tretina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitten tredje"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Orta üçte bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центральна третина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3 giữa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "中间1/3"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "中央1/3"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "中央1/3"
}
}
}
},
"7yS-wj-uWD.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Show Todo Mode in menu\"; ObjectID = \"7yS-wj-uWD\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إظهار وضع Todo في القائمة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra el mode Todo en el menú"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra el mode Todo en el menú"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobrazit Todo mód v menu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "To-do-Modus in Menü anzeigen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Show Todo Mode in menu"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar el modo 'Todo' en el menú"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar el modo 'Todo' en el menú"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher le mode Todo dans le menu"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilkan Mode Todo di menu"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra modalità In evidenza nel menu"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ToDoモードをメニューに表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "메뉴에서 Todo 모드 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti Todo režimą meniu"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis Gjøreliste-modus i menyen"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Show Todo Mode in menu"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis Gjereliste-modus i menyen"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Show Todo Mode in menu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Todo Mode no menu"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Show Todo Mode in menu"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arată Modul Todo în meniu"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показывать Todo режим в меню"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobraziť Todo režim v menu"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa Att göra-läge i menyn"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menüde Todo Modunu göster"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показувати режим Завдань в меню"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị chế độ Todo trên menu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "在菜单中显示待办模式"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "在選單中顯示待辦模式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "在選單中顯示待辦模式"
}
}
}
},
"8Bg-SZ-hDO.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Center\"; ObjectID = \"8Bg-SZ-hDO\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مركز"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vycentrovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zentrieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Center"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tengah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centro"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "中央に表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "가운데"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Į centrą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midten"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centreer"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midten"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Środek"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centro"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centro"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centru"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "В центр"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vycentrovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitten"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Orta"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центр"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căn giữa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "中间"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "中央"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "中央"
}
}
}
},
"8dv-v2-SPu.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"3. In the Rectangle menu, enable Todo Mode.\"; ObjectID = \"8dv-v2-SPu\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. في قائمة Rectangle ، قم بتمكين Todo Mode"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Al menú Rectangle, habilita el mode Todo."
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Al menú Rectangle, habilita el mode Todo."
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Zapněte Todo mód v Rectangle menu."
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Aktiviere den To-do-Modus im Rectangle-Menü."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "3. In the Rectangle menu, enable Todo Mode."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. En el menú de Rectangle, activa el modo Todo."
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. En el menú de Rectangle, activa el modo Todo."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Dans le menu de Rectangle, activer le mode Todo."
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Di Menu Rectangle, Aktifkan mode Todo."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Nel menu di Rectangle, attiva modalità In evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. RectangleのメニューからToDoモードを有効にします。"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Rectangle 메뉴에서, Todo 모드를 켭니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. „Rectangle“ meniu įjunkite Todo režimą."
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. I Rectangle-menyen: aktiver Gjøreliste-modus."
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. In the Rectangle menu, enable Todo Mode."
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. I Rectangle-menyen: aktiver Gjereliste-modus."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. In the Rectangle menu, enable Todo Mode."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. No menu do Rectangle, habilite o Todo Mode."
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. In the Rectangle menu, enable Todo Mode."
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Activează modul Todo în meniul Rectangle."
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. В меню Rectangle включите Todo режим."
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Zapni Todo režim v Rectangle menu."
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. I Rectangle-menyn, aktivera Att göra-läge."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Rectangle menüsünde, Todo Modunu aktif edin."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. В меню Rectangle увімкніть режим Завдань."
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "3. Trên menu của Rectangle, bật chế độ Todo."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒊在 Rectangle 菜单中,启用待办模式"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒊ 在 Rectangle 選單中,啟用待辦模式。"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒊在Rectangle選單中,啟用待辦模式。"
}
}
}
},
"8mr-sm-Yjd.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Writing Direction\"; ObjectID = \"8mr-sm-Yjd\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اتجاه الكتابة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direcció d'escriptura"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direcció d'escriptura"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schreibrichtung"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dirección de escritura"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dirección de escritura"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sens d'écriture"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arah Penulisan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direzione di scrittura"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "文字の向き"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "작성 방향"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rašymo kryptis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriveretning"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schrijfrichting"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriveretning"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kierunek pisania"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direção de escrita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direção de Escrita"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Направление записи"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skrivriktning"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "8mr-sm-Yjd.title"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "书写方向"
}
}
}
},
"8oe-J2-oUU.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Maximize\"; ObjectID = \"8oe-J2-oUU\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحقيق أقصى قدر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximitzar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximitzar"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximalizovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Maximize"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximise"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximiser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimalkan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Massimizza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "最大化"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "최대화"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimizuoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximaliseer"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimer"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksymalizuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizează"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Максимизировать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximalizovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximera"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tamamını kapla"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Максимізувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phóng to tối đa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "最大化"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "放到最大"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "放到最大"
}
}
}
},
"08q-Ce-1QL.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Last Two Thirds\"; ObjectID = \"08q-Ce-1QL\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الثلثين الأخيرين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últims dos terços"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últims dos terços"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Poslední dvě třetiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zwei Drittel rechts"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Last Two Thirds"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últimos dos tercios"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últimos dos tercios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deux tiers du bas"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dua Pertiga Terakhir"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultimi due terzi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "2/3にして右寄せ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "마지막 2/3"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dešinės dvi trečiosios"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siste to tredjedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Laatste tweederde deel"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siste to tredjedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dwie trzecie z prawej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últimos dois terços"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últimos dois terços"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultimele Două Treimi"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Последние две трети"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Posledné dve tretiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sista två tredjedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Son iki üçte bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Останні дві третини"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "2/3 cuối"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右侧2/3"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右側2/3"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右側2/3"
}
}
}
},
"9ic-FL-obx.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Substitutions\"; ObjectID = \"9ic-FL-obx\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "البدائل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sustitucions"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sustitucions"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ersetzungen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sustituciones"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sustituciones"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Remplacements"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pergantian"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sostituzioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "自動置換"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "대체"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pakeitimai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Erstatninger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vervangingen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Erstatningar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zamienniki"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substituições"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substituições"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Замены"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substitutioner"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sự thay thế"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "替换"
}
}
}
},
"9JD-tZ-7jf.title" : {
"comment" : "Class = \"NSWindow\"; title = \"Authorize Rectangle\"; ObjectID = \"9JD-tZ-7jf\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تخويل المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoritzar el Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoritzar el Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizovat Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle autorisieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Authorize Rectangle"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Authorise Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Izinkan Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizza Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleを許可"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 승인"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Leisti Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle toestemming geven"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoryzuj Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizează Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Разрешить Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Povoliť Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auktorisera Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle'ı Yetkilendir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Авторизувати Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cấp phép cho Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "授权 Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "授權 Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "授權Rectangle"
}
}
}
},
"9XM-Zb-HEb.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"If the checkbox is disabled, click the padlock and enter your password\"; ObjectID = \"9XM-Zb-HEb\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إذا تم تعطيل مربع الاختيار ، فانقر فوق القفل وأدخل كلمة المرور الخاصة بك"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si la casella de selecció està desactivada, feu clic al cadenat i introduïu la vostra contrasenya."
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si la casella de selecció està desactivada, feu clic al cadenat i introduïu la vostra contrasenya."
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokud je zaškrtávací políčko vypnuto, tak klikněte na zámek a zadejte vaše heslo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wenn das Kontrollkästchen deaktiviert ist, klicke auf das Vorhängeschloss und gib dein Passwort ein."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "If the checkbox is disabled, click the padlock and enter your password"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si la casilla de verificación está desactivada, haga clic en el candado e introduzca su contraseña."
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si la casilla de verificación está desactivada, haga clic en el candado e introduzca su contraseña."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si la case est décochée, cliquez sur le cadenas et entrez votre mot de passe."
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jika kotak centang dinonaktifkan, klik gembok dan masukkan kata sandi Anda"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se la casella di controllo è disattivata, fai clic sul lucchetto e inserisci la password"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "チェックボックスが無効になっている場合は、カギをクリックしてパスワードを入力してください"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "확인란이 비활성화되어 있으면, 자물쇠를 클릭하고 암호를 입력하세요"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jei žymėjimas yra išjungtas, spustelėkite užraktą ir įveskite savo slaptažodį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om avkryssingsboksen er inaktiv, klikker du på hengelåsen og skriver inn passordet ditt."
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Als het selectievakje is uitgeschakeld, klik dan op het hangslot en voer uw wachtwoord in."
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om avkryssingsboksen er inaktiv, klikkar du på hengelåsen og skriv inn passordet ditt."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jeśli pole wyboru nie jest zaznaczone, kliknij kłódkę i wpisz hasło."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se a seleção estiver desativada, clique no cadeado e insira sua senha"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se a caixa de verificação estiver desactivada, clique no cadeado e introduza a sua palavra-passe"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dacă checkbox-ul este dezactivat, apăsați pe lacăt și introduceți parola"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Если флажок отключен, щелкните на замок и введите свой пароль"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ak je zaškrtávacie políčko vypnuté, klikni na zámok a zadaj svoje heslo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om kryssrutan är inaktiverad klickar du på hänglåset och anger ditt lösenord."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eğer işaret kutusu devre dışı ise, kilit simgesine tıklayıp şifrenizi girin"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Якщо галочка вимкнена, натисніть на замок і введіть пароль"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nếu hộp kiểm bị tắt, hãy nhấp vào ổ khóa và nhập mật khẩu của bạn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "如果复选框已禁用,点按锁型图标,然后输入您的密码"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "如果註記框已停用,按一下鎖頭圖示,然後輸入您的密碼"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "如果剔選框已停用,按一下掛鎖圖像,然後輸入你的密碼"
}
}
}
},
"9yt-4B-nSM.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Smart Copy/Paste\"; ObjectID = \"9yt-4B-nSM\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نسخ / لصق ذكي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copia/enganxa intel·ligent"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copia/enganxa intel·ligent"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Intelligentes Kopieren/Einfügen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar y pegar de forma inteligente"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar y pegar de forma inteligente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copier/coller intelligent"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salin/Tempel Pintar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copia/incolla intelligente"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スマートコピー/ペースト"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스마트 복사하기/붙여넣기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Protingas kopijavimas/įterpimas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smart kopier/lim inn"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slim kopiëren/plakken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smart kopier/lim inn"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inteligentne kopiowanie/wklejanie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar/Colar Inteligente"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar/Colar Inteligente"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Умное копирование/вставка"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smart kopiera/klistra in"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sao chép/Dán thông minh"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "智能拷贝/粘贴"
}
}
}
},
"46P-cB-AYj.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Tighten\"; ObjectID = \"46P-cB-AYj\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "شد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Estirar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Estirar"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enger"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajustar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajustar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reserrer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kencangkan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stringi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "きつく"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "좁게"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tempkite"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stram inn"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aanhalen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stram inn"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ściśnij"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apertar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apertar"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Затяните"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dra åt"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siết chặt"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "紧排"
}
}
}
},
"74m-kw-w1f.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Check for Updates…\"; ObjectID = \"74m-kw-w1f\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zkontrolovat aktualizace…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nach Updates suchen…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Check for Updates…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar actualizaciones…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar actualizaciones…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mettre à jour…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Periksa Pembaruan…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controlla aggiornamenti…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アップデートを確認…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "업데이트 확인…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tikrinti atnaujinimus…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se etter oppdateringer…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kijk of er updates zijn…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sjå etter oppdateringar…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprawdź aktualizacje…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Procurar por atualizações..."
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verifique se há atualizações…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificare Actualizări…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Проверить обновления…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skontrolovať aktualizácie…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök efter uppdateringar…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Güncellemeleri kontrol et…"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перевірити оновлення…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kiểm tra các bản cập nhật…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "检查更新…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "檢查更新項目⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "檢查更新項目⋯"
}
}
}
},
"78Y-hA-62v.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Correct Spelling Automatically\"; ObjectID = \"78Y-hA-62v\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "التصحيح الإملائي تلقائيًا"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Corregir l'ortografia automàticament"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Corregir l'ortografia automàticament"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtschreibung automatisch korrigieren"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Corrección ortográfica automática"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Corrección ortográfica automática"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Corriger l'orthographe automatiquement"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Benarkan Ejaan Secara Otomatis"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Correggi automaticamente ortografia"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スペルを自動的に修正"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "맞춤법 자동 수정"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automatiškai taisyti rašybą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automatisk stavekontrollretting"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Corrigeer spelling automatisch"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automatisk stavekontrollretting"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Popraw pisownię automatycznie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Correção ortográfica automática"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Correção ortográfica automátic"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Автоматически исправлять орфографию"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automatiskt rättstavning"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tự động sửa lỗi chính tả"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自动纠正拼写"
}
}
}
},
"A66-A4-cGD.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Quit Rectangle\"; ObjectID = \"A66-A4-cGD\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "قم بإنهاء المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sortir de Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sortir de Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukončit Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle beenden"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Quit Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salir de Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salir de Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quitter Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keluar Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esci da Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleを終了"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 종료"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Išeiti iš Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avslutt Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle stoppen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avslutt Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wyjdź z Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fechar Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sair do Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Închide Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выход из Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukončiť Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avsluta Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle'dan Çık"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вийти з Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thoát Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "退出 Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "結束 Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "結束Rectangle"
}
}
}
},
"adp-cN-qkh.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Top Left\"; ObjectID = \"adp-cN-qkh\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أعلى اليسار"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superior esquerra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superior esquerra"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vlevo nahoře"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Oben links"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Top Left"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arriba a la izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arriba a la izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "En haut à gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kiri Atas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "In alto a sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左上"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽 위"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kairėje viršuje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre venstre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linksboven"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre venstre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lewy górny róg"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Topo esquerdo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Topo Esquerdo"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stânga Sus"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Слева вверху"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vľavo hore"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Övre vänstra"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol Üst"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхній лівий кут"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Góc trên bên trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左上"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左上"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左上"
}
}
}
},
"AEr-NX-9wW.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"190 px\"; ObjectID = \"AEr-NX-9wW\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "190 px"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 пкс"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "190 px"
}
}
}
},
"agt-UL-0e3.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Use Default\"; ObjectID = \"agt-UL-0e3\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استخدم الافتراضي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ús per defecte"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ús per defecte"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standard verwenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uso predeterminado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uso predeterminado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utiliser la valeur par défaut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gunakan Bawaan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usa predefinito"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルトを使用"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기본값 사용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naudoti pagal nutylėjimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk standard"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gebruik standaard"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk standard"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Użyj domyślnych"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar Padrão"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar Padrão"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Использовать по умолчанию"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använd standard"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sử dụng mặc định"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用默认"
}
}
}
},
"AgV-lP-6XB.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"%\"; ObjectID = \"AgV-lP-6XB\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "%"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "%"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "%"
}
}
}
},
"aTl-1u-JFS.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Print…\"; ObjectID = \"aTl-1u-JFS\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مطبعة…"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Imprimeix…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Imprimeix…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Drucken…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Imprimir…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Imprimir…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Imprimer…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cetak…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stampa…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "プリント…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "프린트…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spausdinti…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriv ut…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afdrukken…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriv ut…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Drukuj…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Imprimir…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Imprimir…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Печать…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriv ut…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "In…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "打印…"
}
}
}
},
"aUF-d1-5bR.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Window\"; ObjectID = \"aUF-d1-5bR\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نافذة او شباك"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finestra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finestra"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Okno"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fenster"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Window"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ventana"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ventana"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fenêtre"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jendela"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finestra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ウインドウ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "창"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Langas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vindu"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venster"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vindauge"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Okno"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Janela"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Janela"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fereastră"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Окно"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Okno"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fönster"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pencere"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вікно"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cửa sổ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "窗口"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "視窗"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "視窗"
}
}
}
},
"aXa-aM-Jaq.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Font\"; ObjectID = \"aXa-aM-Jaq\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الخط"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipus de lletra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipus de lletra"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schrift"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipo de letra"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipo de letra"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Police"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jenis Huruf"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Carattere"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "フォント"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "서체"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Šriftas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Font"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lettertype"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Font"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Czcionka"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fonte"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipo de letra"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Шрифт"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Typsnitt"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phông"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "字体"
}
}
}
},
"AYu-sK-qS6.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Main Menu\"; ObjectID = \"AYu-sK-qS6\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "القائمة الرئيسية"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menú principal"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menú principal"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hlavní menu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hauptmenü"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Main Menu"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menú principal"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menú principal"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menu principal"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menu Utama"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menu principale"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "メインメニュー"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "메인 메뉴"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pagrindinis meniu"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hovedmeny"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hoofdmenu"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hovudmeny"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menu główne"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menu Principal"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menu principal"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meniu Principal"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Главное меню"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hlavné menu"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Huvudmeny"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ana Menü"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Головне меню"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menu chính"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "主菜单"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "主選單"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "主選單"
}
}
}
},
"ayu-YO-10p.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Stage Manager recent apps area\"; ObjectID = \"ayu-YO-10p\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "منطقة تطبيقات مدير المرحلة الأخيرة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Àrea d'aplicacions recents de Stage Manager"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Àrea d'aplicacions recents de Stage Manager"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager oblast posledních aplikací"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager Bereich für zuletzt verwendete Programme"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Stage Manager recent apps area"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "área para aplicaciones recientes en el State Manager"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "área para aplicaciones recientes en el State Manager"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zone des applications récentes de Stage Manager"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager recent apps area"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Area app recenti in Stage Manager"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ステージマネージャの最近使ったアプリケーションエリア"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스테이지 매니저 최근 앱 영역"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Scenos valdytojas paskutinių programų sritys"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Område for siste brukte i Stage Manager"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager recent apps area"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Område for siste brukte i Stage Manager"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager recent apps area"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager recent apps area"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager recent apps area"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager recent apps area"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager область последних приложений"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager oblasť posledných aplikácií"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager recent apps area"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stage Manager son uygulamalar alanı"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Область недавніх застосунків Stage Manager"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vùng hiển thị ứng dụng hiện tại của Stage Manager"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "“台前调度”最近使用的应用程序区域"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "「幕前調度」最近使用過的應用程式區域"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "「幕前管理」最近使用過的應用程式區域"
}
}
}
},
"bg9-nw-YvU.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Gaps between windows\"; ObjectID = \"bg9-nw-YvU\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "فجوات بين النوافذ"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espai entre finestres"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espai entre finestres"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mezery mezi okny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abstände zwischen Fenstern"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Gaps between windows"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espacio entre ventanas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espacio entre ventanas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Écart entre fenêtres"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jarak Antar Jendela"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spazio tra le finestre"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ウインドウの間隔"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "창 사이 간격"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tarpai tarp langų"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mellomrom mellom vinduene"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gaps between windows"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mellomrom mellom vindaugo"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przestrzeń między oknami"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espaço entre janelas"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espaços entre janelas"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Goluri între ferestre"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Промежутки между окнами"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Medzery medzi oknami"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mellanrum mellan fönsterna"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pencereler arası boşluk"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Відступи між вікнами"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khoảng cách giữa các cửa sổ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "窗口间空隙"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "視窗間空隙"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "視窗間空隙"
}
}
}
},
"BgM-ve-c93.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"\\tLeft to Right\"; ObjectID = \"BgM-ve-c93\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : " t من اليسار إلى اليمين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tEsquerra a dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tEsquerra a dreta"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVon links nach rechts"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tIzquierda a derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tIzquierda a derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDe gauche à droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tKiri ke Kanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa sinistra a destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t左から右"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t좌에서 우로"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tIš kairės į dešinę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVenstre til høgre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVan links naar rechts"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVenstre til høgre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tOd lewej do prawej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa esquerda para a direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa esquerda para a direita"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tСлева направо"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVänster till höger"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trái sang phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tLeft to Right"
}
}
}
},
"bgn-CT-cEk.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Show Colors\"; ObjectID = \"bgn-CT-cEk\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إظهار الألوان"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra colors"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra colors"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Farben einblenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar colores"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar colores"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher les couleurs"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilkan Warna"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra colori"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "カラーパネルを表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "색상 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti spalvas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis farger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toon kleuren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis fargar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż kolory"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Cores"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Cores"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показать цвета"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa färger"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiện màu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示颜色"
}
}
}
},
"bib-Uj-vzu.title" : {
"comment" : "Class = \"NSMenu\"; title = \"File\"; ObjectID = \"bib-Uj-vzu\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "ملف"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fitxer"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fitxer"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Soubor"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Datei"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "File"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Archivo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Archivo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fichier"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Berkas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "File"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ファイル"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "파일"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Failas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arkiv"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bestand"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arkiv"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Plik"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arquivo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ficheiro"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fișier"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Файл"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Súbor"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arkiv"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "File"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Файл"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tệp"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "文件"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "檔案"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "檔案"
}
}
}
},
"BOF-NM-1cW.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Preferences…\"; ObjectID = \"BOF-NM-1cW\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "التفضيلات ..."
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferències…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferències…"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Předvolby…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einstellungen…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Preferences…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferencias…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferencias…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Préférences…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferensi…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferenze…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "環境設定…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "환경설정…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nustatymai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Innstillinger…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voorkeuren…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Innstillingar…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferencje…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferências…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferências…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preferințe…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Настройки…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Predvoľby…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inställningar…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercihler…"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Налаштування…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cài đặt…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "偏好设置…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "偏好設定⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "偏好設定⋯"
}
}
}
},
"Bottom Center Left Eighth" : {
},
"Bottom Center Right Eighth" : {
},
"Bottom eighths from corners; thirds" : {
},
"Bottom Left Eighth" : {
},
"Bottom Right Eighth" : {
},
"Bottom sixths from corners; thirds" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixièmes bas à partir des coins ; tiers"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodní šestiny z rohů; třetiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Untere Sechstel beim Ziehen aus den Ecken; Drittel"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextos inferiores de las esquinas; tercios"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextos inferiores de las esquinas; tercios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixièmes bas à partir des coins ; tiers"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesti inferiori dagli angoli; terzi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : " 3分割(画面端にドラッグで下側6分割)"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아래쪽 1/6, 모서리에서 3등분"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apatinės šeštosios nuo kampų; trečdalys"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nederste sjettedel fra hjørne; tredjedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedste sjettedel frå hjørne; tredjedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижние шестые от углов; трети"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodné šestiny z rohov; tretiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom sixths from corners; thirds"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Üçte bir (köşelere yaklaşıldığında ise altıda bir)"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижні шості від кутів; третини"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/6 phía dưới ngay góc; 1/3"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自角落则底部⅙;⅓"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "自角落則底部⅙;⅓"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "自角落則底部⅙;⅓"
}
}
}
},
"Bottom Third" : {
},
"Bottom Two Thirds" : {
},
"bRX-dV-iAR.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Center Half\"; ObjectID = \"bRX-dV-iAR\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نصف المركز"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat central"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat central"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vycentrovat polovinu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mittlere Hälfte"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Center Half"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre Half"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad central"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad central"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié centrale"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Separuh Tengah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà centrale"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "半分にして中央に表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "가운데 절반"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrinė pusė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midtre halvdel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Middelste helft"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midtre halvdel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Połowa na środku"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade central"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade Central"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jumătatea Centrală"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центральная половина"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vycentrovať polovicu"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitthalvan"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Orta Yarım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центральна половина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/2 giữa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "中间半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "中半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "中半"
}
}
}
},
"buJ-ug-pKt.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Use Selection for Find\"; ObjectID = \"buJ-ug-pKt\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استخدم التحديد للبحث"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitzeu la selecció per a la cerca"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitzeu la selecció per a la cerca"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hledat výběr"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auswahl für Suche übernehmen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Use Selection for Find"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar la selección para buscar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar la selección para buscar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utiliser la sélection pour la recherche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gunakan Pilihan untuk Temukan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usa selezione per trovare"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "選択部分を検索に使用"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "선택 부분으로 찾기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naudoti pasirinktą paieškai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk markert tekst for å finne"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gebruik selectie voor zoeken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk markert tekst for å finna"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Użyj wyboru, aby znaleźć"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar seleção para buscar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar seleção para procurar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Folosește Selecția pentru Căutare"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Использовать выбранное для поиска"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Použiť výber pri hľadaní"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använd markerad för att söka"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use Selection for Find"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Використовувати виділення для пошуку"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dùng lựa chọn để tìm kiếm"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查找所选内容"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用所選範圍尋找"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用所選範圍尋找"
}
}
}
},
"Bw7-FT-i3A.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Save As…\"; ObjectID = \"Bw7-FT-i3A\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "حفظ باسم ..."
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anomena i desa…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anomena i desa…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Speichern unter…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Guardar como…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Guardar como…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enregistrer sous…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Simpan Sebagai…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salva con nome…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "名前を付けて保存…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "다른 이름으로 저장…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Išsaugoti kaip…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lagre som…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opslaan als…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lagre som…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zapisz jako…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salvar como…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Guardar como…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Сохранить как…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spara som…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lưu dưới dạng…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "存储为…"
}
}
}
},
"c8a-y6-VQd.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Transformations\"; ObjectID = \"c8a-y6-VQd\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "التحولات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformacions"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformacions"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformationen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformaciones"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformaciones"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformations"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformasi"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trasformazioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "変換"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "변형"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformacijos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Endre bokstavtype"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformaties"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Endra bokstavtype"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przekształcenia"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformações"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformações"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Преобразования"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transformationer"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chuyển đổi"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "转换"
}
}
}
},
"C9v-g0-DH8.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Restore\"; ObjectID = \"C9v-g0-DH8\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يعيد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaura"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaura"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obnovit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wiederherstellen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Restore"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pulihkan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ripristina"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "元に戻す"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "복원"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atkurti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tilbakestill"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Herstel"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tilbakestill"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przywróć"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restabilire"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Восстановить"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obnoviť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Återställ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Önceki Boyuta Getir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Відновити"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khôi phục"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "恢复"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "復原"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "回復"
}
}
}
},
"Cancel" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Annuler"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancel·la"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancel·la"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abbrechen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancelar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancelar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Annuler"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Batal"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Annulla"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "キャンセル"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "취소"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atšaukti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avbryt"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancel"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avbryt"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancel"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancelar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cancel"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Отмена"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zrušiť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avbryt"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Скасувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Huỷ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消"
}
}
}
},
"cBj-76-2E7.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Not Authorized to Control Your Computer\"; ObjectID = \"cBj-76-2E7\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "غير مصرح له بالتحكم في جهاز الكمبيوتر الخاص بك"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "No està autoritzat per controlar el vostre ordinador"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "No està autoritzat per controlar el vostre ordinador"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ovládání počítače neautorizováno"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nicht berechtigt, Deinen Computer zu steuern"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Not Authorized to Control Your Computer"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Not Authorised to Control Your Computer"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "No está autorizado para controlar su computadora"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "No está autorizado para controlar su computadora"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Non autorisé à contrôler votre ordinateur"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tidak Berwenang untuk Mengontrol Komputer Anda"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Non autorizzato a controllare il tuo computer"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "コンピューターを制御する権限がありません"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "컴퓨터를 제어할 권한이 없습니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Neautorizuotas kompiuterio valdymui"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ikke løyve til å styre datamaskina di"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Niet bevoegd om uw computer te besturen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ikkje løyve til å styra datamaskina di"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Brak autoryzacji do kontroli komputera"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Não autorizado para controlar seu computador"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Não autorizado a controlar o seu computador"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Neautorizat pentru a Controla Dispozitivul Tău"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Не авторизован для управления компьютером"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nemá oprávnenie ovládať tvoj počítač"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inte behörig att styra din dator"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bilgisayarınızı kontrol etme yetkisi yok"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Не авторизовано для керування вашим комп’ютером"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Không đủ quyền để diều khiển máy tính của bạn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "未获授权控制您的电脑"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "未被授權來控制您的電腦"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "未被授權來控制你的電腦"
}
}
}
},
"cDB-IK-hbR.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Use None\"; ObjectID = \"cDB-IK-hbR\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استخدام لا شيء"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitzar cap"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitzar cap"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keine verwenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar ninguno"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar ninguno"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ne rien utiliser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tidak Gunakan Apapun"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Non usare"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用しない"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "사용하지 않음"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nenaudoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk ingen"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gebruik geen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk ingen"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nie używaj żadnego"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar nenhum"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nenhum"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Не использовать"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använd ingen"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Không sử dụng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "都不使用"
}
}
}
},
"Conflict with macOS tiling" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Konflikt mit macOS Fenstermanagement"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS のタイル表示機能との競合"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS 타일 정리 기능과 충돌"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Konflikt s umiestnením dlaždíc v macOS"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xung đột với ô xếp macOS"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "与 macOS 窗口平铺功能冲突"
}
}
}
},
"Conflict with system setting" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflit avec le paramètre système"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Konflikt mit Systemeinstellung"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflicto con los ajustes del sistema"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflicto con los ajustes del sistema"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflit avec le paramètre système"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflitto con Impostazioni di Sistema"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "システム設定との競合"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "시스템 설정과 충돌"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Konfliktas su sistemos nustatymu"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Konflikt med systeminnstillingene"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Konflikt med systeminnstillingane"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflito com as configurações do sistema"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Конфликт с системными настройками"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Konflikt so systémovým nastavením"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sistem ayarlarıyla çakışma"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xung đội với cài đặt hệ thống"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "与系统设置冲突"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "與系統設定衝突"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Conflict with system setting"
}
}
}
},
"Corners" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Coins"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Racons"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Racons"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rohy"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ecken"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esquinas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esquinas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Coins"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sudur"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Angoli"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "画面端"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "모서리"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kampai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hjørne"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Corners"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hjørne"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Narożniki"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cantos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cantos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Углы"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rohy"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hörn"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Köşeler"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Кути"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Các góc"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "角落"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "角落"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "角落"
}
}
}
},
"cqv-fj-IhA.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Selection\"; ObjectID = \"cqv-fj-IhA\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اختيار"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selecció"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selecció"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auswahl"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selección"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selección"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sélection"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pilihan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selezione"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "選択"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "선택 부분"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pasirinkimas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utvalg"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selectie"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utval"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wybór"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seleção"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seleção"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выбор"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Markerade"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lựa chọn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "所选内容"
}
}
}
},
"cRm-wn-Yv6.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Last Third\"; ObjectID = \"cRm-wn-Yv6\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الثلث الأخير"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últim terç"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últim terç"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Poslední třetina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Letztes Drittel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Last Third"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Último tercio"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Último tercio"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers du bas"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sepertiga Terakhir"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultimo terzo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3にして右寄せ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "마지막 1/3"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paskutinis trečdalis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siste tredjedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Laatste derde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siste tredjedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna trzecia z prawej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Último terço"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Último Terço"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultima Treime"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Последняя треть"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Posledná tretina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sista tredje"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Son üçte bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Остання третина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3 cuối"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右首1/3"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右首1/3"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右1/3"
}
}
}
},
"CUR-SD-CEL.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Use cursor position for screen detection\"; ObjectID = \"CUR-SD-CEL\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Use cursor position for screen detection"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sử dụng vị trí con trỏ để nhận diện màn hình"
}
}
}
},
"Currently using: " : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configuration actuelle : "
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "S'utilitza actualment: "
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "S'utilitza actualment: "
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aktuell verwendet: "
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usando actualmente: "
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usando actualmente: "
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configuration actuelle : "
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Currently using: "
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Attualmente in uso: "
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "現在の設定: "
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "현재 사용 중인 단축키: "
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dabar naudojama: "
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruker nå: "
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Currently using: "
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruker no: "
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Currently using: "
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usando atualmente:"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Currently using: "
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Сейчас используется: "
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Momentálne používané:"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använder för närvarande: "
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Використовується: "
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiện đang sử dụng:"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "当前使用中:"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "目前正在使用:"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "目前正在使用:"
}
}
}
},
"cwL-P1-jid.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Smart Links\"; ObjectID = \"cwL-P1-jid\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "روابط ذكية"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enllaços intel·ligents"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enllaços intel·ligents"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Intelligente Web- und E-Mail-Links"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enlaces inteligentes"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enlaces inteligentes"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Liens intelligents"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tautan Pintar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Link intelligenti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スマートリンク"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스마트 링크"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Intelektualios nuorodos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarte lenker"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slimme links"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarte lenkar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inteligentne łącza"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Links Inteligentes"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Links Inteligentes"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Интеллектуальные ссылки"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarta länkar"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Liên kết thông minh"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "智能链接"
}
}
}
},
"d7y-s8-7GE.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Top Half\"; ObjectID = \"d7y-s8-7GE\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "النصف العلوي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat superior"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat superior"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horní polovina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obere Hälfte"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Top Half"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad superior"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad superior"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié du haut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Setengah Atas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà superiore"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "上半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "위쪽 절반"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viršutinė pusė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øverste halvdel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bovenste helft"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvste halvdel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Górna połowa"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade superior"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade superior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jumătatea de Sus"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхняя половина"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horná polovica"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Övre halvan"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Üst Yarım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхня половина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nửa trên"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "上半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "上半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "上半"
}
}
}
},
"d9c-me-L2H.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Text\"; ObjectID = \"d9c-me-L2H\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نص"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texto"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texto"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texte"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Teks"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Testo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "テキスト"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "텍스트"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekstas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekst"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekst"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekst"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekst"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texto"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texto"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Текст"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chữ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "文本"
}
}
}
},
"d9M-CD-aMd.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Make Lower Case\"; ObjectID = \"d9M-CD-aMd\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "جعل الأحرف الصغيرة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Converteix a minúscules"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Converteix a minúscules"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kleinschreiben"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Convertir a minúsculas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Convertir a minúsculas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Passer en minuscules"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buat Huruf Kecil"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rendi minuscolo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "小文字にする"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "소문자로 만들기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vesti į mažąjį registrą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk små bokstaver"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maak kleine letters"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk små bokstavar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zmień na małe litery"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Converter em Minúsculas"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minúsculas"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Привести к нижнему регистру"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ändra till gemener"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viết chữ thường"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "变为小写"
}
}
}
},
"D99-0O-MB6.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Ignore frontmost.app\"; ObjectID = \"D99-0O-MB6\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تجاهل frontmost.app"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignora frontmost.app"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignora frontmost.app"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorovat frontmost.app"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "frontmost.app ignorieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Ignore frontmost.app"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorar frontmost.app"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorar frontmost.app"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorer frontmost.app"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abaikan frontmost.app"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignora frontmost.app"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "frontmost.appを無視"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "frontmost.app 무시"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignoruoti frontmost.app"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorer frontmost.app"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Negeer frontmost.app"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorer frontmost.app"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignoruj frontmost.app"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorar frontmost.app"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorar frontmost.app"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignoră frontmost.app"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Игнорировать frontmost.app"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorovať frontmost.app"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ignorera frontmost.app"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "frontmost.app uygulamasını yoksay"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ігнорувати frontmost.app"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bỏ qua frontmost.app"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "忽略 frontmost.app"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "忽略 frontmost.app"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "忽略frontmost.app"
}
}
}
},
"Default Shortcuts" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Raccourcis par défaut"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dreceres predeterminades"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dreceres predeterminades"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standard-Tastaturkurzbefehle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atajos por defecto"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atajos por defecto"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Raccourcis par défaut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pintasan Bawaan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abbreviazioni predefinite"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルトのショートカット"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기본 단축키 선택"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Numatytieji karštieji klavišai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standardsnarvegar"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Default Shortcuts"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standardsnarvegar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Default Shortcuts"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atalhos padrões"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Default Shortcuts"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Горячие клавиши по-умолчанию"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Predvolené skratky"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standardgenvägar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Типові комбінації клавіш"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Shortcut mặc định"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "默认快捷键"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "預設快速鍵"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "預設快捷鍵"
}
}
}
},
"DG2-BN-GPE.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Right\"; ObjectID = \"DG2-BN-GPE\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يمين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechts"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Right"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Droit"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "오른쪽"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dešinė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Høgre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Høgre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Справа"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vpravo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sağ"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Правий"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右侧"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右側"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right"
}
}
}
},
"DHt-cE-Bl0.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Toggle Todo\"; ObjectID = \"DHt-cE-Bl0\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تبديل Todo"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "To-do-Modus aktivieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Toggle Todo"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alternar modo 'Todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alternar modo 'Todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Activer/Désactiver Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Attiva/disattiva In evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todoモードの切り替え"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 켜기/끄기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Perjungti Todo"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slå av/på Gjøreliste"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slå av/på Gjereliste"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Включить режим Todo приложения"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prepnúť Todo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo'yu etkinleştir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перемкнути Завдання"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bật/tắt Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "启用/禁用待办模式"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "切換待辦模式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toggle Todo"
}
}
}
},
"Disable in macOS" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "In Systemeinstellungen deaktivieren"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS 側を無効化"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS의 기능 끄기"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vypnúť v macOS"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vô hiệu hóa trong macOS"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "在 macOS 里禁用"
}
}
}
},
"Disable in Rectangle" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "In Rectangle deaktivieren"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 側を無効化"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle의 기능 끄기"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vypnúť v Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vô hiệu hóa trong Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "在 Rectangle 里禁用"
}
}
}
},
"Dismiss" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abbrechen"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "無視"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "무시"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zatvoriť"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Huỷ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "忽略"
}
}
}
},
"Display" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moniteur"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pantalla"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pantalla"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Displej"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bildschirm"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pantalla"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pantalla"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moniteur"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schermo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ディスプレイ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "디스플레이"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ekranas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skjerm"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Display"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skjerm"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ekran"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tela"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ecrã"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Дисплей"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Displej"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skärm"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ekran"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Дисплей"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示器"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "顯示器"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "顯示器"
}
}
}
},
"dMs-cI-mzQ.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"File\"; ObjectID = \"dMs-cI-mzQ\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "ملف"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fitxer"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fitxer"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Soubor"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Datei"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "File"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Archivo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Archivo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fichier"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Berkas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "File"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ファイル"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "파일"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Failas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arkiv"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bestand"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arkiv"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Plik"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arquivo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ficheiro"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fișier"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Файл"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Súbor"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arkiv"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dosya"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Файл"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tệp"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "文件"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "檔案"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "檔案"
}
}
}
},
"Drag to screen edge tiling is enabled in both Rectangle and macOS." : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Das Ziehen zum Bildschirmrand für das Anordnen von Fenstern ist sowohl in Rectangle als auch in den macOS Systemeinstellungen aktiviert."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "\"画面の端にドラッグしてタイル表示\"が、Ractangle と macOS の両方で有効になっています。"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "화면 가장자리로 드래그해 타일을 정렬하는 기능이 Rectangle과 macOS 설정에서 모두 켜져 있습니다."
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Potiahnutie na okraj obrazovky je zapnuté v Rectangle aj macOS."
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tính năng kéo để ghép cạnh màn hình được bật trong cả Rectangle và macOS."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "在 Rectangle 和 macOS 中都启用了拖移窗口至屏幕边缘实现平铺"
}
}
}
},
"dRJ-4n-Yzg.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Undo\"; ObjectID = \"dRJ-4n-Yzg\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الغاء التحميل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desfés"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desfés"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zpět"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Widerrufen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Undo"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deshacer"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deshacer"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Annuler"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Balik"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Annulla"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "元に戻す"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "실행 취소"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atšaukti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Angre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ongedaan maken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Angra"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cofnij"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desfazer"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desfazer"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anulează Ultima Modificare"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Отменить"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Späť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ångra"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Geri Al"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Відмінити"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hoàn tác"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "撤销"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "還原"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "還原"
}
}
}
},
"Dv1-io-Yv7.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Spelling and Grammar\"; ObjectID = \"Dv1-io-Yv7\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "التهجئة والقواعد اللغوية"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia i gramàtica"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia i gramàtica"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtschreibung und Grammatik"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografía y gramática"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografía y gramática"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Orthographe et grammaire"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ejaan dan Tata Bahasa"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia e grammatica"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スペルと文法"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "맞춤법 및 문법"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rašyba ir gramatika"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stavekontroll og grammatikk"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spelling en grammatica"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stavekontroll og grammatikk"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pisownia i gramatyka"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia e gramática"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ortografia e Gramática"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Правописание и грамматика"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stavning och grammatik"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chính tả và Ngữ pháp"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "拼写和语法"
}
}
}
},
"DVo-aG-piG.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Close\"; ObjectID = \"DVo-aG-piG\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يغلق"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tanca"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tanca"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zavřít"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schließen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Close"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerrar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerrar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fermer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tutup"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chiudi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "閉じる"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "닫기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uždaryti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lukk"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sluiten"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lat att"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zamknij"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fechar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fechar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Închide"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Закрыть"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zavrieť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stäng"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kapat"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Закрити"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đóng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "关闭"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "關閉"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "關閉"
}
}
}
},
"e9j-DR-MEH.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Launch on login\"; ObjectID = \"e9j-DR-MEH\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "ابدأ عند تسجيل الدخول"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Executa en l'inici de sessió"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Executa en l'inici de sessió"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spustit při přihlášení"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Beim Anmelden starten"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Launch on login"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Iniciar al iniciar sesión"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Iniciar al iniciar sesión"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Démarrer avec la session"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jalankan saat login"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avvia al login"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ログイン時に起動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "로그인 시 실행"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paleisti prisijungus prie sistemos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Start ved pålogging"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Starten bij het inloggen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Start ved pålogging"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uruchamiaj po zalogowaniu się"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Iniciar no login"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Iniciar no login"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pornește la login"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Запуск при входе в систему"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spustiť pri prihlásení"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Starta vid inloggning"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Başlangıçta çalıştır"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Запускати при вході в систему"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khởi động khi đăng nhập"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "登录时打开"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "在登入時打開"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "在登入時開啟"
}
}
}
},
"e57-QJ-6bL.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Almost Maximize\"; ObjectID = \"e57-QJ-6bL\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تكبير تقريبا"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quasi maximitzar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quasi maximitzar"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skoro maximalizovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nahezu maximieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Almost Maximize"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Almost Maximise"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Casi maximizar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Casi maximizar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quasi maximiser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hampir Perbesar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quasi massimizza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ほぼ最大化"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "거의 최대화"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Beveik maksimizuoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nesten maksimert"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bijna maximaliseren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nesten maksimert"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prawie zmaksymalizuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quase maximizar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quase Maximizar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizează parțial"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Почти максимизировать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skoro maximalizovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nästan maximerad"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Neredeyse tamamını kapla"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Майже максимізувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phóng to tương đối"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "接近最大化"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "近乎放到最大"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "幾乎放到最大"
}
}
}
},
"Eah-KL-kbn.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Make Larger\"; ObjectID = \"Eah-KL-kbn\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اجعله أكبر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fer més gran"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fer més gran"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zvětšit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vergrößern"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Make Larger"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hacer más grande"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hacer más grande"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Agrandir la taille"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buat Lebih Luas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ingrandisci"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "拡大"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "크게"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Padidinti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjør større"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Groter maken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjer større"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Powiększ"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aumentar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aumentar o tamanho"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mărește"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Увеличить"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zväčšiť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gör större"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Büyüt"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Збільшити"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tăng kích thước"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "放大"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "放大"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "放大"
}
}
}
},
"EBt-5H-0z6.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"EBt-5H-0z6\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"ec4-FB-fMa.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Bottom Half\"; ObjectID = \"ec4-FB-fMa\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "النصف الأسفل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat inferior"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat inferior"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodní polovina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Untere Hälfte"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Bottom Half"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad inferior"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad inferior"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié du bas"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Setengah Bawah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà inferiore"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "下半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아래쪽 절반"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apatinė pusė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nederste halvdel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Onderste helft"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedste halvdel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dolna połowa"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade inferior"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade inferior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jumătatea de Jos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижняя половина"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodná polovica"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre halvan"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alt Yarım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижня половина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nửa dưới"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "下半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "下半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "下半"
}
}
}
},
"Eighths" : {
},
"Enable Todo Mode" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Activer le mode Todo"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Habilita mode Todo"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Habilita mode Todo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "To-do-Modus aktivieren"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Habilitar el modo 'Todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Habilitar el modo 'Todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Activer le mode Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aktifkan Mode Todo"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Attiva modalità In evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ToDoモードを有効にする"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 모드 활성화"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Įjungti Todo programos režimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aktiver Gjøreliste-modus"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enable Todo Mode"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aktiver Gjereliste-modus"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enable Todo Mode"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Habilitar Todo Mode"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enable Todo Mode"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Включить режим Todo приложения"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zapnúť Todo režim"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aktivera Att göra-läge"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Увімкнути режим Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bật chế độ Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "启用待办模式"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "啟用待辦模式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "啟用待辦模式"
}
}
}
},
"Ext-Set-Cel.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"⋯\"; ObjectID = \"Ext-Set-Cel\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "⋯"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "⋯"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "⋯"
}
}
}
},
"Extra Shortcuts" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Extra Shortcuts"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Дополнительные горячие клавиши"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phím tắt bổ sung"
}
}
}
},
"F2S-fz-NVQ.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Help\"; ObjectID = \"F2S-fz-NVQ\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يساعد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nápověda"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hilfe"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Help"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ayuda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ayuda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aide"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bantuan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aiuto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ヘルプ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "도움말"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pagalba"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hjelp"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hulp"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hjelp"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pomoc"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajutor"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Помощь"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pomocník"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hjälp"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yardım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Довідка"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trợ giúp"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "帮助"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "輔助說明"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "輔助說明"
}
}
}
},
"f3Q-q7-Pcy.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Top Right Sixth\"; ObjectID = \"f3Q-q7-Pcy\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أعلى اليمين السادس"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè superior dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè superior dreta"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horní pravá šestina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Oberes rechtes Sechstel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Top Right Sixth"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante arriba a la derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante arriba a la derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixième haut droit"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperenam Kanan Atas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesto superiore destro"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右上"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "위 오른쪽 1/6"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viršutinė šeštoji dešinėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre høgre sjettedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtsboven zesde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre høgre sjettedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna szósta po prawej u góry"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto superior à direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto Direito Superior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Șesimea din Dreapta Sus"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхняя шестая справа"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horná pravá šestina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Övre högra sjätte"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sağ Üst Altıda bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхнія права шоста частина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/6 góc trên bên phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右上1/6"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右上1/6"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右上1/6"
}
}
}
},
"F8S-GI-LiB.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Right Half\"; ObjectID = \"F8S-GI-LiB\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "النصف الأيمن"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat dreta"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pravá polovina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechte Hälfte"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Right Half"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Setengah Kanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "오른쪽 절반"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dešinė pusė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Høgre halvdel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechterhelft"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Høgre halvdel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prawa połowa"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade direita"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jumătatea din Dreapta"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Правая половина"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pravá polovica"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Högra halvan"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sağ yarım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Права половина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/2 cuối"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右半"
}
}
}
},
"F12-EV-Lfz.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"First Third\"; ObjectID = \"F12-EV-Lfz\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الاول الثالث"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primer terç"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primer terç"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "První třetina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Erstes Drittel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "First Third"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primer tercio"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primer tercio"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers du haut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sepertiga Pertama"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primo terzo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3にして左寄せ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "처음 1/3"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pirmasis trečdalis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Første tredjedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eerste derde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fyrste tredjedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna trzecia z lewej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeiro terço"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeiro Terço"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prima Treime"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Первая треть"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prvá tretina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Första tredje"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İlk üçte bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перша третина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3 đầu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左首1/3"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左側1/3"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左側1/3"
}
}
}
},
"Fal-I4-PZk.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Text\"; ObjectID = \"Fal-I4-PZk\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نص"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texto"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texto"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texte"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Teks"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Testo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "テキスト"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "텍스트"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekstas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekst"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekst"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekst"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekst"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texto"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Texto"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Текст"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chữ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "文本"
}
}
}
},
"Fap-R2-Aj6.label" : {
"comment" : "Class = \"NSTabViewItem\"; label = \"Snap Areas\"; ObjectID = \"Fap-R2-Aj6\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schnappbereiche"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Snap Areas"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Áreas Snap"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Áreas Snap"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redimensionner areas"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Area jepret"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aree a scatto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スナップ領域"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스냅 영역"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Snap Areas"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redimensionar areas"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encaixar areas"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zóny prichytenia"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tutturma Bölgeleri"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Зони прив’язки"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khu vực bố trí"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "吸附区域"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "貼齊區域"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "貼齊區域"
}
}
}
},
"FCh-1Q-Xms.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Keep a chosen application visible on the right of your primary screen at all times\"; ObjectID = \"FCh-1Q-Xms\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "احتفظ بالتطبيق المختار مرئيًا على يمين شاشتك الأساسية في جميع الأوقات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Manté l'aplicació escollida visible a la dreta de la pantalla principal en tot moment"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Manté l'aplicació escollida visible a la dreta de la pantalla principal en tot moment"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobrazí vybranou aplikaci vždy na pravé straně vaší hlavní obrazovky"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Halte eine ausgewählte Anwendung auf der rechten Seite des Hauptbildschirms im Vordergrund."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Keep a chosen application visible on the right of your primary screen at all times"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mantener la aplicación elegida visible a la derecha de la pantalla primaria en todo momento"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mantener la aplicación elegida visible a la derecha de la pantalla primaria en todo momento"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Garder une application visible à tout moment sur la droite de votre écran principal"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Biarkan aplikasi yang dipilih terlihat di sebelah kanan layar utama Anda setiap saat"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tieni l'applicazione scelta sempre visibile sulla destra del tuo schermo principale"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "メインディスプレイの右部分に、指定されたアプリケーションを常に表示します"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "선택한 응용 프로그램을 메인 화면 오른쪽에 항상 표시합니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Laikyti pasirinktą programą nuolat matomą dešinėje pagrindinio ekrano pusėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjør et valgt program synlig hele tida til høgre på hovedskjermen din"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep a chosen application visible on the right of your primary screen at all times"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjer eit valt program synleg heile tida til høgre på hovudskjermen din"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep a chosen application visible on the right of your primary screen at all times"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep a chosen application visible on the right of your primary screen at all times"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep a chosen application visible on the right of your primary screen at all times"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Păstrează tot timpul o aplicație la alegere vizibilă în dreapta ecranului principal"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Держать выбранное приложение постоянно видимым в правой части основного экрана"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ponechá zvolenú aplikáciu vždy zobrazenú na pravej strane hlavnej obrazovky"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Behåll en vald applikation hela tiden synlig till höger på din primära skärm"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seçtiğiniz bir uygulamayı ana ekranınızın sağında her zaman görüntümenizi sağlar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Залишати обраний додаток завжди видимим справа на головному екрані"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Luôn giữ ứng dụng được chọn hiển thị bên phải của màn hình chính"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "使所选应用程序在主屏幕右侧始终保持可见"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "在主螢幕右側始終顯示所選擇的應用程式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "在主螢幕右側始終顯示所選擇的應用程式"
}
}
}
},
"FeM-D8-WVr.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Substitutions\"; ObjectID = \"FeM-D8-WVr\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "البدائل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substitucions"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substitucions"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ersetzungen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sustituciones"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sustituciones"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Remplacements"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Penggantian"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sostituzioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "置換"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "대체"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pakeitimai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Erstatninger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vervangingen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Erstatningar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zamienniki"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substituições"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substituições"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Замены"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substitutioner"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sự thay thế"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示替换"
}
}
}
},
"FKE-Sm-Kum.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Rectangle Help\"; ObjectID = \"FKE-Sm-Kum\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تعليمات المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda de Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda de Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle nápověda"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle-Hilfe"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Rectangle Help"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ayuda de Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ayuda de Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aide Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bantuan Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aiuto su Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleヘルプ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 도움말"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle Pagalba"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle-hjelp"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle hulp"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle-hjelp"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pomoc Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda do Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda do Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajutor Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle Справка"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pomocník pre Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle-hjälp"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle Yardım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Довідка по Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trợ giúp của Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 帮助"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 輔助說明"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle輔助說明"
}
}
}
},
"Fko-xs-gN5.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Second Fourth\"; ObjectID = \"Fko-xs-gN5\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الرابع الثاني"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Segon quart"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Segon quart"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Druhá čtvrtina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zweites Viertel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Second Fourth"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Second Quarter"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Segundo cuarto"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Segundo cuarto"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deuxième quart"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperempat Kedua"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Secondo quarto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左から2番目"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "두번째 1/4"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Antra ketvirtis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Andre fjerdedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tweede kwart"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Andre fjerdedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Druga ćwiartka"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Segundo quarto"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Segundo Quarto"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Al Doilea Sfert"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вторая четверть"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Druhá štvrtina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Andra fjärde"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İkinci Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Друга чверть"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/4 thứ hai"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左二1/4"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左二1/4"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左二1/4"
}
}
}
},
"fL5-gz-pOD.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"fL5-gz-pOD\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"FLh-CI-WNK.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"FLh-CI-WNK\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"Fourths" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quarts"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quartes"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quartes"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Čtvrtiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viertel"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quarters"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cuartos"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cuartos"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quarts"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperempat"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quarti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "4分割"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "4등분"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ketvirtys"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fjerdedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kwarten"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fjerdedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ćwiartki"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quartos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quartos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Четверти"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Štvrtiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fjärdedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Четверини"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phần tư"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "四等分"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "四等分"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "四等分"
}
}
}
},
"Fourths columns" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colonnes de quarts"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Čtvrtiny - sloupce"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viertel Spalten"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quarter columns"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Columnas cuartas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Columnas cuartas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colonnes de quarts"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quarti in colonne"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "横向きに4分割"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/4 열"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ketvirtadaliai-stulpeliai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fjerdedelskolonner"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fjerdedelskolonner"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Четверти-колонны"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Štvrtiny stĺpce"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fourths columns"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Четвертини стовпців"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Các cột phần tư"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "四等分栏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "四等分直欄"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "四等分直欄"
}
}
}
},
"Fx0-sm-DrT.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Reflow Todo\"; ObjectID = \"Fx0-sm-DrT\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إنحسر تودو"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Reflow Todo"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reajustar 'Todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reajustar 'Todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Repositionner Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Riorganizza In evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todoモードを再設定"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 재배치"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Perdėlioti Todo"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt om på Gjøreliste"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt om på Gjereliste"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Обновить положение Todo окна"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preusporiadať Todo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo'yu Yeniden Ayarla"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Переформатувати вікна Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Làm mới Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重新排列待办"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "重新排列待辦"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
}
}
},
"GB9-OM-e27.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Bold\"; ObjectID = \"GB9-OM-e27\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "عريض"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Negreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Negreta"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fett"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Negrita"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Negrita"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gras"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cetak Tebal"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Grassetto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ボールド"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "볼드체"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paryškintas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Halvfeit"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vet"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Halvfeit"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pogrubienie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Negrito"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Negrito"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Полужирный"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fetstil"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "In đậm"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "粗体"
}
}
}
},
"gEd-S9-Cfp.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Please select your default shortcuts and behavior\"; ObjectID = \"gEd-S9-Cfp\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الرجاء تحديد الاختصارات والسلوك الافتراضي الخاص بك"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seleccioneu les dreceres i el vostre comportament per defecte"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seleccioneu les dreceres i el vostre comportament per defecte"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prosím vyberte vaše výchozí zkratky a chování"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bitte wähle die Standardeinstellungen für Kurzbefehe und deren Verhaltensweisen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Please select your default shortcuts and behavior"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Please select your default shortcuts and behaviour"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Por favor seleccione el comportamiento y atajos predeterminados"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Por favor seleccione el comportamiento y atajos predeterminados"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Veuillez choisir vos raccourcis et comportements par défaut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Silakan pilih pintasan dan perilaku default Anda"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seleziona le tue abbreviazioni predefinite e il comportamento"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルトのショートカットと動作を選択してください"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기본값의 단축키와 작업을 선택하십시오"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prašome pasirinkti karštuosius klavišus ir numatytąjį elgesį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Velg standardsnarveger og oppførsel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Please select your default shortcuts and behavior"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vel standardsnarvegar og oppførsel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wybierz domyślne skróty oraz zachowanie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selecione seus atalhos e comportamento padrão"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Por favor, selecione so seus atalhos e comportamento padrão"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selectează scurtăturile și modurile de funcționare predefinite"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Пожалуйста, выберите горячие клавиши и поведение по умолчанию"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prosím, vyber svoje predvolené skratky a správanie"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Välj dina standardgenvägar och beteende"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lütfen varsayılan kısayol ve tercihlerinizi seçiniz"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Будь ласка, виберіть ваші типові комбінації клавіш та поведінку"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hãy chọn phím tắt và hành vi mặc định bạn mong muốn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "请选择您的默认快捷键与行为"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "請選擇您的預設快速鍵與行為"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "請選擇你的預設快捷鍵與行為"
}
}
}
},
"GEO-Iw-cKr.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Format\"; ObjectID = \"GEO-Iw-cKr\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "شكل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "フォーマット"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "포맷"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formatas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formaat"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Формат"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Định dạng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "格式"
}
}
}
},
"gFy-Zj-RGl.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"About\"; ObjectID = \"gFy-Zj-RGl\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "عن"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant a"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant a"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "O aplikaci"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Über"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "About"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca de"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca de"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "À propos"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tentang"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Informazioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleについて"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "정보"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apie programą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Over"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sobre"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sobre"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Despre"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "О программе"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "O aplikácii"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hakkında"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Про програму"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Giới thiệu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "关于"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於"
}
}
}
},
"gHH-BV-5kP.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"cycle sizes on half actions\"; ObjectID = \"gHH-BV-5kP\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "دورة ½ و ⅔ و على نصف الإجراءات"
}
},
"ca" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "cicle ½, ⅔, i ⅓ a mitges accions"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "cicle ½, ⅔, i ⅓ a mitges accions"
}
},
"cs" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "změnit šířku oken na ½, ⅔, a ⅓ u polovičních akcí"
}
},
"de" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Wechsle zwischen verschiedenen Größen bei Aktionen für halbe Bildschirme"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "cycle sizes on half actions"
}
},
"es" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "bucle de ½, ⅔, y ⅓ en acciones de mitad"
}
},
"es-419" : {
"stringUnit" : {
"state" : "",
"value" : "bucle de ½, ⅔, y ⅓ en acciones de mitad"
}
},
"fr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "alterner entre ½, ⅔ et ⅓ lors des actions de moitié d’écran"
}
},
"id" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "siklus ½, ⅔ dan ⅓ pada setengah tindakan"
}
},
"it" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "scorri tra ½, ⅔, e ⅓ con le azioni di mezzi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サイズを半分にするのを繰り返す"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "절반 동작시 창 크기 순환"
}
},
"lt" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "perjungti tarp ½, ⅔ ir ⅓ pusėms"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "bytt mellom størrelser for halv-handlinger"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "byt mellom storleikar for halv-handlingar"
}
},
"ru" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "переключаться между ½, ⅔ и ⅓ для половин"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "meniť veľkosť pri použití skratiek polovice na:"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "växla mellan storlek på halva åtgärder"
}
},
"tr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "yarım seçenekleri yinelenirse ½, ⅔, ve ⅓ oranlarında geçiş yap"
}
},
"uk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "перемикати ½, ⅔, and ⅓ при діях з половиною"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "thay đổi tuần hoàn ½, ⅔, và ⅓ kích thước"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "半屏操作循环½、⅔、⅓"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "一半動作循環½、⅔和⅓"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "一半動作循環½、⅔和⅓"
}
}
}
},
"Gi5-1S-RQB.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Font\"; ObjectID = \"Gi5-1S-RQB\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الخط"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipus de lletra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipus de lletra"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schrift"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipo de letra"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipo de letra"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Police"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jenis Huruf"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Font"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "フォント"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "서체"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Šriftas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skrift"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lettertype"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skrift"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Czcionka"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fonte"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tipo de letra"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Шрифт"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Typsnitt"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phông chữ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "字体"
}
}
}
},
"Go to System Settings → Privacy & Security → Accessibility" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aller dans Réglages Système → Confidentialité et sécurité → Accessibilité"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gehe zu Systemeinstellungen → Datenschutz & Sicherheit → Bedienungshilfen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vaya a ajustes de sistema → Privacidad y Seguridad → Accesibilidad"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vaya a ajustes de sistema → Privacidad y Seguridad → Accesibilidad"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aller dans Réglages Système → Confidentialité et sécurité → Accessibilité"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vai a Impostazioni di Sistema → Privacy e sicurezza → Accessibilità"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "システム設定→プライバシーとセキュリティ→アクセシビリティを選択します"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "시스템 설정 → 개인정보 보호 및 보안 → 손쉬운 사용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eikite į Sistemos nuostatas → Privatumas ir saugumas → Privatumas → Universalus prieinamumas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå til Systeminnstillinger → Personvern og sikkerhet → Tilgjengelighet"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå til Systeminnstillingar → Personvern og tryggleik → Tilgjengelegheit"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vá em Preferências do Sistema → Segurança e Privacidade → Privacidade → Acessibilidade"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перейдите в Системные настройки → Конфиденциальность и безопасность → Конфиденциальность → Универсальный доступ"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prejdi do Systémové nastavenia → Súkromie a bezpečnosť → Prístupnosť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Go to System Settings → Privacy & Security → Accessibility"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sistem Ayarları → Gizlilik ve Güvenlik → Erişikebilirlik menüsüne gidin"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перейти до Налаштування системи → Конфіденційність та безпека → Доступність"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đi đến Cài đặt hệ thống → Quyền riêng tư & Bảo mật → Trợ năng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "前往 系统设置 → 安全性与隐私 → 辅助功能"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "前往 系統設定 → 隱私權與安全性 → 輔助使用"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "前往 系統設定 → 保安與私隱 → 輔助使用"
}
}
}
},
"gtf-PD-IHm.label" : {
"comment" : "Class = \"NSTabViewItem\"; label = \"General\"; ObjectID = \"gtf-PD-IHm\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Réglages"
}
},
"ca" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Configuració"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Configuració"
}
},
"cs" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Nastavení"
}
},
"de" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Einstellungen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "General"
}
},
"es" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Ajustes"
}
},
"es-419" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Ajustes"
}
},
"fr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Réglages"
}
},
"id" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Pengaturan"
}
},
"it" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Impostazioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "設定"
}
},
"ko" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "설정"
}
},
"lt" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Nustatymai"
}
},
"nb" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Innstillinger"
}
},
"nl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Settings"
}
},
"nn" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Innstillingar"
}
},
"pl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Ustawienia"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Configurações"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Definições"
}
},
"ro" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Setări"
}
},
"ru" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Настройки"
}
},
"sk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Nastavenia"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Inställningar"
}
},
"tr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Genel Ayarlar"
}
},
"uk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Налаштування"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tổng quan"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "设置"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "設定"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "設定"
}
}
}
},
"GUa-eO-cwY.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Use Default\"; ObjectID = \"GUa-eO-cwY\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استخدم الافتراضي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ús predeterminat"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ús predeterminat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standard verwenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uso predeterminado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uso predeterminado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utiliser la valeur par défaut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gunakan Bawaan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usa predefinito"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "デフォルトを使用"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기본값 사용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naudoti pagal nutylėjimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk standard"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gebruik standaard"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk standard"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Użyj domyślnych"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar Padrão"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar Padrão"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Использовать по умолчанию"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använd standard"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sử dụng mặc định"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用默认"
}
}
}
},
"gVA-U4-sdL.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Paste\"; ObjectID = \"gVA-U4-sdL\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "معجون"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enganxa"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enganxa"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vložit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einfügen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Paste"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pegar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pegar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Coller"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tempel"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Incolla"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ペースト"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "붙여넣기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Įterpimas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lim inn"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Plakken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lim inn"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wklej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lipește"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вставка"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vložiť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Klistra in"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yapıştır"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вставити"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dán"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "粘贴"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "貼上"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "貼上"
}
}
}
},
"gyg-xl-dPn.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Rectangle needs your permission to control your window positions.\"; ObjectID = \"gyg-xl-dPn\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يحتاج المستطيل إلى إذنك للتحكم في مواضع النافذة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle necessita el vostre permís per controlar les posicions de les finestres."
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle necessita el vostre permís per controlar les posicions de les finestres."
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle potřebuje vaše povolení, aby mohl ovládat pozice oken."
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle benötigt deine Erlaubnis, um Fensterpositionen zu steuern."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Rectangle needs your permission to control your window positions."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle necesita su permiso para controlar la posición de las ventanas."
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle necesita su permiso para controlar la posición de las ventanas."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle requiert votre permission pour contrôler la position de vos fenêtres."
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle memerlukan izin anda untuk mengatur posisi jendela."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle ha bisogno del tuo permesso per controllare le posizioni delle tue finestre."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleがウインドウの位置を制御するには許可が必要です。"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle은 창 위치를 제어하기 위해 권한이 필요합니다."
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle reikia jūsų leidimo valdyti langų padėtį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle trenger lov av deg for å kontrollere vindusposisjonene."
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle heeft uw toestemming nodig om uw vensterposities te kunnen aanpassen."
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle treng lov av deg for å kontrollera vindaugsposisjonane."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle potrzebuje twojego pozwolenia, aby móc sterować pozycjami okna."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Rectangle precisa de sua permissão para controlar a posição das janelas."
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Rectangle precisa da sua permissão para controlar as posições das janelas."
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle are nevoie de permisiunea ta pentru a controla poziția ferestrelor tale."
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle необходимо ваше разрешение для управления положением окон"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle potrebuje povolenie na ovládanie umiestnenia tvojich okien."
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle behöver ditt tillstånd för att kontrollera dina fönsterpositioner."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle'ın pencere konumlarını değiştirebilmek için izninize ihtiyacı var."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle потребує вашого дозволу для керування позиціями ваших вікон."
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle cần sự cho phép của bạn để điều khỉển vị trí cửa sổ."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 需要您的允许以控制窗口位置。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 需要您的許可來控制視窗位置。"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle需要你的允許以控制視窗位置。"
}
}
}
},
"H1b-Si-o9J.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Writing Direction\"; ObjectID = \"H1b-Si-o9J\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اتجاه الكتابة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direcció d'escriptura"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direcció d'escriptura"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schreibrichtung"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dirección de escritura"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dirección de escritura"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sens d'écriture"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arah Penulisan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direzione di scrittura"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "文字の向き"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "작성 방향"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rašymo kryptis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriveretning"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schrijfrichting"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriveretning"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kierunek pisania"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direção de Escrita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direção de Escrita"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Направление письма"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skrivriktning"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hướng viết"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "书写方向"
}
}
}
},
"H8h-7b-M4v.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"View\"; ObjectID = \"H8h-7b-M4v\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "منظر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visualitza"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visualitza"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobrazit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Darstellung"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "View"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vista"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Peržiūra"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bekijk"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Widok"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visualizar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vizualizează"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Просмотр"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobraziť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Görünüm"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вигляд"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xem"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "顯示方式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "顯示方式"
}
}
}
},
"Half Split Ratios" : {
},
"Halves" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitiés"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitats"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitats"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Poloviny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hälften"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitades"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitades"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitiés"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bagian"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "2등분"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pusės"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Halvdeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Halves"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Halvdelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Połowy"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metades"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metades"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Половинки"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Polovice"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hälfter"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yarımlar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Половини"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Một nửa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "一半螢幕"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "一半螢幕"
}
}
}
},
"heT-W6-Fyf.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Double-click window title bar to maximize/restore\"; ObjectID = \"heT-W6-Fyf\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "انقر نقرًا مزدوجًا فوق شريط عنوان النافذة لتكبير / استعادة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Doppelklick auf die Titelleiste des Fensters zum Maximieren/Wiederherstellen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Double-click window title bar to maximize/restore"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximise/restore"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Haz click dos veces en la barra de título de la ventana para maximizar/restaurar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Haz click dos veces en la barra de título de la ventana para maximizar/restaurar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-cliquer sur la barre de titre d'une fenêtre pour maximiser/restaurer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fai doppio clic sul titolo della finestra per massimizzare/ripristinare"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ウインドウのタイトルバーをダブルクリックすることで、最大化/最大化解除を行う"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "윈도우 제목 막대를 두 번 클릭해 확대/축소"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spustelėkite du kartus lango antraštės juostą, kad padidintumėte/atstatytumėte"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dobbeltklikk vindustittel for å maksimere eller tilbakestille"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dobbeltklikk vindaugstittel for å maksimera eller tilbakestilla"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Duplo clique no title bar da janela para maximizar/restaurar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Дважды щелкните по заголовку окна, чтобы увеличить/уменьшить его размер"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dvojitým kliknutím na lištu s názvom maximalizovať/obnoviť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Büyütmek/Yeniden yüklemek için üst pencere çubuğuna çift tıklayın."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nhấp đúp trên thanh tiêu đề để phóng to/khôi phục"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "连按窗口标题以缩放/恢复"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "連按兩下視窗標題列來最大化/復原"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Double-click window title bar to maximize/restore"
}
}
}
},
"HFo-cy-zxI.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Show Spelling and Grammar\"; ObjectID = \"HFo-cy-zxI\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إظهار التدقيق الإملائي والنحوي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar ortografia i gramàtica"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar ortografia i gramàtica"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtschreibung und Grammatik einblenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar ortografía y gramática"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar ortografía y gramática"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher l'orthographe et la grammaire"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilkan Ejaan dan Tata Bahasa"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra ortografia e grammatica"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スペルと文法を表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "맞춤법 및 문법 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti rašybą ir gramatiką"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis stavekontroll og grammatikk"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toon spelling en grammatica"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis stavekontroll og grammatikk"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż pisownię i gramatykę"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar ortografia e gramática"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Ortografia e Gramática"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показать правописание и грамматику"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa stavning och grammatik"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị Chính tả và Ngữ pháp"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示拼写和语法"
}
}
}
},
"HFQ-gK-NFA.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Text Replacement\"; ObjectID = \"HFQ-gK-NFA\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استبدال النص"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substitució de text"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substitució de text"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Text ersetzen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reemplazo de texto"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reemplazo de texto"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Remplacement de texte"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Penggantian Teks"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sostituzione testo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "テキストの置き換え"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "삽입"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Teksto pakeitimas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Teksterstatninger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tekstvervanging"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Teksterstatningar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zamiana tekstu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substituição de Texto"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Substituição de Texto"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Замена текста"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Textbyte"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thay thế văn bản"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "文本替换"
}
}
}
},
"HIK-3r-i7E.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Check for Updates…\"; ObjectID = \"HIK-3r-i7E\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحقق من وجود تحديثات…"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca actualitzacions…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca actualitzacions…"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zkontrolovat aktualizace…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nach Updates suchen…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Check for Updates…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar actualizaciones…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar actualizaciones…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mettre à jour…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Periksa Pembaruan…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controlla aggiornamenti…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アップデートを確認…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "업데이트 확인…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tikrinti atnaujinimus…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se etter oppdateringer…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kijk of er updates zijn…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sjå etter oppdateringar…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprawdź aktualizacje…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Procurar por atualizações…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verifique se há atualizações…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verifică Actualizări…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Проверить обновления…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skontrolovať aktualizácie…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök efter uppdateringar…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Güncellemeleri kontrol et…"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перевірити оновлення…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kiểm tra các bản cập nhật…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "检查更新…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "檢查更新⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "檢查更新項目⋯"
}
}
}
},
"HOm-BV-2jc.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Move Up\"; ObjectID = \"HOm-BV-2jc\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحرك"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mou amunt"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mou amunt"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Přesunout nahoru"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nach oben bewegen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Move Up"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover hasta arriba"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover hasta arriba"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Déplacer vers le haut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naikkan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sposta su"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "上に移動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "위로 이동"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aukštyn"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt opp"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naar boven"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt opp"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przesuń w górę"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para cima"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para cima"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mută Sus"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вверх"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Presunúť hore"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytta upp"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yukarı kenar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перемістити вгору"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đi lên"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "向上移动"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "上移"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "上移"
}
}
}
},
"HOp-Kd-vhY.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Recommended\"; ObjectID = \"HOp-Kd-vhY\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مُستَحسَن"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recomanat"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recomanat"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Doporučené"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Empfohlen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Recommended"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recomendado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recomendado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recommandé"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Direkomendasikan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Consigliate"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "推奨設定"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "권장 설정"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rekomenduojama"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anbefalt"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recommended"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tilrådd"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rekomendowane"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recomendado"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recomendado"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recomandat"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Рекомендуемые"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Odporúčané"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rekommenderas"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Önerilen"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Рекомендовано"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gợi ý"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "推荐"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "建議"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "建議"
}
}
}
},
"Horizontal (L/R, %)" : {
},
"hQb-2v-fYv.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Smart Quotes\"; ObjectID = \"hQb-2v-fYv\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اقتباسات ذكية"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cites intel·ligents"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cites intel·ligents"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Intelligente Anführungszeichen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Citas inteligentes"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Citas inteligentes"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Citations intelligentes"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kutipan Pintar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Virgolette intelligenti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スマート引用符"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스마트 인용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Intelektualios kabutės"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarte hermetegn"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slimme aanhalingstekens"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarte hermeteikn"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inteligentne cudzysłowy"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Citações Inteligentes"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Citações Inteligentes"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Интеллектуальные кавычки"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarta citat"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trích dẫn thông minh"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "智能引号"
}
}
}
},
"HtH-yF-lBR.title" : {
"comment" : "Class = \"NSWindow\"; title = \"Welcome!\"; ObjectID = \"HtH-yF-lBR\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مرحباً"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Benvingut!"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Benvingut!"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vítejte!"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Willkommen!"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Welcome!"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "¡Bienvenido!"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "¡Bienvenido!"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bienvenue !"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selamat Datang!"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ti diamo il benvenuto!"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ようこそ!"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "환영합니다!"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sveiki!"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Velkommen!"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Welcome!"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Velkomen!"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Witaj!"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bem vindo!"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bem-vindo!"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bine ai venit!"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Добро пожаловать!"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vitaj!"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Välkommen!"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hoşgeldiniz!"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ласкаво просимо!"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xin chào!"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "欢迎!"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "歡迎!"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "歡迎!"
}
}
}
},
"HyV-fh-RgO.title" : {
"comment" : "Class = \"NSMenu\"; title = \"View\"; ObjectID = \"HyV-fh-RgO\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "منظر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visualitza"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visualitza"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobrazit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Darstellung"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "View"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vista"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Peržiūra"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bekijk"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Widok"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visualizar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vizualizează"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Просмотр"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobraziť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Görünüm"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вигляд"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xem"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "顯示方式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "顯示方式"
}
}
}
},
"hz2-CU-CR7.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Check Document Now\"; ObjectID = \"hz2-CU-CR7\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحقق من المستند الآن"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comproveu ara el document"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comproveu ara el document"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dokument jetzt prüfen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar documento ahora"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar documento ahora"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vérifier le document maintenant"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Periksa Dokumen Sekarang"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controlla documento ora"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "書類を今すぐチェック"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "지금 문서 검사"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Patikrinkite dokumentą dabar"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontroller dokumentet nå"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controleer nu het document"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontroller dokumentet no"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprawdź dokument teraz"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar documento agora"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar documento agora"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Проверьте документ сейчас"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontrollera dokument nu"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kiểm tra tài liệu ngay"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "立即检查文稿"
}
}
}
},
"hz9-B4-Xy5.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Services\"; ObjectID = \"hz9-B4-Xy5\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "خدمات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serveis"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serveis"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Služby"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dienste"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Services"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servicios"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servicios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Services"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Layanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servizi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サービス"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "서비스"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paslaugos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tjenester"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Diensten"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tenester"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usługi"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serviços"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serviços"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servicii"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Службы"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Služby"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tjänster"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servisler"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Сервіси"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dịch vụ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "服务"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "服務"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "服務"
}
}
}
},
"I0S-gh-46l.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Subscript\"; ObjectID = \"I0S-gh-46l\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مخطوطة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subíndex"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subíndex"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiefgestellt"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subíndice"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subíndice"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Indice"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tulisan di Bawah Garis"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pedice"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "添字"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아래 첨자"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prenumeratorius"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Senka"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subscript"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Senka"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subskrybuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subscrito"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subscrito"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Подписчик"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Index"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chỉ số dưới"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "下标"
}
}
}
},
"i1d-Er-qST.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Smaller\"; ObjectID = \"i1d-Er-qST\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الأصغر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Més petit"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Més petit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kleiner"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Más pequeño"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Más pequeño"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Plus petit"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lebih Kecil"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Più piccolo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "小さく"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "작게"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mažiau"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mindre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kleiner"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mindre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mniejszy"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menor"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menor"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Меньше"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mindre"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nhỏ hơn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "较小"
}
}
}
},
"I97-ob-ue4.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"I97-ob-ue4\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"IAo-SY-fd9.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Open…\"; ObjectID = \"IAo-SY-fd9\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يفتح…"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obre…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obre…"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otevřít…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Öffnen…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Open…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ouvrir…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buka…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apri…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "開く…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "열기…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atidaryti…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Åpne…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opne…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otwórz…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deschide…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Открыть…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otvoriť…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Öppna…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aç…"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Відкрити…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mở…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "打开…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "打開⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "開啟⋯"
}
}
}
},
"ijk-EB-dga.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Baseline\"; ObjectID = \"ijk-EB-dga\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "حدود"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Línia de base"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Línia de base"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schriftlinie"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Línea de base"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Línea de base"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligne de base"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Garis Dasar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linea base"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ベースライン"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기준선"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pagrindinis rodiklis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriftlinje"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Basislijn"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skriftline"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Poziom bazowy"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linha de base"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Base de referência"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Базовый показатель"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Baslinje"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đường cơ sở"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "基线"
}
}
}
},
"IO3-Hi-7gC.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Export\"; ObjectID = \"IO3-Hi-7gC\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يصدّر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exporta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exporta"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exportovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exportieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Export"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exporter"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Expor"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esporta"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "エクスポート"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "내보내기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eksportuoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eksporter"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eksporter"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exportar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exportar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exportă"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Экспорт"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exportovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exportera"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dışa Aktar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Експортувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xuất"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "导出"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "輸出"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "輸出"
}
}
}
},
"iOQ-1e-esP.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Bottom Center Sixth\"; ObjectID = \"iOQ-1e-esP\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مركز القاع السادس"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè inferior centre"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè inferior centre"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodní prostřední šestina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Unteres mittleres Sechstel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Bottom Center Sixth"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bottom Centre Sixth"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante abajo centrado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante abajo centrado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixième bas centre"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperenam Tengah Bawah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesto inferiore centrale"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "中央下"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아래 가운데 1/6"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apatinė šeštoji centre"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre midtre sjettedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Middenonder zesde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre midtre sjettedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna szósta na środku u dołu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto inferior central"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto Central Inferior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Șesimea din Centru Jos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижняя шестая по центру"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodná prostredná šestina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre mitten sjätte"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alt Orta Altıda bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижня центральна шоста частина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/6 ở giữa bên dưới"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "中下1/6"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "中下1/6"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "中下1/6"
}
}
}
},
"iWV-c2-BJD.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Open System Preferences\"; ObjectID = \"iWV-c2-BJD\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "افتح تفضيلات النظام"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obrir preferències del sistema"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obrir preferències del sistema"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otevřít systémové předvolby"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Systemeinstellungen öffnen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Open System Preferences"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir preferencias del sistema"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir preferencias del sistema"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ouvrir les Préférences Système"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buka Preferensi Sistem"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apri Preferenze di Sistema"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "システム環境設定を開く"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "시스템 환경설정 열기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atidaryti sistemos nustatymus"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Åpne systeminnstllingene"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open Systeemvoorkeuren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opna systeminnstllingane"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otwórz ustawienia systemowe"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir Ajustes do Sistema"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir Preferências de Sistema"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deschide Preferințele de Sistem"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Открыть Cистемные настройки"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otvoriť systémové nastavenia"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Öppna systeminställningar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sistem Tercihlerini Aç"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Відкрити Налаштування системи"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mở cài đặt hệ thống"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "打开系统偏好设置"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "打開系統偏好設定"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "開啟系統偏好設定"
}
}
}
},
"iXo-XL-T6q.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Authorize Rectangle\"; ObjectID = \"iXo-XL-T6q\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تخويل المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoritza Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoritza Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizovat Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle autorisieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Authorize Rectangle"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Authorise Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Izinkan Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizza Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleを許可"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 승인"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Suteikti Rectangle prieigą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle toestemming geven"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoryzacja Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizare Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Дать Rectangle доступ"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Povoliť Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auktorisera Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle'ı Yetkilendir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Авторизувати Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cấp phép cho Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "授权Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "授權 Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "授權Rectangle"
}
}
}
},
"J5U-5w-g23.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Justify\"; ObjectID = \"J5U-5w-g23\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يبرر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justificar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justificar"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Blocksatz"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justificar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justificar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justifier"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rata Kanan Kiri"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Giustifica"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "両端揃え"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "좌우 정렬"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lygiuoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Juster"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uitlijnen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Juster"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wyjustuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justificar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justificar"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выровнять"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justera"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căn chỉnh"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "两端对齐"
}
}
}
},
"J6t-sg-Wwz.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Bottom Right\"; ObjectID = \"J6t-sg-Wwz\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أسفل اليمين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior dreta"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vpravo dole"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Unten rechts"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Bottom Right"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abajo a la derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abajo a la derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "En bas à droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kanan Bawah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "In basso a destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右下"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "오른쪽 아래"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apačioje dešinėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre høgre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtsonder"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre høgre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prawy dolny róg"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior direito"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inferior Direita"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dreapta Jos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Внизу справа"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vpravo dole"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre högra"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sağ Alt"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижній правий кут"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Góc dưới bên phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右下"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右下"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右下"
}
}
}
},
"J7y-lM-qPV.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Use None\"; ObjectID = \"J7y-lM-qPV\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استخدام لا شيء"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitzar cap"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitzar cap"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nicht verwenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar ninguno"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar ninguno"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ne rien utiliser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tidak Gunakan Apapun"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Non usare"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用しない"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "사용하지 않음"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nenaudoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk ingen"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gebruik geen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk ingen"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nie używaj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar nenhum"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nenhum"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Не использовать"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använd ingen"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Không sử dụng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "都不使用"
}
}
}
},
"jBQ-r6-VK2.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Kern\"; ObjectID = \"jBQ-r6-VK2\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "كيرن"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zeichenabstand"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "カーニング"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "자간"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kernas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kniping"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kniping"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Керн"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kerning"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Điều chỉnh khoảng cách giữa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "字距调整"
}
}
}
},
"jFq-tB-4Kx.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"\\tRight to Left\"; ObjectID = \"jFq-tB-4Kx\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : " t من اليمين إلى اليسار"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDreta a esquerra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDreta a esquerra"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVon rechts nach links"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDerecha a izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDerecha a izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDe droite à gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tKanan ke Kiri"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa destra a sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t右から左"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t오른쪽에서 왼쪽"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tIš dešinės į kairę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tHøgre til venstre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVan rechts naar links"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tHøgre til venstre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tZ prawej strony do lewej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa direita para a esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa direita para a esquerda"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tСправа налево"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tHöger till vänster"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tPhải sang trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tRight to Left"
}
}
}
},
"Jnd-Lc-nlh.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Next Display\"; ObjectID = \"Jnd-Lc-nlh\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "العرض التالي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Següent pantalla"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Següent pantalla"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Následující displej"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nächster Bildschirm"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Next Display"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siguiente Pantalla"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siguiente Pantalla"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moniteur suivant"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilan Berikutnya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schermo successivo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "次のディスプレイ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "다음 디스플레이"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kitas ekranas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Neste skjerm"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Volgende scherm"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Neste skjerm"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Następny ekran"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Próxima tela"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ecrã seguinte"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ecranul Următor"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Следующий экран"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nasledujúci displej"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nästa skärm"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sonraki Ekran"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Наступний екран"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Màn hình kế tiếp"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "下一个显示器"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "下一個顯示器"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "下一個顯示器"
}
}
}
},
"JSl-FY-MF0.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"JSl-FY-MF0\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"jww-Ju-S3d.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"do nothing\"; ObjectID = \"jww-Ju-S3d\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "لا تفعل شيئا"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "no fer res"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "no fer res"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "nic nedělat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nichts tun"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "do nothing"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "no hacer nada"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "no hacer nada"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "ne rien faire"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "tidak melakukan apapun"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "nessuna azione"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "何もしない"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아무것도 하지 않음"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "nieko nedaryti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "gjør ingenting"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "do nothing"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "gjer ingenting"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "do nothing"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "do nothing"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "do nothing"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "nu face nimic"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "ничего не делать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "nič nerobiť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "gör ingenting"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "hiçbir şey yapma"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "не робити нічого"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Không làm gì"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "不执行任何操作"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "不執行任何動作"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "不執行任何操作"
}
}
}
},
"jxe-nr-LDQ.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"About\"; ObjectID = \"jxe-nr-LDQ\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "عن"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant a"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant a"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "O aplikaci"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Über"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "About"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca de"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca de"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "À propos"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tentang"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Informazioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleについて"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "정보"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apie Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Over"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sobre"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sobre"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Despre"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "О Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "O aplikácii"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hakkında"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Про програму"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Giới thiệu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "关于"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於"
}
}
}
},
"jxT-CU-nIS.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Format\"; ObjectID = \"jxT-CU-nIS\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "شكل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "フォーマット"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "포맷"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formatas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formaat"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Formato"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Формат"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Format"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Định dạng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "格式"
}
}
}
},
"KaW-ft-85H.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Revert to Saved\"; ObjectID = \"KaW-ft-85H\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "العودة إلى المحفوظات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Torna al desat"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Torna al desat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Änderungen zurücksetzen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Volver a Guardado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Volver a Guardado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Revenir au dernier enregistrement"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kembali ke Simpanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ritorna a stato salvato"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "保存済みに戻す"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "다음으로 복귀"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Grąžinti į išsaugotą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå tilbake til lagra"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terug naar opgeslagen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå attende til lagra"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przywróć do zapisanego"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Descartar alterações"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reverter para Guardado"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вернуть к сохранённому"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Återgå till sparad"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quay lại mục đã lưu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "复原到已存储版本"
}
}
}
},
"Kd2-mp-pUS.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Show All\"; ObjectID = \"Kd2-mp-pUS\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "عرض الكل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra-ho tot"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra-ho tot"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobrazit vše"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alle einblenden"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Show All"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar todo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar todo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tout afficher"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilan Semua"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra tutti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "すべて表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "모두 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti viską"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis alle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toon alle"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis alle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż wszystko"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar todos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar todos"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arată Toate"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показать всё"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobraziť všetko"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa allt"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tümünü Göster"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показати все"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị tất cả"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示所有"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "顯示所有"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "顯示所有"
}
}
}
},
"KfQ-dw-3jk.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"KfQ-dw-3jk\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"kIP-vf-haE.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Show Sidebar\"; ObjectID = \"kIP-vf-haE\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إظهار الشريط الجانبي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra barra lateral"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra barra lateral"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seitenleiste einblenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar barra lateral"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar barra lateral"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher la barre latérale"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilkan Bilah Samping"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra barra laterale"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サイドバーを表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "사이드바 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti šoninį skydelį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis sidefeltet"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toon zijbalk"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis sidefeltet"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż pasek boczny"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar barra lateral"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Barra lateral"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показать боковую панель"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa sidofältet"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị thanh bên"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示边栏"
}
}
}
},
"kx2-tZ-lk8.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Animate footprint\"; ObjectID = \"kx2-tZ-lk8\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحريك البصمة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fußabdruck animieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Animate footprint"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animar la huella de ventana"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animar la huella de ventana"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animer l'empreinte"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animazione ridimensionamento"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "軌跡のアニメーション"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "부드러운 스냅 예시 애니메이션"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animuoti seką"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animer fotavtrykk"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animer fotavtrykk"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Анимировать след"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animovať stopu"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Анімувати відбиток"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị vết bố trí"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "吸附动画"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "動畫"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Animate footprint"
}
}
}
},
"kXi-dT-zSF.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Spectacle shortcuts are more likely to conflict with other shortcuts\"; ObjectID = \"kXi-dT-zSF\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "من المرجح أن تتعارض اختصارات النظارات مع الاختصارات الأخرى"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "És probable que les dreceres de Spectable entren en conflicte amb altres dreceres"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "És probable que les dreceres de Spectable entren en conflicte amb altres dreceres"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "U Spectacle zkratek je větší pravděpodobnost konfliktu s jinými zkratkami"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle-Tastaturkurzbefehle stehen eher mit anderen Tastaturkurzbefehlen in Konflikt"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Spectacle shortcuts are more likely to conflict with other shortcuts"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Los atajos de Spectacle tienen más probabilidades de entrar en conflicto con otros atajos"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Los atajos de Spectacle tienen más probabilidades de entrar en conflicto con otros atajos"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Les raccourcis de Spectacle ont plus de chance d'être en conflit avec d'autres raccourcis"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pintasan Spectacle lebih cenderung bertentangan dengan pintasan lainnya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Le abbreviazioni Spectacle hanno maggiori probabilità di conflitto con altre abbreviazioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacleを使用すると、ショートカットがほかのショートカットと競合する可能性が高まります"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle 단축키는 다른 키 조합과 충돌할 가능성이 있습니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle karštieji klavišai tikriausiai sukels konfliktų su kitais karštaisiais klavišais"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle-snarveger kommer mer sannsynleg i konflikt med andre snarveger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle shortcuts are more likely to conflict with other shortcuts"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle-snarvegar kjem meir sannsynleg i konflikt med andre snarvegar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skróty Spectacle są bardziej podatne na konflikt z innymi skrótami"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atalhos Spectacle tem mais chance de causar conflitos com outros atalhos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Os atalhos de Spectacle têm maior probabilidade de entrar em conflito com outros atalhos"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Scurtăturile Spectacle sunt mai predispuse să se suprapună cu alte scurtături"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Горячие клавиши Spectacle с большой вероятностью будут конфликтовать с другими горячими клавишами"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle skratky majú vyššiu pravdepodobnosť konfliktu s inými skratkami"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle-genvägar är mer benägna att komma i konflikt med andra genvägar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle kısayollarının diğer kısayollarla çakışması daha muhtemeldir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Комбінації клавіш Spectacle більш ймовірно конфліктують з іншими комбінаціями клавіш"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phím tắt của Spectacle có nhiều khả năng xung đột với những phím tắt khác"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle 快捷键更有可能与其他快捷键冲突"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle 快速鍵更可能與其他快速鍵相衝突"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle快捷鍵更可能與其他快捷鍵衝突"
}
}
}
},
"kYm-Ye-gOR.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Welcome to Rectangle!\"; ObjectID = \"kYm-Ye-gOR\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مرحبًا بك في المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Benvingut a Rectangle!"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Benvingut a Rectangle!"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vítejte do Rectangle!"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Willkommen bei Rectangle!"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Welcome to Rectangle!"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "¡Bienvenido a Rectangle!"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "¡Bienvenido a Rectangle!"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bienvenue dans Rectangle !"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selamat Datang di Rectangle!"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle ti dà il benvenuto!"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleへようこそ!"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle에 오신 것을 환영합니다!"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sveiki atvykę į Rectangle!"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Velkommen til Rectangle!"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Welcome to Rectangle!"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Velkomen til Rectangle!"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Witaj w Rectangle!"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bem vindo ao Rectangle!"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bem-vindo ao Rectangle!"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bine ai venit în Rectangle!"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Добро пожаловать в Rectangle!"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Víta Ťa Rectangle!"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Välkommen till Rectangle!"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle'a Hoşgeldiniz!"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ласкаво просимо до Rectangle!"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chào mừng đến với Rectangle!"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "欢迎使用 Rectangle!"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "歡迎使用 Rectangle!"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "歡迎使用Rectangle!"
}
}
}
},
"Larger Width" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Larger Width"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Увеличить ширину"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chiều rộng lớn hơn"
}
}
}
},
"Lbh-J2-qVU.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"\\tLeft to Right\"; ObjectID = \"Lbh-J2-qVU\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : " t من اليسار إلى اليمين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tEsquerra a dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tEsquerra a dreta"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVon links nach rechts"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tIzquierda a derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tIzquierda a derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDe gauche à droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tKiri ke Kanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa sinistra a destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t左から右"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t왼쪽에서 오른쪽"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tIš kairės į dešinę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVenstre til høgre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVan links naar rechts"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVenstre til høgre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tOd lewej do prawej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa esquerda para a direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa Esquerda para a Direita"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tСлева направо"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVänster till höger"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tTrái sáng phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tLeft to Right"
}
}
}
},
"LE2-aR-0XJ.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Bring All to Front\"; ObjectID = \"LE2-aR-0XJ\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إحضار الكل إلى المقدمة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Porta tot al davant"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Porta tot al davant"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alle nach vorne bringen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Traer a todos al frente"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Traer a todos al frente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tout ramener au premier plan"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bawa Semua ke Depan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Porta tutti in primo piano"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "すべてを手前に移動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "모두 앞으로 가져오기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Iškelti viską į priekį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Legg alle øverst"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Breng alles naar voren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Legg alle øvst"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Umieść wszystko na wierzchu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trazer tudo para a frente"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trazer tudo para a frente"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вынести всё вперёд"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ta fram allt"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đưa tất cả ra phía trước"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "前置全部窗口"
}
}
}
},
"Left half, top/bottom half near corners" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié gauche, moitié du haut/bas près des coins"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left half, top/bottom half near corners"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left half, top/bottom half near corners"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Levá polovina, horní/spodní polovina blízko rohů"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linke Hälfte, Obere/Untere Hälfte in der Nähe der Ecken"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad izquierda, mitad superior/inferior cerca de las esquinas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad izquierda, mitad superior/inferior cerca de las esquinas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié gauche, moitié du haut/bas près des coins"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left half, top/bottom half near corners"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà sinistra, metà superiore/inferiore vicino gli angoli"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半分、画面端付近の上半分・下半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽 반, 위/아래 반에 근접한 모서리"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kairė pusė, viršutinė/apačioje pusė šalia kampų"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstre halvdel, øverste/nederste halvdel nære hjørne"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left half, top/bottom half near corners"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstre halvdel, øvste/nedste halvdel nære hjørne"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left half, top/bottom half near corners"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade esquerda, metade de cima/baixo próximo das bordas"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left half, top/bottom half near corners"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left half, top/bottom half near corners"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Левая половина, верхняя/нижняя половина возле углов"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ľavá polovica, horná/spodná polovica blízko rohov"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left half, top/bottom half near corners"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol yarım (köşelere yaklaşıldığında ise üst/alt yarım)"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ліва половина, верхня/нижня половина близько кутів"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nửa trái, nửa trên/dưới nếu ngay góc"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半屏,靠近角落则上/下半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半,靠近角落則上半/下半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半,靠近角落則上半/下半"
}
}
}
},
"Left or right half" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié gauche ou droite"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left or right half"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left or right half"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Levá nebo pravá polovina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linke oder Rechte Hälfte"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad izquierda o derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad izquierda o derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié gauche ou droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left or right half"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà destra o sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半分または右半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽 또는 오른쪽 반"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kairė arba dešinė pusė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstre eller høgre halvdel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left or right half"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstre eller høgre halvdel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left or right half"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade esquerda ou direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left or right half"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left or right half"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Левая или правая половина"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ľavá alebo pravá polovica"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left or right half"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol veya sağ yarım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ліва або права половина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nửa trái hoặc phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半屏或右半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半或右半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半或右半"
}
}
}
},
"lgE-cR-cQ5.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Go to System Preferences → Security & Privacy → Privacy → Accessibility\"; ObjectID = \"lgE-cR-cQ5\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "انتقل إلى تفضيلات النظام ← الأمان والخصوصية ← الخصوصية ← إمكانية الوصول"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anar a Preferències del sistema → Seguretat i privacitat → Privacitat → Accesibilitat"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anar a Preferències del sistema → Seguretat i privacitat → Privacitat → Accesibilitat"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jděte do Předvolby systému -> Zabezpečení a soukromí -> Soukromí -> Zpřístupnění"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gehe zu Systemeinstellungen → Sicherheit & Datenschutz → Datenschutz → Bedienungshilfen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Go to System Preferences → Security & Privacy → Privacy → Accessibility"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vaya a Preferencias del sistema → Seguridad y privacidad → Privacidad → Accesibilidad"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vaya a Preferencias del sistema → Seguridad y privacidad → Privacidad → Accesibilidad"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Allez dans Préférences Système → Sécurité et confidentialité → Confidentialité → Accessibilité"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buka Preferensi Sistem → Keamanan & Privasi → Privasi → Aksesibilitas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vai a Preferenze di Sistema → Sicurezza e privacy → Privacy → Accessibilità"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "システム環境設定→セキュリティとプライバシー→プライバシー→アクセシビリティに移動してください"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "시스템 환경설정 → 보안 및 개인 정보 보호 → 개인 정보 보호 → 손쉬운 사용으로 이동하십시오"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eikite į Sistemos nustatymus → Apsauga ir saugumas → Privatumas → Universalusis prieinamumas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå til Systeminnstillinger → Personvern og sikkerhet → Personvern → Tilgjengelighet"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ga naar Systeemvoorkeuren → Beveiliging en privacy → Privacy → Toegankelijkheid"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå til Systeminnstillingar → Personvern og tryggleik → Personvern → Tilgjengelegheit"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przejdź do Preferencji systemowych → Ochrona i prywatność → Prywatność → Dostępność"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vá em Preferências do Sistema → Segurança e Privacidade → Privacidade → Acessibilidade"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aceda a Preferências do Sistema → Segurança e Privacidade → Privacidade → Privacidade → Acessibilidade"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deschide System Preferences → Security & Privacy → Privacy → Accesibilitate"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перейдите в Системные настройки → Защита и безопасность → Конфиденциальность → Универсальный доступ"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prejdi do Systémové nastavenia -> Súkromie a bezpečnosť -> Súkromie -> Prístupnosť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå till Systeminställningar → Säkerhet och sekretess → Sekretess → Tillgänglighet"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sistem Tercihleri -> Güvenlik & Gizlilik > Güvenlik > Erişilebilirlik menüsüne gidin."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перейдіть до Налаштування системи → Безпека та конфіденційність → Конфіденційність → Доступність"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đi đến Cài đặt hệ thống → Quyền riêng tư & Bảo mật → Trợ năng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "前往 系统偏好设置 → 安全性与隐私 → 隐私 → 辅助功能"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "前往 系統偏好設定 → 安全性與隱私權 → 隱私權 → 輔助使用"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "前往 系統設定 → 保安與私隱 → 私隱 → 輔助使用"
}
}
}
},
"LqQ-pM-jRN.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Bottom Left Sixth\"; ObjectID = \"LqQ-pM-jRN\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أسفل اليسار السادس"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè inferior esquerre"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè inferior esquerre"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodní levá šestina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Unteres linkes Sechstel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Bottom Left Sixth"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante abajo a la izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante abajo a la izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixième bas gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperenam Kiri Bawah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesto inferiore sinistro"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左下"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아래 왼쪽 1/6"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apatinė šeštoji kairėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre venstre sjettedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linksonder zesde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre venstre sjettedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna szósta po lewej u dołu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto inferior à esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto Esquerdo Inferior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Șesimea din Stânga Jos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижняя шестая слева"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodná ľavá šestina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre vänstra sjätte"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol Alt Altıda bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижня ліва шоста частина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/6 góc dưới bên trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左下1/6"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左下1/6"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左下1/6"
}
}
}
},
"ltc-mf-BHr.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"When the menu bar icon is hidden, relaunch Rectangle from Finder to open\"; ObjectID = \"ltc-mf-BHr\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "عندما تكون أيقونة شريط القائمة مخفية ، أعد تشغيل المستطيل من Finder لفتح القائمة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quan la icona de la barra de menús estigui amagada, torneu a iniciar Rectangle des del Finder per obrir el menú."
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quan la icona de la barra de menús estigui amagada, torneu a iniciar Rectangle des del Finder per obrir el menú."
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokud je ikona skrytá v řádku nabídek, tak znovu spusťte Rectangle přes Finder"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wenn das Menüleistensymbol ausgeblendet ist, starte Rectangle im Finder neu, um die Rectangle-Einstellungen zu öffnen."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "When the menu bar icon is hidden, relaunch Rectangle from Finder to open"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cuando el icono de la barra de menús esté oculto, vuelva a iniciar Rectangle desde el Finder para abrir el menú."
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cuando el icono de la barra de menús esté oculto, vuelva a iniciar Rectangle desde el Finder para abrir el menú."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lorsque l'icône de la barre des menus est masquée, relancez Rectangle depuis le Finder pour ouvrir le menu."
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Saat ikon bilah menu disembunyikan, luncurkan kembali Rectangle dari Finder untuk membuka menu."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quando l'icona dalla barra dei menu è nascosta, rilancia Rectangle dal Finder per aprire il menu."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "メニューバーのアイコンが非表示の場合にメニューを開くには、FinderからRectangleを再起動してください。"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "메뉴 막대 아이콘이 숨겨져 있을 경우, Finder에서 Rectangle를 다시 시작하여 메뉴를 여십시오."
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jei meniu juostos piktograma yra paslėpta, paleiskite Rectangle programą iš Finder, kad atidarytumėte meniu."
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Når menyradikonet er skjult kan du starte Rectangle fra Finder for å åpne menyen."
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Als het menubalk-pictogram verborgen is, start u Rectangle opnieuw vanuit Finder om het menu te openen."
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Når menyradikonet er gøymd kan du starta Rectangle frå Finder for å opna menyen."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gdy ikona paska menu jest ukryta, ponownie uruchom Rectangle z Findera, aby otworzyć menu."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quando o ícone da barra de menus estiver oculto, reinicie o Rectangle pelo Finder para abrir o menu."
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quando o ícone da barra de menus estiver oculto, reinicie o Rectangle do Finder para abrir o menu."
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dacă iconița din bara de meniu este ascunsă, repornește Rectangle din Finder"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Если значок строки меню скрыт, перезапустите программу Rectangle из Finder, чтобы открыть меню."
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ak je ikona v lište skrytá, znovu spusti Rectangle z Findera"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "När menyradens ikon är dold, starta då Rectangle från Finder för att öppna menyn."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menü simgesi gizlendiğinde, menüyü açmak için Rectangle'ı Finder ile yeniden açın."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Коли піктограма у рядку меню прихована, перезапустіть Rectangle з Finder для відкриття"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khi biểu tượng trên thanh menu bị ẩn, khởi chạy Rectangle từ Finder để mở lại"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "当菜单栏图标被隐藏时,从访达重新开启Rectangle以打开。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "選單列圖示被隱藏時,從 Finder 重新啟動 Rectangle 來打開。"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "選單列圖像被隱藏時,從Finder重新啟動Rectangle以開啟。"
}
}
}
},
"lUu-Hs-vuk.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"400\"; ObjectID = \"lUu-Hs-vuk\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "400"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "400"
}
}
}
},
"LVM-kO-fVI.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Paste Ruler\"; ObjectID = \"LVM-kO-fVI\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "لصق المسطرة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enganxa regle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enganxa regle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lineal einfügen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pegar Regla"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pegar Regla"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Règle pour coller"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tempel Penggaris"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Incolla righello"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ルーラーをペースト"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "눈금자 붙여넣기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Įterpti liniuotę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lim inn linjal"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lineaal plakken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lim inn linjal"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wklej linijkę"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colar régua"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Régua de Colar"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вставить линейку"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Klistra in linjal"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dán thước"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "粘贴标尺"
}
}
}
},
"m2F-eA-g7w.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Bottom Right Sixth\"; ObjectID = \"m2F-eA-g7w\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "السادس الأيمن السفلي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè inferior dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè inferior dreta"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodní pravá šestina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Unteres rechtes Sechstel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Bottom Right Sixth"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante abajo a la derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante abajo a la derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixième bas droit"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperenam Kanan Bawah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesto inferiore destro"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右下"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "아래 오른쪽 1/6"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apatinė šeštoji dešinėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre høgre sjettedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtsonder zesde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre høgre sjettedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna szósta po prawej u dołu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto inferior à direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto Direito Inferior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Șesimea din Dreapta Jos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижняя шестая справа"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spodná pravá šestina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nedre högra sjätte"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sağ Alt Altıda bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Нижня права шоста частина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/6 góc dưới bên phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右下1/6"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右下1/6"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右下1/6"
}
}
}
},
"Maximize" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximiser"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximitzar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximitzar"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximalizovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximieren"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximise"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximiser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimalkan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Massimizza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "最大化"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "최대화"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimizuoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximize"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksimer"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maksymalizuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximizează"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Максимизировать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximalizovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maximera"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tamamını kapla"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Максимізувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tối đa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "最大化"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "放到最大"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "放到最大"
}
}
}
},
"MDd-Sm-sUx.title" : {
"comment" : "Class = \"NSWindow\"; title = \"About Todo Mode\"; ObjectID = \"MDd-Sm-sUx\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "حول تودو مود"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant al mode Todo"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant al mode Todo"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Todo módu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Über den To-do-Modus"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "About Todo Mode"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca del modo 'Todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca del modo 'Todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "À propos du mode Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tentang Mode Todo"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Informazioni sulla modalità In evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ToDoモードについて"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 모드 정보"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apie Todo režimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Gjøreliste-modus"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "About Todo Mode"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Gjereliste-modus"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "About Todo Mode"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sobre o Todo Mode"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "About Todo Mode"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Despre Modul Todo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "О Todo режиме"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Todo režime"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Att göra-läge"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo Modu Hakkında"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Про режим Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Giới thiệu chế độ Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "关于待办模式"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於待辦模式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於待辦模式"
}
}
}
},
"mFt-Kg-UYG.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Top Left Sixth\"; ObjectID = \"mFt-Kg-UYG\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أعلى اليسار السادس"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè superior esquerre"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè superior esquerre"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horní levá šestina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Oberes linkes Sechstel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Top Left Sixth"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante arriba a la izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante arriba a la izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixième haut gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperenam Kiri Atas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesto superiore sinistro"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左上"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "위 왼쪽 1/6"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viršutinė šeštoji kairėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre venstre sjettedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linksboven zesde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre venstre sjettedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna szósta po lewej u góry"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto superior à esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto Esquerdo Superior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Șesimea din Stânga Sus"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхняя шестая слева"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horná ľavá šestina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Övre vänstra sjätte"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol Üst Altıda bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхня ліва шоста частина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/6 góc trên bên trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左上1/6"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左上1/6"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左上1/6"
}
}
}
},
"Middle Third" : {
},
"mK6-2p-4JG.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Check Grammar With Spelling\"; ObjectID = \"mK6-2p-4JG\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحقق من القواعد مع التدقيق الإملائي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Revisa la gramàtica amb l'ortografia"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Revisa la gramàtica amb l'ortografia"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtschreib- und Grammatikprüfung"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Revisar la gramática con la ortografía"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Revisar la gramática con la ortografía"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vérifier la grammaire avec l'orthographe"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Periksa Tata Bahasa Dengan Ejaan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controlla grammatica insieme all'ortografia"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スペルと一緒に文法をチェック"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "맞춤법 및 문법 검사"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Patikrinti gramatiką naudojant rašybos tikrinimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontroller grammatikk og stavemåte"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Grammatica en spelling controleren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontroller grammatikk og stavemåte"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprawdź gramatykę"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar gramática com ortografia"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar gramática com ortografia"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Проверить грамматику с помощью правописания"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontrollera grammatik med stavning"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kiểm tra ngữ pháp với chính tả"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "检查拼写和语法"
}
}
}
},
"MkV-Pr-PK5.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Copy Ruler\"; ObjectID = \"MkV-Pr-PK5\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نسخ المسطرة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Regla de còpia"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Regla de còpia"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lineal kopieren"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar regla"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar regla"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Règle pour copier"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salin Penggaris"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copia righello"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ルーラーをコピー"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "눈금자 복사하기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nukopijuoti liniuotę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopier linjal"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lineaal kopiëren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopier linjal"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopiuj linijkę"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar régua"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Régua de Cópia"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Скопировать линейку"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopiera linjal"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sao chép Thước kẻ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "拷贝标尺"
}
}
}
},
"MKW-qf-Q2C.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"▶︎ ⋯\"; ObjectID = \"MKW-qf-Q2C\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "▶︎ ⋯"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "▶︎ ⋯"
}
}
}
},
"Move to Edge" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Déplacer vers le bord"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mou a la vora"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mou a la vora"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Přesunout ke kraji"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "An den Rand bewegen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desplazar al borde"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desplazar al borde"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Déplacer vers le bord"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Geser ke Tepi"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Muovi verso i bordi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "画面端に移動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "모서리로 이동"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Perkelti į kraštą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt til kanten"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verplaats naar de rand"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt til kanten"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przesuń do krawędzi"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para a borda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para Lado"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Переместить к краю"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Presunúť na okraj"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytta till kanten"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kenarlar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перемістити до краю"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đi đến cạnh"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "移动到边缘"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "移至邊緣"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "移到邊緣"
}
}
}
},
"mpl-sd-2Wc.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Left\"; ObjectID = \"mpl-sd-2Wc\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "غادر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Links"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Left"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kairė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Слева"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vľavo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ліворуч"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左侧"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左側"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Left"
}
}
}
},
"MzN-CJ-ASD.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Make Smaller\"; ObjectID = \"MzN-CJ-ASD\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اجعله اصغر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fer més petit"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fer més petit"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zmenšit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verkleinern"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Make Smaller"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hacer más pequeño"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hacer más pequeño"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Réduire la taille"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buat Lebih Kecil"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rimpicciolisci"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "縮小"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "작게"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sumažinti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjør mindre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maak kleiner"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjer mindre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zmniejsz"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Diminuir"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tornar mais pequeno"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Micșorează"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Уменьшить"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zmenšiť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gör mindre"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Küçült"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Зменшити"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Giảm kích thước"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "缩小"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "縮小"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "縮小"
}
}
}
},
"N2U-pY-CLq.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Keep a chosen application visible on the right side of your primary screen at all times\"; ObjectID = \"N2U-pY-CLq\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "احتفظ بالتطبيق المختار مرئيًا على الجانب الأيمن من شاشتك الأساسية في جميع الأوقات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Manté l'aplicació escollida visible al costat dret de la pantalla principal en tot moment"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Manté l'aplicació escollida visible al costat dret de la pantalla principal en tot moment"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobrazí vybranou aplikaci vždy na pravé straně vaší hlavní obrazovky"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Halte eine ausgewählte Anwendung auf der rechten Seite des Hauptbildschirms im Vordergrund."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Keep a chosen application visible on the right side of your primary screen at all times"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mantener la aplicación elegida visible en la parte derecha de la pantalla primaria en todo momento"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mantener la aplicación elegida visible en la parte derecha de la pantalla primaria en todo momento"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Garder une application visible à tout moment sur le côté droit de votre écran principal"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Biarkan aplikasi yang dipilih terlihat di sisi kanan layar utama Anda setiap saat"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tieni l'applicazione scelta sempre visibile sulla destra del tuo schermo principale"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "メインディスプレイの右側に、指定されたアプリケーションを常に表示します"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "선택한 응용 프로그램을 메인 화면 오른쪽에 항상 표시합니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Laikyti pasirinktą programą nuolat matomą dešinėje pagrindinio ekrano pusėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjør et valgt program synlig hele tida til høgre på hovedskjermen din"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep a chosen application visible on the right side of your primary screen at all times"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjer eit valt program synleg heile tida til høgre på hovudskjermen din"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep a chosen application visible on the right side of your primary screen at all times"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep a chosen application visible on the right side of your primary screen at all times"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep a chosen application visible on the right side of your primary screen at all times"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Păstrază tot timpul o aplicație la alegere în dreapta ecranului principal"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Держать выбранное приложение постоянно видимым в правой части основного экрана"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ponechá zvolenú aplikáciu vždy zobrazenú na pravej strane hlavnej obrazovky"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Behåll en vald applikation hela tiden synlig på höger sida på din primära skärm"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seçtiğiniz bir uygulamayı ana ekranınızın sağında her zaman görüntüleyin"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Залишати обраний застосунок завжди видимим на правому боці головного екрану"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Luôn giữ ứng dụng được chọn hiển thị bên phải của màn hình chính"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "使所选应用程序在主屏幕右侧始终保持可见"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "在主螢幕右側始終顯示所選擇的應用程式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "在主螢幕右側始終顯示所選擇的應用程式"
}
}
}
},
"n4U-FC-L9s.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Remove keyboard shortcut restrictions\"; ObjectID = \"n4U-FC-L9s\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "السماح لأي اختصار لوحة المفاتيح"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Permet qualsevol drecera de teclat"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Permet qualsevol drecera de teclat"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Odstranit omezení klávesových zkratek"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jeden Tastaturkurzbefehl erlauben"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Remove keyboard shortcut restrictions"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Permitir cualquier atajo de teclado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Permitir cualquier atajo de teclado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser tout raccourci clavier"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Izinkan semua pintasan papan ketik"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Consenti qualsiasi abbreviazione da tastiera"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "すべてのキーボードショートカットを許可"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "모든 키보드 단축키 허용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Leisti bet kokį klavišų derinį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tillat alle tastatursnarveger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Elke sneltoets toestaan"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tillat alle tastatursnarvegar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pozwól na użycie dowolnego skrótu klawiaturowego"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Permitir qualquer atalho de teclado"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Permitir qualquer atalho de teclado"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Șterge restricțiile scurtăturilor"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Разрешить любое сочетание клавиш"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Odstrániť obmedzenia klávesových skratiek"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tillåt alla tangentbordsgenvägar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tüm klavye kısayollarına izin ver"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Видалити обмеження комбінацій клавіш"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xóa bỏ hạn chế của phím tắt"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "移除键盘快捷键限制"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "移除鍵盤快速鍵限制"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "移除鍵盤快捷鍵限制"
}
}
}
},
"NMo-om-nkz.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Services\"; ObjectID = \"NMo-om-nkz\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "خدمات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serveis"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serveis"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Služby"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dienste"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Services"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servicios"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servicios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Services"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Layanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servizi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サービス"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "서비스"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paslaugos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tjenester"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Diensten"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tenester"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usługi"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serviços"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serviços"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servicii"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Службы"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Služby"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tjänster"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Servisler"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Сервіси"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dịch vụ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "服务"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "服務"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "服務"
}
}
}
},
"NMu-W8-Awa.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"NMu-W8-Awa\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"Nop-cj-93Q.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"\\tDefault\"; ObjectID = \"Nop-cj-93Q\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : " t الافتراضي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPer defecte"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPer defecte"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandard"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPredeterminado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPredeterminado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPar défaut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tBawaan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPredefinito"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tデフォルト"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t기본"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPagal nutylėjimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandard"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandaard"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandard"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDomyślnie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPadrão"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPadrão"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tПо умолчанию"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandard"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tMặc định"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tDefault"
}
}
}
},
"nwX-h6-fwm.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Last Three Fourths\"; ObjectID = \"nwX-h6-fwm\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الأرباع الثلاثة الأخيرة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Darrers tres quarts"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Darrers tres quarts"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Poslední tři čtvrtiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Letzte drei Viertel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Last Three Fourths"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Last Three Quarters"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultimos tres cuartos"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últimos tres cuartos"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trois quarts de droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiga Perempat Terakhir"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultimi tre quarti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "3/4にして右寄せ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "마지막 3/4"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paskutinės trys ketvirtys"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siste tre fjerdedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Siste tre fjerdedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ostatnie trzy czwarte"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Último três quartos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Últimos Três Quartos"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ultimele Trei Sferturi"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Последние три четверти"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Posledné tri štvrtiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sista tre fjärdedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Son Üç Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Останні три чверті"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "3/4 cuối"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右侧3/4"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右側3/4"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右側3/4"
}
}
}
},
"o6e-r0-MWq.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Ligatures\"; ObjectID = \"o6e-r0-MWq\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الأربطة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lligadures"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lligadures"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaduras"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaduras"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligatures"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligatur"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Legature"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "リガチャ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "합자"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligatūros"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligatury"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaduras"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaduras"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Лигатуры"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturer"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chữ ghép"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "连字"
}
}
}
},
"O8K-y6-bva.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"View Logging…\"; ObjectID = \"O8K-y6-bva\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "عرض التسجيل ..."
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Veure registre de missatges…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Veure registre de missatges…"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobrazit logování…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Protokolle anzeigen…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "View Logging…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver registro de mensajes…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver registro de mensajes…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voir le journal…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lihat Pencatatan…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vedi resoconto…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ログを表示…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "로그 보기…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Peržiūrėti žurnalą…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis loggen…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "View Logging…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis loggen…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż logowanie…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visualizar logs…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ver Registos…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vizualizează Log-uri…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Просмотр журнала…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobraziť záznamy…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa loggen…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "View Logging…"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Переглянути журнал подій…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xem nhật ký…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查看日志…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "檢視記錄⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "檢視記錄⋯"
}
}
}
},
"O9a-3Q-HB1.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Todo side\"; ObjectID = \"O9a-3Q-HB1\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "جانب تودو"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "To-do-Seite"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Todo side"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lado del 'todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lado del 'todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Côté de Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lato In evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todoアプリケーションの位置"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 위치"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo pusė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjøreliste-side"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjereliste-side"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Расположение Todo приложения"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo strana"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Бічна панель Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phía của Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "待办位置"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "待辦方向"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo side"
}
}
}
},
"OaQ-X3-Vso.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Baseline\"; ObjectID = \"OaQ-X3-Vso\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "حدود"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Línia base"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Línia base"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schriftlinie"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Línea de base"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Línea de base"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligne de base"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Garis Dasar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linea base"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ベースライン"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기준선"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pagrindinis rodiklis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Grunnlinje"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Basislijn"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Grunnline"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Poziom bazowy"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linha de base"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Base de referência"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Базовый показатель"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Baslinje"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đường cơ sở"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "基线"
}
}
}
},
"oas-Oc-fiZ.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Open Recent\"; ObjectID = \"oas-Oc-fiZ\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "فتح الأحدث"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obre recents"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obre recents"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zuletzt geöffnet"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir reciente"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir reciente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ouvrir l'élément récent"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buka Baru-baru Ini"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apri recente"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "最近使った項目を開く"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "최근 사용 열기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atidaryti paskutinius"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Åpne sist brukte"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open recent"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opne sist brukte"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Niedawno otwarte"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir recente"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir Recente"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Открыть недавнее"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Öppna senaste"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mở gần nhất…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "打开最近使用"
}
}
}
},
"oEQ-RN-TTJ.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"oEQ-RN-TTJ\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"ogc-rX-tC1.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Loosen\"; ObjectID = \"ogc-rX-tC1\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "فك"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deixar anar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deixar anar"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Weiter"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aflojar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aflojar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desserrer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Longgarkan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Allenta"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ゆるく"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "넓게"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atlaisvinti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Løsere"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Losmaken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lausare"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zluzuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afrouxar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afrouxar"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Расслабьтесь"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lossa"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nới lỏng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "松排"
}
}
}
},
"Olw-nP-bQN.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Hide Rectangle\"; ObjectID = \"Olw-nP-bQN\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إخفاء المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Amaga Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Amaga Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skrýt Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle ausblenden"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Hide Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Masquer Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sembunyikan Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nascondi Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleを非表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 가리기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slėpti Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skjul Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verberg Rectangle"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gøym Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukryj Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ascunde Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Скрыть Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skryť Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dölj Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle'ı Gizle"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Сховати Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ẩn Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "隐藏 Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "隱藏 Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "隱藏Rectangle"
}
}
}
},
"Open System Settings" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ouvrir les Réglages Système"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Systemeinstellungen öffnen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abra los ajustes del sistema"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abra los ajustes del sistema"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ouvrir les Réglages Système"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apri Impostazioni di Sistema"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "システム設定を開く"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "시스템 설정 열기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atidaryti sistemos nuostatas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Åpne Systeminnstillingene"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opne Systeminnstillingane"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir Ajustes do Sistema"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Открыть Системные настройки"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otvoriť Systémové nastavenia"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open System Settings"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Відкрити Налаштування системи"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mở Cài đặt hệ thống "
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "打开系统设置"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "開啟系統設定"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "開啟系統設定"
}
}
}
},
"oSu-n4-8Yu.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Center Two Thirds\"; ObjectID = \"oSu-n4-8Yu\";",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "الثلثان في الوسط"
}
},
"ca" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Dos terços centrals"
}
},
"cs" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Prostřední dvě třetiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zentrierte zwei Drittel"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Center Two Thirds"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre Two Thirds"
}
},
"es" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Dos tercios centrales"
}
},
"es-419" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Dos tercios al centro"
}
},
"fr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Deux tiers centraux"
}
},
"id" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Dua Pertiga Tengah"
}
},
"it" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Due terzi al centro"
}
},
"ja" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "中央の3分の2"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "가운데 2/3"
}
},
"nb" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Midtre to tredeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Middelste twee derde"
}
},
"pl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Środkowe dwie trzecie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Dois Terços Centrais"
}
},
"ro" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Două treimi pe centru"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центральные две трети"
}
},
"sk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Stredné dve tretiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Mellersta två tredjedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Ortadaki Üçte İki"
}
},
"uk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Центральні дві третини"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hai phần ba ở giữa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "中间2/3"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "中間2/3"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "中間2/3"
}
}
}
},
"Other" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Other"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Altres"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Altres"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ostatní"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mehr"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otros"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otros"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Other"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lainnya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Altro"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "そのほか"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기타"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kita"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Annet"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Other"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anna"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inne"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Outro"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Outro"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Другое"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ostatné"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Annat"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Diğer"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Інше"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khác"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "其他"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "其他"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "其他"
}
}
}
},
"OwM-mh-QMV.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Find Previous\"; ObjectID = \"OwM-mh-QMV\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "البحث عن السابق"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca anterior"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca anterior"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hledat předchozí"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Weitersuchen (rückwärts)"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Find Previous"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar anterior"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar anterior"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechercher le précédent"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Temukan Sebelumnya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trova precedente"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "前を検索"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "이전 찾기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rasti ankstesnį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn forrige"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoek vorige"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn førre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Znajdź poprzedni"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar anterior"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar Anterior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Caută în Spate"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Найти предыдущий"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nájsť predchádzajúce"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök föregående"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Öncekini Bul"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Знайти попередній"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tìm kiếm trước đó"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查找上一个"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找上一個"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找上一個"
}
}
}
},
"OY7-WF-poV.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Minimize\"; ObjectID = \"OY7-WF-poV\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تصغير"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimitzar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimitzar"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimalizovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Im Dock ablegen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Minimize"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimise"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimizar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimizar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Placer dans le Dock"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kecilkan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Contrai"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "しまう"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "최소화"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sumažinti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimaliseren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimer"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zminimalizuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimizar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimizar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimizează"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Минимизировать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimalizovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimera"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Küçült"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Згорнути"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thu nhỏ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "最小化"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "縮到最小"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "縮到最細"
}
}
}
},
"Oyz-dy-DGm.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Stop Speaking\"; ObjectID = \"Oyz-dy-DGm\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "توقف عن الكلام"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deixar de parlar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deixar de parlar"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprachausgabe stoppen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deja de hablar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deja de hablar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Arrêter Dictée"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Berhenti Bicara"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Interrompi lettura"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "読み上げを停止"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "말하기 중단"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Užtenka plepėti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stopp opplesing"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stop met praten"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stopp opplesing"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przestań mówić"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pare de falar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Parar de falar"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Хватит болтать"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sluta prata"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dừng đọ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "停止朗读"
}
}
}
},
"pa3-QI-u2k.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Delete\"; ObjectID = \"pa3-QI-u2k\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يمسح"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Suprimeix"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Suprimeix"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smazat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Löschen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Delete"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Borrar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Borrar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Supprimer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hapus"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Elimina"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "削除"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "삭제"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ištrinti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slett"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verwijderen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slett"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usuń"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Excluir"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eliminar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Șterge"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Удалить"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Odstrániť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ta bort"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sil"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Видалити"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Xóa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "删除"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "刪除"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "刪除"
}
}
}
},
"Pbz-DF-hgG.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Move cursor along with window across displays\"; ObjectID = \"Pbz-DF-hgG\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "حرك المؤشر مع النافذة عبر شاشات العرض"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mou el cursor juntament amb la finestra per les pantalles"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mou el cursor juntament amb la finestra per les pantalles"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pohybujte oknem pomocí kurzoru po displejích"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mauszeiger zusammen mit dem Fenster über Bildschirme bewegen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Move cursor along with window across displays"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover cursor junto con la ventana a través de las pantallas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover cursor junto con la ventana a través de las pantallas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Déplacer le curseur entre les moniteurs avec la fenêtre"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pindahkan kursor bersama dengan jendela di seluruh tampilan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sposta il cursore insieme alle finestre tra schermi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "別ディスプレイへのウインドウ移動時にカーソルも一緒に移動させる"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "창이 디스플레이 사이에 이동 시 커서도 함께 이동"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Perkelti žymeklį kartu su langais tarp ekranų"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt musepila sammen med vinduet over skjermer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Move cursor along with window across displays"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt musepila i lag med vindauget over skjermar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przenoś kursor razem z oknem pomiędzy ekranami"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Move cursor along with window across displays"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deslocar cursor com janela entre ecrãs"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mută cursorul deodată cu fereastra între ecrane"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перемещать курсор вместе с окном между экранами"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Presúvať kurzor spolu s oknom medzi displejmi"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytta markören tillsammans med fönstret över skärmar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fare imlecini pencere ile beraber hareket ettir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Переміщати курсор разом з вікном між екранами"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Di chuyển con trỏ cùng với cửa sổ qua nhiều màn hình"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "光标和窗口一起跨显示器移动"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "游標與視窗一起跨顯示器移動"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "游標連同視窗一起跨顯示器移動"
}
}
}
},
"Ptp-SP-VEL.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Bigger\"; ObjectID = \"Ptp-SP-VEL\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أكبر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Més gran"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Més gran"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Größer"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Más grande"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Más grande"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Plus grand"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lebih Besar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Più grande"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "大きく"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "크게"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Padidinti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Større"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Groter"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Større"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Większy"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maior"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maior"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Больше"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Större"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lớn hơn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "较大"
}
}
}
},
"pxx-59-PXV.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Save…\"; ObjectID = \"pxx-59-PXV\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يحفظ…"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desa…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Desa…"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uložit…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sichern…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Save…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Guardar…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Guardar…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sauvegarder…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Simpan…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salva…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "保存…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "저장…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Išsaugoti…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lagre…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opslaan…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lagre…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zapisz…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salvar…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Guardar…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salvează…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Сохранить…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Uložiť…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Save…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kaydet…"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Зберегти…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lưu…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "存储…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "儲存⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "儲存⋯"
}
}
}
},
"Q2j-YZ-1jU.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"Q2j-YZ-1jU\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"Q5e-8K-NDq.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Show Fonts\"; ObjectID = \"Q5e-8K-NDq\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إظهار الخطوط"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra tipus de lletra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra tipus de lletra"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schriften einblenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar tipos de letra"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar tipos de letra"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher les polices"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilkan Jenis Huruf"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra caratteri"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "フォントパネルを表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "서체 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti šriftus"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis fonter"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toon lettertypen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis fontar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż Czcionki"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Fontes"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Fontes"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показать шрифты"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa typsnitt"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị phông"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示字体"
}
}
}
},
"Q6Q-6J-okH.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"First Fourth\"; ObjectID = \"Q6Q-6J-okH\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الرابع الأول"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primer quart"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primer quart"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "První čtvrtina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Erstes Viertel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "First Fourth"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "First Quarter"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primer cuarto"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primer cuarto"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Premier quart"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperempat Pertama"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primo quarto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左から1番目"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "첫번째 1/4"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pirma ketvirtis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Første fjerdedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eerste kwart"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fyrste fjerdedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pierwsza ćwiartka"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeiro quarto"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeiro Quarto"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primul Sfert"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Первая четверть"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prvá štvrtina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Första fjärde"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İlk Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перша чверть"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/4 đầu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左首1/4"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左首1/4"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左首1/4"
}
}
}
},
"q09-fT-Sye.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Find Next\"; ObjectID = \"q09-fT-Sye\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "بحث عن التالي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca següent"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca següent"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hledat další"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Weitersuchen (vorwärts)"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Find Next"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar siguiente"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar siguiente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechercher le suivant"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Temukan Berikutnya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trova successivo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "次を検索"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "다음 찾기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ieškoti toliau"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn neste"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Volgende zoeken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn neste"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Znajdź następny"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar próximo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar Próximo"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Caută în Față"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Найти дальше"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nájsť ďalšie"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök nästa"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sonrakini Bul"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Знайти наступне"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tìm kiếm kế tiếp"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查找下一个"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找下一個"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找下一個"
}
}
}
},
"q9C-qZ-xw5.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"While in Todo Mode, you can refresh the Todo Mode layout by selecting \\\"Reflow Todo\\\" in the Rectangle menu or executing the associated keyboard shortcut.\"; ObjectID = \"q9C-qZ-xw5\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أثناء وجودك في Todo Mode ، يمكنك تحديث تخطيط Todo Mode عن طريق تحديد 'Reflow Todo ' في قائمة Rectangle أو تنفيذ اختصار لوحة المفاتيح المرتبط"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mentre esteu al mode Todo, podeu actualitzar el disseny del mode TodoO seleccionant \"Redistribuir Todo\" al menú Rectangle o executant la drecera de teclat associada."
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mentre esteu al mode Todo, podeu actualitzar el disseny del mode TodoO seleccionant \"Redistribuir Todo\" al menú Rectangle o executant la drecera de teclat associada."
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rozložení Todo módu můžete obnovit vybráním \"Zobrazit Todo\" v Rectangle menu nebo exekucí nastavené zkratky."
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Du kannst im To-do-Modus die To-do-Anwendung neu ausrichten indem du \"To-do neu ausrichten\" im Rectangle-Menü auswählst oder die zugewiesene Tastenkombination ausführst."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "While in Todo Mode, you can refresh the Todo Mode layout by selecting \"Reflow Todo\" in the Rectangle menu or executing the associated keyboard shortcut."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mientras esté en modo 'Todo', puede refrescar la disposición del modo 'Todo' seleccionando \"Reflujo en 'Todo'\" en el menú de Rectangle o usando el atajo de teclado asociado."
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mientras esté en modo 'Todo', puede refrescar la disposición del modo 'Todo' seleccionando \"Reflujo en 'Todo'\" en el menú de Rectangle o usando el atajo de teclado asociado."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lorsque vous êtes en mode Todo, vous pouvez rafraîchir la vue en sélectionnant « Rafraîchir Todo » dans le menu de Rectangle ou en utilisant le raccourci clavier associé."
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Saat dalam Mode Todo, Anda dapat menyegarkan tata letak Mode Todo dengan memilih \"Alur Ulang Todo » di menu Rectangle menu atau menjalankan pintasan keyboard terkait."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Durante la modalità In evidenza, puoi reimpostarla selezionando \"Reimposta In Evidenza\" nel menu di Rectangle o con l'abbreviazione da tastiera impostata."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ToDoモードのウインドウ配置を復元するには、ToDoモードのときに、Rectangleのメニューにある\"ToDoモードを再設定\"を選択するか、指定されたキーボードショートカットを押します。"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 모드를 사용하는 동안, Rectangle 메뉴에서 \"Todo 재배치\"를 클릭하거나 키보드 단축키를 사용해 Todo 모드 레이아웃을 새로고칠 수 있습니다."
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kai įjungtas Todo režimas, galite atnaujinti Todo režimo išdėstymą pasirinkdami „Atnaujinti Todo“ Rectangle meniu arba įvykdę susietą klaviatūros trumpinį."
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Når du er i Gjøreliste-modus kan du oppdatere Gjøreliste-oppsettet ved å velge \"Flytt om på Gjøreliste\" i Rectangle-menyen eller ved å benytte definerte tastatursnarveger."
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "While in Todo Mode, you can refresh the Todo Mode layout by selecting \"Reflow Todo\" in the Rectangle menu or executing the associated keyboard shortcut."
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Når du er i Gjereliste-modus kan du oppdatera Gjereliste-oppsettet ved å velja \"Flytt om på Gjereliste\" i Rectangle-menyen eller ved å nytta definerte tastatursnarvegar."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "While in Todo Mode, you can refresh the Todo Mode layout by selecting \"Reflow Todo\" in the Rectangle menu or executing the associated keyboard shortcut."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "While in Todo Mode, you can refresh the Todo Mode layout by selecting \"Reflow Todo\" in the Rectangle menu or executing the associated keyboard shortcut."
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "While in Todo Mode, you can refresh the Todo Mode layout by selecting \"Reflow Todo\" in the Rectangle menu or executing the associated keyboard shortcut."
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Din Modul Todo, poți reactualiza aspectul Modului Todo selectând \"Reflow Todo\" în meniul Rectangle sau folosind scurtătura asociată acestuia."
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "При включенном Todo режиме вы можете обновить положение окна Todo приложения выбрав \"Обновить положение Todo окна\" в меню Rectangle или при помощи соответствующей горячей клавиши."
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "V Todo režime môžeš obnoviť rozloženie Todo režimu vyberom \"Preusporiadať Todo\" v Rectangle menu alebo pomocou príslušnej skratky."
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "När du är i Att göra-läget kan du uppdatera Att göra-layouten genom att välja \"Ordna om Att göra\" i Rectangle-menyn eller genom att använda tilldelat tangentbordsgenväg."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo Modu aktifken Rectangle menüsündeki \"Todo'yu Yeniden Ayarla\" seçeneği ile veya tanımladığınız klavye kısayolu ile ekran düzenini tazeleyebilirsiniz."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Під час роботи в режимі Завдань ви можете оновити макет режиму Завдань, вибравши «Переформатувати вікна Завдань» у меню Rectangle або виконавши пов’язану комбінацію клавіш."
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khi ở chế độ Todo, bạn có thể làm mới bố cục của chế độ Todo bằng cách chọn \"Làm mới Todo\" trong menu của Rectangle hoặc ấn phím tắt tương ứng."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "在“待办模式”下,若要刷新待办模式布局,您可以从 Rectangle 菜单中选择“重新排列待办”,或使用对应的键盘快捷键。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "在待辦模式下,若要重新整理待辦模式佈局,您可以從 Rectangle 選單中選擇「重新排列待辦」,或使用相應的鍵盤快速鍵"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "在待辦模式下,若要重新整理待辦模式佈局,你可以從Rectangle選單中選擇「重新排列待辦」,或使用相應的鍵盤快捷鍵"
}
}
}
},
"qBm-QP-s63.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"qBm-QP-s63\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"qIS-W8-SiK.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Page Setup…\"; ObjectID = \"qIS-W8-SiK\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اعداد الصفحة…"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configura pàgina…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configura pàgina…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Papierformat…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configurar página…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configurar página…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mise en page…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pengaturan Halaman…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Impostazione pagina…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ページ設定…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "페이지 설정…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Puslapio nustatymai…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sideinnstillinger…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pagina instellingen…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sideinnstillingar…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ustawienia strony…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configuração da Página…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Configuração da página…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Настройки страницы…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sidinställningar…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thiết lập trang…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "页面设置..."
}
}
}
},
"qlg-kC-FMr.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Hide menu bar icon\"; ObjectID = \"qlg-kC-FMr\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إخفاء رمز شريط القائمة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Amaga la icona de la barra de menús"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Amaga la icona de la barra de menús"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skrýt ikonu z řádku nabídek"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Symbol in der Menüleiste ausblenden"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Hide menu bar icon"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar el icono de la barra de menús"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar el icono de la barra de menús"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Masquer l'icône dans la barre des menus"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sembunyikan ikon bilah menu"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nascondi l'icona dalla barra dei menu"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "メニューバーにアイコンを表示しない"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "메뉴 막대 아이콘 숨김"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slėpti piktogramą iš meniu juostos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skjul menyradikonet"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verberg het menubalk-pictogram"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gøym menyradikonet"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukryj ikonę paska menu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar ícone da barra de menu"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar ícone da barra de menu"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ascunde iconița din bara de meniu"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Скрыть значок из строки меню"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skryť ikonu v lište"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dölj menyradens ikon"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menü simgesini gizle"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Приховати піктограму у рядку меню"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ẩn biểu tượng trên thanh menu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "隐藏菜单栏图标"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "隱藏選單列圖示"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "隱藏選單列圖像"
}
}
}
},
"QwF-QN-YH7.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Previous Display\"; ObjectID = \"QwF-QN-YH7\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "العرض السابق"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pantalla anterior"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pantalla anterior"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Předchozí displej"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vorheriger Bildschirm"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Previous Display"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pantalla anterior"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pantalla anterior"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moniteur précédent"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilan Sebelumnya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Schermo precedente"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "前のディスプレイ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "이전 디스플레이"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ankstesnis ekranas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Forrige skjerm"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vorige scherm"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Førre skjerm"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Poprzedni ekran"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tela anterior"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ecrã anterior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ecran Anterior"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Предыдущий экран"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Predchádzajúci displej"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Föregående skärm"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Önceki Ekran"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Попередній екран"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Màn hìn trước đó"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "上一个显示器"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "上一個顯示器"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "上一個顯示器"
}
}
}
},
"qze-7p-m1X.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"1. Bring your chosen todo application frontmost\"; ObjectID = \"qze-7p-m1X\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. اجلب تطبيق المهام الذي اخترته في المقدمة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Porta l'aplicació Todo que has triat al davant"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Porta l'aplicació Todo que has triat al davant"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Přiveďte vaší vybranou todo aplikaci do popředí"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Bringe die gewünschte To-do-Anwendung in den Vordergrund."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "1. Bring your chosen todo application frontmost"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Traer la aplicación 'Todo' elegida encima de todo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Traer la aplicación 'Todo' elegida encima de todo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Mettre votre application todo au premier plan"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Bawa aplikasi todo pilihan Anda paling depan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Seleziona la finestra dell'applicazione scelta"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. ToDoアプリに指定したいアプリを最前面に表示します"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Todo 응용 프로그램을 맨 앞에 둡니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Pirmame plane padėkite pasirinktą Todo programą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Legg det valgte Gjøreliste-programmet lengst fram"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Bring your chosen todo application frontmost"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Legg det valde Gjereliste-programmet lengst fram"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Bring your chosen todo application frontmost"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Trazer seu aplicativo todo escolhido para frente"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Bring your chosen todo application frontmost"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Aduceți aplicația aleasă cel mai în față"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Разместите выбранное в качестве Todo приложение на переднем плане"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Presuň zvolenú Todo aplikáciu do popredia"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Placera din valda Att göra-applikation längst fram"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Seçtiğiniz Todo uygulamasını en öne alın"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Перемістіть обране завдання у передній план"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1. Hiển thị ứng dụng todo được chọn lên trên cùng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒈前置您选择的待办应用"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒈ 將您選擇的待辦應用程式移至最前"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒈將你選擇的待辦應用移到最前"
}
}
}
},
"r2Y-cY-tgn.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Haptic feedback\"; ObjectID = \"r2Y-cY-tgn\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Haptisches Feedback"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Haptic feedback"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "触覚フィードバック"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "햅틱 피드백"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Тактильный отклик"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Haptická odozva"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phản hồi xúc giác"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "触感反馈"
}
}
}
},
"R4o-n2-Eq4.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Zoom\"; ObjectID = \"R4o-n2-Eq4\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تكبير"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoomen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Réduire/agrandir"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Perbesar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ズーム"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "확대/축소"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Priartinti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Увеличить"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoom"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phóng"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "缩放"
}
}
}
},
"r4Q-q9-FLt.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"r4Q-q9-FLt\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"RB4-Sm-HuC.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"\\tRight to Left\"; ObjectID = \"RB4-Sm-HuC\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : " t من اليمين إلى اليسار"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDreta a esquerra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDreta a esquerra"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVon rechts nach links"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDerecha a izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDerecha a izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDe droite à gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tKanan ke Kiri"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa destra a sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t右から左"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t오른쪽에서 왼쪽"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tIš dešinės į kairę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tHøgre til venstre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tVan rechts naar links"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tHøgre til venstre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tOd prawej do lewej"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa direita para a esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDa direita para a esquerda"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tСправа налево"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tHöger till vänster"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tPhải sang trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tRight to Left"
}
}
}
},
"rbD-Rh-wIN.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Check Spelling While Typing\"; ObjectID = \"rbD-Rh-wIN\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تدقيق إملائي أثناء الكتابة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comproveu l'ortografia mentre escriviu"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comproveu l'ortografia mentre escriviu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Während der Texteingabe prüfen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Revisar la ortografía mientras escribe"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Revisar la ortografía mientras escribe"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vérifier l'orthographe pendant la frappe"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Periksa Ejaan saat Mengetik"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controlla ortografia durante la digitazione"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "入力中にスペルチェック"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "입력하는 동안 맞춤법 검사"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rašybos tikrinimas rašant tekstą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontroller stavemåte mens du skriver"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controleer de spelling tijdens het typen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontroller stavemåte mens du skriv"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprawdź pisownię podczas pisania"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar ortografia durante a digitação"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar ortografia enquanto escreve"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Проверка орфографии при наборе текста"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontrollera stavningen medan du skriver"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kiểm tra chính tả khi gõ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "键入时检查拼写"
}
}
}
},
"Reflow Todo" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Repositionner Todo"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redistribueix Todo"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redistribueix Todo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "To-do neu ausrichten"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflujo en 'Todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflujo en 'Todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Repositionner Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alur Ulang Todo"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reimposta In evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ToDoモードを再設定"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 재배치"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atnaujinti Todo lango padėtį"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt om på Gjøreliste"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt om på Gjereliste"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reflow Todo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Обновить положение Todo окна"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Preusporiadať Todo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ordna om Att göra"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Переформатувати вікна Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Làm mới Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "重新排列待办"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "重新排列待辦"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "重新排列待辦"
}
}
}
},
"rgM-f4-ycn.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Smart Dashes\"; ObjectID = \"rgM-f4-ycn\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "شرطات ذكية"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Guions intel·ligents"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Guions intel·ligents"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Intelligente Bindestriche"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Raya inteligente"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Raya inteligente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tirets intelligents"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tanda Hubung Pintar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trattini intelligenti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スマートダッシュ記号"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스마트 대시"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Protingi brūkšniai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarte bindestreker"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slimme streepjes"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarte bindestrekar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inteligentne myślniki"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Traços Inteligentes"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Traços Inteligentes"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Умные тире"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Smarta bindestreck"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dấu gạch ngang thông minh"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "智能破折号"
}
}
}
},
"RgZ-Jw-XQZ.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Import\"; ObjectID = \"RgZ-Jw-XQZ\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يستورد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importa"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importa"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Import"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Impor"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importa"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "インポート"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "가져오기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importuoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importer"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importă"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Импорт"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Importera"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İçe Aktar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Імпортувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nhập"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "导入"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "輸入"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "輸入"
}
}
}
},
"Right half, top/bottom half near corners" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié droite, moitié du haut/bas près des coins"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right half, top/bottom half near corners"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right half, top/bottom half near corners"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pravá polovina, horní/spodní polovina blízko rohů"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechte Hälfte, Obere/Untere Hälfte in der Nähe der Ecken"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad derecha, mitad superior/inferior cerca de las esquinas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad derecha, mitad superior/inferior cerca de las esquinas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié droite, moitié du haut/bas près des coins"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right half, top/bottom half near corners"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà destra, metà superiore/inferiore vicino gli angoli"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右半分、画面端付近の上半分・下半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "반, 위/아래 반에 근접한 모서리"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dešinė pusė, viršutinė/apačioje pusė šalia kampų"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Høgre halvdel, øverste/nederste halvdel nære hjørne"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right half, top/bottom half near corners"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Høgre halvdel, øvste/nedste halvdel nære hjørne"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right half, top/bottom half near corners"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade direita, metade cima/baixo próximo das bordas"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right half, top/bottom half near corners"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right half, top/bottom half near corners"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Правая половина, верхняя/нижняя половина возле углов"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pravá polovica, horná/spodná polovica blízko rohov"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Right half, top/bottom half near corners"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sağ yarım (köşelere yaklaşıldığında ise üst/alt yarım)"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Права половина, верхня/нижня половина близько кутів"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nửa phải, nửa trên/dưới nếu ngay góc"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右半屏,靠近角落则上/下半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右半,靠近角落則上半/下半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右半,靠近角落則上半/下半"
}
}
}
},
"rmV-YD-Hzj.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Check for updates automatically\"; ObjectID = \"rmV-YD-Hzj\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحقق من وجود تحديثات تلقائيا"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comproveu si hi ha actualitzacions automàticament"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comproveu si hi ha actualitzacions automàticament"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automaticky kontrolovat aktualizace"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automatisch nach Updates suchen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Check for updates automatically"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar actualizaciones automáticamente"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar actualizaciones automáticamente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechercher automatiquement les mises à jour"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Periksa untuk Pembaruan Otomatis"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controlla automaticamente gli aggiornamenti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アップデートを自動的に確認"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "자동으로 업데이트 확인"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automatiškai tikrinti atnaujinimus"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se etter oppdateringer automatisk"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automatisch controleren op updates"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sjå etter oppdateringar automatisk"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprawdzaj aktualizacje automatycznie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Procurar atualizações automaticamente"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verifique se há atualizações automaticamente"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verifică actualizările automat"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Проверять обновления автоматически"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Automaticky kontrolovať aktualizácie"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök efter uppdateringar automatiskt"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Güncellemeleri otomatik kontrol et"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перевіряти оновлення автоматично"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tự động kiểm tra các bản cập nhật"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自动检查更新"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "自動檢查更新項目"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "自動檢查更新項目"
}
}
}
},
"Rqc-34-cIF.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Superscript\"; ObjectID = \"Rqc-34-cIF\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مرتفع"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superíndex"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superíndex"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hochgestellt"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superíndice"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superíndice"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exposant"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superskrip"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apice"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "上付き"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "위 첨자"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superscenario"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Heva skrift"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superscript"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Heva skrift"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superscript"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superscript"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Superescrito"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Суперсценарий"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upphöjd"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chữ số trên"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "上标"
}
}
}
},
"Ruw-6m-B2m.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Select All\"; ObjectID = \"Ruw-6m-B2m\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "اختر الكل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selecciona-ho tot"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selecciona-ho tot"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vybrat vše"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alles auswählen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Select All"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seleccionar todo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seleccionar todo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tout sélectionner"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pilih Semua"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seleziona tutto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "すべて選択"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "모두 선택"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pasirinkite viską"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Marker alt"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selecteer alles"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Marker alt"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wybierz wszystko"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selecionar tudo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selecionar Todos"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Selectează Tot"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выберите всё"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vybrať všetko"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Markera allt"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Select All"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Виділити все"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chọn tất cả"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "全选"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "全選"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "全選"
}
}
}
},
"rzr-Qq-702.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Move Right\"; ObjectID = \"rzr-Qq-702\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحرك يمينا"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moure a la dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moure a la dreta"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Přesunout vpravo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nach rechts bewegen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Move Right"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover a la derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover a la derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Déplacer à droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Geser ke Kanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sposta a destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右に移動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "오른쪽으로 이동"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Į dešinę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt til høgre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naar rechts"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt til høgre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przesuń w prawo"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para a direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para a direita"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mută în Dreapta"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Направо"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Presunúť vpravo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytta höger"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sağ Kenar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перемістити праворуч"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Qua phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "向右移动"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右移"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右移"
}
}
}
},
"S0p-oC-mLd.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Jump to Selection\"; ObjectID = \"S0p-oC-mLd\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "انتقل إلى التحديد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salta a la selecció"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salta a la selecció"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zobrazit výběr"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zur Auswahl springen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Jump to Selection"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ir a la selección"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ir a la selección"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aller à la sélection"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lompat ke Terpilih"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vai alla selezione"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "選択部分へジャンプ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "선택 부분으로 이동"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pereiti prie pasirinkto"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå til markering"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ga naar selectie"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå til markering"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przejdź do wyboru"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ir para a seleção"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ir para a seleção"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sari la Selecție"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перейти к выбранному"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prejsť na výber"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hoppa till markerad"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jump to Selection"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перейти до вибору"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nhảy đến lựa chọn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "跳到所选内容"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "跳至所選範圍"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "跳去所選範圍"
}
}
}
},
"Show Eighths in menu" : {
},
"Sixths" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixièmes"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisenes"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisenes"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Šestiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sechstel"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextos"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextos"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixièmes"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperenam"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terzi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "6分割"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "6등분"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Šeštosios"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sjettedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zesden"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sjettedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedne szóste"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Шестые"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Šestiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sjättedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Altıda bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Шості"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phần sáu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "六等分"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "六等分"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "六等分"
}
}
}
},
"Size" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Taille"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mida"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mida"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Velikost"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Größe"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tamaño"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tamaño"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Taille"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukuran"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dimensione"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サイズ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "크기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dydis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Størrelse"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Size"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Storleik"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rozmiar"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tamanho"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tamanho"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Размер"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Veľkosť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Storlek"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Boyut"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Розмір"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kích cỡ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "大小"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "大小"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "大小"
}
}
}
},
"Smaller Width" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Smaller Width"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Уменьшить ширину"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chiều rộng nhỏ hơn"
}
}
}
},
"snW-S8-Cw5.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Show Toolbar\"; ObjectID = \"snW-S8-Cw5\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إظهار شريط الأدوات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra la barra d'eines"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra la barra d'eines"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Symbolleiste einblenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar barra de herramientas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar barra de herramientas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher la barre d'outils"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilkan Bilah Alat"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra la barra strumenti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ツールバーを表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "도구 막대 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti įrankių juostą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis verktøyrada"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Werkbalk weergeven"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis verktøyrada"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż pasek narzędzi"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar barra de ferramentas"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar barra de ferramentas"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показать панель инструментов"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa verktygsfältet"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị thanh công cụ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示工具栏"
}
}
}
},
"STb-JK-oB1.title" : {
"comment" : "Class = \"NSWindow\"; title = \"Rectangle Settings\"; ObjectID = \"STb-JK-oB1\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "تفضيلات المستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferències de Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferències de Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle předvolby"
}
},
"de" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle-Einstellungen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Rectangle Settings"
}
},
"es" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferencias de Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferencias de Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Préférences Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferensi Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferenze Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle環境設定"
}
},
"ko" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle 환경설정"
}
},
"lt" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle nustatymai"
}
},
"nb" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle-innstillinger"
}
},
"nl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Voorkeuren Rectangle"
}
},
"nn" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle-innstillingar"
}
},
"pl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferencje Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferências do Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferências do Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferințe Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Настройки Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle predvoľby"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle-inställningar"
}
},
"tr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle Tercihleri"
}
},
"uk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Налаштування Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cài đặt của Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle 偏好设置"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle 偏好設定"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Rectangle偏好設定"
}
}
}
},
"SXx-HZ-GkB.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Cycle across displays on repeated left or right commands\"; ObjectID = \"SXx-HZ-GkB\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "التنقل عبر شاشات العرض بأوامر متكررة يسارًا أو يمينًا"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Passeu per les pantalles amb ordres repetides a l'esquerra o a la dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Passeu per les pantalles amb ordres repetides a l'esquerra o a la dreta"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Monitorwechsel bei wiederholten Links/Rechts-Befehlen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bucle a través de pantallas en ejecuciones repetidas de comandos de movimiento a la izquierda o a la derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bucle a través de pantallas en ejecuciones repetidas de comandos de movimiento a la izquierda o a la derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Déplacer sur les moniteurs lors de commandes gauche ou droite répétées"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Berputar melintasi tampilan pada perintah kiri atau kanan yang berulang"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spostati tra gli schermi con comandi ripetuti a sinistra o destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半分/左半分にサイズ変更するコマンドを繰り返したら、ウインドウを表示するディスプレイを変更"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽 및 오른쪽 명령을 반복하여 디스플레이 순환"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Perkelti langus tarp ekranų, kai lygiuojama iš eilės į kairę arba į dešinę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå gjennom skjermene ved å gjenta venstre- eller høgrekommandoer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ga schermen langs bij opeenvolgende uitvoeringen van links of rechts"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gå gjennom skjermane ved å gjenta venstre- eller høgrekommandoar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przechodź między ekranami przy powtarzających się komendach lewo/prawo"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Navegue entre telas repetindo os comandos para a direita ou esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alternar entre ecrãs ao repetir comandos para a esquerda ou para a direita"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перемещать окна между экранами при последовательном выравнивании влево или вправо"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bläddra mellan skärmarna med upprepade vänster- eller högerkommandon"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chuyển đổi qua lại giữa các màn hình hiển thị theo lệnh lặp lại bên trái hoặc bên phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "通过重复向左或向右命令在显示器循环显示"
}
}
}
},
"t7n-mU-75I.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Enable Rectangle.app\"; ObjectID = \"t7n-mU-75I\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحقق من Rectangle.app"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comprova Rectangle.app"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comprova Rectangle.app"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zkontrolovat Rectangle.app"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle.app prüfen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Enable Rectangle.app"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Compruebe Rectangle.app"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Compruebe Rectangle.app"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vérifier Rectangle.app"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Periksa Rectangle.app"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controlla Rectangle.app"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle.appを確認してください"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle.app 확인하기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Patikrinkite failą Rectangle.app."
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sjekk Rectangle.app"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Controleer Rectangle.app"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sjekk Rectangle.app"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprawdź Rectangle.app."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar Rectangle.app"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verificar Rectangle.app"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verifică Rectangle.app"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Проверьте файл Rectangle.app."
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skontrolovať Rectangle.app"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kontrollera Rectangle.app"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle.app'ı işaretleyerek izin verin"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Увімкнути Rectangle.app"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bật Rectangle.app"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "启用 Rectangle.app"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "啟用 Rectangle.app"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "啟用Rectangle.app"
}
}
}
},
"T9Z-QF-gwc.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"First Three Fourths\"; ObjectID = \"T9Z-QF-gwc\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "أول ثلاثة أرباع"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primers tres quarts"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primers tres quarts"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "První tři čtvrtiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Erste drei Viertel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "First Three Fourths"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "First Three Quarters"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeros tres cuartos"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeros tres cuartos"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trois quarts de gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiga Perempat Pertama"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primi tre quarti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "3/4にして左寄せ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "처음 3/4"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pirmosios trys ketvirtys"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Første tre fjerdedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : ""
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fyrste tre fjerdedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pierwsze trzy czwarte"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeiro três quartos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primeiros Três Quartos"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primele Trei Sferturi"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Первые три четверти"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prvé tri štvrtiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Första tre fjärdedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "İlk Üç Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перші три чверті"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "3/4 đầu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左侧3/4"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左側3/4"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左側3/4"
}
}
}
},
"Td7-aD-5lo.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Window\"; ObjectID = \"Td7-aD-5lo\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نافذة او شباك"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finestra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finestra"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Okno"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fenster"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Window"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ventana"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ventana"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fenêtre"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jendela"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finestra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ウインドウ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "창"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Langas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vindu"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venster"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vindauge"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Okno"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Janela"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Janela"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fereastră"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Окно"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Okno"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fönster"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pencere"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вікно"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cửa sổ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "窗口"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "視窗"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "視窗"
}
}
}
},
"Thirds" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terços"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terços"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Třetiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Drittel"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercios"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sepertiga"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terzi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "3分割"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "3등분"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trečdaliai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedne trzecie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terços"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terços"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Трети"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tretiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Üçte bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Третини"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "三等分"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "三等分"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "三等分"
}
}
}
},
"Thirds, drag toward center for two thirds" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers, glisser vers le centre pour deux tiers"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Třetiny, táhnout směrem ke středu pro dvě třetiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Drittel, zur Mitte ziehen für zwei Drittel"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercios, arrastrar hacia el centro para dos tercios"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercios, arrastrar hacia el centro para dos tercios"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers, glisser vers le centre pour deux tiers"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terzi, trascina verso il centro per i due terzi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "3分割、中心にドラッグで2/3"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3, 가운데로 드래그하면 2/3"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trečdalys, perkelkite į centrą du trečdalius"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedeler, dra mot midten for to tredjedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedelar, dra mot midten for to tredjedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Трети, перетащите к центру на две трети"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tretiny, ťahaj smerom do stredu pre dve tretiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, drag toward center for two thirds"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Üçte bir (üçte iki için ortaya doğru sürükleyin)"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Третини, перетягніть у центр для двох третин"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3, kéo đến giữa thành 2/3"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "⅓,向中间拖移则⅔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "⅓,向中央拖移則⅔"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "⅓,向中央拖移則⅔"
}
}
}
},
"Thirds, top/bottom half near corners" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers, moitié du haut/bas près des coins"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Třetiny, horní/spodní polovina blízko rohů"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Drittel, Obere/Untere Hälfte in der Nähe der Ecken"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercios, mitad superior/inferior cerca de las esquinas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercios, mitad superior/inferior cerca de las esquinas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiers, moitié du haut/bas près des coins"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terzi, metà superiore/inferiore vicino gli angoli"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "3分割、画面端付近の上半分・下半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3, 위/아래 반에 근접한 모서리"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trečdalys, viršutinė/apačioje pusė šalia kampų"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedeler, øverste/nederste halvdel nære hjørne"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredjedelar, øvste/nedste halvdel nære hjørne"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Трети, верхняя/нижняя половина возле углов"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tretiny, horná/spodná polovica blízko rohov"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thirds, top/bottom half near corners"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Üçte bir (köşelere yaklaşıldığında ise üst/alt)"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Третини, верхня/нижня половина близько кутів"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/3, nửa trên/dưới nếu ngay góc"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "⅓,靠近角落则上/下半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "⅓,靠近角落則上半/下半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "⅓;靠近角落則上半/下半"
}
}
}
},
"Tiling in macOS has been disabled" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Das Ziehen von Fenstern an den Bildschirmrand zum Anordnen wurde in den macOS Systemeinstellungen deaktiviert"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS のタイル表示機能が無効になりました"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS의 타일 정리 기능이 비활성화됨"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Umiestnenie dlaždíc v macOS bolo vypnuté"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tính năng xếp gạch trong macOS đã bị vô hiệu hóa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS 中的窗口平铺功能已被禁用"
}
}
}
},
"Tiling in Rectangle has been disabled" : {
"extractionState" : "manual",
"localizations" : {
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle의 타일 정리 기능이 비활성화됨"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Việc xếp gạch trong hình chữ nhật đã bị vô hiệu hóa"
}
}
}
},
"tlD-Oa-oAM.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Kern\"; ObjectID = \"tlD-Oa-oAM\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "كيرن"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zeichenabstand"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "カーニング"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "자간"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kernas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Knip"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Knip"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kern"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Керн"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kerning"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Điều chỉnh khoảng cách giữa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "字句调整"
}
}
}
},
"To adjust macOS tiling, go to System Settings → Desktop & Dock → Windows" : {
"extractionState" : "manual",
"localizations" : {
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS 타일 정리 기능을 조정하려면, 시스템 설정 → 데스크탑 및 Dock → 윈도우로 이동하세요"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Để điều chỉnh ô xếp macOS, hãy vào Cài đặt hệ thống → Màn hình nền & Dock → Windows"
}
}
}
},
"To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting." : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pour permettre à Rectangle de gérer la fonctionnalité de double-clic sur la barre de titre d'une fenêtre, vous devez désactiver le paramètre macOS correspondant."
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Damit Rectangle die Doppelklickfunktion der Titelleiste verwalten kann, muss die entsprechende macOS Systemeinstellung deaktiviert werden."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Para permitir que Rectangle administre la funcionalidad de doble click en la barra de título, debes deshabilitar los ajustes correspondientes de macOS."
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Para permitir que Rectangle administre la funcionalidad de doble click en la barra de título, debes deshabilitar los ajustes correspondientes de macOS."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pour permettre à Rectangle de gérer la fonctionnalité de double-clic sur la barre de titre d'une fenêtre, vous devez désactiver le paramètre macOS correspondant."
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Per permettere a Rectangle di gestire la funzione di doppio clic sulla barra del titolo, devi disabilitare l'impostazione di macOS corrispondente."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleがタイトルバーのダブルクリック機能を管理するには、該当するmacOSの設定を無効にする必要があります。"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle이 제목 막대 두 번 클릭 기능을 제어하려면, 해당하는 macOS 설정을 꺼야 합니다."
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Norėdami leisti „Rectangle“ valdyti antraštės juostos dvigubą spustelėjimą, turite išjungti atitinkamą „macOS“ nustatymą."
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "For å la Rectangle styre dobbeltklikking i vindustittelen må du slå av den tilsvarende innstillinga i macOS."
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "For å la Rectangle styra dobbeltklikking i vindaugstittelen må du slå av den tilsvarande innstillinga i macOS."
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Чтобы позволить Rectangle управлять функцией двойного щелчка в заголовке, необходимо отключить соответствующую настройку macOS."
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aby Rectangle mohol spravovať funkciu dvojitého kliknutia v lište s názvom, musíš vypnúť príslušné nastavenie v macOS."
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Để cho phép Rectangle quản lý chức năng nhấp đúp vào thanh tiêu đề, bạn cần phải tắt cài đặt macOS tương ứng."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "你需要禁用 macOS 中对应的设置以使用 Rectangle 管理连按窗口标题功能。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "若要讓 Rectangle 管理標題列連點功能,您需要停用對應的 macOS 設定。"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "To let Rectangle manage the title bar double click functionality, you need to disable the corresponding macOS setting."
}
}
}
},
"To re-enable it, go to System Settings → Desktop & Dock → Windows" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Um dies wieder zu aktivieren, gehe zu Systemeinstellungen → Schreibtisch & Dock → Fenster"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "再度有効化するには、システム設定 → デスクトップと Dock → ウインドウに移動します"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "다시 켜려면, 시스템 설정 → 데스크탑 및 Dock → 윈도우로 이동합니다"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pre opätovné povolenie, prejdi do Systémové nastavenia → Plocha a Dock → Okná"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Để bật lại, hãy vào Cài đặt hệ thống → Màn hình nền & Dock → Windows"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "要重新启用它,请转到系统设置→ 桌面与程序坞 → 窗口"
}
}
}
},
"Top Center Left Eighth" : {
},
"Top Center Right Eighth" : {
},
"Top eighths from corners; maximize" : {
},
"Top Left Eighth" : {
},
"Top Right Eighth" : {
},
"Top screen edge tiling in macOS is now disabled" : {
"extractionState" : "manual",
"localizations" : {
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "macOS의 화면 상단 가장자리 타일 정렬이 꺼졌습니다"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tính năng ghép cạnh màn hình trên cùng trong macOS hiện đã bị vô hiệu hóa"
}
}
}
},
"Top sixths from corners; maximize" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixièmes haut à partir les coins ; maximiser"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horní šestiny z rohů; maximalizovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obere Sechstel beim Ziehen aus den Ecken; maximieren"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextos superiores de las esquinas; maximizar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextos superiores de las esquinas; maximizar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixièmes haut à partir les coins ; maximiser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesti superiori dagli angoli; massimizza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : " 最大化(画面端にドラッグで上側6分割)"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "위쪽 1/6, 모서리에서 최대화"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viršutinės šeštosios nuo kampų; maksimizuoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øverste sjettedel fra hjørne; maksimer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvste sjettedel frå hjørne; maksimer"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхние шестые от углов; максимизировать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horné šestiny z rohov; maximalizovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top sixths from corners; maximize"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tamamını kapla (köşelere yaklaşıldığında ise altıda birini kapla)"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхні шості від кутів; максимізувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/6 phía trên ngay góc; phóng to tối đa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "自角落则顶部⅙;最大化"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "自角落則頂部⅙;放到最大"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "自角落則頂部⅙;放到最大"
}
}
}
},
"Top Third" : {
},
"Top Two Thirds" : {
},
"Top/bottom halves" : {
"extractionState" : "manual",
"localizations" : {
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Górna/Dolna połowa"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nửa trên/dưới"
}
}
}
},
"tRr-pd-1PS.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Data Detectors\"; ObjectID = \"tRr-pd-1PS\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "كاشفات البيانات"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Detectors de dades"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Detectors de dades"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Datenerkennung"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Detectores de datos"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Detectores de datos"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Détecteurs de données"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pendeteksi Data"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rilevatori di dati"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "データ検出"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "데이터 탐지기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Duomenų detektoriai"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Datadetektorer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gegevensdetectoren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Datadetektorar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Detektory danych"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Detectores de dados"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Detectores de dados"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Детекторы данных"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Datadetektorer"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nhận diện dữ liệu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "数据检测器"
}
}
}
},
"Tt8-3X-UpT.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"Tt8-3X-UpT\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"TTx-7X-Wie.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Top Center Sixth\"; ObjectID = \"TTx-7X-Wie\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "المركز السادس الأعلى"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè superior centre"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sisè superior centre"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horní prostřední šestina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Oberes mittleres Sechstel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Top Center Sixth"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Top Centre Sixth"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante arriba centrado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sextante arriba centrado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sixième haut centre"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Seperenam Tengah Atas"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sesto superiore centrale"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "中央上"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "위 가운데 1/6"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viršutinė šeštoji centre"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre midtre sjettedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midden boven zesde"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Øvre midtre sjettedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jedna szósta na środku u góry"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto superior central"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sexto Central Superior"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Șesimea din Centru Sus"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхняя шестая по центру"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Horná prostredná šestina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Övre mitten sjätte"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Üst Orta Altıda bir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Верхня центральна шоста частина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/6 ở giữa bên trên"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "中上1/6"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "中上1/6"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "中上1/6"
}
}
}
},
"tXI-mr-wws.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Open Recent\"; ObjectID = \"tXI-mr-wws\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "فتح الأحدث"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obrir recent"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obrir recent"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Benutzte Dokumente"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir reciente"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir reciente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ouvrir l'élément récent"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buka Baru-baru Ini"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apri recente"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "最近使った項目を開く"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "최근 사용 열기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atidaryti paskutinius"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Åpne sist brukte"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Open recent"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opne sist brukte"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Niedawno otwarte"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir recente"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Abrir Recente"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Открыть недавнее"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Öppna senaste"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mở gần nhất"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "打开最近使用"
}
}
}
},
"UEZ-Bs-lqG.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Capitalize\"; ObjectID = \"UEZ-Bs-lqG\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تكبير"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primera lletra en majúscula"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Primera lletra en majúscula"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Großschreiben"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Capitalizar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Capitalizar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Capitaliser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gunakan Huruf Besar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maiuscolo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "語頭を大文字にする"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "대문자로 만들기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Didžiosiomis raidėmis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stor førstebokstav"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hoofdletters"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stor fyrstebokstav"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kapitalizuj"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Capitalizar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maiúsculas"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "В верхнем регистре"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kapitalisera"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "In hoa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "首字母大写"
}
}
}
},
"uLF-Uf-tBt.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Restore Default Shortcuts & Snap Areas\"; ObjectID = \"uLF-Uf-tBt\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استعادة الاختصارات الافتراضية ومناطق الانطباق"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaura les dreceres predeterminades"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaura les dreceres predeterminades"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obnovit výchozí zkratky"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standard-Tastaturkurzbefehle wiederherstellen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Restore Default Shortcuts & Snap Areas"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar accesos directos predeterminados y ajustes de areas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar accesos directos predeterminados"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurer les raccourcis par défaut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pulihkan Pintasan Bawaah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ripristina abbreviazioni predefinite"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ショートカットを初期化"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "기본 단축키 복원"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atkurti numatytuosius karštuosius klavišus"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tilbakestill snarveger og festeområder"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standaard sneltoetsen herstellen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tilbakestill snarvegar og festeområde"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przywróć domyślne skróty"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar atalhos padrão"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar Atalhos Padrão"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restabilește Scurtăturile Predefinite"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Восстановить горячие клавиши по умолчанию"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obnoviť predvolené skratky a zóny prichytenia"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Återställ genvägar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Varsayılan kısayolları geri yükle"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Відновити типові комбінації клавіш"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khôi phục phím tắt mặc định"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "恢复默认快捷键和吸附区域"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "復原預設快速鍵"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "回復預設快捷鍵"
}
}
}
},
"Update Available…" : {
"extractionState" : "manual"
},
"uQy-DD-JDr.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Rectangle\"; ObjectID = \"uQy-DD-JDr\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مستطيل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle"
}
}
}
},
"uRl-iY-unG.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Cut\"; ObjectID = \"uRl-iY-unG\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يقطع"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Retalla"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Retalla"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vyjmout"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ausschneiden"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Cut"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cortar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cortar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Couper"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Potong"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Taglia"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "カット"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "오려두기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Iškirpti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Klipp ut"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Knippen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Klypp ut"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wytnij"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Recortar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cortar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tăiere"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вырезать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vystrihnúť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Klipp ut"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cut"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вирізати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cắt"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "剪切"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "剪下"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "剪下"
}
}
}
},
"Use as Todo Window" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utiliser comme fenêtre Todo"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Als To-do-Fenster verwenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar como ventana 'Todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar como ventana 'Todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utiliser comme fenêtre Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usa come finestra in evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todoウインドウとして使用"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 윈도우로 사용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naudoti kaip Todo langą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk som Gjøreliste-vindu"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk som Gjereliste-vindauge"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Použiť ako Todo okno"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Використовувати як вікно Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sử dụng như cửa sổ Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "作为待办窗口"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "做為待辦視窗"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use as Todo Window"
}
}
}
},
"Use frontmost.app as Todo App" : {
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utiliser frontmost.app comme application Todo"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitza frontmost.app com a app Todo"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitza frontmost.app com a app Todo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verwende frontmost.app als To-do-Anwendung"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use frontmost.app as Todo App"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use frontmost.app as Todo App"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utiliser frontmost.app comme application Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gunakan frontmost.app sebagai Aplikasi Todo"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usa frontmost.app come applicazione in evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "frontmost.appをToDoアプリとして使う"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "frontmost.app을 Todo 앱으로 사용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naudoti pirmame plane esantį langą kaip Todo programą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk frontmost.app som Gjøreliste-program"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use frontmost.app as Todo App"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk frontmost.app som Gjereliste-program"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use frontmost.app as Todo App"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use frontmost.app as Todo App"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Use frontmost.app as Todo App"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Использовать окно на переднем плане в качестве Todo приложения"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Použiť frontmost.app ako Todo aplikáciu"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använd frontmost.app som Att göra-app"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Використовувати frontmost.app як застосунок Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dùng frontmost.app làm ứng dụng Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用 frontmost.app 作为待办应用"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用 frontmost.app 作為待辦應用程式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "使用frontmost.app作為待辦應用"
}
}
}
},
"uw2-9W-2jq.label" : {
"comment" : "Class = \"NSTabViewItem\"; label = \"Shortcuts\"; ObjectID = \"uw2-9W-2jq\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Raccourcis clavier"
}
},
"ca" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Dreceres de teclat"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Dreceres de teclat"
}
},
"cs" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Klávesové zkratky"
}
},
"de" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Tastaturkurzbefehle"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Shortcuts"
}
},
"es" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Atajos de teclado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Atajos de teclado"
}
},
"fr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Raccourcis clavier"
}
},
"id" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Pintasan Papan Ketik"
}
},
"it" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Abbreviazioni da tastiera"
}
},
"ja" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "キーボードショートカット"
}
},
"ko" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "키보드 단축키"
}
},
"lt" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Karštieji klavišai"
}
},
"nb" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Tastatursnarveger"
}
},
"nl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Keyboard Shortcuts"
}
},
"nn" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Tastatursnarvegar"
}
},
"pl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Skróty klawiaturowe"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Atalhos de teclado"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Atalhos de Teclado"
}
},
"ro" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Scurtături"
}
},
"ru" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Горячие клавиши"
}
},
"sk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Klávesové skratky"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Tangentbordsgenvägar"
}
},
"tr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Klavye Kısayolları"
}
},
"uk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Комбінації клавіш"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phím tắt"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "键盘快捷键"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "鍵盤快速鍵"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "鍵盤快捷鍵"
}
}
}
},
"UZP-5q-D5Y.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"Restore window size when unsnapped\"; ObjectID = \"UZP-5q-D5Y\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استعادة حجم النافذة عند الإغلاق"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaura la mida de la finestra quan no s'ajusti"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaura la mida de la finestra quan no s'ajusti"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obnovit velikost okna při uvolnění"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fenster beim Bewegen auf Originalgröße zurücksetzen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Restore window size when unsnapped"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Resetear el tamaño de la ventana al despegarla"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Resetear el tamaño de la ventana al despegarla"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurer la taille de fenêtre en annulant le glissement"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kembalikan ukuran jendela saat tidak dijepret"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ripristina le dimensioni della finestra se spostata"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スナップが解除されたらウインドウサイズを元に戻す"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스냅 해제 시 창 크기 복원"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Atkurti lango dydį po to, kai pašalinamas pririšimas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjenskap størrelsen på vinduet når det blir revet løs"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restore window size when unsnapped"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gjenskap storleiken på vindauget når det blir rive laus"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przywróć rozmiar okna po odczepieniu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar tamanho da janela quando desencaixado"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restaurar tamanho de janela quando desencaixada"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Restabilește dimensiunea ferestrei când este închisă"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Восстановить размер окна после снятия привязки"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Obnoviť veľkosť okna po uvoľnení"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Återställ fönsterstorleken när den lossas"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tutturulduğu yerden ayrılan pencereleri eski boyutuna çevir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Відновлювати розмір вікна при відміні зміни розміру"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Khôi phục cửa sổ khi không bố trí"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "结束吸附时恢复窗口大小"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "結束貼齊時復原視窗大小"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "結束貼齊時回復視窗大小"
}
}
}
},
"v2f-bX-xiM.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Move Left\"; ObjectID = \"v2f-bX-xiM\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تحرك يسارا"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moure a l'esquerra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moure a l'esquerra"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Přesunout vlevo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nach links bewegen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Move Left"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover a la izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover a la izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Déplacer à gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Geser ke Kiri"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sposta a sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左に移動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽으로 이동"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Į kairę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt til venstre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naar links"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytt til venstre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przesuń w lewo"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para a esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mover para a esquerda"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mută în Stânga"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Налево"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Presunúť vľavo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Flytta vänster"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol Kenar"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Перемістити ліворуч"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Qua trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "向左移动"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左移"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左移"
}
}
}
},
"Vdr-fp-XzO.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Hide Others\"; ObjectID = \"Vdr-fp-XzO\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إخفاء الآخرين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Amaga els altres"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Amaga els altres"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skrýt ostatní"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Andere ausblenden"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Hide Others"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar otros"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ocultar otros"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Masquer les autres"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sembunyikan Lainnya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nascondi altre"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ほかを隠す"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "나머지 가리기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Slėpti kitą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skjul andre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verberg andere"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gøym andre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukryj Inne"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esconder Outros"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esconder Outros"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ascunde restul"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Скрыть другое"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Skryť ostatné"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dölj andra"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hide Others"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Сховати інші"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ẩn những thứ khác"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "隐藏其他"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "隱藏其他"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "隱藏其他"
}
}
}
},
"Vertical (T/B, %)" : {
},
"Vfd-fe-hCe.title" : {
"comment" : "Class = \"NSButtonCell\"; title = \"ⓘ\"; ObjectID = \"Vfd-fe-hCe\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "ⓘ"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "ⓘ"
}
}
}
},
"VIf-4h-MJW.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Authorize…\"; ObjectID = \"VIf-4h-MJW\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تفويض ..."
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoritza…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoritza…"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizovat…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorisieren…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Authorize…"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Authorise..."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Otorisasi…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizza…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "許可…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "승인…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizuoti…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toestemming geven…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoriser…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autoryzuj…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizar…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Autorizare…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Авторизовать…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Povoliť…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auktorisera…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yetkilendir..."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Авторизувати…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cấp phép…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "授权…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "授權⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "授權⋯"
}
}
}
},
"VIY-Ag-zcb.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Center\"; ObjectID = \"VIY-Ag-zcb\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مركز"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zentrieren"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrer"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tengah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centro"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "中央に表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "중앙"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centras"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midten"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centreer"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midten"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centrum"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centralizar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centro"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центр"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitten"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căn giữa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "居中"
}
}
}
},
"Vjx-xi-njq.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Italic\"; ObjectID = \"Vjx-xi-njq\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مائل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cursiva"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cursiva"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kursiv"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cursiva"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cursiva"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Italique"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cetak Miring"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Corsivo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "イタリック"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "이탤릭체"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kursyvas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kursiv"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cursief"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kursiv"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kursywa"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Itálico"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Itálico"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Курсив"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kursiv"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "In nghiên"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "斜体"
}
}
}
},
"vKC-jM-MkH.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Paste Style\"; ObjectID = \"vKC-jM-MkH\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "نمط اللصق"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enganxa estil"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enganxa estil"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stil einfügen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pegar estilo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pegar estilo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Style de collage"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tempel Gaya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Incolla lo stile"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スタイルをペースト"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "스타일 붙여넣기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Įterpimo stilius"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lim inn stil"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stijl plakken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lim inn stil"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wklej Styl"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colar Estilo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colar Estilo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Стиль вставки"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Klistra in stil"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dán kiểu chữ"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "粘贴样式"
}
}
}
},
"vLm-3I-IUL.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Show Ruler\"; ObjectID = \"vLm-3I-IUL\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "عرض المسطرة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra regle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra regle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lineale einblenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar regla"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar regla"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Afficher la règle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilkan Penggaris"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra righello"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ルーラーを表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "눈금자 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti liniuotę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis linjal"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toon lineaal"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis linjal"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż Linijkę"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Régua"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Régua"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показать линейку"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa linjal"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiện thước"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示标尺"
}
}
}
},
"vmV-6d-7jI.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Make Upper Case\"; ObjectID = \"vmV-6d-7jI\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "جعل الأحرف الكبيرة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Converteix a majúscules"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Converteix a majúscules"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Großbuchstaben"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Convertir a mayúsculas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Convertir a mayúsculas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Passer en majuscules"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buat Huruf Besar"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rendi maiuscolo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "大文字にする"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "대문자로 만들기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viską padaryti didžiosiomis raidėmis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk store bokstaver"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maak hoofdletters"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk store bokstavar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zmień na duże litery"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Converter em Maiúsculas"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Maiúsculas"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Сделать всё в верхнем регистре"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ändra till versaler"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Viết hoa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "变为大写"
}
}
}
},
"vNY-rz-j42.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Clear Menu\"; ObjectID = \"vNY-rz-j42\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "مسح القائمة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Neteja menú"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Neteja menú"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einträge löschen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Borrar menú"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Borrar menú"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Effacer le menu"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bersihkan Menu"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pulisci menu"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "メニューを消去"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "메뉴 지우기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Išvalyti meniu"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tøm menyen"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Menu leegmaken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tøm menyen"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wyczyść menu"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Limpar Menu"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Limpar Menu"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Очистить меню"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rensa menyn"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Làm sạch menu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "清除菜单"
}
}
}
},
"Vph-Z0-euH.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Center Three Fourths\"; ObjectID = \"Vph-Z0-euH\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "وسط ثلاثة أرباع"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tres quarts centrals"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tres quarts centrals"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Střední tři čtvrtiny"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mittlere drei Viertel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Center Three Fourths"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Centre Three Quarters"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tres cuartos centrales"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tres cuartos centrales"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trois quarts centraux"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiga Perempat Tengah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tre quarti centrali"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "3/4にして中央揃え"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "중앙 3/4"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vidurinės trys ketvirtys"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midterste tre fjerdedeler"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Middelste drie kwart"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Midtre tre fjerdedelar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Środkowe trzy czwarte"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Três quartos centrais"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Três Quartos Centrais"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trei Sferturi Centrale"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центральные три четверти"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Stredné tri štvrtiny"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mittersta tre fjärdedelar"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Orta Üç Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Центральні три чверті"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "3/4 ở giữa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "中间3/4"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "中間3/4"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "中間3/4"
}
}
}
},
"w0m-vy-SC9.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Ligatures\"; ObjectID = \"w0m-vy-SC9\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "الأربطة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lligadures"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lligadures"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaduras"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaduras"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligatures"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligatur"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Legature"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "合字"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "합자"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligatūros"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturer"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligatury"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaduras"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaduras"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Лигатуры"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ligaturer"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chữ ghép"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "连字"
}
}
}
},
"W48-6f-4Dl.title" : {
"comment" : "Class = \"NSMenu\"; title = \"Edit\"; ObjectID = \"W48-6f-4Dl\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يحرر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Edita"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Edita"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upravit"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bearbeiten"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Edit"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Modifier"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunting"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Modifica"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "編集"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "편집"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redaguoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rediger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bewerken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rediger"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Edycja"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editare"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Редактировать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upraviť"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Redigera"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Edit"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Редагувати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chỉnh sửa"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "编辑"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "編輯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "編輯"
}
}
}
},
"Was-JA-tGl.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"New\"; ObjectID = \"Was-JA-tGl\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "جديد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nou"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nou"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nový"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Neu"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "New"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nuevo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nuevo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nouveau"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Baru"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nuovo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "新規作成"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "신규"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sukurti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nytt"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nieuw"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nytt"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nowy"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Novo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Novo"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nou"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Создать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nový"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ny"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "New"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Новий"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mới"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "新建"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "新增"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "新增"
}
}
}
},
"wb2-vD-lq4.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Align Right\"; ObjectID = \"wb2-vD-lq4\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "محاذاة اليمين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinea a la dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinea a la dreta"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechtsbündig"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinear a la derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinear a la derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aligner à droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rata Kanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Allinea a destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "右揃え"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "오른쪽 정렬"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lygiavimas į dešinę"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Høgrejustert"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechts uitlijnen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Høgrejustert"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wyrównaj w prawo"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinhar à Direita"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinhar à Direita"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выравнивание вправо"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Anpassa höger"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căn phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右对齐"
}
}
}
},
"WeT-3V-zwk.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Paste and Match Style\"; ObjectID = \"WeT-3V-zwk\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "لصق ومطابقة النمط"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enganxa i coincideix amb l'estil"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enganxa i coincideix amb l'estil"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vložit a sladit styl"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einfügen und Stil anpassen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Paste and Match Style"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pegar y emparejar estilo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pegar y emparejar estilo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Coller et adapter le style"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tempel dan Cocokkan Gaya"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Incolla e mantieni stile"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ペーストしてスタイルを合わせる"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "붙여넣고 스타일 일치시킴"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Įterpti ir suderinti stilius"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lim inn og tilpass stil"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Plak en neem stijl over"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lim inn og tilpass stil"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wklej i dopasuj styl"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colar e manter estilo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Colar e Combinar Estilo"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lipește și Aplică Stilizarea"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вставить и соотнести стили"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vložiť a prispôsobiť štýl"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Klistra in och matcha stil"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paste and Match Style"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вставити зі збереженням стилю"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dán và khớp kiểu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "粘贴并匹配样式"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "貼上並符合樣式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "貼上並符合樣式"
}
}
}
},
"Width Step (px)" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Width Step (px)"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Шаг ширины (px)"
}
}
}
},
"wpr-3q-Mcd.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Help\"; ObjectID = \"wpr-3q-Mcd\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يساعد"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nápověda"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hilfe"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Help"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ayuda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ayuda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aide"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bantuan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aiuto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ヘルプ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "도움말"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pagalba"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hjelp"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hulp"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hjelp"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pomoc"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajuda"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ajutor"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Помощь"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pomocník"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hjälp"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Yardım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Довідка"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trợ giúp"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "帮助"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "輔助說明"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "輔助說明"
}
}
}
},
"WRG-CD-K1S.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Underline\"; ObjectID = \"WRG-CD-K1S\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "تسطير"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subratllat"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subratllat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Unterstrichen"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subrayar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subrayar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Souligner"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Garis Bawah"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sottolinea"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "アンダーライン"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "밑줄체"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pabrauktas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Understreka"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Onderstrepen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Understreka"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Podkreśl"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sublinhar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sublinhado"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Подчеркнутый"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Understrykning"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gạch dưới"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "下划线"
}
}
}
},
"x3v-GG-iWU.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Copy\"; ObjectID = \"x3v-GG-iWU\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "ينسخ"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copia"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copia"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopírovat"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopieren"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Copy"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copier"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salin"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copia"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "コピー"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "복사하기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopijuoti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopier"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopiëren"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopier"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopia"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiar"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copiere"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Копировать"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopírovať"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kopiera"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Copy"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Копіювати"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sao chép"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "拷贝"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "拷貝"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "複製"
}
}
}
},
"xBU-le-7cX.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"xBU-le-7cX\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"Xc8-Sm-pig.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Left Half\"; ObjectID = \"Xc8-Sm-pig\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "النصف الأيسر"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat esquerra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Meitat esquerra"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Levá polovina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linke Hälfte"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Left Half"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mitad izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Moitié gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Setengah Kiri"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metà sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半分"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽 절반"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kairė pusė"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstre halvdel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linkerhelft"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstre halvdel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lewa połowa"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Metade esquerda"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Prima Jumătate"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Левая половина"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ľavá polovica"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vänstra halvan"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sol Yarım"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ліва половина"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/2 đầu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半屏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "左半"
}
}
}
},
"xcE-uL-2J0.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Choosing Spectacle will also cycle 1/2, 2/3, and 1/3 window widths on repeated shortcuts\"; ObjectID = \"xcE-uL-2J0\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "سيؤدي اختيار Spectacle أيضًا إلى تدوير عرض النافذة 1/2 و 2/3 و 1/3 على الاختصارات المتكررة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si escolliu Spectacle, també es farà un cicle de 1/2, 2/3 i 1/3 d'amplada de finestra a les dreceres repetides"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si escolliu Spectacle, també es farà un cicle de 1/2, 2/3 i 1/3 d'amplada de finestra a les dreceres repetides"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vybráním Spectacle se také bude měnit šířka oken na 1/2, 2/3, a 1/3 při opakovaných příkazech"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wenn Spectacle ausgewählt wird, werden bei wiederholten Tastaturkurzbefehlen zwischen 1/2, 2/3, und 1/3-Fensterbreiten durchgewechselt"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Choosing Spectacle will also cycle 1/2, 2/3, and 1/3 window widths on repeated shortcuts"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Elegir Spectacle también creará un bucle para las anchuras de 1/2, 2/3 y 1/3 del tamaño de la ventana en atajos accionados repetidas veces"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Elegir Spectacle también creará un bucle para las anchuras de 1/2, 2/3 y 1/3 del tamaño de la ventana en atajos accionados repetidas veces"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Choisir Spectacle altérera aussi les largeurs de fenêtre 1/2, 2/3, et 1/3 pour les raccourcis répétés"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Memilih Spectacle juga akan menggilir 1/2, 2/3, dan 1/3 lebar jendela pada pintasan berulang"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Scegliere Spectacle alternerà 1/2, 2/3, e 1/3 in larghezza con abbreviazioni ripetute"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacleを選択すると、同じショートカットを繰り返した際にウインドウの幅を1/2、2/3、1/3に順次変更します"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle을 선택하여도 단축키를 반복하면 1/2, 2/3, 1/3 창 넓이를 순환합니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pasirinkus Spectacle karštuosius klavišus, taip pat bus cikliškai keičiamas lango plotis 1/2, 2/3 ir 1/3 naudojant kartojančius karštuosius klavišus"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Å velge Spectacle fører også til at man veksler mellom 1/2-, 2/3-, og 1/3-vindusbredder når du bruker samme snarveg flere ganger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Choosing Spectacle will also cycle 1/2, 2/3, and 1/3 window widths on repeated shortcuts"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Å velja Spectacle fører òg til at ein vekslar mellom 1/2-, 2/3-, og 1/3-vindaugsbreidder når du bruker same snarveg fleire gonger"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wybranie Spectacle będzie także zmieniało szerokość okna 1/2, 2/3 i 1/3 przy powtarzających się skrótach."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle também fará com que comandos repetidos alternem o tamanho da janela entre 1/2, 2/3 e 1/3 de largura"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Escolher Spectacle também vai alternar ente larguras de janelas de 1/2, 2/3 e 1/3 ao repetir atalhos"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Dacă alegeți Spectacle se vor parcurge 1/2, 2/3, și 1/3 din lățimile ferestrei la repetarea scurtăturilor"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выбор горячих клавиш Spectacle также зациклит 1/2, 2/3 и 1/3 ширины окна при повторяющихся горячих клавиш"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zvolením Spectacle sa tiež bude meniť šírka okien na 1/2, 2/3 a 1/3 pri opakovaní skratiek"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Att välja Spectacle kommer också att växla mellan 1/2-, 2/3-, och 1/3-fönsterbredder med upprepade kortkommandon"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spectacle seçilirse, yinelenen kısayollar ekranın 1/2, 2/3 ve 1/3 genişlikleri arasında geçiş sağlar."
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вибір Spectacle також циклічно переключає 1/2, 2/3 і 1/3 ширини вікна при повторному використанні комбінації клавіш"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Chọn Spectacle cũng sẽ thiết lập tuần hoàn 1/2, 2/3, và 1/3 kích thước cửa sổ khi các phím tắt được lặp lại"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "若选择 Spectacle,重复快捷键也会循环½、⅔、⅓窗口宽度"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "如果選擇 Spectacle,重複快速鍵也會循環½、⅔、⅓視窗寬度"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "若選擇Spectacle,重複快捷鍵也會循環½、⅔、⅓視窗寬度"
}
}
}
},
"xE6-jw-EPt.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"If the area is too small, recent apps will be hidden\"; ObjectID = \"xE6-jw-EPt\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "إذا كانت المنطقة صغيرة جدًا ، فسيتم إخفاء التطبيقات الحديثة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si l'àrea és massa petita, les aplicacions recents s'amagaran"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si l'àrea és massa petita, les aplicacions recents s'amagaran"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokud je oblast příliš malá, nedávné aplikace budou skryté"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wenn der Bereich zu klein ist, werden die zuletzt verwendeten Programme ausgeblendet."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "If the area is too small, recent apps will be hidden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si el área es demasiado pequeña, las aplicaciones recientes serán ocultadas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si el área es demasiado pequeña, las aplicaciones recientes serán ocultadas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Si la zone est trop petite, les applications récentes seront masquées"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "If the area is too small, recent apps will be hidden"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se l'area è troppo piccola, le app recenti saranno nascoste"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "エリアが小さい場合、最近使ったアプリケーションは非表示になります"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "영역이 너무 작으면 최근 앱들이 숨겨집니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Jei sritis per maža, paskutinės programos bus paslėptos"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om området er for lite vil siste brukte apper ikke være synlige"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "If the area is too small, recent apps will be hidden"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om området er for lite vil siste brukte appar ikkje vera synlege"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "If the area is too small, recent apps will be hidden"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Se a área é muito pequeno, aplicativos recentes serão ocultados"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "If the area is too small, recent apps will be hidden"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "If the area is too small, recent apps will be hidden"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Если область слишком мала, последние приложения будут скрыты"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ak je oblasť príliš malá, nedávne aplikácie sa skryjú"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "If the area is too small, recent apps will be hidden"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Eğer alan çok darsa, son uygulamalar gizlenecektir"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Якщо область занадто мала, останні застосунки будуть приховані"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nếu vùng hiển thị quá nhỏ, các ứng dụng hiện tại sẽ bị ẩn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "若该区域过小,最近使用的应用程序将被隐藏"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "如果該區域過小,將會隱藏最近使用過的應用程式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "如果該區域過小,最近使用過的應用程式將被隱藏"
}
}
}
},
"xK0-Bn-yqf.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"-\"; ObjectID = \"xK0-Bn-yqf\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "-"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "-"
}
}
}
},
"XlM-ch-cLG.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"cycle through displays\"; ObjectID = \"XlM-ch-cLG\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "دورة من خلال شاشات العرض"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "cicle per les pantalles"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "cicle per les pantalles"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "přesouvat po displejích"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Durch Bildschirme wechseln"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "cycle through displays"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "bucle a través de las pantallas"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "bucle a través de las pantallas"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "parcourir les moniteurs"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "siklus melalui tampilan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "scorri tra schermi"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ウインドウを表示するディスプレイを変更"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "디스플레이 순환"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "perjungineti tarp ekranų"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "gå gjennom skjermene"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "cycle through displays"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "gå gjennom skjermane"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "cycle through displays"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "cycle through displays"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "cycle through displays"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "navigare ciclică între ecrane"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "переключаться между дисплеями"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "prepínať medzi displejmi"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "bläddra mellan skärmarna"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "ekranlar arasında dolaş"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "циклічно перебирати екрани"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Di chuyển tuần hoàn qua các màn hình"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "循环显示器"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "循環顯示器"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "循環顯示器"
}
}
}
},
"xNi-9K-fnJ.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"2. In the Rectangle menu, select\\n\\\"Use [Application] as Todo App\\\"\"; ObjectID = \"xNi-9K-fnJ\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. في قائمة المستطيل ، حدد n استخدام [Application] كتطبيق Todo"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Al menú Rectangle, selecciona\n\"Utilitza [Application] com a app Todo\""
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Al menú Rectangle, selecciona\n\"Utilitza [Application] com a app Todo\""
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. V Rectangle menu, zvolte\n\"Vybrat [Application] jako Todo aplikaci\""
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Wähle \n\"Verwende [Application] als To-do-Anwendung\" im Rectangle-Menü."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "2. In the Rectangle menu, select\n\"Use [Application] as Todo App\""
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. En el menú de Rectangle, selecciona\n\"Usar [Aplicación] como aplicación 'Todo'\""
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. En el menú de Rectangle, selecciona\n\"Usar [Aplicación] como aplicación 'Todo'\""
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Dans le menu de Rectangle, sélectionner\n« Utiliser [Application] comme App Todo »"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Di Menu Rectangle, pilih\n\"Gunakan [Application] sebagai Aplikasi Todo\""
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Nel menu di Rectangle, seleziona \n\"Usa [Applicazione] come applicazione in evidenza\""
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Rectangleのメニューにある\n\"[アプリケーション名]をToDoアプリとして使う\"を選択します"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Rectangle 메뉴에서, \n\"[Application]을 Todo 앱으로 사용\" 메뉴를 클릭합니다"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "„Rectangle“ meniu pasirinkite „Naudoti [Programą] kaip Todo programą“"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. I Rectangle-menyen: velg\n\"Bruk [Program] som Gjøreliste-program\""
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. In the Rectangle menu, select\n\"Use [Application] as Todo App\""
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. I Rectangle-menyen: vel\n\"Bruk [Program] som Gjereliste-program\""
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. In the Rectangle menu, select\n\"Use [Application] as Todo App\""
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. No menu do Rectangle, selecione\n\"Use [Aplicativo] como Todo App\""
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. In the Rectangle menu, select\n\"Use [Application] as Todo App\""
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. În meniul Rectangle, selectează\n\"Folosește [Application] ca și Todo App\""
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. В меню Rectangle выберите \"Использовать [Приложение] в качестве приложения Todo\""
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. V Rectangle menu, zvoľ\n\"Použiť [Aplikácia] ako Todo aplikáciu\""
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. I Rectangle-menyn, välj\n\"Använd [Applikation] som Att göra-app\""
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Rectangle menüsünde \n\"[Uygulama Adı]nı Todo App olarak kullan\" seçeneğini seçin"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. У меню Rectangle виберіть\n\"Використовувати [Застосунок] як застосунок Завдань\""
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "2. Trên menu của Rectangle, chọn\n\"Sử dụng [Ứng dụng] làm ứng dụng Todo\""
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒉在 Rectangle 菜单中,选择\n“使用[应用程序]作为待办应用”"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒉ 在 Rectangle 選單中,選擇\n「使用[應用程式]作為待辦應用程式」"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "⒉在Rectangle選單中,選擇\n「使用[應用程式]作為待辦應用」"
}
}
}
},
"xQD-1f-W4t.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Use All\"; ObjectID = \"xQD-1f-W4t\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "استخدام كل"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitzar-ho tot"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Utilitzar-ho tot"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alle verwenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar todo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar todo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tout utiliser"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gunakan Semua"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usa tutti"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "すべて使用"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "모두 사용"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naudoti viską"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk alle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gebruik alle"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bruk alle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Użyj wszystkich"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar todos"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usar Todos"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Использовать всё"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Använd alla"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "xQD-1f-W4t.title"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "全部使用"
}
}
}
},
"xrE-MZ-jX0.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Speech\"; ObjectID = \"xrE-MZ-jX0\";",
"extractionState" : "manual",
"localizations" : {
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Veu"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Veu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprachausgabe"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voz"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voz"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Discours"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pidato"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voce"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "スピーチ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "말하기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kalba"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tale"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spraak"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tale"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Przemówienie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voz"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fala"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Речь"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tal"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Giọng nói"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "语音"
}
}
}
},
"Xz5-n4-O0W.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Find…\"; ObjectID = \"Xz5-n4-O0W\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "يجد…"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca…"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hledat…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Suchen…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Find…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechercher…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Temukan…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trova…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "検索…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "찾기…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rasti…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoek…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Znajdź…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căutare…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Найти…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Násjť…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Find…"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Знайти…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tìm kiếm …"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查找…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找⋯"
}
}
}
},
"YEy-JH-Tfz.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Find and Replace…\"; ObjectID = \"YEy-JH-Tfz\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "بحث واستبدال ..."
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca i reemplaça…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cerca i reemplaça…"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hledat a nahradit…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Suchen und Ersetzen…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Find and Replace…"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar y reemplazar…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar y reemplazar…"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rechercher et remplacer…"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Temukan dan Ganti…"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trova e sostituisci…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "検索と置換…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "찾기 및 대치…"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rasti ir pakeisti…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn og erstatt…"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zoek en vervang…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Finn og byt ut…"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Znajdź i zastąp…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Buscar e substituir…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Encontrar e Substituir…"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căutare și Înlocuire…"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Найти и заменить…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nájsť a nahradiť…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sök och ersätt…"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Find and Replace…"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Знайти і замінити…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "T\u0018ìm kiếm và thay thế...\n"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "查找和替换…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找與取代⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "尋找與取代⋯"
}
}
}
},
"YGs-j5-SAR.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"\\tDefault\"; ObjectID = \"YGs-j5-SAR\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : " t الافتراضي"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPer defecte"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPer defecte"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandard"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPredeterminado"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPredeterminado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPar défaut"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tBawaan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPredefinito"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tデフォルト"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "\t기본"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPagal nutylėjimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandard"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandaard"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandard"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tDomyślnie"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPadrão"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tPadrão"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tПо умолчанию"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "\tStandard"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\Mặc định"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "\\tDefault"
}
}
}
},
"Ynk-f8-cLZ.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Start Speaking\"; ObjectID = \"Ynk-f8-cLZ\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "ابدأ التحدث"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comença a parlar"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comença a parlar"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sprachausgabe starten"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Empieza a hablar"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Empieza a hablar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Démarrer Dictée"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mulai Bicara"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avvia la lettura ad alta voce"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "読み上げを開始"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "말하기 시작"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tarpti"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Start tale"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Begin met spreken"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Start tale"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zacznij mówić"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Comece a falar"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Começar a falar"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Проговорить"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Börja tala"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bắt đầu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "开始朗读"
}
}
}
},
"YRC-4a-xGg.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Settings…\"; ObjectID = \"YRC-4a-xGg\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "التفضيلات ..."
}
},
"ca" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferències…"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferències…"
}
},
"cs" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Předvolby…"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Einstellungen…"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Settings…"
}
},
"es" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferencias…"
}
},
"es-419" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferencias…"
}
},
"fr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Préférences…"
}
},
"id" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferensi…"
}
},
"it" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferenze…"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "設定…"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "설정…"
}
},
"lt" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Nustatymai…"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Innstillinger…"
}
},
"nl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Voorkeuren…"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Innstillingar…"
}
},
"pl" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferencje…"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferências…"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferências…"
}
},
"ro" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Preferințe…"
}
},
"ru" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Настройки…"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nastavenia…"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Inställningar…"
}
},
"tr" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Tercihler…"
}
},
"uk" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "Налаштування…"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cài đặt…"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "偏好设置…"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "偏好設定⋯"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "偏好設定⋯"
}
}
}
},
"yvN-PE-bxn.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Quit Rectangle\"; ObjectID = \"yvN-PE-bxn\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sortir de Rectangle"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sortir de Rectangle"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukončit Rectangle"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle beenden"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Quit Rectangle"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salir de Rectangle"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Salir de Rectangle"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quitter Rectangle"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keluar Rectangle"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Esci da Rectangle"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangleを終了"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle 종료"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Išeiti iš Rectangle"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avslutt Rectangle"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle stoppen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avslutt Rectangle"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wyjdź z Rectangle."
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fechar Rectangle"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sair do Rectangle"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Închide Rectangle"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выход из Rectangle"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ukončiť Rectangle"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avsluta Rectangle"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rectangle'dan Çık"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Вийти з Rectangle"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thoát Rectangle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "退出 Rectangle"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "結束 Rectangle"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "結束Rectangle"
}
}
}
},
"z6F-FW-3nz.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Show Substitutions\"; ObjectID = \"z6F-FW-3nz\";",
"extractionState" : "manual",
"localizations" : {
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra substitucions"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra substitucions"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ersetzungen einblenden"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar sustituciones"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar sustituciones"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Montrer les substitutions"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tampilkan substitusi "
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostra sostituzioni"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "自動置換を表示"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "대체 보기"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rodyti pakeitimus"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis erstatninger"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Toon vervangingen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Vis erstatningar"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pokaż zamiany"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Mostrar Substituições"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Exibir substituições"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Показать замены"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Visa substitutioner"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hiển thị"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "显示替换"
}
}
}
},
"Z9d-Rl-RVq.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"move to adjacent display on left or right\"; ObjectID = \"Z9d-Rl-RVq\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "انتقل إلى الشاشة المجاورة على اليسار أو اليمين"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "mou a la pantalla adjacent a l'esquerra o a la dreta"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "mou a la pantalla adjacent a l'esquerra o a la dreta"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "přesunout na sousedící displej vlevo nebo vpravo"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zum benachbarten Bildschirm auf der linken oder rechten Seite bewegen"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "move to adjacent display on left or right"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "mover a la pantalla adyacente a la izquierda o a la derecha"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "mover a la pantalla adyacente a la izquierda o a la derecha"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "déplacer vers le moniteur à gauche ou à droite"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "pindah ke tampilan yang berdekatan di kiri atau kanan"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "sposta nello schermo adiacente a sinistra o a destra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ウインドウを左右のディスプレイに順次移動"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "인접한 왼쪽 또는 오른쪽 디스플레이로 이동"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "pereiti prie gretimo ekrano kairėje arba dešinėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "flytt til nærmeste skjerm til venstre eller høgre"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "move to adjacent display on left or right"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "flytt til nærmaste skjerm til venstre eller høgre"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "move to adjacent display on left or right"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "move to adjacent display on left or right"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "move to adjacent display on left or right"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "mută în ecranul adiacent din stânga sau din dreapta"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "перейти к соседнему дисплею слева или справа"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "presunúť na susediaci displej vľavo alebo vpravo"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "flytta till intilliggande skärm till vänster eller höger"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "pencereyi sağdaki veya soldaki bitişik ekrana taşı"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "перемістити на сусідній екран зліва або справа"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Di chuyển đến cạnh trái hoặc phải"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "移动到左侧或右侧的相邻显示器"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "移至左側或右側的相鄰顯示器"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "移到左側或右側的相鄰顯示器"
}
}
}
},
"ZM1-6Q-yy1.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Align Left\"; ObjectID = \"ZM1-6Q-yy1\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "محاذاة لليسار"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinea a l'esquerra"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinea a l'esquerra"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Linksbündig"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinear a la izquierda"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinear a la izquierda"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Aligner à gauche"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Rata Kiri"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Allinea a sinistra"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左揃え"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "왼쪽 정렬"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lygiuoti kairėje"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstrejuster"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Links uitlijnen"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Venstrejuster"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wyrównaj w lewo"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinhar à esquerda"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alinhar à Esquerda"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Выровнять влево"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Justera vänster"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Căn trái"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "左对齐"
}
}
}
},
"ZTK-rS-b17.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"Third Fourth\"; ObjectID = \"ZTK-rS-b17\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "ثالث رابع"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercer quart"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercer quart"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Třetí čtvrtina"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Drittes Viertel"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Third Fourth"
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Third Quarter"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercer cuarto"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tercer cuarto"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Troisième quart"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tiga Perempat"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terzo quarto"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "左から3番目"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "세번째 1/4"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trečia ketvirtis"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredje fjerdedel"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Derde kwart"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredje fjerdedel"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Trzecia ćwiartka"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terceiro quarto"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Terceiro Quarto"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Al Treilea Sfert"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Третья четверть"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tretia štvrtina"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tredje fjärde"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Üçüncü Çeyrek"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Третя чверть"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "1/4 thứ ba"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "右二1/4"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "右二1/4"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "右二1/4"
}
}
}
},
"ZVi-DR-1zj.title" : {
"comment" : "Class = \"NSTextFieldCell\"; title = \"About Todo Mode\"; ObjectID = \"ZVi-DR-1zj\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "حول تودو مود"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant al mode Todo"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quant al mode Todo"
}
},
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Todo módu"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Über den To-do-Modus"
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "About Todo Mode"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca del modo 'Todo'"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Acerca del modo 'Todo'"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "À propos du mode Todo"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Tentang Todo Mode"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Informazioni sulla modalità In evidenza"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ToDoモードについて"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo 모드 정보"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Apie Todo režimą"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Gjøreliste-modus"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "About Todo Mode"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Gjereliste-modus"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "About Todo Mode"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sobre o Todo Mode"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "About Todo Mode"
}
},
"ro" : {
"stringUnit" : {
"state" : "translated",
"value" : "Despre Modul Todo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "О Todo режиме"
}
},
"sk" : {
"stringUnit" : {
"state" : "translated",
"value" : "O Todo režime"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Om Att göra-läge"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Todo Modu Hakkında"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "Про режим Завдань"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Giới thiệu chế độ Todo"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "关于待办模式"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於待辦模式"
}
},
"zh-Hant-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "關於待辦模式"
}
}
}
},
"ZvO-Gk-QUH.title" : {
"comment" : "Class = \"NSMenuItem\"; title = \"Paragraph\"; ObjectID = \"ZvO-Gk-QUH\";",
"extractionState" : "manual",
"localizations" : {
"ar" : {
"stringUnit" : {
"state" : "translated",
"value" : "فقرة"
}
},
"ca" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paràgraf"
}
},
"ca-ES" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paràgraf"
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Absatz"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Párrafo"
}
},
"es-419" : {
"stringUnit" : {
"state" : "translated",
"value" : "Párrafo"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paragraphe"
}
},
"id" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paragraf"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paragrafo"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "段落"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "단락"
}
},
"lt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paragrafas"
}
},
"nb" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avsnitt"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paragraaf"
}
},
"nn" : {
"stringUnit" : {
"state" : "translated",
"value" : "Avsnitt"
}
},
"pl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paragraf"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Parágrafo"
}
},
"pt-PT" : {
"stringUnit" : {
"state" : "translated",
"value" : "Parágrafo"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "Параграф"
}
},
"sv-SE" : {
"stringUnit" : {
"state" : "translated",
"value" : "Paragraf"
}
},
"vi" : {
"stringUnit" : {
"state" : "translated",
"value" : "Đoạn văn"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "段落"
}
}
}
}
},
"version" : "1.0"
}
================================================
FILE: Rectangle.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 60;
objects = {
/* Begin PBXBuildFile section */
12D896200936C0DE9FF41FB4 /* (null) in Frameworks */ = {isa = PBXBuildFile; };
30166BD024F27D6A00A38608 /* SpecifiedCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30166BCF24F27D6A00A38608 /* SpecifiedCalculation.swift */; };
482E9E422EB1528D00D7928A /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 482E9E412EB1528D00D7928A /* AppIcon.icon */; };
6490B39127BF907A0056C220 /* BottomLeftEighthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B39027BF907A0056C220 /* BottomLeftEighthCalculation.swift */; };
6490B39327BF90F90056C220 /* EighthsRepeated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B39227BF90F90056C220 /* EighthsRepeated.swift */; };
6490B39527BF96880056C220 /* TopLeftEighthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B39427BF96880056C220 /* TopLeftEighthCalculation.swift */; };
6490B39727BF96EA0056C220 /* TopCenterLeftEighthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B39627BF96EA0056C220 /* TopCenterLeftEighthCalculation.swift */; };
6490B39927BF97BB0056C220 /* TopCenterRightEighthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B39827BF97BB0056C220 /* TopCenterRightEighthCalculation.swift */; };
6490B39B27BF980F0056C220 /* TopRightEighthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B39A27BF980F0056C220 /* TopRightEighthCalculation.swift */; };
6490B39D27BF984D0056C220 /* BottomCenterLeftEighthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B39C27BF984D0056C220 /* BottomCenterLeftEighthCalculation.swift */; };
6490B39F27BF98840056C220 /* BottomCenterRightEighthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B39E27BF98840056C220 /* BottomCenterRightEighthCalculation.swift */; };
6490B3A127BF98C70056C220 /* BottomRightEighthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6490B3A027BF98C70056C220 /* BottomRightEighthCalculation.swift */; };
7EC9E3BAD5BC57E49A7BCEE5 /* TwelfthsRepeated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3592F8E85CE82B8FA662A31 /* TwelfthsRepeated.swift */; };
BAB3F495AD1F3454FAA31AFB /* TopLeftTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9FDCA1333C1BF6930A8D7F3 /* TopLeftTwelfthCalculation.swift */; };
924919761FC491952752A147 /* TopCenterLeftTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9698D1D9EE0180D7C4468304 /* TopCenterLeftTwelfthCalculation.swift */; };
14DBE979E4453E13A3BF5C17 /* TopCenterRightTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4D034DBD7EFAC4CF5F8D67B /* TopCenterRightTwelfthCalculation.swift */; };
F4EED30B47FB6C55EA937254 /* TopRightTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E8357E928530D10A806F3CD /* TopRightTwelfthCalculation.swift */; };
05DBEA44B55E6F8C5FC3D6E0 /* MiddleLeftTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEABF10E66D648DDB37DABBA /* MiddleLeftTwelfthCalculation.swift */; };
9FDA3D672AE475B83CA1A34A /* MiddleCenterLeftTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5070DE9100E45D374053F0C2 /* MiddleCenterLeftTwelfthCalculation.swift */; };
DCD3CF2993E9AFAF30820117 /* MiddleCenterRightTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCF2AC59501448BD3BAA16EC /* MiddleCenterRightTwelfthCalculation.swift */; };
8B1D14E3A55936EBCCC1E807 /* MiddleRightTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA84AB4DB9E7EEFCE50AA6D8 /* MiddleRightTwelfthCalculation.swift */; };
BF9871B3BCF0E652444E0C56 /* BottomLeftTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 246168B345ECE6C375ACEEB7 /* BottomLeftTwelfthCalculation.swift */; };
52953B57D48A4F110779E9BD /* BottomCenterLeftTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71FE3EBE50F91F9EE2989279 /* BottomCenterLeftTwelfthCalculation.swift */; };
666598377754D51045353CD0 /* BottomCenterRightTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A362206B9F76C269D8F469 /* BottomCenterRightTwelfthCalculation.swift */; };
15E8CA7F6AC3EA2C4FB1424C /* BottomRightTwelfthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7D038C68560DC11F14496F6 /* BottomRightTwelfthCalculation.swift */; };
B6366EE24FA928086846969B /* SixteenthsRepeated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16B4044DB4809116039F96EB /* SixteenthsRepeated.swift */; };
3FA1D2E6C9B4623227F680CF /* TopLeftSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6294D2CB6E3D8ED982F418AE /* TopLeftSixteenthCalculation.swift */; };
A0844B53B14365D0278BC124 /* TopCenterLeftSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE9E5E2C8BA2590DD0B6F59 /* TopCenterLeftSixteenthCalculation.swift */; };
A32D3739AA16C537F6427C4F /* TopCenterRightSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 918F847FF15D524B6DB2E6DA /* TopCenterRightSixteenthCalculation.swift */; };
F51A7467767F8EAF97321A00 /* TopRightSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD222258713B13274FB651B0 /* TopRightSixteenthCalculation.swift */; };
D8644560FF112B0748CE1975 /* UpperMiddleLeftSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E2DBE0733F31BC159BC99C /* UpperMiddleLeftSixteenthCalculation.swift */; };
E791B00A88D90C24A4C3D2D1 /* UpperMiddleCenterLeftSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B8CA6901E6FE134E930135B /* UpperMiddleCenterLeftSixteenthCalculation.swift */; };
895C73559E1ACEFBBE8DC32D /* UpperMiddleCenterRightSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEBF3EA35F0C110A170EAD33 /* UpperMiddleCenterRightSixteenthCalculation.swift */; };
0F29956694B5BB31EBDAE445 /* UpperMiddleRightSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3B5B09465C38F8B766B3C3C /* UpperMiddleRightSixteenthCalculation.swift */; };
562018A56BC897E769500F1F /* LowerMiddleLeftSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C796BCAA3DA5F85B55A7EE83 /* LowerMiddleLeftSixteenthCalculation.swift */; };
88763FEFFA3AECF8502604D6 /* LowerMiddleCenterLeftSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378C96D832D4CC6BCCF9D604 /* LowerMiddleCenterLeftSixteenthCalculation.swift */; };
A73749B5FB00D2CC2DB08744 /* LowerMiddleCenterRightSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE08B666CCCD1805CAB08BD /* LowerMiddleCenterRightSixteenthCalculation.swift */; };
4266090403BAF4B8A654A28B /* LowerMiddleRightSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EC57F37CFD790695177AC8 /* LowerMiddleRightSixteenthCalculation.swift */; };
F7B6C43BB57F8064F49DDBB6 /* BottomLeftSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEE147786B2CD7350FAFB700 /* BottomLeftSixteenthCalculation.swift */; };
9988C2A18B6AF03E09204981 /* BottomCenterLeftSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88454ABE5C62BD610AEA3EB5 /* BottomCenterLeftSixteenthCalculation.swift */; };
630644571003EB468CB643D8 /* BottomCenterRightSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24EBF1F9A6209449A988E15 /* BottomCenterRightSixteenthCalculation.swift */; };
2D240EE416CC03AC921E3A4F /* BottomRightSixteenthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 482EA970820F37C6917FCD98 /* BottomRightSixteenthCalculation.swift */; };
729E0A982AFF76B1006E2F48 /* CenterProminentlyCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 729E0A972AFF76B1006E2F48 /* CenterProminentlyCalculation.swift */; };
74804F0B2E25521C009F1F7D /* CenterTwoThirdsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74804F0A2E25521C009F1F7D /* CenterTwoThirdsCalculation.swift */; };
7BE578EF2C5BF4EE0083DAE3 /* CycleSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BE578EE2C5BF4ED0083DAE3 /* CycleSize.swift */; };
866661F2257D248A00A9CD2D /* RepeatedExecutionsInThirdsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 866661F1257D248A00A9CD2D /* RepeatedExecutionsInThirdsCalculation.swift */; };
944F25CD2CE5A144004B2FD2 /* PrefsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 944F25CC2CE5A144004B2FD2 /* PrefsViewController.swift */; };
94E9B08E2C3B8D97004C7F41 /* MacTilingDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E9B08D2C3B8D97004C7F41 /* MacTilingDefaults.swift */; };
94E9B0902C3E4578004C7F41 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E9B08F2C3E4578004C7F41 /* StringExtension.swift */; };
9818E00D28B59205004AA524 /* CompoundSnapArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818E00C28B59205004AA524 /* CompoundSnapArea.swift */; };
9818E01028B59396004AA524 /* HalvesCompoundCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818E00F28B59396004AA524 /* HalvesCompoundCalculation.swift */; };
9818E01228B59B64004AA524 /* ThirdsCompoundCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818E01128B59B64004AA524 /* ThirdsCompoundCalculation.swift */; };
9818E01428B5A4FD004AA524 /* SixthsCompoundCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818E01328B5A4FD004AA524 /* SixthsCompoundCalculation.swift */; };
9818E01828B63C48004AA524 /* FourthsCompoundCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818E01728B63C48004AA524 /* FourthsCompoundCalculation.swift */; };
9818E01A28B63C49004AA524 /* EighthsCompoundCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818E01928B63C49004AA524 /* EighthsCompoundCalculation.swift */; };
98192DDA270F606C00015E66 /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98192DD9270F606C00015E66 /* Debounce.swift */; };
98192DDE2717201100015E66 /* ReverseAllManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98192DDD2717201000015E66 /* ReverseAllManager.swift */; };
981F27D12340E3E1006CD263 /* InternetAccessPolicy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 981F27D02340E3E1006CD263 /* InternetAccessPolicy.plist */; };
9821402122B3884600ABFB3F /* BottomHalfCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821402022B3884600ABFB3F /* BottomHalfCalculation.swift */; };
9821402322B3886100ABFB3F /* CenterCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821402222B3886100ABFB3F /* CenterCalculation.swift */; };
9821402522B3887200ABFB3F /* MaximizeCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821402422B3887200ABFB3F /* MaximizeCalculation.swift */; };
9821402722B3888100ABFB3F /* ChangeSizeCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821402622B3888100ABFB3F /* ChangeSizeCalculation.swift */; };
9821402922B3889100ABFB3F /* LowerLeftCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821402822B3889100ABFB3F /* LowerLeftCalculation.swift */; };
9821402B22B388A000ABFB3F /* LowerRightCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821402A22B388A000ABFB3F /* LowerRightCalculation.swift */; };
9821403122B38A0500ABFB3F /* TopHalfCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821403022B38A0500ABFB3F /* TopHalfCalculation.swift */; };
9821403322B38A1B00ABFB3F /* UpperLeftCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821403222B38A1B00ABFB3F /* UpperLeftCalculation.swift */; };
9821403522B38A2B00ABFB3F /* UpperRightCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821403422B38A2B00ABFB3F /* UpperRightCalculation.swift */; };
9821403722B3D16700ABFB3F /* MaximizeHeightCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821403622B3D16700ABFB3F /* MaximizeHeightCalculation.swift */; };
9821403F22B3EBD900ABFB3F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821403E22B3EBD900ABFB3F /* AppDelegate.swift */; };
9821404322B3EBDA00ABFB3F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9821404222B3EBDA00ABFB3F /* Assets.xcassets */; };
9821404622B3EBDA00ABFB3F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9821404422B3EBDA00ABFB3F /* Main.storyboard */; };
9821405B22B3ECCA00ABFB3F /* RectangleLauncher.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9821403C22B3EBD900ABFB3F /* RectangleLauncher.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
9821405E22B3ED3600ABFB3F /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9821405D22B3ED3600ABFB3F /* ServiceManagement.framework */; };
9821406022B3EFB200ABFB3F /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9821405F22B3EFB200ABFB3F /* Defaults.swift */; };
9824700D22AF9B7D0037B409 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824700C22AF9B7D0037B409 /* AppDelegate.swift */; };
9824701122AF9B7E0037B409 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9824701022AF9B7E0037B409 /* Assets.xcassets */; };
9824701422AF9B7E0037B409 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9824701222AF9B7E0037B409 /* Main.storyboard */; };
9824702022AF9B7E0037B409 /* RectangleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824701F22AF9B7E0037B409 /* RectangleTests.swift */; };
9824702C22AFA22E0037B409 /* AccessibilityWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824702A22AFA22E0037B409 /* AccessibilityWindowController.swift */; };
9824702F22AFA2E50037B409 /* AccessibilityAuthorization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824702E22AFA2E50037B409 /* AccessibilityAuthorization.swift */; };
9824703122AFA8470037B409 /* RectangleStatusItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824703022AFA8470037B409 /* RectangleStatusItem.swift */; };
9824703722B0F3200037B409 /* WindowAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824703622B0F3200037B409 /* WindowAction.swift */; };
9824703922B0F37C0037B409 /* ShortcutManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824703822B0F37C0037B409 /* ShortcutManager.swift */; };
9824703B22B139780037B409 /* CUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824703A22B139780037B409 /* CUtil.swift */; };
9824703D22B13C7E0037B409 /* AccessibilityElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824703C22B13C7E0037B409 /* AccessibilityElement.swift */; };
9824703F22B13FBC0037B409 /* ScreenDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824703E22B13FBC0037B409 /* ScreenDetection.swift */; };
9824704122B186D00037B409 /* WindowManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824704022B186D00037B409 /* WindowManager.swift */; };
9824704B22B189250037B409 /* StandardWindowMover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824704622B189240037B409 /* StandardWindowMover.swift */; };
9824704C22B189250037B409 /* WindowMover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824704722B189240037B409 /* WindowMover.swift */; };
9824704D22B189250037B409 /* WindowCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824704822B189250037B409 /* WindowCalculation.swift */; };
9824704E22B189250037B409 /* QuantizedWindowMover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824704922B189250037B409 /* QuantizedWindowMover.swift */; };
9824704F22B189250037B409 /* BestEffortWindowMover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824704A22B189250037B409 /* BestEffortWindowMover.swift */; };
9824705122B28D7A0037B409 /* LeftRightHalfCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9824705022B28D7A0037B409 /* LeftRightHalfCalculation.swift */; };
983BBD6F253B609D000D223E /* FootprintWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 983BBD6E253B609D000D223E /* FootprintWindow.swift */; };
983DD04028A844BE00BF1EEE /* SnapAreaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 983DD03F28A844BE00BF1EEE /* SnapAreaViewController.swift */; };
983DD04428B0639E00BF1EEE /* SnapAreaModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 983DD04328B0639E00BF1EEE /* SnapAreaModel.swift */; };
984EDB0F29A42ED200D119D2 /* LaunchOnLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984EDB0E29A42ED200D119D2 /* LaunchOnLogin.swift */; };
9851A5C3251BEBA300ECF78C /* OrientationAware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9851A5C2251BEBA300ECF78C /* OrientationAware.swift */; };
985B9BF522B93EEC00A2E8F0 /* ApplicationToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985B9BF422B93EEC00A2E8F0 /* ApplicationToggle.swift */; };
985B9BF822BB6F5100A2E8F0 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 985B9BF622BB6F5000A2E8F0 /* MessageView.xib */; };
985B9BF922BB6F5100A2E8F0 /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985B9BF722BB6F5000A2E8F0 /* MessageView.swift */; };
9877B63A29C8AC0E00F02D74 /* MASShortcut in Frameworks */ = {isa = PBXBuildFile; productRef = 9877B63929C8AC0E00F02D74 /* MASShortcut */; };
9877B63D29C8AC3600F02D74 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 9877B63C29C8AC3600F02D74 /* Sparkle */; };
988D066122EB4C7C004EABD7 /* FirstThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988D066022EB4C7C004EABD7 /* FirstThirdCalculation.swift */; };
988D066322EB4CA5004EABD7 /* FirstTwoThirdsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988D066222EB4CA5004EABD7 /* FirstTwoThirdsCalculation.swift */; };
988D066522EB4CB6004EABD7 /* CenterThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988D066422EB4CB5004EABD7 /* CenterThirdCalculation.swift */; };
988D066722EB4CC0004EABD7 /* LastTwoThirdsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988D066622EB4CC0004EABD7 /* LastTwoThirdsCalculation.swift */; };
988D066922EB4CCB004EABD7 /* LastThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988D066822EB4CCB004EABD7 /* LastThirdCalculation.swift */; };
988D067D22EB4E17004EABD7 /* AlmostMaximizeCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988D067C22EB4E17004EABD7 /* AlmostMaximizeCalculation.swift */; };
988D067F22EB4EDE004EABD7 /* MoveLeftRightCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988D067E22EB4EDE004EABD7 /* MoveLeftRightCalculation.swift */; };
988D068322EB4EF3004EABD7 /* MoveUpDownCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988D068222EB4EF3004EABD7 /* MoveUpDownCalculation.swift */; };
98910B3E231130AF0066EC23 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98910B3D231130AF0066EC23 /* SettingsViewController.swift */; };
98987AA42391890400BE72C4 /* LogViewer.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 98987AA22391890300BE72C4 /* LogViewer.storyboard */; };
98987AA52391890400BE72C4 /* LogViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98987AA32391890400BE72C4 /* LogViewer.swift */; };
989DA30E243FC0DF008C7AA4 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 989DA30D243FC0DF008C7AA4 /* WelcomeViewController.swift */; };
98A009AB2512491300CFBF0C /* CenterHalfCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009AA2512491300CFBF0C /* CenterHalfCalculation.swift */; };
98A009AD2512498000CFBF0C /* FirstFourthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009AC2512498000CFBF0C /* FirstFourthCalculation.swift */; };
98A009AF2512517900CFBF0C /* SecondFourthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009AE2512517900CFBF0C /* SecondFourthCalculation.swift */; };
98A009B1251252C900CFBF0C /* ThirdFourthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009B0251252C900CFBF0C /* ThirdFourthCalculation.swift */; };
98A009B32512536900CFBF0C /* LastFourthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009B22512536800CFBF0C /* LastFourthCalculation.swift */; };
98A009B52512537800CFBF0C /* TopLeftSixthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009B42512537800CFBF0C /* TopLeftSixthCalculation.swift */; };
98A009B72512538200CFBF0C /* TopCenterSixthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009B62512538200CFBF0C /* TopCenterSixthCalculation.swift */; };
98A009B92512538D00CFBF0C /* TopRightSixthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009B82512538D00CFBF0C /* TopRightSixthCalculation.swift */; };
98A009BB2512539900CFBF0C /* BottomLeftSixthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009BA2512539900CFBF0C /* BottomLeftSixthCalculation.swift */; };
98A009BD251253A000CFBF0C /* BottomCenterSixthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009BC251253A000CFBF0C /* BottomCenterSixthCalculation.swift */; };
98A009BF251253AB00CFBF0C /* BottomRightSixthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A009BE251253AB00CFBF0C /* BottomRightSixthCalculation.swift */; };
98A6EDDD251F3F4A00F74B10 /* SixthsRepeated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A6EDDC251F3F4A00F74B10 /* SixthsRepeated.swift */; };
BB0000000000000000000001 /* QuartersRepeated.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0000000000000000000002 /* QuartersRepeated.swift */; };
98A6EDEC2528FFC100F74B10 /* WindowActionCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A6EDEB2528FFC100F74B10 /* WindowActionCategory.swift */; };
98B3559823CE025700E410E0 /* CenteringFixedSizedWindowMover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B3559723CE025700E410E0 /* CenteringFixedSizedWindowMover.swift */; };
98BEFA482620DEDD00D9D54F /* NSImageExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98BEFA472620DEDC00D9D54F /* NSImageExtension.swift */; };
98C1008C2305F1FA006E5344 /* SubsequentExecutionMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C1008B2305F1FA006E5344 /* SubsequentExecutionMode.swift */; };
98C1008E230B9EF6006E5344 /* NextPrevDisplayCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C1008D230B9EF6006E5344 /* NextPrevDisplayCalculation.swift */; };
98C2755E231FF6A9009B9292 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C2755D231FF6A9009B9292 /* EventMonitor.swift */; };
98C27561231FFA5F009B9292 /* SnappingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C27560231FFA5F009B9292 /* SnappingManager.swift */; };
98C275672322E2DA009B9292 /* WindowHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C275662322E2DA009B9292 /* WindowHistory.swift */; };
98C6DEF023CE191700CC0C1E /* GapCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C6DEEF23CE191700CC0C1E /* GapCalculation.swift */; };
98C97FFD25893B040061F01F /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C97FFC25893B040061F01F /* Config.swift */; };
98D1441324560B1E0090C603 /* AlertUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D1441224560B1E0090C603 /* AlertUtil.swift */; };
98D16A442592AD55005228CB /* MASShortcutMigration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D16A432592AD55005228CB /* MASShortcutMigration.swift */; };
98D16A492592B460005228CB /* NotificationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D16A482592B460005228CB /* NotificationExtension.swift */; };
98D4B6C525B6256C009C7BF6 /* TodoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D4B6C425B6256C009C7BF6 /* TodoManager.swift */; };
98FA9497235A2D7600F95C4F /* RepeatedExecutionsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98FA9496235A2D7600F95C4F /* RepeatedExecutionsCalculation.swift */; };
98FD7C5F2687BC14009E9DAF /* FirstThreeFourthsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98FD7C5E2687BC14009E9DAF /* FirstThreeFourthsCalculation.swift */; };
98FD7C612687BCB6009E9DAF /* LastThreeFourthsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98FD7C602687BCB6009E9DAF /* LastThreeFourthsCalculation.swift */; };
9FF740232E34DE9000D22955 /* CenterThreeFourthsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF740222E34DE9000D22955 /* CenterThreeFourthsCalculation.swift */; };
AA040C67290B2640003181D5 /* RunLoopThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA040C66290B2640003181D5 /* RunLoopThread.swift */; };
AA0AC000291C1B5E00D125D2 /* CGExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA0ABFFF291C1B5E00D125D2 /* CGExtension.swift */; };
AA0AC002291C1B9100D125D2 /* AXExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA0AC001291C1B9100D125D2 /* AXExtension.swift */; };
AA0AC004291C48DE00D125D2 /* SequenceExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA0AC003291C48DE00D125D2 /* SequenceExtension.swift */; };
AA0ACC2F2864A86D0025E376 /* StageUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA0ACC2E2864A86D0025E376 /* StageUtil.swift */; };
AA3A9E8B29230A82004EB8E5 /* CFExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3A9E8A29230A82004EB8E5 /* CFExtension.swift */; };
AA49DD1129B8C1B100690E13 /* TitleBarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA49DD1029B8C1B100690E13 /* TitleBarManager.swift */; };
AA4DA2FB28FDC94A00355CEB /* DispatchTimeExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA4DA2FA28FDC94A00355CEB /* DispatchTimeExtension.swift */; };
AA536C2729005DD000579AC6 /* TimeoutCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA536C2629005DD000579AC6 /* TimeoutCache.swift */; };
AA69F83C29909A95001A81AF /* RightTodoCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA69F83B29909A95001A81AF /* RightTodoCalculation.swift */; };
AA69F8402992DCB1001A81AF /* LeftTodoCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA69F83F2992DCB1001A81AF /* LeftTodoCalculation.swift */; };
AAADE1AF28CBAB0000036331 /* WindowUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAADE1AE28CBAB0000036331 /* WindowUtil.swift */; };
B4521F932BD7CEFB00FD43CC /* ChangeWindowDimensionCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4521F922BD7CEFB00FD43CC /* ChangeWindowDimensionCalculation.swift */; };
B4780A322BD4C75900732B9E /* HalfOrDoubleDimensionCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4780A312BD4C75900732B9E /* HalfOrDoubleDimensionCalculation.swift */; };
BB0B80492EFB0AF900A9B165 /* TopVerticalTwoThirdsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B80482EFB0AF900A9B165 /* TopVerticalTwoThirdsCalculation.swift */; };
BB0B804A2EFB0AF900A9B165 /* MiddleVerticalThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B80462EFB0AF900A9B165 /* MiddleVerticalThirdCalculation.swift */; };
BB0B804B2EFB0AF900A9B165 /* BottomVerticalTwoThirdsCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B80452EFB0AF900A9B165 /* BottomVerticalTwoThirdsCalculation.swift */; };
BB0B804C2EFB0AF900A9B165 /* BottomVerticalThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B80442EFB0AF900A9B165 /* BottomVerticalThirdCalculation.swift */; };
BB0B804D2EFB0AF900A9B165 /* TopVerticalThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B80472EFB0AF900A9B165 /* TopVerticalThirdCalculation.swift */; };
D0423D8327A8D31D008A4894 /* HorizontalThirdsRepeated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0423D8227A8D31D008A4894 /* HorizontalThirdsRepeated.swift */; };
D04CE3002781794E00BD47B3 /* TopLeftNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE2FF2781794E00BD47B3 /* TopLeftNinthCalculation.swift */; };
D04CE30227817A6100BD47B3 /* TopCenterNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE30127817A6100BD47B3 /* TopCenterNinthCalculation.swift */; };
D04CE30427817A6F00BD47B3 /* TopRightNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE30327817A6F00BD47B3 /* TopRightNinthCalculation.swift */; };
D04CE30627817A8400BD47B3 /* MiddleLeftNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE30527817A8400BD47B3 /* MiddleLeftNinthCalculation.swift */; };
D04CE30827817A9200BD47B3 /* MiddleCenterNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE30727817A9200BD47B3 /* MiddleCenterNinthCalculation.swift */; };
D04CE30A27817A9F00BD47B3 /* MiddleRightNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE30927817A9F00BD47B3 /* MiddleRightNinthCalculation.swift */; };
D04CE30C27817AA900BD47B3 /* BottomLeftNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE30B27817AA900BD47B3 /* BottomLeftNinthCalculation.swift */; };
D04CE30E27817AB500BD47B3 /* BottomCenterNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE30D27817AB500BD47B3 /* BottomCenterNinthCalculation.swift */; };
D04CE31027817ABE00BD47B3 /* BottomRightNinthCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE30F27817ABE00BD47B3 /* BottomRightNinthCalculation.swift */; };
D04CE31227817C9B00BD47B3 /* NinthsRepeated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04CE31127817C9B00BD47B3 /* NinthsRepeated.swift */; };
D0CFE33127A8CAED004DA47B /* TopLeftThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFE33027A8CAED004DA47B /* TopLeftThirdCalculation.swift */; };
D0CFE33327A8CCB1004DA47B /* TopRightThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFE33227A8CCB1004DA47B /* TopRightThirdCalculation.swift */; };
D0CFE33527A8CD16004DA47B /* BottomLeftThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFE33427A8CD16004DA47B /* BottomLeftThirdCalculation.swift */; };
D0CFE33727A8CD51004DA47B /* BottomRightThirdCalculation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CFE33627A8CD51004DA47B /* BottomRightThirdCalculation.swift */; };
FDE8FCE027C2950400EACCAA /* MultiWindowManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDE8FCDF27C2950400EACCAA /* MultiWindowManager.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
9824701C22AF9B7E0037B409 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 9824700122AF9B7D0037B409 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 9824700822AF9B7D0037B409;
remoteInfo = Rectangle;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
9821405A22B3EC9900ABFB3F /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = Contents/Library/LoginItems;
dstSubfolderSpec = 1;
files = (
9821405B22B3ECCA00ABFB3F /* RectangleLauncher.app in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
30166BCF24F27D6A00A38608 /* SpecifiedCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpecifiedCalculation.swift; sourceTree = ""; };
423DC1992AE681F900C98564 /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/Main.xcstrings; sourceTree = ""; };
42627A972ADA03D200D047C6 /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/Main.xcstrings; sourceTree = ""; };
482E9E412EB1528D00D7928A /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = ""; };
6490B39027BF907A0056C220 /* BottomLeftEighthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomLeftEighthCalculation.swift; sourceTree = ""; };
6490B39227BF90F90056C220 /* EighthsRepeated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EighthsRepeated.swift; sourceTree = ""; };
6490B39427BF96880056C220 /* TopLeftEighthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopLeftEighthCalculation.swift; sourceTree = ""; };
6490B39627BF96EA0056C220 /* TopCenterLeftEighthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopCenterLeftEighthCalculation.swift; sourceTree = ""; };
6490B39827BF97BB0056C220 /* TopCenterRightEighthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopCenterRightEighthCalculation.swift; sourceTree = ""; };
6490B39A27BF980F0056C220 /* TopRightEighthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopRightEighthCalculation.swift; sourceTree = ""; };
6490B39C27BF984D0056C220 /* BottomCenterLeftEighthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCenterLeftEighthCalculation.swift; sourceTree = ""; };
6490B39E27BF98840056C220 /* BottomCenterRightEighthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCenterRightEighthCalculation.swift; sourceTree = ""; };
6490B3A027BF98C70056C220 /* BottomRightEighthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomRightEighthCalculation.swift; sourceTree = ""; };
F3592F8E85CE82B8FA662A31 /* TwelfthsRepeated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwelfthsRepeated.swift; sourceTree = ""; };
D9FDCA1333C1BF6930A8D7F3 /* TopLeftTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopLeftTwelfthCalculation.swift; sourceTree = ""; };
9698D1D9EE0180D7C4468304 /* TopCenterLeftTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopCenterLeftTwelfthCalculation.swift; sourceTree = ""; };
A4D034DBD7EFAC4CF5F8D67B /* TopCenterRightTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopCenterRightTwelfthCalculation.swift; sourceTree = ""; };
7E8357E928530D10A806F3CD /* TopRightTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopRightTwelfthCalculation.swift; sourceTree = ""; };
EEABF10E66D648DDB37DABBA /* MiddleLeftTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiddleLeftTwelfthCalculation.swift; sourceTree = ""; };
5070DE9100E45D374053F0C2 /* MiddleCenterLeftTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiddleCenterLeftTwelfthCalculation.swift; sourceTree = ""; };
BCF2AC59501448BD3BAA16EC /* MiddleCenterRightTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiddleCenterRightTwelfthCalculation.swift; sourceTree = ""; };
AA84AB4DB9E7EEFCE50AA6D8 /* MiddleRightTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiddleRightTwelfthCalculation.swift; sourceTree = ""; };
246168B345ECE6C375ACEEB7 /* BottomLeftTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomLeftTwelfthCalculation.swift; sourceTree = ""; };
71FE3EBE50F91F9EE2989279 /* BottomCenterLeftTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCenterLeftTwelfthCalculation.swift; sourceTree = ""; };
C1A362206B9F76C269D8F469 /* BottomCenterRightTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCenterRightTwelfthCalculation.swift; sourceTree = ""; };
D7D038C68560DC11F14496F6 /* BottomRightTwelfthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomRightTwelfthCalculation.swift; sourceTree = ""; };
16B4044DB4809116039F96EB /* SixteenthsRepeated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SixteenthsRepeated.swift; sourceTree = ""; };
6294D2CB6E3D8ED982F418AE /* TopLeftSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopLeftSixteenthCalculation.swift; sourceTree = ""; };
5BE9E5E2C8BA2590DD0B6F59 /* TopCenterLeftSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopCenterLeftSixteenthCalculation.swift; sourceTree = ""; };
918F847FF15D524B6DB2E6DA /* TopCenterRightSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopCenterRightSixteenthCalculation.swift; sourceTree = ""; };
FD222258713B13274FB651B0 /* TopRightSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopRightSixteenthCalculation.swift; sourceTree = ""; };
84E2DBE0733F31BC159BC99C /* UpperMiddleLeftSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpperMiddleLeftSixteenthCalculation.swift; sourceTree = ""; };
8B8CA6901E6FE134E930135B /* UpperMiddleCenterLeftSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpperMiddleCenterLeftSixteenthCalculation.swift; sourceTree = ""; };
BEBF3EA35F0C110A170EAD33 /* UpperMiddleCenterRightSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpperMiddleCenterRightSixteenthCalculation.swift; sourceTree = ""; };
A3B5B09465C38F8B766B3C3C /* UpperMiddleRightSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpperMiddleRightSixteenthCalculation.swift; sourceTree = ""; };
C796BCAA3DA5F85B55A7EE83 /* LowerMiddleLeftSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LowerMiddleLeftSixteenthCalculation.swift; sourceTree = ""; };
378C96D832D4CC6BCCF9D604 /* LowerMiddleCenterLeftSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LowerMiddleCenterLeftSixteenthCalculation.swift; sourceTree = ""; };
8AE08B666CCCD1805CAB08BD /* LowerMiddleCenterRightSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LowerMiddleCenterRightSixteenthCalculation.swift; sourceTree = ""; };
87EC57F37CFD790695177AC8 /* LowerMiddleRightSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LowerMiddleRightSixteenthCalculation.swift; sourceTree = ""; };
FEE147786B2CD7350FAFB700 /* BottomLeftSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomLeftSixteenthCalculation.swift; sourceTree = ""; };
88454ABE5C62BD610AEA3EB5 /* BottomCenterLeftSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCenterLeftSixteenthCalculation.swift; sourceTree = ""; };
D24EBF1F9A6209449A988E15 /* BottomCenterRightSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCenterRightSixteenthCalculation.swift; sourceTree = ""; };
482EA970820F37C6917FCD98 /* BottomRightSixteenthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomRightSixteenthCalculation.swift; sourceTree = ""; };
729E0A972AFF76B1006E2F48 /* CenterProminentlyCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterProminentlyCalculation.swift; sourceTree = ""; };
74804F0A2E25521C009F1F7D /* CenterTwoThirdsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterTwoThirdsCalculation.swift; sourceTree = ""; };
7BE578EE2C5BF4ED0083DAE3 /* CycleSize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CycleSize.swift; sourceTree = ""; };
866661F1257D248A00A9CD2D /* RepeatedExecutionsInThirdsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepeatedExecutionsInThirdsCalculation.swift; sourceTree = ""; };
944F25CC2CE5A144004B2FD2 /* PrefsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefsViewController.swift; sourceTree = ""; };
94E9B08D2C3B8D97004C7F41 /* MacTilingDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacTilingDefaults.swift; sourceTree = ""; };
94E9B08F2C3E4578004C7F41 /* StringExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = ""; };
9808018523D05C0B0077774A /* RectangleRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RectangleRelease.entitlements; sourceTree = ""; };
9808018623D05C1F0077774A /* RectangleLauncherRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RectangleLauncherRelease.entitlements; sourceTree = ""; };
9818E00C28B59205004AA524 /* CompoundSnapArea.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompoundSnapArea.swift; sourceTree = ""; };
9818E00F28B59396004AA524 /* HalvesCompoundCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HalvesCompoundCalculation.swift; sourceTree = ""; };
9818E01128B59B64004AA524 /* ThirdsCompoundCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdsCompoundCalculation.swift; sourceTree = ""; };
9818E01328B5A4FD004AA524 /* SixthsCompoundCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SixthsCompoundCalculation.swift; sourceTree = ""; };
9818E01728B63C48004AA524 /* FourthsCompoundCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FourthsCompoundCalculation.swift; sourceTree = ""; };
9818E01928B63C49004AA524 /* EighthsCompoundCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EighthsCompoundCalculation.swift; sourceTree = ""; };
98192DD9270F606C00015E66 /* Debounce.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Debounce.swift; sourceTree = ""; };
98192DDD2717201000015E66 /* ReverseAllManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReverseAllManager.swift; sourceTree = ""; };
981F27D02340E3E1006CD263 /* InternetAccessPolicy.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = InternetAccessPolicy.plist; sourceTree = ""; };
9821402022B3884600ABFB3F /* BottomHalfCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomHalfCalculation.swift; sourceTree = ""; };
9821402222B3886100ABFB3F /* CenterCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterCalculation.swift; sourceTree = ""; };
9821402422B3887200ABFB3F /* MaximizeCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaximizeCalculation.swift; sourceTree = ""; };
9821402622B3888100ABFB3F /* ChangeSizeCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeSizeCalculation.swift; sourceTree = ""; };
9821402822B3889100ABFB3F /* LowerLeftCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LowerLeftCalculation.swift; sourceTree = ""; };
9821402A22B388A000ABFB3F /* LowerRightCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LowerRightCalculation.swift; sourceTree = ""; };
9821403022B38A0500ABFB3F /* TopHalfCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopHalfCalculation.swift; sourceTree = ""; };
9821403222B38A1B00ABFB3F /* UpperLeftCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpperLeftCalculation.swift; sourceTree = ""; };
9821403422B38A2B00ABFB3F /* UpperRightCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpperRightCalculation.swift; sourceTree = ""; };
9821403622B3D16700ABFB3F /* MaximizeHeightCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaximizeHeightCalculation.swift; sourceTree = ""; };
9821403C22B3EBD900ABFB3F /* RectangleLauncher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RectangleLauncher.app; sourceTree = BUILT_PRODUCTS_DIR; };
9821403E22B3EBD900ABFB3F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
9821404222B3EBDA00ABFB3F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
9821404522B3EBDA00ABFB3F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
9821404722B3EBDA00ABFB3F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
9821404822B3EBDA00ABFB3F /* RectangleLauncher.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RectangleLauncher.entitlements; sourceTree = ""; };
9821405D22B3ED3600ABFB3F /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
9821405F22B3EFB200ABFB3F /* Defaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Defaults.swift; sourceTree = ""; };
9821552627BFFB13002523EC /* Rectangle-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Rectangle-Bridging-Header.h"; sourceTree = ""; };
9824700922AF9B7D0037B409 /* Rectangle.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Rectangle.app; sourceTree = BUILT_PRODUCTS_DIR; };
9824700C22AF9B7D0037B409 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
9824701022AF9B7E0037B409 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
9824701322AF9B7E0037B409 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
9824701522AF9B7E0037B409 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
9824701622AF9B7E0037B409 /* Rectangle.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Rectangle.entitlements; sourceTree = ""; };
9824701B22AF9B7E0037B409 /* RectangleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RectangleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
9824701F22AF9B7E0037B409 /* RectangleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RectangleTests.swift; sourceTree = ""; };
9824702122AF9B7E0037B409 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
9824702A22AFA22E0037B409 /* AccessibilityWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibilityWindowController.swift; sourceTree = ""; };
9824702E22AFA2E50037B409 /* AccessibilityAuthorization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityAuthorization.swift; sourceTree = ""; };
9824703022AFA8470037B409 /* RectangleStatusItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RectangleStatusItem.swift; sourceTree = ""; };
9824703622B0F3200037B409 /* WindowAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowAction.swift; sourceTree = ""; };
9824703822B0F37C0037B409 /* ShortcutManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutManager.swift; sourceTree = ""; };
9824703A22B139780037B409 /* CUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CUtil.swift; sourceTree = ""; };
9824703C22B13C7E0037B409 /* AccessibilityElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityElement.swift; sourceTree = ""; };
9824703E22B13FBC0037B409 /* ScreenDetection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenDetection.swift; sourceTree = ""; };
9824704022B186D00037B409 /* WindowManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowManager.swift; sourceTree = ""; };
9824704622B189240037B409 /* StandardWindowMover.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StandardWindowMover.swift; sourceTree = ""; };
9824704722B189240037B409 /* WindowMover.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowMover.swift; sourceTree = ""; };
9824704822B189250037B409 /* WindowCalculation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowCalculation.swift; sourceTree = ""; };
9824704922B189250037B409 /* QuantizedWindowMover.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuantizedWindowMover.swift; sourceTree = ""; };
9824704A22B189250037B409 /* BestEffortWindowMover.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BestEffortWindowMover.swift; sourceTree = ""; };
9824705022B28D7A0037B409 /* LeftRightHalfCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeftRightHalfCalculation.swift; sourceTree = ""; };
983BBD6E253B609D000D223E /* FootprintWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FootprintWindow.swift; sourceTree = ""; };
983DD03F28A844BE00BF1EEE /* SnapAreaViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapAreaViewController.swift; sourceTree = ""; };
983DD04328B0639E00BF1EEE /* SnapAreaModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapAreaModel.swift; sourceTree = ""; };
984EDB0E29A42ED200D119D2 /* LaunchOnLogin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchOnLogin.swift; sourceTree = ""; };
9851A5C2251BEBA300ECF78C /* OrientationAware.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrientationAware.swift; sourceTree = ""; };
985B9BF422B93EEC00A2E8F0 /* ApplicationToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationToggle.swift; sourceTree = ""; };
985B9BF622BB6F5000A2E8F0 /* MessageView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MessageView.xib; sourceTree = ""; };
985B9BF722BB6F5000A2E8F0 /* MessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = ""; };
988D066022EB4C7C004EABD7 /* FirstThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstThirdCalculation.swift; sourceTree = ""; };
988D066222EB4CA5004EABD7 /* FirstTwoThirdsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstTwoThirdsCalculation.swift; sourceTree = ""; };
988D066422EB4CB5004EABD7 /* CenterThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterThirdCalculation.swift; sourceTree = ""; };
988D066622EB4CC0004EABD7 /* LastTwoThirdsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastTwoThirdsCalculation.swift; sourceTree = ""; };
988D066822EB4CCB004EABD7 /* LastThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastThirdCalculation.swift; sourceTree = ""; };
988D067C22EB4E17004EABD7 /* AlmostMaximizeCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlmostMaximizeCalculation.swift; sourceTree = ""; };
988D067E22EB4EDE004EABD7 /* MoveLeftRightCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoveLeftRightCalculation.swift; sourceTree = ""; };
988D068222EB4EF3004EABD7 /* MoveUpDownCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoveUpDownCalculation.swift; sourceTree = ""; };
98910B3D231130AF0066EC23 /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; };
98987AA22391890300BE72C4 /* LogViewer.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LogViewer.storyboard; sourceTree = ""; };
98987AA32391890400BE72C4 /* LogViewer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogViewer.swift; sourceTree = ""; };
989DA30D243FC0DF008C7AA4 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = ""; };
98A009AA2512491300CFBF0C /* CenterHalfCalculation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CenterHalfCalculation.swift; sourceTree = ""; };
98A009AC2512498000CFBF0C /* FirstFourthCalculation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstFourthCalculation.swift; sourceTree = ""; };
98A009AE2512517900CFBF0C /* SecondFourthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondFourthCalculation.swift; sourceTree = ""; };
98A009B0251252C900CFBF0C /* ThirdFourthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdFourthCalculation.swift; sourceTree = ""; };
98A009B22512536800CFBF0C /* LastFourthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastFourthCalculation.swift; sourceTree = ""; };
98A009B42512537800CFBF0C /* TopLeftSixthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopLeftSixthCalculation.swift; sourceTree = ""; };
98A009B62512538200CFBF0C /* TopCenterSixthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopCenterSixthCalculation.swift; sourceTree = ""; };
98A009B82512538D00CFBF0C /* TopRightSixthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopRightSixthCalculation.swift; sourceTree = ""; };
98A009BA2512539900CFBF0C /* BottomLeftSixthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomLeftSixthCalculation.swift; sourceTree = ""; };
98A009BC251253A000CFBF0C /* BottomCenterSixthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCenterSixthCalculation.swift; sourceTree = ""; };
98A009BE251253AB00CFBF0C /* BottomRightSixthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomRightSixthCalculation.swift; sourceTree = ""; };
98A6EDDC251F3F4A00F74B10 /* SixthsRepeated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SixthsRepeated.swift; sourceTree = ""; };
BB0000000000000000000002 /* QuartersRepeated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuartersRepeated.swift; sourceTree = ""; };
98A6EDEB2528FFC100F74B10 /* WindowActionCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowActionCategory.swift; sourceTree = ""; };
98B3559723CE025700E410E0 /* CenteringFixedSizedWindowMover.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenteringFixedSizedWindowMover.swift; sourceTree = ""; };
98BEFA472620DEDC00D9D54F /* NSImageExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImageExtension.swift; sourceTree = ""; };
98C1008B2305F1FA006E5344 /* SubsequentExecutionMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubsequentExecutionMode.swift; sourceTree = ""; };
98C1008D230B9EF6006E5344 /* NextPrevDisplayCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextPrevDisplayCalculation.swift; sourceTree = ""; };
98C2755D231FF6A9009B9292 /* EventMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventMonitor.swift; sourceTree = ""; };
98C27560231FFA5F009B9292 /* SnappingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnappingManager.swift; sourceTree = ""; };
98C275662322E2DA009B9292 /* WindowHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowHistory.swift; sourceTree = ""; };
98C6DEEF23CE191700CC0C1E /* GapCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GapCalculation.swift; sourceTree = ""; };
98C97FFC25893B040061F01F /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; };
98D1441224560B1E0090C603 /* AlertUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertUtil.swift; sourceTree = ""; };
98D16A432592AD55005228CB /* MASShortcutMigration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MASShortcutMigration.swift; sourceTree = ""; };
98D16A482592B460005228CB /* NotificationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationExtension.swift; sourceTree = ""; };
98D4B6C425B6256C009C7BF6 /* TodoManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoManager.swift; sourceTree = ""; };
98FA9496235A2D7600F95C4F /* RepeatedExecutionsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepeatedExecutionsCalculation.swift; sourceTree = ""; };
98FD7C5E2687BC14009E9DAF /* FirstThreeFourthsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstThreeFourthsCalculation.swift; sourceTree = ""; };
98FD7C602687BCB6009E9DAF /* LastThreeFourthsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastThreeFourthsCalculation.swift; sourceTree = ""; };
9FF740222E34DE9000D22955 /* CenterThreeFourthsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterThreeFourthsCalculation.swift; sourceTree = ""; };
AA040C66290B2640003181D5 /* RunLoopThread.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunLoopThread.swift; sourceTree = ""; };
AA0ABFFF291C1B5E00D125D2 /* CGExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CGExtension.swift; sourceTree = ""; };
AA0AC001291C1B9100D125D2 /* AXExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AXExtension.swift; sourceTree = ""; };
AA0AC003291C48DE00D125D2 /* SequenceExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SequenceExtension.swift; sourceTree = ""; };
AA0ACC2E2864A86D0025E376 /* StageUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StageUtil.swift; sourceTree = ""; };
AA3A9E8A29230A82004EB8E5 /* CFExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CFExtension.swift; sourceTree = ""; };
AA49DD1029B8C1B100690E13 /* TitleBarManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleBarManager.swift; sourceTree = ""; };
AA4DA2FA28FDC94A00355CEB /* DispatchTimeExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DispatchTimeExtension.swift; sourceTree = ""; };
AA536C2629005DD000579AC6 /* TimeoutCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeoutCache.swift; sourceTree = ""; };
AA69F83B29909A95001A81AF /* RightTodoCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RightTodoCalculation.swift; sourceTree = ""; };
AA69F83F2992DCB1001A81AF /* LeftTodoCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeftTodoCalculation.swift; sourceTree = ""; };
AAADE1AE28CBAB0000036331 /* WindowUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowUtil.swift; sourceTree = ""; };
B4521F922BD7CEFB00FD43CC /* ChangeWindowDimensionCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeWindowDimensionCalculation.swift; sourceTree = ""; };
B4780A312BD4C75900732B9E /* HalfOrDoubleDimensionCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HalfOrDoubleDimensionCalculation.swift; sourceTree = ""; };
BB0B80442EFB0AF900A9B165 /* BottomVerticalThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomVerticalThirdCalculation.swift; sourceTree = ""; };
BB0B80452EFB0AF900A9B165 /* BottomVerticalTwoThirdsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomVerticalTwoThirdsCalculation.swift; sourceTree = ""; };
BB0B80462EFB0AF900A9B165 /* MiddleVerticalThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiddleVerticalThirdCalculation.swift; sourceTree = ""; };
BB0B80472EFB0AF900A9B165 /* TopVerticalThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopVerticalThirdCalculation.swift; sourceTree = ""; };
BB0B80482EFB0AF900A9B165 /* TopVerticalTwoThirdsCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopVerticalTwoThirdsCalculation.swift; sourceTree = ""; };
D0423D8227A8D31D008A4894 /* HorizontalThirdsRepeated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HorizontalThirdsRepeated.swift; sourceTree = ""; };
D04CE2FF2781794E00BD47B3 /* TopLeftNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopLeftNinthCalculation.swift; sourceTree = ""; };
D04CE30127817A6100BD47B3 /* TopCenterNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopCenterNinthCalculation.swift; sourceTree = ""; };
D04CE30327817A6F00BD47B3 /* TopRightNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopRightNinthCalculation.swift; sourceTree = ""; };
D04CE30527817A8400BD47B3 /* MiddleLeftNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiddleLeftNinthCalculation.swift; sourceTree = ""; };
D04CE30727817A9200BD47B3 /* MiddleCenterNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiddleCenterNinthCalculation.swift; sourceTree = ""; };
D04CE30927817A9F00BD47B3 /* MiddleRightNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiddleRightNinthCalculation.swift; sourceTree = ""; };
D04CE30B27817AA900BD47B3 /* BottomLeftNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomLeftNinthCalculation.swift; sourceTree = ""; };
D04CE30D27817AB500BD47B3 /* BottomCenterNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCenterNinthCalculation.swift; sourceTree = ""; };
D04CE30F27817ABE00BD47B3 /* BottomRightNinthCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomRightNinthCalculation.swift; sourceTree = ""; };
D04CE31127817C9B00BD47B3 /* NinthsRepeated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NinthsRepeated.swift; sourceTree = ""; };
D0CFE33027A8CAED004DA47B /* TopLeftThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopLeftThirdCalculation.swift; sourceTree = ""; };
D0CFE33227A8CCB1004DA47B /* TopRightThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopRightThirdCalculation.swift; sourceTree = ""; };
D0CFE33427A8CD16004DA47B /* BottomLeftThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomLeftThirdCalculation.swift; sourceTree = ""; };
D0CFE33627A8CD51004DA47B /* BottomRightThirdCalculation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomRightThirdCalculation.swift; sourceTree = ""; };
FDE8FCDF27C2950400EACCAA /* MultiWindowManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiWindowManager.swift; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
9821403922B3EBD900ABFB3F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
9824700622AF9B7D0037B409 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9877B63A29C8AC0E00F02D74 /* MASShortcut in Frameworks */,
9877B63D29C8AC3600F02D74 /* Sparkle in Frameworks */,
9821405E22B3ED3600ABFB3F /* ServiceManagement.framework in Frameworks */,
12D896200936C0DE9FF41FB4 /* (null) in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
9824701822AF9B7E0037B409 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9818E00E28B5922A004AA524 /* CompoundSnapArea */ = {
isa = PBXGroup;
children = (
9818E00C28B59205004AA524 /* CompoundSnapArea.swift */,
9818E00F28B59396004AA524 /* HalvesCompoundCalculation.swift */,
9818E01128B59B64004AA524 /* ThirdsCompoundCalculation.swift */,
9818E01728B63C48004AA524 /* FourthsCompoundCalculation.swift */,
9818E01928B63C49004AA524 /* EighthsCompoundCalculation.swift */,
9818E01328B5A4FD004AA524 /* SixthsCompoundCalculation.swift */,
);
path = CompoundSnapArea;
sourceTree = "";
};
98192DDF2717201E00015E66 /* MultiWindow */ = {
isa = PBXGroup;
children = (
98192DDD2717201000015E66 /* ReverseAllManager.swift */,
FDE8FCDF27C2950400EACCAA /* MultiWindowManager.swift */,
);
path = MultiWindow;
sourceTree = "";
};
9821403D22B3EBD900ABFB3F /* RectangleLauncher */ = {
isa = PBXGroup;
children = (
9808018623D05C1F0077774A /* RectangleLauncherRelease.entitlements */,
9821403E22B3EBD900ABFB3F /* AppDelegate.swift */,
9821404222B3EBDA00ABFB3F /* Assets.xcassets */,
9821404422B3EBDA00ABFB3F /* Main.storyboard */,
9821404722B3EBDA00ABFB3F /* Info.plist */,
9821404822B3EBDA00ABFB3F /* RectangleLauncher.entitlements */,
);
path = RectangleLauncher;
sourceTree = "";
};
9821405C22B3ED3600ABFB3F /* Frameworks */ = {
isa = PBXGroup;
children = (
9821405D22B3ED3600ABFB3F /* ServiceManagement.framework */,
);
name = Frameworks;
sourceTree = "";
};
982140E922B7DA3100ABFB3F /* WindowCalculation */ = {
isa = PBXGroup;
children = (
BB0B80442EFB0AF900A9B165 /* BottomVerticalThirdCalculation.swift */,
BB0B80452EFB0AF900A9B165 /* BottomVerticalTwoThirdsCalculation.swift */,
BB0B80462EFB0AF900A9B165 /* MiddleVerticalThirdCalculation.swift */,
BB0B80472EFB0AF900A9B165 /* TopVerticalThirdCalculation.swift */,
BB0B80482EFB0AF900A9B165 /* TopVerticalTwoThirdsCalculation.swift */,
9FF740222E34DE9000D22955 /* CenterThreeFourthsCalculation.swift */,
74804F0A2E25521C009F1F7D /* CenterTwoThirdsCalculation.swift */,
98A009AA2512491300CFBF0C /* CenterHalfCalculation.swift */,
98A009AC2512498000CFBF0C /* FirstFourthCalculation.swift */,
98FD7C5E2687BC14009E9DAF /* FirstThreeFourthsCalculation.swift */,
98FD7C602687BCB6009E9DAF /* LastThreeFourthsCalculation.swift */,
98A009AE2512517900CFBF0C /* SecondFourthCalculation.swift */,
98A009B0251252C900CFBF0C /* ThirdFourthCalculation.swift */,
98A009B22512536800CFBF0C /* LastFourthCalculation.swift */,
98A009B42512537800CFBF0C /* TopLeftSixthCalculation.swift */,
98A009B62512538200CFBF0C /* TopCenterSixthCalculation.swift */,
98A009B82512538D00CFBF0C /* TopRightSixthCalculation.swift */,
98A009BA2512539900CFBF0C /* BottomLeftSixthCalculation.swift */,
98A009BC251253A000CFBF0C /* BottomCenterSixthCalculation.swift */,
98A009BE251253AB00CFBF0C /* BottomRightSixthCalculation.swift */,
9824704822B189250037B409 /* WindowCalculation.swift */,
9824705022B28D7A0037B409 /* LeftRightHalfCalculation.swift */,
9821402022B3884600ABFB3F /* BottomHalfCalculation.swift */,
9821403022B38A0500ABFB3F /* TopHalfCalculation.swift */,
9821402222B3886100ABFB3F /* CenterCalculation.swift */,
729E0A972AFF76B1006E2F48 /* CenterProminentlyCalculation.swift */,
9821402422B3887200ABFB3F /* MaximizeCalculation.swift */,
9821402622B3888100ABFB3F /* ChangeSizeCalculation.swift */,
B4780A312BD4C75900732B9E /* HalfOrDoubleDimensionCalculation.swift */,
9821402822B3889100ABFB3F /* LowerLeftCalculation.swift */,
9821402A22B388A000ABFB3F /* LowerRightCalculation.swift */,
9821403222B38A1B00ABFB3F /* UpperLeftCalculation.swift */,
9821403422B38A2B00ABFB3F /* UpperRightCalculation.swift */,
9821403622B3D16700ABFB3F /* MaximizeHeightCalculation.swift */,
988D066022EB4C7C004EABD7 /* FirstThirdCalculation.swift */,
988D066222EB4CA5004EABD7 /* FirstTwoThirdsCalculation.swift */,
988D066422EB4CB5004EABD7 /* CenterThirdCalculation.swift */,
988D066622EB4CC0004EABD7 /* LastTwoThirdsCalculation.swift */,
988D066822EB4CCB004EABD7 /* LastThirdCalculation.swift */,
988D067E22EB4EDE004EABD7 /* MoveLeftRightCalculation.swift */,
988D068222EB4EF3004EABD7 /* MoveUpDownCalculation.swift */,
988D067C22EB4E17004EABD7 /* AlmostMaximizeCalculation.swift */,
98C1008D230B9EF6006E5344 /* NextPrevDisplayCalculation.swift */,
98FA9496235A2D7600F95C4F /* RepeatedExecutionsCalculation.swift */,
98C6DEEF23CE191700CC0C1E /* GapCalculation.swift */,
9851A5C2251BEBA300ECF78C /* OrientationAware.swift */,
98A6EDDC251F3F4A00F74B10 /* SixthsRepeated.swift */,
BB0000000000000000000002 /* QuartersRepeated.swift */,
866661F1257D248A00A9CD2D /* RepeatedExecutionsInThirdsCalculation.swift */,
30166BCF24F27D6A00A38608 /* SpecifiedCalculation.swift */,
D04CE31127817C9B00BD47B3 /* NinthsRepeated.swift */,
D04CE2FF2781794E00BD47B3 /* TopLeftNinthCalculation.swift */,
D04CE30127817A6100BD47B3 /* TopCenterNinthCalculation.swift */,
D04CE30327817A6F00BD47B3 /* TopRightNinthCalculation.swift */,
D04CE30527817A8400BD47B3 /* MiddleLeftNinthCalculation.swift */,
D04CE30727817A9200BD47B3 /* MiddleCenterNinthCalculation.swift */,
D04CE30927817A9F00BD47B3 /* MiddleRightNinthCalculation.swift */,
D04CE30B27817AA900BD47B3 /* BottomLeftNinthCalculation.swift */,
D04CE30D27817AB500BD47B3 /* BottomCenterNinthCalculation.swift */,
D04CE30F27817ABE00BD47B3 /* BottomRightNinthCalculation.swift */,
D0CFE33027A8CAED004DA47B /* TopLeftThirdCalculation.swift */,
D0CFE33227A8CCB1004DA47B /* TopRightThirdCalculation.swift */,
D0CFE33427A8CD16004DA47B /* BottomLeftThirdCalculation.swift */,
D0CFE33627A8CD51004DA47B /* BottomRightThirdCalculation.swift */,
D0423D8227A8D31D008A4894 /* HorizontalThirdsRepeated.swift */,
6490B39227BF90F90056C220 /* EighthsRepeated.swift */,
6490B39427BF96880056C220 /* TopLeftEighthCalculation.swift */,
6490B39627BF96EA0056C220 /* TopCenterLeftEighthCalculation.swift */,
6490B39827BF97BB0056C220 /* TopCenterRightEighthCalculation.swift */,
6490B39A27BF980F0056C220 /* TopRightEighthCalculation.swift */,
6490B39027BF907A0056C220 /* BottomLeftEighthCalculation.swift */,
6490B39C27BF984D0056C220 /* BottomCenterLeftEighthCalculation.swift */,
6490B39E27BF98840056C220 /* BottomCenterRightEighthCalculation.swift */,
6490B3A027BF98C70056C220 /* BottomRightEighthCalculation.swift */,
F3592F8E85CE82B8FA662A31 /* TwelfthsRepeated.swift */,
D9FDCA1333C1BF6930A8D7F3 /* TopLeftTwelfthCalculation.swift */,
9698D1D9EE0180D7C4468304 /* TopCenterLeftTwelfthCalculation.swift */,
A4D034DBD7EFAC4CF5F8D67B /* TopCenterRightTwelfthCalculation.swift */,
7E8357E928530D10A806F3CD /* TopRightTwelfthCalculation.swift */,
246168B345ECE6C375ACEEB7 /* BottomLeftTwelfthCalculation.swift */,
71FE3EBE50F91F9EE2989279 /* BottomCenterLeftTwelfthCalculation.swift */,
C1A362206B9F76C269D8F469 /* BottomCenterRightTwelfthCalculation.swift */,
D7D038C68560DC11F14496F6 /* BottomRightTwelfthCalculation.swift */,
EEABF10E66D648DDB37DABBA /* MiddleLeftTwelfthCalculation.swift */,
5070DE9100E45D374053F0C2 /* MiddleCenterLeftTwelfthCalculation.swift */,
BCF2AC59501448BD3BAA16EC /* MiddleCenterRightTwelfthCalculation.swift */,
AA84AB4DB9E7EEFCE50AA6D8 /* MiddleRightTwelfthCalculation.swift */,
16B4044DB4809116039F96EB /* SixteenthsRepeated.swift */,
6294D2CB6E3D8ED982F418AE /* TopLeftSixteenthCalculation.swift */,
5BE9E5E2C8BA2590DD0B6F59 /* TopCenterLeftSixteenthCalculation.swift */,
918F847FF15D524B6DB2E6DA /* TopCenterRightSixteenthCalculation.swift */,
FD222258713B13274FB651B0 /* TopRightSixteenthCalculation.swift */,
84E2DBE0733F31BC159BC99C /* UpperMiddleLeftSixteenthCalculation.swift */,
8B8CA6901E6FE134E930135B /* UpperMiddleCenterLeftSixteenthCalculation.swift */,
BEBF3EA35F0C110A170EAD33 /* UpperMiddleCenterRightSixteenthCalculation.swift */,
A3B5B09465C38F8B766B3C3C /* UpperMiddleRightSixteenthCalculation.swift */,
C796BCAA3DA5F85B55A7EE83 /* LowerMiddleLeftSixteenthCalculation.swift */,
378C96D832D4CC6BCCF9D604 /* LowerMiddleCenterLeftSixteenthCalculation.swift */,
8AE08B666CCCD1805CAB08BD /* LowerMiddleCenterRightSixteenthCalculation.swift */,
87EC57F37CFD790695177AC8 /* LowerMiddleRightSixteenthCalculation.swift */,
FEE147786B2CD7350FAFB700 /* BottomLeftSixteenthCalculation.swift */,
88454ABE5C62BD610AEA3EB5 /* BottomCenterLeftSixteenthCalculation.swift */,
D24EBF1F9A6209449A988E15 /* BottomCenterRightSixteenthCalculation.swift */,
482EA970820F37C6917FCD98 /* BottomRightSixteenthCalculation.swift */,
AA69F83B29909A95001A81AF /* RightTodoCalculation.swift */,
AA69F83F2992DCB1001A81AF /* LeftTodoCalculation.swift */,
B4521F922BD7CEFB00FD43CC /* ChangeWindowDimensionCalculation.swift */,
);
path = WindowCalculation;
sourceTree = "";
};
982140EA22B7DB0400ABFB3F /* WindowMover */ = {
isa = PBXGroup;
children = (
9824704A22B189250037B409 /* BestEffortWindowMover.swift */,
9824704922B189250037B409 /* QuantizedWindowMover.swift */,
9824704622B189240037B409 /* StandardWindowMover.swift */,
9824704722B189240037B409 /* WindowMover.swift */,
98B3559723CE025700E410E0 /* CenteringFixedSizedWindowMover.swift */,
);
path = WindowMover;
sourceTree = "";
};
982140EB22B7DB1A00ABFB3F /* AccessibilityAuthorization */ = {
isa = PBXGroup;
children = (
9824702E22AFA2E50037B409 /* AccessibilityAuthorization.swift */,
9824702A22AFA22E0037B409 /* AccessibilityWindowController.swift */,
);
path = AccessibilityAuthorization;
sourceTree = "";
};
982140EC22B7DB5700ABFB3F /* Utilities */ = {
isa = PBXGroup;
children = (
9824703A22B139780037B409 /* CUtil.swift */,
98D1441224560B1E0090C603 /* AlertUtil.swift */,
98D16A432592AD55005228CB /* MASShortcutMigration.swift */,
98D16A482592B460005228CB /* NotificationExtension.swift */,
98BEFA472620DEDC00D9D54F /* NSImageExtension.swift */,
98192DD9270F606C00015E66 /* Debounce.swift */,
AA0ACC2E2864A86D0025E376 /* StageUtil.swift */,
94E9B08D2C3B8D97004C7F41 /* MacTilingDefaults.swift */,
94E9B08F2C3E4578004C7F41 /* StringExtension.swift */,
AAADE1AE28CBAB0000036331 /* WindowUtil.swift */,
AA4DA2FA28FDC94A00355CEB /* DispatchTimeExtension.swift */,
AA536C2629005DD000579AC6 /* TimeoutCache.swift */,
AA040C66290B2640003181D5 /* RunLoopThread.swift */,
AA0AC001291C1B9100D125D2 /* AXExtension.swift */,
AA0ABFFF291C1B5E00D125D2 /* CGExtension.swift */,
AA0AC003291C48DE00D125D2 /* SequenceExtension.swift */,
AA3A9E8A29230A82004EB8E5 /* CFExtension.swift */,
98C2755D231FF6A9009B9292 /* EventMonitor.swift */,
);
path = Utilities;
sourceTree = "";
};
9824700022AF9B7D0037B409 = {
isa = PBXGroup;
children = (
9824700B22AF9B7D0037B409 /* Rectangle */,
9824701E22AF9B7E0037B409 /* RectangleTests */,
9821403D22B3EBD900ABFB3F /* RectangleLauncher */,
9824700A22AF9B7D0037B409 /* Products */,
9821405C22B3ED3600ABFB3F /* Frameworks */,
);
sourceTree = "";
};
9824700A22AF9B7D0037B409 /* Products */ = {
isa = PBXGroup;
children = (
9824700922AF9B7D0037B409 /* Rectangle.app */,
9824701B22AF9B7E0037B409 /* RectangleTests.xctest */,
9821403C22B3EBD900ABFB3F /* RectangleLauncher.app */,
);
name = Products;
sourceTree = "";
};
9824700B22AF9B7D0037B409 /* Rectangle */ = {
isa = PBXGroup;
children = (
9824700C22AF9B7D0037B409 /* AppDelegate.swift */,
9824701022AF9B7E0037B409 /* Assets.xcassets */,
482E9E412EB1528D00D7928A /* AppIcon.icon */,
9824701222AF9B7E0037B409 /* Main.storyboard */,
9824701522AF9B7E0037B409 /* Info.plist */,
981F27D02340E3E1006CD263 /* InternetAccessPolicy.plist */,
9821552627BFFB13002523EC /* Rectangle-Bridging-Header.h */,
9808018523D05C0B0077774A /* RectangleRelease.entitlements */,
9824701622AF9B7E0037B409 /* Rectangle.entitlements */,
9821405F22B3EFB200ABFB3F /* Defaults.swift */,
984EDB0E29A42ED200D119D2 /* LaunchOnLogin.swift */,
98C1008B2305F1FA006E5344 /* SubsequentExecutionMode.swift */,
7BE578EE2C5BF4ED0083DAE3 /* CycleSize.swift */,
985B9BF422B93EEC00A2E8F0 /* ApplicationToggle.swift */,
9824703022AFA8470037B409 /* RectangleStatusItem.swift */,
9824703622B0F3200037B409 /* WindowAction.swift */,
98A6EDEB2528FFC100F74B10 /* WindowActionCategory.swift */,
9824703822B0F37C0037B409 /* ShortcutManager.swift */,
9824703C22B13C7E0037B409 /* AccessibilityElement.swift */,
9824703E22B13FBC0037B409 /* ScreenDetection.swift */,
98C275662322E2DA009B9292 /* WindowHistory.swift */,
9824704022B186D00037B409 /* WindowManager.swift */,
AA49DD1029B8C1B100690E13 /* TitleBarManager.swift */,
98987AA62391890C00BE72C4 /* Logging */,
98910B3C2311304D0066EC23 /* PrefsWindow */,
989DA30C243FC0C3008C7AA4 /* WelcomeWindow */,
98C2755F231FF6AE009B9292 /* Snapping */,
98D4B6C925B625B6009C7BF6 /* TodoMode */,
985B9BFA22BE218C00A2E8F0 /* Popover */,
982140EA22B7DB0400ABFB3F /* WindowMover */,
982140E922B7DA3100ABFB3F /* WindowCalculation */,
98192DDF2717201E00015E66 /* MultiWindow */,
982140EB22B7DB1A00ABFB3F /* AccessibilityAuthorization */,
982140EC22B7DB5700ABFB3F /* Utilities */,
);
path = Rectangle;
sourceTree = "";
};
9824701E22AF9B7E0037B409 /* RectangleTests */ = {
isa = PBXGroup;
children = (
9824701F22AF9B7E0037B409 /* RectangleTests.swift */,
9824702122AF9B7E0037B409 /* Info.plist */,
);
path = RectangleTests;
sourceTree = "";
};
985B9BFA22BE218C00A2E8F0 /* Popover */ = {
isa = PBXGroup;
children = (
985B9BF722BB6F5000A2E8F0 /* MessageView.swift */,
985B9BF622BB6F5000A2E8F0 /* MessageView.xib */,
);
path = Popover;
sourceTree = "";
};
98910B3C2311304D0066EC23 /* PrefsWindow */ = {
isa = PBXGroup;
children = (
944F25CC2CE5A144004B2FD2 /* PrefsViewController.swift */,
98910B3D231130AF0066EC23 /* SettingsViewController.swift */,
983DD03F28A844BE00BF1EEE /* SnapAreaViewController.swift */,
98C97FFC25893B040061F01F /* Config.swift */,
);
path = PrefsWindow;
sourceTree = "";
};
98987AA62391890C00BE72C4 /* Logging */ = {
isa = PBXGroup;
children = (
98987AA22391890300BE72C4 /* LogViewer.storyboard */,
98987AA32391890400BE72C4 /* LogViewer.swift */,
);
path = Logging;
sourceTree = "";
};
989DA30C243FC0C3008C7AA4 /* WelcomeWindow */ = {
isa = PBXGroup;
children = (
989DA30D243FC0DF008C7AA4 /* WelcomeViewController.swift */,
);
path = WelcomeWindow;
sourceTree = "";
};
98C2755F231FF6AE009B9292 /* Snapping */ = {
isa = PBXGroup;
children = (
98C27560231FFA5F009B9292 /* SnappingManager.swift */,
983BBD6E253B609D000D223E /* FootprintWindow.swift */,
983DD04328B0639E00BF1EEE /* SnapAreaModel.swift */,
9818E00E28B5922A004AA524 /* CompoundSnapArea */,
);
path = Snapping;
sourceTree = "";
};
98D4B6C925B625B6009C7BF6 /* TodoMode */ = {
isa = PBXGroup;
children = (
98D4B6C425B6256C009C7BF6 /* TodoManager.swift */,
);
path = TodoMode;
sourceTree = "";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
9821403B22B3EBD900ABFB3F /* RectangleLauncher */ = {
isa = PBXNativeTarget;
buildConfigurationList = 9821405422B3EBDA00ABFB3F /* Build configuration list for PBXNativeTarget "RectangleLauncher" */;
buildPhases = (
9821403822B3EBD900ABFB3F /* Sources */,
9821403922B3EBD900ABFB3F /* Frameworks */,
9821403A22B3EBD900ABFB3F /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = RectangleLauncher;
productName = RectangleLauncher;
productReference = 9821403C22B3EBD900ABFB3F /* RectangleLauncher.app */;
productType = "com.apple.product-type.application";
};
9824700822AF9B7D0037B409 /* Rectangle */ = {
isa = PBXNativeTarget;
buildConfigurationList = 9824702422AF9B7E0037B409 /* Build configuration list for PBXNativeTarget "Rectangle" */;
buildPhases = (
9824700522AF9B7D0037B409 /* Sources */,
9824700622AF9B7D0037B409 /* Frameworks */,
9824700722AF9B7D0037B409 /* Resources */,
9821405A22B3EC9900ABFB3F /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = Rectangle;
packageProductDependencies = (
9877B63929C8AC0E00F02D74 /* MASShortcut */,
9877B63C29C8AC3600F02D74 /* Sparkle */,
);
productName = Rectangle;
productReference = 9824700922AF9B7D0037B409 /* Rectangle.app */;
productType = "com.apple.product-type.application";
};
9824701A22AF9B7E0037B409 /* RectangleTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 9824702722AF9B7E0037B409 /* Build configuration list for PBXNativeTarget "RectangleTests" */;
buildPhases = (
9824701722AF9B7E0037B409 /* Sources */,
9824701822AF9B7E0037B409 /* Frameworks */,
9824701922AF9B7E0037B409 /* Resources */,
);
buildRules = (
);
dependencies = (
9824701D22AF9B7E0037B409 /* PBXTargetDependency */,
);
name = RectangleTests;
productName = RectangleTests;
productReference = 9824701B22AF9B7E0037B409 /* RectangleTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
9824700122AF9B7D0037B409 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 1020;
LastUpgradeCheck = 1500;
ORGANIZATIONNAME = "Ryan Hanson";
TargetAttributes = {
9821403B22B3EBD900ABFB3F = {
CreatedOnToolsVersion = 10.2.1;
SystemCapabilities = {
com.apple.HardenedRuntime = {
enabled = 0;
};
com.apple.Sandbox = {
enabled = 1;
};
};
};
9824700822AF9B7D0037B409 = {
CreatedOnToolsVersion = 10.2.1;
LastSwiftMigration = 1320;
SystemCapabilities = {
com.apple.HardenedRuntime = {
enabled = 0;
};
com.apple.Sandbox = {
enabled = 0;
};
};
};
9824701A22AF9B7E0037B409 = {
CreatedOnToolsVersion = 10.2.1;
TestTargetID = 9824700822AF9B7D0037B409;
};
};
};
buildConfigurationList = 9824700422AF9B7D0037B409 /* Build configuration list for PBXProject "Rectangle" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
es,
fr,
de,
ru,
"pt-BR",
"pt-PT",
it,
pl,
nl,
"es-419",
ja,
"zh-Hans",
"zh-Hant",
ko,
"zh-Hant-HK",
"sv-SE",
ro,
id,
cs,
sk,
ca,
tr,
"ca-ES",
uk,
vi,
lt,
ar,
nb,
nn,
"en-GB",
);
mainGroup = 9824700022AF9B7D0037B409;
packageReferences = (
9877B63829C8AC0E00F02D74 /* XCRemoteSwiftPackageReference "MASShortcut" */,
9877B63B29C8AC3600F02D74 /* XCRemoteSwiftPackageReference "Sparkle" */,
);
productRefGroup = 9824700A22AF9B7D0037B409 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
9824700822AF9B7D0037B409 /* Rectangle */,
9824701A22AF9B7E0037B409 /* RectangleTests */,
9821403B22B3EBD900ABFB3F /* RectangleLauncher */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
9821403A22B3EBD900ABFB3F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9821404322B3EBDA00ABFB3F /* Assets.xcassets in Resources */,
9821404622B3EBDA00ABFB3F /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
9824700722AF9B7D0037B409 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
985B9BF822BB6F5100A2E8F0 /* MessageView.xib in Resources */,
9824701122AF9B7E0037B409 /* Assets.xcassets in Resources */,
9824701422AF9B7E0037B409 /* Main.storyboard in Resources */,
981F27D12340E3E1006CD263 /* InternetAccessPolicy.plist in Resources */,
98987AA42391890400BE72C4 /* LogViewer.storyboard in Resources */,
482E9E422EB1528D00D7928A /* AppIcon.icon in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
9824701922AF9B7E0037B409 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
9821403822B3EBD900ABFB3F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9821403F22B3EBD900ABFB3F /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
9824700522AF9B7D0037B409 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
98A009B32512536900CFBF0C /* LastFourthCalculation.swift in Sources */,
98A009BB2512539900CFBF0C /* BottomLeftSixthCalculation.swift in Sources */,
9821402322B3886100ABFB3F /* CenterCalculation.swift in Sources */,
98A009AB2512491300CFBF0C /* CenterHalfCalculation.swift in Sources */,
9818E01828B63C48004AA524 /* FourthsCompoundCalculation.swift in Sources */,
9818E01A28B63C49004AA524 /* EighthsCompoundCalculation.swift in Sources */,
D0CFE33327A8CCB1004DA47B /* TopRightThirdCalculation.swift in Sources */,
94E9B08E2C3B8D97004C7F41 /* MacTilingDefaults.swift in Sources */,
9821403522B38A2B00ABFB3F /* UpperRightCalculation.swift in Sources */,
984EDB0F29A42ED200D119D2 /* LaunchOnLogin.swift in Sources */,
9824702F22AFA2E50037B409 /* AccessibilityAuthorization.swift in Sources */,
988D066322EB4CA5004EABD7 /* FirstTwoThirdsCalculation.swift in Sources */,
D04CE30A27817A9F00BD47B3 /* MiddleRightNinthCalculation.swift in Sources */,
98BEFA482620DEDD00D9D54F /* NSImageExtension.swift in Sources */,
98FA9497235A2D7600F95C4F /* RepeatedExecutionsCalculation.swift in Sources */,
D0CFE33727A8CD51004DA47B /* BottomRightThirdCalculation.swift in Sources */,
9824705122B28D7A0037B409 /* LeftRightHalfCalculation.swift in Sources */,
9824703D22B13C7E0037B409 /* AccessibilityElement.swift in Sources */,
98D1441324560B1E0090C603 /* AlertUtil.swift in Sources */,
AA0AC004291C48DE00D125D2 /* SequenceExtension.swift in Sources */,
985B9BF522B93EEC00A2E8F0 /* ApplicationToggle.swift in Sources */,
AA0AC002291C1B9100D125D2 /* AXExtension.swift in Sources */,
98D16A442592AD55005228CB /* MASShortcutMigration.swift in Sources */,
74804F0B2E25521C009F1F7D /* CenterTwoThirdsCalculation.swift in Sources */,
988D066522EB4CB6004EABD7 /* CenterThirdCalculation.swift in Sources */,
D04CE30827817A9200BD47B3 /* MiddleCenterNinthCalculation.swift in Sources */,
98A009BD251253A000CFBF0C /* BottomCenterSixthCalculation.swift in Sources */,
6490B39F27BF98840056C220 /* BottomCenterRightEighthCalculation.swift in Sources */,
98C2755E231FF6A9009B9292 /* EventMonitor.swift in Sources */,
98A009AF2512517900CFBF0C /* SecondFourthCalculation.swift in Sources */,
6490B39127BF907A0056C220 /* BottomLeftEighthCalculation.swift in Sources */,
D04CE30C27817AA900BD47B3 /* BottomLeftNinthCalculation.swift in Sources */,
6490B39327BF90F90056C220 /* EighthsRepeated.swift in Sources */,
9821406022B3EFB200ABFB3F /* Defaults.swift in Sources */,
D0CFE33527A8CD16004DA47B /* BottomLeftThirdCalculation.swift in Sources */,
D0CFE33127A8CAED004DA47B /* TopLeftThirdCalculation.swift in Sources */,
FDE8FCE027C2950400EACCAA /* MultiWindowManager.swift in Sources */,
98192DDA270F606C00015E66 /* Debounce.swift in Sources */,
D04CE3002781794E00BD47B3 /* TopLeftNinthCalculation.swift in Sources */,
9821403122B38A0500ABFB3F /* TopHalfCalculation.swift in Sources */,
9818E01428B5A4FD004AA524 /* SixthsCompoundCalculation.swift in Sources */,
9824704B22B189250037B409 /* StandardWindowMover.swift in Sources */,
9821402722B3888100ABFB3F /* ChangeSizeCalculation.swift in Sources */,
6490B39927BF97BB0056C220 /* TopCenterRightEighthCalculation.swift in Sources */,
98B3559823CE025700E410E0 /* CenteringFixedSizedWindowMover.swift in Sources */,
9FF740232E34DE9000D22955 /* CenterThreeFourthsCalculation.swift in Sources */,
729E0A982AFF76B1006E2F48 /* CenterProminentlyCalculation.swift in Sources */,
9824704E22B189250037B409 /* QuantizedWindowMover.swift in Sources */,
AA536C2729005DD000579AC6 /* TimeoutCache.swift in Sources */,
D04CE30627817A8400BD47B3 /* MiddleLeftNinthCalculation.swift in Sources */,
9824703B22B139780037B409 /* CUtil.swift in Sources */,
988D067D22EB4E17004EABD7 /* AlmostMaximizeCalculation.swift in Sources */,
98C1008C2305F1FA006E5344 /* SubsequentExecutionMode.swift in Sources */,
94E9B0902C3E4578004C7F41 /* StringExtension.swift in Sources */,
6490B3A127BF98C70056C220 /* BottomRightEighthCalculation.swift in Sources */,
985B9BF922BB6F5100A2E8F0 /* MessageView.swift in Sources */,
988D066722EB4CC0004EABD7 /* LastTwoThirdsCalculation.swift in Sources */,
98192DDE2717201100015E66 /* ReverseAllManager.swift in Sources */,
AA0ACC2F2864A86D0025E376 /* StageUtil.swift in Sources */,
98A009B1251252C900CFBF0C /* ThirdFourthCalculation.swift in Sources */,
D04CE31227817C9B00BD47B3 /* NinthsRepeated.swift in Sources */,
9824703F22B13FBC0037B409 /* ScreenDetection.swift in Sources */,
983DD04428B0639E00BF1EEE /* SnapAreaModel.swift in Sources */,
AA040C67290B2640003181D5 /* RunLoopThread.swift in Sources */,
9821402B22B388A000ABFB3F /* LowerRightCalculation.swift in Sources */,
D04CE30427817A6F00BD47B3 /* TopRightNinthCalculation.swift in Sources */,
98FD7C612687BCB6009E9DAF /* LastThreeFourthsCalculation.swift in Sources */,
9821402522B3887200ABFB3F /* MaximizeCalculation.swift in Sources */,
866661F2257D248A00A9CD2D /* RepeatedExecutionsInThirdsCalculation.swift in Sources */,
9824704D22B189250037B409 /* WindowCalculation.swift in Sources */,
98C1008E230B9EF6006E5344 /* NextPrevDisplayCalculation.swift in Sources */,
9824703122AFA8470037B409 /* RectangleStatusItem.swift in Sources */,
D04CE31027817ABE00BD47B3 /* BottomRightNinthCalculation.swift in Sources */,
98A009B92512538D00CFBF0C /* TopRightSixthCalculation.swift in Sources */,
98C275672322E2DA009B9292 /* WindowHistory.swift in Sources */,
9821403722B3D16700ABFB3F /* MaximizeHeightCalculation.swift in Sources */,
9824704122B186D00037B409 /* WindowManager.swift in Sources */,
D0423D8327A8D31D008A4894 /* HorizontalThirdsRepeated.swift in Sources */,
98C97FFD25893B040061F01F /* Config.swift in Sources */,
989DA30E243FC0DF008C7AA4 /* WelcomeViewController.swift in Sources */,
9818E01228B59B64004AA524 /* ThirdsCompoundCalculation.swift in Sources */,
98C27561231FFA5F009B9292 /* SnappingManager.swift in Sources */,
9824703722B0F3200037B409 /* WindowAction.swift in Sources */,
B4521F932BD7CEFB00FD43CC /* ChangeWindowDimensionCalculation.swift in Sources */,
9821402922B3889100ABFB3F /* LowerLeftCalculation.swift in Sources */,
7BE578EF2C5BF4EE0083DAE3 /* CycleSize.swift in Sources */,
9821402122B3884600ABFB3F /* BottomHalfCalculation.swift in Sources */,
9851A5C3251BEBA300ECF78C /* OrientationAware.swift in Sources */,
98FD7C5F2687BC14009E9DAF /* FirstThreeFourthsCalculation.swift in Sources */,
983DD04028A844BE00BF1EEE /* SnapAreaViewController.swift in Sources */,
9824702C22AFA22E0037B409 /* AccessibilityWindowController.swift in Sources */,
988D066122EB4C7C004EABD7 /* FirstThirdCalculation.swift in Sources */,
983BBD6F253B609D000D223E /* FootprintWindow.swift in Sources */,
988D067F22EB4EDE004EABD7 /* MoveLeftRightCalculation.swift in Sources */,
AA3A9E8B29230A82004EB8E5 /* CFExtension.swift in Sources */,
98C6DEF023CE191700CC0C1E /* GapCalculation.swift in Sources */,
98910B3E231130AF0066EC23 /* SettingsViewController.swift in Sources */,
98A009AD2512498000CFBF0C /* FirstFourthCalculation.swift in Sources */,
AA4DA2FB28FDC94A00355CEB /* DispatchTimeExtension.swift in Sources */,
98D4B6C525B6256C009C7BF6 /* TodoManager.swift in Sources */,
B4780A322BD4C75900732B9E /* HalfOrDoubleDimensionCalculation.swift in Sources */,
AA69F83C29909A95001A81AF /* RightTodoCalculation.swift in Sources */,
AA49DD1129B8C1B100690E13 /* TitleBarManager.swift in Sources */,
9824700D22AF9B7D0037B409 /* AppDelegate.swift in Sources */,
98A009BF251253AB00CFBF0C /* BottomRightSixthCalculation.swift in Sources */,
6490B39527BF96880056C220 /* TopLeftEighthCalculation.swift in Sources */,
D04CE30227817A6100BD47B3 /* TopCenterNinthCalculation.swift in Sources */,
98A009B52512537800CFBF0C /* TopLeftSixthCalculation.swift in Sources */,
9824704F22B189250037B409 /* BestEffortWindowMover.swift in Sources */,
30166BD024F27D6A00A38608 /* SpecifiedCalculation.swift in Sources */,
9824703922B0F37C0037B409 /* ShortcutManager.swift in Sources */,
98D16A492592B460005228CB /* NotificationExtension.swift in Sources */,
AA0AC000291C1B5E00D125D2 /* CGExtension.swift in Sources */,
BB0B80492EFB0AF900A9B165 /* TopVerticalTwoThirdsCalculation.swift in Sources */,
BB0B804A2EFB0AF900A9B165 /* MiddleVerticalThirdCalculation.swift in Sources */,
BB0B804B2EFB0AF900A9B165 /* BottomVerticalTwoThirdsCalculation.swift in Sources */,
BB0B804C2EFB0AF900A9B165 /* BottomVerticalThirdCalculation.swift in Sources */,
BB0B804D2EFB0AF900A9B165 /* TopVerticalThirdCalculation.swift in Sources */,
6490B39D27BF984D0056C220 /* BottomCenterLeftEighthCalculation.swift in Sources */,
98A6EDDD251F3F4A00F74B10 /* SixthsRepeated.swift in Sources */,
BB0000000000000000000001 /* QuartersRepeated.swift in Sources */,
AAADE1AF28CBAB0000036331 /* WindowUtil.swift in Sources */,
98A009B72512538200CFBF0C /* TopCenterSixthCalculation.swift in Sources */,
AA69F8402992DCB1001A81AF /* LeftTodoCalculation.swift in Sources */,
9821403322B38A1B00ABFB3F /* UpperLeftCalculation.swift in Sources */,
98987AA52391890400BE72C4 /* LogViewer.swift in Sources */,
9824704C22B189250037B409 /* WindowMover.swift in Sources */,
6490B39B27BF980F0056C220 /* TopRightEighthCalculation.swift in Sources */,
944F25CD2CE5A144004B2FD2 /* PrefsViewController.swift in Sources */,
9818E01028B59396004AA524 /* HalvesCompoundCalculation.swift in Sources */,
988D066922EB4CCB004EABD7 /* LastThirdCalculation.swift in Sources */,
98A6EDEC2528FFC100F74B10 /* WindowActionCategory.swift in Sources */,
988D068322EB4EF3004EABD7 /* MoveUpDownCalculation.swift in Sources */,
D04CE30E27817AB500BD47B3 /* BottomCenterNinthCalculation.swift in Sources */,
6490B39727BF96EA0056C220 /* TopCenterLeftEighthCalculation.swift in Sources */,
9818E00D28B59205004AA524 /* CompoundSnapArea.swift in Sources */,
7EC9E3BAD5BC57E49A7BCEE5 /* TwelfthsRepeated.swift in Sources */,
BAB3F495AD1F3454FAA31AFB /* TopLeftTwelfthCalculation.swift in Sources */,
924919761FC491952752A147 /* TopCenterLeftTwelfthCalculation.swift in Sources */,
14DBE979E4453E13A3BF5C17 /* TopCenterRightTwelfthCalculation.swift in Sources */,
F4EED30B47FB6C55EA937254 /* TopRightTwelfthCalculation.swift in Sources */,
BF9871B3BCF0E652444E0C56 /* BottomLeftTwelfthCalculation.swift in Sources */,
52953B57D48A4F110779E9BD /* BottomCenterLeftTwelfthCalculation.swift in Sources */,
666598377754D51045353CD0 /* BottomCenterRightTwelfthCalculation.swift in Sources */,
15E8CA7F6AC3EA2C4FB1424C /* BottomRightTwelfthCalculation.swift in Sources */,
05DBEA44B55E6F8C5FC3D6E0 /* MiddleLeftTwelfthCalculation.swift in Sources */,
9FDA3D672AE475B83CA1A34A /* MiddleCenterLeftTwelfthCalculation.swift in Sources */,
DCD3CF2993E9AFAF30820117 /* MiddleCenterRightTwelfthCalculation.swift in Sources */,
8B1D14E3A55936EBCCC1E807 /* MiddleRightTwelfthCalculation.swift in Sources */,
B6366EE24FA928086846969B /* SixteenthsRepeated.swift in Sources */,
3FA1D2E6C9B4623227F680CF /* TopLeftSixteenthCalculation.swift in Sources */,
A0844B53B14365D0278BC124 /* TopCenterLeftSixteenthCalculation.swift in Sources */,
A32D3739AA16C537F6427C4F /* TopCenterRightSixteenthCalculation.swift in Sources */,
F51A7467767F8EAF97321A00 /* TopRightSixteenthCalculation.swift in Sources */,
D8644560FF112B0748CE1975 /* UpperMiddleLeftSixteenthCalculation.swift in Sources */,
E791B00A88D90C24A4C3D2D1 /* UpperMiddleCenterLeftSixteenthCalculation.swift in Sources */,
895C73559E1ACEFBBE8DC32D /* UpperMiddleCenterRightSixteenthCalculation.swift in Sources */,
0F29956694B5BB31EBDAE445 /* UpperMiddleRightSixteenthCalculation.swift in Sources */,
562018A56BC897E769500F1F /* LowerMiddleLeftSixteenthCalculation.swift in Sources */,
88763FEFFA3AECF8502604D6 /* LowerMiddleCenterLeftSixteenthCalculation.swift in Sources */,
A73749B5FB00D2CC2DB08744 /* LowerMiddleCenterRightSixteenthCalculation.swift in Sources */,
4266090403BAF4B8A654A28B /* LowerMiddleRightSixteenthCalculation.swift in Sources */,
F7B6C43BB57F8064F49DDBB6 /* BottomLeftSixteenthCalculation.swift in Sources */,
9988C2A18B6AF03E09204981 /* BottomCenterLeftSixteenthCalculation.swift in Sources */,
630644571003EB468CB643D8 /* BottomCenterRightSixteenthCalculation.swift in Sources */,
2D240EE416CC03AC921E3A4F /* BottomRightSixteenthCalculation.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
9824701722AF9B7E0037B409 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9824702022AF9B7E0037B409 /* RectangleTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
9824701D22AF9B7E0037B409 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 9824700822AF9B7D0037B409 /* Rectangle */;
targetProxy = 9824701C22AF9B7E0037B409 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
9821404422B3EBDA00ABFB3F /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
9821404522B3EBDA00ABFB3F /* Base */,
42627A972ADA03D200D047C6 /* mul */,
);
name = Main.storyboard;
sourceTree = "";
};
9824701222AF9B7E0037B409 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
9824701322AF9B7E0037B409 /* Base */,
423DC1992AE681F900C98564 /* mul */,
);
name = Main.storyboard;
sourceTree = "";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
9821405522B3EBDA00ABFB3F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = RectangleLauncher/RectangleLauncher.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = NO;
INFOPLIST_FILE = RectangleLauncher/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.knollsoft.RectangleLauncher;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
9821405622B3EBDA00ABFB3F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = RectangleLauncher/RectangleLauncherRelease.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = XSYZ3E4B7D;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = RectangleLauncher/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.knollsoft.RectangleLauncher;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
9824702222AF9B7E0037B409 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "Mac Developer";
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
9824702322AF9B7E0037B409 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "Mac Developer";
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
name = Release;
};
9824702522AF9B7E0037B409 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled";
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Rectangle/Rectangle.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 100;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = NO;
INFOPLIST_FILE = Rectangle/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 0.94;
PRODUCT_BUNDLE_IDENTIFIER = com.knollsoft.Rectangle;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "Rectangle/Rectangle-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
9824702622AF9B7E0037B409 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled";
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Rectangle/RectangleRelease.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 100;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = XSYZ3E4B7D;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = Rectangle/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 0.94;
PRODUCT_BUNDLE_IDENTIFIER = com.knollsoft.Rectangle;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "Rectangle/Rectangle-Bridging-Header.h";
SWIFT_VERSION = 5.0;
};
name = Release;
};
9824702822AF9B7E0037B409 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = RectangleTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
PRODUCT_BUNDLE_IDENTIFIER = dev.ryanhanson.RectangleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Rectangle.app/Contents/MacOS/Rectangle";
};
name = Debug;
};
9824702922AF9B7E0037B409 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = XSYZ3E4B7D;
INFOPLIST_FILE = RectangleTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.15;
PRODUCT_BUNDLE_IDENTIFIER = dev.ryanhanson.RectangleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Rectangle.app/Contents/MacOS/Rectangle";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
9821405422B3EBDA00ABFB3F /* Build configuration list for PBXNativeTarget "RectangleLauncher" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9821405522B3EBDA00ABFB3F /* Debug */,
9821405622B3EBDA00ABFB3F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
9824700422AF9B7D0037B409 /* Build configuration list for PBXProject "Rectangle" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9824702222AF9B7E0037B409 /* Debug */,
9824702322AF9B7E0037B409 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
9824702422AF9B7E0037B409 /* Build configuration list for PBXNativeTarget "Rectangle" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9824702522AF9B7E0037B409 /* Debug */,
9824702622AF9B7E0037B409 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
9824702722AF9B7E0037B409 /* Build configuration list for PBXNativeTarget "RectangleTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9824702822AF9B7E0037B409 /* Debug */,
9824702922AF9B7E0037B409 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
9877B63829C8AC0E00F02D74 /* XCRemoteSwiftPackageReference "MASShortcut" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/rxhanson/MASShortcut";
requirement = {
branch = master;
kind = branch;
};
};
9877B63B29C8AC3600F02D74 /* XCRemoteSwiftPackageReference "Sparkle" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/sparkle-project/Sparkle";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.0.0;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
9877B63929C8AC0E00F02D74 /* MASShortcut */ = {
isa = XCSwiftPackageProductDependency;
package = 9877B63829C8AC0E00F02D74 /* XCRemoteSwiftPackageReference "MASShortcut" */;
productName = MASShortcut;
};
9877B63C29C8AC3600F02D74 /* Sparkle */ = {
isa = XCSwiftPackageProductDependency;
package = 9877B63B29C8AC3600F02D74 /* XCRemoteSwiftPackageReference "Sparkle" */;
productName = Sparkle;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 9824700122AF9B7D0037B409 /* Project object */;
}
================================================
FILE: RectangleLauncher/AppDelegate.swift
================================================
//
// AppDelegate.swift
// RectangleLauncher
//
// Created by Ryan Hanson on 6/14/19.
// Copyright © 2019 Ryan Hanson. All rights reserved.
//
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
if #available(macOS 13, *) {
terminate()
return
}
let mainAppIdentifier = "com.knollsoft.Rectangle"
let running = NSWorkspace.shared.runningApplications
let isRunning = !running.filter({$0.bundleIdentifier == mainAppIdentifier}).isEmpty
if isRunning {
self.terminate()
} else {
let killNotification = Notification.Name("killLauncher")
DistributedNotificationCenter.default().addObserver(self,
selector: #selector(self.terminate),
name: killNotification,
object: mainAppIdentifier)
let path = Bundle.main.bundlePath as NSString
var components = path.pathComponents
components.removeLast()
components.removeLast()
components.removeLast()
components.append("MacOS")
components.append("Rectangle")
let newPath = NSString.path(withComponents: components)
NSWorkspace.shared.launchApplication(newPath)
}
}
@objc func terminate() {
NSApp.terminate(nil)
}
}
================================================
FILE: RectangleLauncher/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac",
"size" : "16x16",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "16x16",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "32x32",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "32x32",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "128x128",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "128x128",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "256x256",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "256x256",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "512x512",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "512x512",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: RectangleLauncher/Assets.xcassets/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: RectangleLauncher/Base.lproj/Main.storyboard
================================================