├── 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 | ![langswitch-example](https://github.com/Nikeev/LangSwitch/assets/1555773/2850313a-f70d-4f76-b629-3d5798754f86) 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 | --------------------------------------------------------------------------------