├── LangSwitch
├── Assets.xcassets
│ ├── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── 128-mac.png
│ │ ├── 16-mac.png
│ │ ├── 256-mac.png
│ │ ├── 32-mac.png
│ │ ├── 512-mac.png
│ │ ├── 64-mac.png
│ │ ├── 1024-mac.png
│ │ └── Contents.json
│ └── AccentColor.colorset
│ │ └── Contents.json
├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
├── LangSwitchApp.swift
├── LangSwitch.entitlements
└── AppDelegate.swift
├── LangSwitch.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── xcuserdata
│ └── nikeev.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
└── project.pbxproj
├── README.md
└── LICENSE
/LangSwitch/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/LangSwitch/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AppIcon.appiconset/128-mac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nikeev/LangSwitch/HEAD/LangSwitch/Assets.xcassets/AppIcon.appiconset/128-mac.png
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AppIcon.appiconset/16-mac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nikeev/LangSwitch/HEAD/LangSwitch/Assets.xcassets/AppIcon.appiconset/16-mac.png
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AppIcon.appiconset/256-mac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nikeev/LangSwitch/HEAD/LangSwitch/Assets.xcassets/AppIcon.appiconset/256-mac.png
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AppIcon.appiconset/32-mac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nikeev/LangSwitch/HEAD/LangSwitch/Assets.xcassets/AppIcon.appiconset/32-mac.png
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AppIcon.appiconset/512-mac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nikeev/LangSwitch/HEAD/LangSwitch/Assets.xcassets/AppIcon.appiconset/512-mac.png
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AppIcon.appiconset/64-mac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nikeev/LangSwitch/HEAD/LangSwitch/Assets.xcassets/AppIcon.appiconset/64-mac.png
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AppIcon.appiconset/1024-mac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nikeev/LangSwitch/HEAD/LangSwitch/Assets.xcassets/AppIcon.appiconset/1024-mac.png
--------------------------------------------------------------------------------
/LangSwitch.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/LangSwitch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LangSwitch/LangSwitchApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LangSwitchApp.swift
3 | // LangSwitch
4 | //
5 | // Created by ANTON NIKEEV on 05.07.2023.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct LangSwitchApp: App {
12 | @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
13 |
14 | var body: some Scene {
15 | Settings {
16 | EmptyView().frame(width:.zero)
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/LangSwitch/LangSwitch.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 | com.apple.security.network.client
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/LangSwitch.xcodeproj/xcuserdata/nikeev.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | LangSwitch.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # LangSwitch
2 | LangSwitch is a super-simple macOS app that switches your keyboard languages (input sources) one by one by pressing the Fn/🌐 button. It aims to address the annoyance caused by the default macOS function, which includes a popup and a delay between source changes. The sole purpose of this app is to immediately change the language without any popups or delays.
3 |
4 | # P.S.
5 | MacOS Sonoma has improved language switching. They removed the popup, and switching is faster. But still it can be glitchy and works with bugs from time to time. So this app can still be relevant)
6 |
7 | 
8 |
9 | **How to use:**
10 | - Download and install the app from the releases page.
11 | - Disable the default macOS 🌐 button click action in Keyboard settings.
12 | - Run the LangSwitch app.
13 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Nikeev
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/LangSwitch/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {"images":[{"size":"1024x1024","filename":"1024-mac.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]}
--------------------------------------------------------------------------------
/LangSwitch/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // LangSwitch
4 | //
5 | // Created by ANTON NIKEEV on 05.07.2023.
6 | //
7 |
8 | import SwiftUI
9 | import Carbon
10 | import Foundation
11 | import AppKit
12 | import IOKit.hid
13 |
14 |
15 | class AppDelegate: NSObject, NSApplicationDelegate {
16 | var statusBarItem: NSStatusItem?
17 | var aboutWindow: NSWindow?
18 | let longPressThreshold: TimeInterval = 0.2;
19 |
20 | func applicationDidFinishLaunching(_ notification: Notification) {
21 | // Create a status bar item with a system icon
22 | statusBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
23 | statusBarItem?.button?.image = NSImage(systemSymbolName: "globe", accessibilityDescription: nil)
24 | statusBarItem?.isVisible = true
25 |
26 | // Add a menu to the status bar item
27 | let menu = NSMenu()
28 | menu.addItem(withTitle: "About LangSwitch", action: #selector(showAboutWindow), keyEquivalent: "")
29 | menu.addItem(withTitle: "Hide Icon", action: #selector(hideStatusBarIcon), keyEquivalent: "")
30 | menu.addItem(withTitle: "Exit", action: #selector(exitAction), keyEquivalent: "")
31 | statusBarItem?.menu = menu
32 |
33 | NSApp.setActivationPolicy(.accessory)
34 | NSApp.hide(nil)
35 |
36 | var anotherClicked = false;
37 | var lastPressTime = Date();
38 |
39 | // Register for Fn button press events
40 | NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) { event in
41 | guard event.keyCode == 63 else {
42 | return
43 | }
44 |
45 | if event.modifierFlags.intersection(.deviceIndependentFlagsMask).contains(.function) {
46 | anotherClicked = false
47 | lastPressTime = Date()
48 | }
49 |
50 | if !event.modifierFlags.intersection([.shift, .control, .option, .command]).isEmpty {
51 | anotherClicked = true
52 | }
53 |
54 | let allowedFlags: NSEvent.ModifierFlags = [.capsLock]
55 | let remainingFlags = event.modifierFlags.intersection(.deviceIndependentFlagsMask).subtracting(allowedFlags)
56 | if remainingFlags.isEmpty && !anotherClicked {
57 | let timePassed = Date().timeIntervalSince(lastPressTime)
58 | if timePassed < self.longPressThreshold {
59 | self.switchKeyboardLanguage()
60 | }
61 | }
62 | }
63 | }
64 |
65 | @objc func showAboutWindow() {
66 | if aboutWindow == nil {
67 | let windowWidth: CGFloat = 300
68 | let windowHeight: CGFloat = 180
69 |
70 | let windowContent = NSView(frame: NSRect(x: 0, y: 0, width: windowWidth, height: windowHeight))
71 | let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown version"
72 |
73 | let versionLabel = NSTextField(labelWithString: "LangSwitch v\(version)")
74 | versionLabel.frame = NSRect(x: (windowWidth - 150) / 2, y: 130, width: 150, height: 20)
75 | versionLabel.alignment = .center // Центрирование текста
76 | windowContent.addSubview(versionLabel)
77 |
78 | let gitHubButton = NSButton(title: "GitHub Page", target: self, action: #selector(openGitHub))
79 | gitHubButton.frame = NSRect(x: (windowWidth - 100) / 2, y: 90, width: 100, height: 30)
80 | windowContent.addSubview(gitHubButton)
81 |
82 | let checkUpdatesButton = NSButton(title: "Check for Updates", target: self, action: #selector(checkForUpdates))
83 | checkUpdatesButton.frame = NSRect(x: (windowWidth - 150) / 2, y: 50, width: 150, height: 30)
84 | windowContent.addSubview(checkUpdatesButton)
85 |
86 | aboutWindow = NSWindow(contentRect: NSRect(x: 0, y: 0, width: windowWidth, height: windowHeight),
87 | styleMask: [.titled, .closable],
88 | backing: .buffered,
89 | defer: false)
90 | aboutWindow?.contentView = windowContent
91 | aboutWindow?.center()
92 | }
93 | aboutWindow?.makeKeyAndOrderFront(nil)
94 | NSApp.activate(ignoringOtherApps: true)
95 | }
96 |
97 |
98 | @objc func openGitHub() {
99 | if let url = URL(string: "https://github.com/Nikeev/LangSwitch") {
100 | NSWorkspace.shared.open(url)
101 | }
102 | }
103 |
104 | @objc func checkForUpdates() {
105 | guard let url = URL(string: "https://api.github.com/repos/Nikeev/LangSwitch/releases/latest") else { return }
106 |
107 | let task = URLSession.shared.dataTask(with: url) { data, response, error in
108 | guard let data = data, error == nil else {
109 | self.showAlert(message: "Failed to check for updates.")
110 | return
111 | }
112 |
113 | do {
114 | if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
115 | let latestVersion = json["tag_name"] as? String {
116 | let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0"
117 |
118 | if latestVersion > "v\(currentVersion)" {
119 | self.showAlert(message: "New version \(latestVersion) is available! Download it from GitHub.")
120 | } else {
121 | self.showAlert(message: "You're up to date.")
122 | }
123 | }
124 | } catch {
125 | self.showAlert(message: "Error parsing update information.")
126 | }
127 | }
128 | task.resume()
129 | }
130 |
131 | func showAlert(message: String) {
132 | DispatchQueue.main.async {
133 | let alert = NSAlert()
134 | alert.messageText = message
135 | alert.runModal()
136 | }
137 | }
138 |
139 | @objc func hideStatusBarIcon() {
140 | statusBarItem?.isVisible = false
141 | }
142 |
143 | @objc func exitAction() {
144 | NSApplication.shared.terminate(nil)
145 | }
146 |
147 | func switchKeyboardLanguage() {
148 | // Get the current keyboard input source
149 | guard let currentSource = TISCopyCurrentKeyboardInputSource()?.takeUnretainedValue() else {
150 | print("Failed to switch keyboard language.")
151 | return
152 | }
153 |
154 | // Get all enabled keyboard input sources
155 | guard let inputSources = getInputSources() as? [TISInputSource],
156 | !inputSources.isEmpty else {
157 | print("Failed to switch keyboard language.")
158 | return
159 | }
160 |
161 | // Find the index of the current input source
162 | guard let currentIndex = inputSources.firstIndex(where: { $0 == currentSource }) else {
163 | print("Failed to switch keyboard language.")
164 | return
165 | }
166 |
167 | // Calculate the index of the next input source
168 | let nextIndex = (currentIndex + 1) % inputSources.count
169 |
170 | // Retrieve the next input source
171 | let nextSource = inputSources[nextIndex]
172 |
173 | // Switch to the next input source
174 | TISSelectInputSource(nextSource)
175 |
176 | // Print the new input source's name
177 | let newSourceName = Unmanaged.fromOpaque(TISGetInputSourceProperty(nextSource, kTISPropertyLocalizedName)).takeUnretainedValue() as String
178 | print("Switched to: \(newSourceName)")
179 | }
180 |
181 | func getInputSources() -> [TISInputSource] {
182 | let inputSourceNSArray = TISCreateInputSourceList(nil, false)
183 | .takeRetainedValue() as NSArray
184 | var inputSourceList = inputSourceNSArray as! [TISInputSource]
185 |
186 | inputSourceList = inputSourceList.filter({
187 | $0.category == TISInputSource.Category.keyboardInputSource
188 | })
189 |
190 | let inputSources = inputSourceList.filter(
191 | {
192 | $0.isSelectable
193 | })
194 |
195 | return inputSources
196 | }
197 | }
198 |
199 | extension TISInputSource {
200 | enum Category {
201 | static var keyboardInputSource: String {
202 | return kTISCategoryKeyboardInputSource as String
203 | }
204 | }
205 |
206 | private func getProperty(_ key: CFString) -> AnyObject? {
207 | let cfType = TISGetInputSourceProperty(self, key)
208 | if (cfType != nil) {
209 | return Unmanaged.fromOpaque(cfType!)
210 | .takeUnretainedValue()
211 | } else {
212 | return nil
213 | }
214 | }
215 |
216 | var category: String {
217 | return getProperty(kTISPropertyInputSourceCategory) as! String
218 | }
219 |
220 | var isSelectable: Bool {
221 | return getProperty(kTISPropertyInputSourceIsSelectCapable) as! Bool
222 | }
223 | }
224 |
--------------------------------------------------------------------------------
/LangSwitch.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 4C79BECE2A553F0D006A793C /* LangSwitchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C79BECD2A553F0D006A793C /* LangSwitchApp.swift */; };
11 | 4C79BED02A553F0D006A793C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C79BECF2A553F0D006A793C /* AppDelegate.swift */; };
12 | 4C79BED22A553F0E006A793C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C79BED12A553F0E006A793C /* Assets.xcassets */; };
13 | 4C79BED52A553F0E006A793C /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C79BED42A553F0E006A793C /* Preview Assets.xcassets */; };
14 | /* End PBXBuildFile section */
15 |
16 | /* Begin PBXContainerItemProxy section */
17 | 4C79BEDC2A553F0E006A793C /* PBXContainerItemProxy */ = {
18 | isa = PBXContainerItemProxy;
19 | containerPortal = 4C79BEC22A553F0D006A793C /* Project object */;
20 | proxyType = 1;
21 | remoteGlobalIDString = 4C79BEC92A553F0D006A793C;
22 | remoteInfo = LangSwitch;
23 | };
24 | 4C79BEE62A553F0E006A793C /* PBXContainerItemProxy */ = {
25 | isa = PBXContainerItemProxy;
26 | containerPortal = 4C79BEC22A553F0D006A793C /* Project object */;
27 | proxyType = 1;
28 | remoteGlobalIDString = 4C79BEC92A553F0D006A793C;
29 | remoteInfo = LangSwitch;
30 | };
31 | /* End PBXContainerItemProxy section */
32 |
33 | /* Begin PBXFileReference section */
34 | 4C79BECA2A553F0D006A793C /* LangSwitch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LangSwitch.app; sourceTree = BUILT_PRODUCTS_DIR; };
35 | 4C79BECD2A553F0D006A793C /* LangSwitchApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LangSwitchApp.swift; sourceTree = ""; };
36 | 4C79BECF2A553F0D006A793C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
37 | 4C79BED12A553F0E006A793C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
38 | 4C79BED42A553F0E006A793C /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
39 | 4C79BED62A553F0E006A793C /* LangSwitch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LangSwitch.entitlements; sourceTree = ""; };
40 | 4C79BEDB2A553F0E006A793C /* LangSwitchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LangSwitchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
41 | 4C79BEE52A553F0E006A793C /* LangSwitchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LangSwitchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
42 | /* End PBXFileReference section */
43 |
44 | /* Begin PBXFrameworksBuildPhase section */
45 | 4C79BEC72A553F0D006A793C /* Frameworks */ = {
46 | isa = PBXFrameworksBuildPhase;
47 | buildActionMask = 2147483647;
48 | files = (
49 | );
50 | runOnlyForDeploymentPostprocessing = 0;
51 | };
52 | 4C79BED82A553F0E006A793C /* Frameworks */ = {
53 | isa = PBXFrameworksBuildPhase;
54 | buildActionMask = 2147483647;
55 | files = (
56 | );
57 | runOnlyForDeploymentPostprocessing = 0;
58 | };
59 | 4C79BEE22A553F0E006A793C /* Frameworks */ = {
60 | isa = PBXFrameworksBuildPhase;
61 | buildActionMask = 2147483647;
62 | files = (
63 | );
64 | runOnlyForDeploymentPostprocessing = 0;
65 | };
66 | /* End PBXFrameworksBuildPhase section */
67 |
68 | /* Begin PBXGroup section */
69 | 4C79BEC12A553F0D006A793C = {
70 | isa = PBXGroup;
71 | children = (
72 | 4C79BECC2A553F0D006A793C /* LangSwitch */,
73 | 4C79BECB2A553F0D006A793C /* Products */,
74 | );
75 | sourceTree = "";
76 | };
77 | 4C79BECB2A553F0D006A793C /* Products */ = {
78 | isa = PBXGroup;
79 | children = (
80 | 4C79BECA2A553F0D006A793C /* LangSwitch.app */,
81 | 4C79BEDB2A553F0E006A793C /* LangSwitchTests.xctest */,
82 | 4C79BEE52A553F0E006A793C /* LangSwitchUITests.xctest */,
83 | );
84 | name = Products;
85 | sourceTree = "";
86 | };
87 | 4C79BECC2A553F0D006A793C /* LangSwitch */ = {
88 | isa = PBXGroup;
89 | children = (
90 | 4C79BECD2A553F0D006A793C /* LangSwitchApp.swift */,
91 | 4C79BECF2A553F0D006A793C /* AppDelegate.swift */,
92 | 4C79BED12A553F0E006A793C /* Assets.xcassets */,
93 | 4C79BED62A553F0E006A793C /* LangSwitch.entitlements */,
94 | 4C79BED32A553F0E006A793C /* Preview Content */,
95 | );
96 | path = LangSwitch;
97 | sourceTree = "";
98 | };
99 | 4C79BED32A553F0E006A793C /* Preview Content */ = {
100 | isa = PBXGroup;
101 | children = (
102 | 4C79BED42A553F0E006A793C /* Preview Assets.xcassets */,
103 | );
104 | path = "Preview Content";
105 | sourceTree = "";
106 | };
107 | /* End PBXGroup section */
108 |
109 | /* Begin PBXNativeTarget section */
110 | 4C79BEC92A553F0D006A793C /* LangSwitch */ = {
111 | isa = PBXNativeTarget;
112 | buildConfigurationList = 4C79BEEF2A553F0E006A793C /* Build configuration list for PBXNativeTarget "LangSwitch" */;
113 | buildPhases = (
114 | 4C79BEC62A553F0D006A793C /* Sources */,
115 | 4C79BEC72A553F0D006A793C /* Frameworks */,
116 | 4C79BEC82A553F0D006A793C /* Resources */,
117 | );
118 | buildRules = (
119 | );
120 | dependencies = (
121 | );
122 | name = LangSwitch;
123 | productName = LangSwitch;
124 | productReference = 4C79BECA2A553F0D006A793C /* LangSwitch.app */;
125 | productType = "com.apple.product-type.application";
126 | };
127 | 4C79BEDA2A553F0E006A793C /* LangSwitchTests */ = {
128 | isa = PBXNativeTarget;
129 | buildConfigurationList = 4C79BEF22A553F0E006A793C /* Build configuration list for PBXNativeTarget "LangSwitchTests" */;
130 | buildPhases = (
131 | 4C79BED72A553F0E006A793C /* Sources */,
132 | 4C79BED82A553F0E006A793C /* Frameworks */,
133 | 4C79BED92A553F0E006A793C /* Resources */,
134 | );
135 | buildRules = (
136 | );
137 | dependencies = (
138 | 4C79BEDD2A553F0E006A793C /* PBXTargetDependency */,
139 | );
140 | name = LangSwitchTests;
141 | productName = LangSwitchTests;
142 | productReference = 4C79BEDB2A553F0E006A793C /* LangSwitchTests.xctest */;
143 | productType = "com.apple.product-type.bundle.unit-test";
144 | };
145 | 4C79BEE42A553F0E006A793C /* LangSwitchUITests */ = {
146 | isa = PBXNativeTarget;
147 | buildConfigurationList = 4C79BEF52A553F0E006A793C /* Build configuration list for PBXNativeTarget "LangSwitchUITests" */;
148 | buildPhases = (
149 | 4C79BEE12A553F0E006A793C /* Sources */,
150 | 4C79BEE22A553F0E006A793C /* Frameworks */,
151 | 4C79BEE32A553F0E006A793C /* Resources */,
152 | );
153 | buildRules = (
154 | );
155 | dependencies = (
156 | 4C79BEE72A553F0E006A793C /* PBXTargetDependency */,
157 | );
158 | name = LangSwitchUITests;
159 | productName = LangSwitchUITests;
160 | productReference = 4C79BEE52A553F0E006A793C /* LangSwitchUITests.xctest */;
161 | productType = "com.apple.product-type.bundle.ui-testing";
162 | };
163 | /* End PBXNativeTarget section */
164 |
165 | /* Begin PBXProject section */
166 | 4C79BEC22A553F0D006A793C /* Project object */ = {
167 | isa = PBXProject;
168 | attributes = {
169 | BuildIndependentTargetsInParallel = 1;
170 | LastSwiftUpdateCheck = 1430;
171 | LastUpgradeCheck = 1430;
172 | TargetAttributes = {
173 | 4C79BEC92A553F0D006A793C = {
174 | CreatedOnToolsVersion = 14.3.1;
175 | };
176 | 4C79BEDA2A553F0E006A793C = {
177 | CreatedOnToolsVersion = 14.3.1;
178 | TestTargetID = 4C79BEC92A553F0D006A793C;
179 | };
180 | 4C79BEE42A553F0E006A793C = {
181 | CreatedOnToolsVersion = 14.3.1;
182 | TestTargetID = 4C79BEC92A553F0D006A793C;
183 | };
184 | };
185 | };
186 | buildConfigurationList = 4C79BEC52A553F0D006A793C /* Build configuration list for PBXProject "LangSwitch" */;
187 | compatibilityVersion = "Xcode 14.0";
188 | developmentRegion = en;
189 | hasScannedForEncodings = 0;
190 | knownRegions = (
191 | en,
192 | Base,
193 | );
194 | mainGroup = 4C79BEC12A553F0D006A793C;
195 | productRefGroup = 4C79BECB2A553F0D006A793C /* Products */;
196 | projectDirPath = "";
197 | projectRoot = "";
198 | targets = (
199 | 4C79BEC92A553F0D006A793C /* LangSwitch */,
200 | 4C79BEDA2A553F0E006A793C /* LangSwitchTests */,
201 | 4C79BEE42A553F0E006A793C /* LangSwitchUITests */,
202 | );
203 | };
204 | /* End PBXProject section */
205 |
206 | /* Begin PBXResourcesBuildPhase section */
207 | 4C79BEC82A553F0D006A793C /* Resources */ = {
208 | isa = PBXResourcesBuildPhase;
209 | buildActionMask = 2147483647;
210 | files = (
211 | 4C79BED52A553F0E006A793C /* Preview Assets.xcassets in Resources */,
212 | 4C79BED22A553F0E006A793C /* Assets.xcassets in Resources */,
213 | );
214 | runOnlyForDeploymentPostprocessing = 0;
215 | };
216 | 4C79BED92A553F0E006A793C /* Resources */ = {
217 | isa = PBXResourcesBuildPhase;
218 | buildActionMask = 2147483647;
219 | files = (
220 | );
221 | runOnlyForDeploymentPostprocessing = 0;
222 | };
223 | 4C79BEE32A553F0E006A793C /* Resources */ = {
224 | isa = PBXResourcesBuildPhase;
225 | buildActionMask = 2147483647;
226 | files = (
227 | );
228 | runOnlyForDeploymentPostprocessing = 0;
229 | };
230 | /* End PBXResourcesBuildPhase section */
231 |
232 | /* Begin PBXSourcesBuildPhase section */
233 | 4C79BEC62A553F0D006A793C /* Sources */ = {
234 | isa = PBXSourcesBuildPhase;
235 | buildActionMask = 2147483647;
236 | files = (
237 | 4C79BED02A553F0D006A793C /* AppDelegate.swift in Sources */,
238 | 4C79BECE2A553F0D006A793C /* LangSwitchApp.swift in Sources */,
239 | );
240 | runOnlyForDeploymentPostprocessing = 0;
241 | };
242 | 4C79BED72A553F0E006A793C /* Sources */ = {
243 | isa = PBXSourcesBuildPhase;
244 | buildActionMask = 2147483647;
245 | files = (
246 | );
247 | runOnlyForDeploymentPostprocessing = 0;
248 | };
249 | 4C79BEE12A553F0E006A793C /* Sources */ = {
250 | isa = PBXSourcesBuildPhase;
251 | buildActionMask = 2147483647;
252 | files = (
253 | );
254 | runOnlyForDeploymentPostprocessing = 0;
255 | };
256 | /* End PBXSourcesBuildPhase section */
257 |
258 | /* Begin PBXTargetDependency section */
259 | 4C79BEDD2A553F0E006A793C /* PBXTargetDependency */ = {
260 | isa = PBXTargetDependency;
261 | target = 4C79BEC92A553F0D006A793C /* LangSwitch */;
262 | targetProxy = 4C79BEDC2A553F0E006A793C /* PBXContainerItemProxy */;
263 | };
264 | 4C79BEE72A553F0E006A793C /* PBXTargetDependency */ = {
265 | isa = PBXTargetDependency;
266 | target = 4C79BEC92A553F0D006A793C /* LangSwitch */;
267 | targetProxy = 4C79BEE62A553F0E006A793C /* PBXContainerItemProxy */;
268 | };
269 | /* End PBXTargetDependency section */
270 |
271 | /* Begin XCBuildConfiguration section */
272 | 4C79BEED2A553F0E006A793C /* Debug */ = {
273 | isa = XCBuildConfiguration;
274 | buildSettings = {
275 | ALWAYS_SEARCH_USER_PATHS = NO;
276 | CLANG_ANALYZER_NONNULL = YES;
277 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
278 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
279 | CLANG_ENABLE_MODULES = YES;
280 | CLANG_ENABLE_OBJC_ARC = YES;
281 | CLANG_ENABLE_OBJC_WEAK = YES;
282 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
283 | CLANG_WARN_BOOL_CONVERSION = YES;
284 | CLANG_WARN_COMMA = YES;
285 | CLANG_WARN_CONSTANT_CONVERSION = YES;
286 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
287 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
288 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
289 | CLANG_WARN_EMPTY_BODY = YES;
290 | CLANG_WARN_ENUM_CONVERSION = YES;
291 | CLANG_WARN_INFINITE_RECURSION = YES;
292 | CLANG_WARN_INT_CONVERSION = YES;
293 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
294 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
295 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
296 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
297 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
298 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
299 | CLANG_WARN_STRICT_PROTOTYPES = YES;
300 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
301 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
302 | CLANG_WARN_UNREACHABLE_CODE = YES;
303 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
304 | COPY_PHASE_STRIP = NO;
305 | DEBUG_INFORMATION_FORMAT = dwarf;
306 | ENABLE_STRICT_OBJC_MSGSEND = YES;
307 | ENABLE_TESTABILITY = YES;
308 | GCC_C_LANGUAGE_STANDARD = gnu11;
309 | GCC_DYNAMIC_NO_PIC = NO;
310 | GCC_NO_COMMON_BLOCKS = YES;
311 | GCC_OPTIMIZATION_LEVEL = 0;
312 | GCC_PREPROCESSOR_DEFINITIONS = (
313 | "DEBUG=1",
314 | "$(inherited)",
315 | );
316 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
317 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
318 | GCC_WARN_UNDECLARED_SELECTOR = YES;
319 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
320 | GCC_WARN_UNUSED_FUNCTION = YES;
321 | GCC_WARN_UNUSED_VARIABLE = YES;
322 | MACOSX_DEPLOYMENT_TARGET = 13.3;
323 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
324 | MTL_FAST_MATH = YES;
325 | ONLY_ACTIVE_ARCH = YES;
326 | SDKROOT = macosx;
327 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
328 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
329 | };
330 | name = Debug;
331 | };
332 | 4C79BEEE2A553F0E006A793C /* Release */ = {
333 | isa = XCBuildConfiguration;
334 | buildSettings = {
335 | ALWAYS_SEARCH_USER_PATHS = NO;
336 | CLANG_ANALYZER_NONNULL = YES;
337 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
338 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
339 | CLANG_ENABLE_MODULES = YES;
340 | CLANG_ENABLE_OBJC_ARC = YES;
341 | CLANG_ENABLE_OBJC_WEAK = YES;
342 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
343 | CLANG_WARN_BOOL_CONVERSION = YES;
344 | CLANG_WARN_COMMA = YES;
345 | CLANG_WARN_CONSTANT_CONVERSION = YES;
346 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
347 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
348 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
349 | CLANG_WARN_EMPTY_BODY = YES;
350 | CLANG_WARN_ENUM_CONVERSION = YES;
351 | CLANG_WARN_INFINITE_RECURSION = YES;
352 | CLANG_WARN_INT_CONVERSION = YES;
353 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
354 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
355 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
356 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
357 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
358 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
359 | CLANG_WARN_STRICT_PROTOTYPES = YES;
360 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
361 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
362 | CLANG_WARN_UNREACHABLE_CODE = YES;
363 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
364 | COPY_PHASE_STRIP = NO;
365 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
366 | ENABLE_NS_ASSERTIONS = NO;
367 | ENABLE_STRICT_OBJC_MSGSEND = YES;
368 | GCC_C_LANGUAGE_STANDARD = gnu11;
369 | GCC_NO_COMMON_BLOCKS = YES;
370 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
371 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
372 | GCC_WARN_UNDECLARED_SELECTOR = YES;
373 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
374 | GCC_WARN_UNUSED_FUNCTION = YES;
375 | GCC_WARN_UNUSED_VARIABLE = YES;
376 | MACOSX_DEPLOYMENT_TARGET = 13.3;
377 | MTL_ENABLE_DEBUG_INFO = NO;
378 | MTL_FAST_MATH = YES;
379 | SDKROOT = macosx;
380 | SWIFT_COMPILATION_MODE = wholemodule;
381 | SWIFT_OPTIMIZATION_LEVEL = "-O";
382 | };
383 | name = Release;
384 | };
385 | 4C79BEF02A553F0E006A793C /* Debug */ = {
386 | isa = XCBuildConfiguration;
387 | buildSettings = {
388 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
389 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
390 | CODE_SIGN_ENTITLEMENTS = LangSwitch/LangSwitch.entitlements;
391 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
392 | CODE_SIGN_STYLE = Automatic;
393 | COMBINE_HIDPI_IMAGES = YES;
394 | CURRENT_PROJECT_VERSION = 7;
395 | DEVELOPMENT_ASSET_PATHS = "\"LangSwitch/Preview Content\"";
396 | DEVELOPMENT_TEAM = X3Z75V6JU2;
397 | ENABLE_HARDENED_RUNTIME = YES;
398 | ENABLE_PREVIEWS = YES;
399 | GENERATE_INFOPLIST_FILE = YES;
400 | INFOPLIST_KEY_CFBundleDisplayName = LangSwitch;
401 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
402 | INFOPLIST_KEY_NSHumanReadableCopyright = "";
403 | LD_RUNPATH_SEARCH_PATHS = (
404 | "$(inherited)",
405 | "@executable_path/../Frameworks",
406 | );
407 | MACOSX_DEPLOYMENT_TARGET = 11;
408 | MARKETING_VERSION = 1.3.1;
409 | PRODUCT_BUNDLE_IDENTIFIER = com.nikeev.LangSwitch;
410 | PRODUCT_NAME = "$(TARGET_NAME)";
411 | SWIFT_EMIT_LOC_STRINGS = YES;
412 | SWIFT_VERSION = 5.0;
413 | };
414 | name = Debug;
415 | };
416 | 4C79BEF12A553F0E006A793C /* Release */ = {
417 | isa = XCBuildConfiguration;
418 | buildSettings = {
419 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
420 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
421 | CODE_SIGN_ENTITLEMENTS = LangSwitch/LangSwitch.entitlements;
422 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
423 | CODE_SIGN_STYLE = Automatic;
424 | COMBINE_HIDPI_IMAGES = YES;
425 | CURRENT_PROJECT_VERSION = 7;
426 | DEVELOPMENT_ASSET_PATHS = "\"LangSwitch/Preview Content\"";
427 | DEVELOPMENT_TEAM = X3Z75V6JU2;
428 | ENABLE_HARDENED_RUNTIME = YES;
429 | ENABLE_PREVIEWS = YES;
430 | GENERATE_INFOPLIST_FILE = YES;
431 | INFOPLIST_KEY_CFBundleDisplayName = LangSwitch;
432 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
433 | INFOPLIST_KEY_NSHumanReadableCopyright = "";
434 | LD_RUNPATH_SEARCH_PATHS = (
435 | "$(inherited)",
436 | "@executable_path/../Frameworks",
437 | );
438 | MACOSX_DEPLOYMENT_TARGET = 11;
439 | MARKETING_VERSION = 1.3.1;
440 | PRODUCT_BUNDLE_IDENTIFIER = com.nikeev.LangSwitch;
441 | PRODUCT_NAME = "$(TARGET_NAME)";
442 | SWIFT_EMIT_LOC_STRINGS = YES;
443 | SWIFT_VERSION = 5.0;
444 | };
445 | name = Release;
446 | };
447 | 4C79BEF32A553F0E006A793C /* Debug */ = {
448 | isa = XCBuildConfiguration;
449 | buildSettings = {
450 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
451 | BUNDLE_LOADER = "$(TEST_HOST)";
452 | CODE_SIGN_STYLE = Automatic;
453 | CURRENT_PROJECT_VERSION = 1;
454 | GENERATE_INFOPLIST_FILE = YES;
455 | MACOSX_DEPLOYMENT_TARGET = 13.3;
456 | MARKETING_VERSION = 1.0;
457 | PRODUCT_BUNDLE_IDENTIFIER = com.nikeev.LangSwitchTests;
458 | PRODUCT_NAME = "$(TARGET_NAME)";
459 | SWIFT_EMIT_LOC_STRINGS = NO;
460 | SWIFT_VERSION = 5.0;
461 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LangSwitch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/LangSwitch";
462 | };
463 | name = Debug;
464 | };
465 | 4C79BEF42A553F0E006A793C /* Release */ = {
466 | isa = XCBuildConfiguration;
467 | buildSettings = {
468 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
469 | BUNDLE_LOADER = "$(TEST_HOST)";
470 | CODE_SIGN_STYLE = Automatic;
471 | CURRENT_PROJECT_VERSION = 1;
472 | GENERATE_INFOPLIST_FILE = YES;
473 | MACOSX_DEPLOYMENT_TARGET = 13.3;
474 | MARKETING_VERSION = 1.0;
475 | PRODUCT_BUNDLE_IDENTIFIER = com.nikeev.LangSwitchTests;
476 | PRODUCT_NAME = "$(TARGET_NAME)";
477 | SWIFT_EMIT_LOC_STRINGS = NO;
478 | SWIFT_VERSION = 5.0;
479 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LangSwitch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/LangSwitch";
480 | };
481 | name = Release;
482 | };
483 | 4C79BEF62A553F0E006A793C /* Debug */ = {
484 | isa = XCBuildConfiguration;
485 | buildSettings = {
486 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
487 | CODE_SIGN_STYLE = Automatic;
488 | CURRENT_PROJECT_VERSION = 1;
489 | GENERATE_INFOPLIST_FILE = YES;
490 | MARKETING_VERSION = 1.0;
491 | PRODUCT_BUNDLE_IDENTIFIER = com.nikeev.LangSwitchUITests;
492 | PRODUCT_NAME = "$(TARGET_NAME)";
493 | SWIFT_EMIT_LOC_STRINGS = NO;
494 | SWIFT_VERSION = 5.0;
495 | TEST_TARGET_NAME = LangSwitch;
496 | };
497 | name = Debug;
498 | };
499 | 4C79BEF72A553F0E006A793C /* Release */ = {
500 | isa = XCBuildConfiguration;
501 | buildSettings = {
502 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
503 | CODE_SIGN_STYLE = Automatic;
504 | CURRENT_PROJECT_VERSION = 1;
505 | GENERATE_INFOPLIST_FILE = YES;
506 | MARKETING_VERSION = 1.0;
507 | PRODUCT_BUNDLE_IDENTIFIER = com.nikeev.LangSwitchUITests;
508 | PRODUCT_NAME = "$(TARGET_NAME)";
509 | SWIFT_EMIT_LOC_STRINGS = NO;
510 | SWIFT_VERSION = 5.0;
511 | TEST_TARGET_NAME = LangSwitch;
512 | };
513 | name = Release;
514 | };
515 | /* End XCBuildConfiguration section */
516 |
517 | /* Begin XCConfigurationList section */
518 | 4C79BEC52A553F0D006A793C /* Build configuration list for PBXProject "LangSwitch" */ = {
519 | isa = XCConfigurationList;
520 | buildConfigurations = (
521 | 4C79BEED2A553F0E006A793C /* Debug */,
522 | 4C79BEEE2A553F0E006A793C /* Release */,
523 | );
524 | defaultConfigurationIsVisible = 0;
525 | defaultConfigurationName = Release;
526 | };
527 | 4C79BEEF2A553F0E006A793C /* Build configuration list for PBXNativeTarget "LangSwitch" */ = {
528 | isa = XCConfigurationList;
529 | buildConfigurations = (
530 | 4C79BEF02A553F0E006A793C /* Debug */,
531 | 4C79BEF12A553F0E006A793C /* Release */,
532 | );
533 | defaultConfigurationIsVisible = 0;
534 | defaultConfigurationName = Release;
535 | };
536 | 4C79BEF22A553F0E006A793C /* Build configuration list for PBXNativeTarget "LangSwitchTests" */ = {
537 | isa = XCConfigurationList;
538 | buildConfigurations = (
539 | 4C79BEF32A553F0E006A793C /* Debug */,
540 | 4C79BEF42A553F0E006A793C /* Release */,
541 | );
542 | defaultConfigurationIsVisible = 0;
543 | defaultConfigurationName = Release;
544 | };
545 | 4C79BEF52A553F0E006A793C /* Build configuration list for PBXNativeTarget "LangSwitchUITests" */ = {
546 | isa = XCConfigurationList;
547 | buildConfigurations = (
548 | 4C79BEF62A553F0E006A793C /* Debug */,
549 | 4C79BEF72A553F0E006A793C /* Release */,
550 | );
551 | defaultConfigurationIsVisible = 0;
552 | defaultConfigurationName = Release;
553 | };
554 | /* End XCConfigurationList section */
555 | };
556 | rootObject = 4C79BEC22A553F0D006A793C /* Project object */;
557 | }
558 |
--------------------------------------------------------------------------------