Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
288 changes: 288 additions & 0 deletions Hinge.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,42 @@
<key>fileRef</key>
<string>560737C72BC60145ADB91F3E</string>
</dict>
<key>6B2D8F1A3C5E7A9B0D1F2E30</key>
<dict>
<key>isa</key>
<string>PBXVariantGroup</string>
<key>children</key>
<array>
<string>3059B037752ACEDB91C5F511</string>
<string>AA31F262039679D2414D52C2</string>
<string>6CE6D5AC0DB41C126672BB9D</string>
<string>2B8E1BC7AD243AF3870134C0</string>
<string>5AD54BB7F98474534A4C83ED</string>
<string>CCCE2CDFEC65CE9BDE7A395C</string>
<string>6A63B12EA753108E36C52FD2</string>
<string>C705DCF21CBF7AD5F970621B</string>
<string>24D3149B3CE03CFD94C2DD17</string>
<string>A695FBDE60D96D7150C64BDA</string>
<string>1A3376B19763C58977411E38</string>
<string>B7AEFB7AF84345927382DF05</string>
<string>6897C8C1DE6E11BE7321E76A</string>
<string>931FCD7B91696BF504041199</string>
<string>61CBDB8F979D36CA892B91C8</string>
<string>379C3C0E9C4614AF3A01076B</string>
<string>0278DE9A6B04F8478495CAD6</string>
</array>
<key>name</key>
<string>Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>8C3E9A2B4D6F8A0C1E3F5A71</key>
<dict>
<key>isa</key>
<string>PBXBuildFile</string>
<key>fileRef</key>
<string>6B2D8F1A3C5E7A9B0D1F2E30</string>
</dict>
<key>38D78C33EBAE0C0ED96716CF</key>
<dict>
<key>isa</key>
Expand Down Expand Up @@ -218,6 +254,7 @@
<array>
<string>560737C72BC60145ADB91F3E</string>
<string>38D78C33EBAE0C0ED96716CF</string>
<string>AA37C8D01B6242599BE403F1</string>
</array>
<key>path</key>
<string>Resources</string>
Expand Down Expand Up @@ -305,6 +342,7 @@
<array>
<string>51C92A1C51E552B028484AA9</string>
<string>F7F4970B79E37D1A4C454958</string>
<string>8C3E9A2B4D6F8A0C1E3F5A71</string>
</array>
<key>runOnlyForDeploymentPostprocessing</key>
<string>0</string>
Expand Down Expand Up @@ -514,6 +552,22 @@
<array>
<string>en</string>
<string>Base</string>
<string>ar</string>
<string>de</string>
<string>es</string>
<string>fr</string>
<string>it</string>
<string>ja</string>
<string>ko</string>
<string>nl</string>
<string>pl</string>
<string>pt-BR</string>
<string>ru</string>
<string>tr</string>
<string>vi</string>
<string>zh-Hans</string>
<string>zh-Hant</string>
<string>hi</string>
</array>
<key>mainGroup</key>
<string>B28B7AF69320201D1CF206EB</string>
Expand All @@ -528,6 +582,240 @@
<string>0E8A3AD980EC179856012B7E</string>
</array>
</dict>
<key>3059B037752ACEDB91C5F511</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>ar</string>
<key>path</key>
<string>ar.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>AA31F262039679D2414D52C2</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>de</string>
<key>path</key>
<string>de.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>6CE6D5AC0DB41C126672BB9D</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>es</string>
<key>path</key>
<string>es.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>2B8E1BC7AD243AF3870134C0</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>fr</string>
<key>path</key>
<string>fr.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>5AD54BB7F98474534A4C83ED</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>it</string>
<key>path</key>
<string>it.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>CCCE2CDFEC65CE9BDE7A395C</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>ja</string>
<key>path</key>
<string>ja.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>6A63B12EA753108E36C52FD2</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>ko</string>
<key>path</key>
<string>ko.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>C705DCF21CBF7AD5F970621B</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>nl</string>
<key>path</key>
<string>nl.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>24D3149B3CE03CFD94C2DD17</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>pl</string>
<key>path</key>
<string>pl.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>A695FBDE60D96D7150C64BDA</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>pt-BR</string>
<key>path</key>
<string>pt-BR.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>1A3376B19763C58977411E38</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>ru</string>
<key>path</key>
<string>ru.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>B7AEFB7AF84345927382DF05</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>tr</string>
<key>path</key>
<string>tr.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>6897C8C1DE6E11BE7321E76A</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>vi</string>
<key>path</key>
<string>vi.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>931FCD7B91696BF504041199</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>zh-Hans</string>
<key>path</key>
<string>zh-Hans.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>61CBDB8F979D36CA892B91C8</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>zh-Hant</string>
<key>path</key>
<string>zh-Hant.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>379C3C0E9C4614AF3A01076B</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>en</string>
<key>path</key>
<string>en.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>0278DE9A6B04F8478495CAD6</key>
<dict>
<key>isa</key>
<string>PBXFileReference</string>
<key>lastKnownFileType</key>
<string>text.plist.strings</string>
<key>name</key>
<string>hi</string>
<key>path</key>
<string>hi.lproj/Localizable.strings</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
<key>AA37C8D01B6242599BE403F1</key>
<dict>
<key>isa</key>
<string>PBXGroup</string>
<key>children</key>
<array>
<string>6B2D8F1A3C5E7A9B0D1F2E30</string>
</array>
<key>path</key>
<string>Localizations</string>
<key>sourceTree</key>
<string>&lt;group&gt;</string>
</dict>
</dict>
<key>rootObject</key>
<string>98F54143AB4E86B28C3AFEE0</string>
Expand Down
22 changes: 22 additions & 0 deletions Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,28 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>ar</string>
<string>de</string>
<string>es</string>
<string>fr</string>
<string>it</string>
<string>ja</string>
<string>ko</string>
<string>nl</string>
<string>pl</string>
<string>pt-BR</string>
<string>ru</string>
<string>tr</string>
<string>vi</string>
<string>zh-Hans</string>
<string>zh-Hant</string>
<string>hi</string>
</array>
<key>CFBundleExecutable</key>
<string>Hinge</string>
<key>CFBundleIdentifier</key>
Expand Down
5 changes: 3 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ SIGN_IDENTITY ?= $(shell security find-identity -v -p codesigning 2>/dev/null |
.PHONY: build

build:
mkdir -p "$(APP)/Contents/MacOS" "$(APP)/Contents/Resources"
mkdir -p "$(APP)/Contents/MacOS" "$(APP)/Contents/Resources/en.lproj"
xcrun swiftc -swift-version 5 -O -target arm64-apple-macosx14.0 $(SOURCES) -o "$(APP)/Contents/MacOS/Hinge" -framework SwiftUI -framework AppKit -framework IOKit -framework ScreenCaptureKit -framework MetalKit -framework MetalPerformanceShaders
cp Info.plist "$(APP)/Contents/Info.plist"
cp Resources/* "$(APP)/Contents/Resources/"
cp Resources/*.icns Resources/*.metal "$(APP)/Contents/Resources/"
cp -R Resources/Localizations/*.lproj "$(APP)/Contents/Resources/"
codesign --force --sign "$(if $(SIGN_IDENTITY),$(SIGN_IDENTITY),-)" "$(APP)"
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,14 @@ open build/Hinge.app

Allow Screen Recording, reopen Hinge if prompted, and turn it on. It turns itself back on the next time you open it. The starting angle is 100°. Prefer something else? Get comfy and click **Set open position**. Hinge remembers.

Hinge speaks your Mac's language: English, Simplified and Traditional Chinese, Japanese, Korean, German, French, Spanish, Italian, Brazilian Portuguese, Russian, Dutch, Turkish, Polish, Arabic, Vietnamese and Hindi. To use a different one, pick it under **Settings > Controls > Language**.

## Got an idea?

Feature requests are welcome. [Open an issue](https://github.com/Noveum/hinge/issues) or just shoot a PR. Small fixes, smoother motion, fun ideas: come play.

[Development checks and setup](CHECKS.md).

## Translations

Translations live in `Resources/Localizations/<language>.lproj/Localizable.strings`, one file per language, including Hindi. On first launch, Hinge saves the best supported match for the system language. Later launches retain that choice until you change it in Settings. Keep the English keys identical across files and preserve format placeholders such as `%@` and `%lld`. Both Make and Xcode bundle these files directly.
Loading