Region-Specific Language Control: Implementing Forced Localization in iOS Apps

My current project has a single target and multiple schemes. Each scheme represents the same app for different countries/regions. It’s essentially the same application with minor adjustments made for each of the supported jurisdictions. In Xcode projects, you define supported languages at the project level (not scheme level). Because of this structure, each app variant inherits the same language settings. My task was to force each app variant to support only the language for the region it was released in. The French app should only support French, no matter what the user’s device language is set to, and so on. This decision was made because large portions of the app are web-based and only supported a single language. ...

April 2, 2025 · Bartosz Kunat

Creating a New Objective-C Project in Xcode 16

Update: 26/03/25 It looks like Objective-C is still an option in the default iOS project template. You can access it after setting the Interface to “Storyboard”. I hadn’t realized these dropdown menus were interconnected. All credit goes to Douglas for spotting this! tl;dr use macOS → Application → Game or Command Line Tool Recently I wanted to refresh my memory on Objective-C. My first thought was to open Xcode, create a new project with language set to Objective-C and play with it. To my surprise, none of the iOS Application project templates allow you to select any other language than Swift. ...

March 25, 2025 · Bartosz Kunat

Verifying VPN Status for Docker qBittorrent on Synology

I run qbittorrent in a Docker container on my Synology NAS, with VPN configured at the Synology system level (Control Panel -> Network -> Network Interface) rather than the container level. For setup instructions, you can follow this guide. Even with killswitch enabled, I wanted to verify beyond the UI’s “Firewalled” status that my torrent traffic was actually routing through the VPN. To check this, SSH into your Synology NAS and run: ...

November 30, 2024 · Bartosz Kunat