{"id":48438299,"url":"https://github.com/bulgariamitko/lang-auto-switcher","last_synced_at":"2026-05-15T12:05:01.957Z","repository":{"id":349543152,"uuid":"1199293227","full_name":"bulgariamitko/lang-auto-switcher","owner":"bulgariamitko","description":"Type English \u0026 Bulgarian on the same keyboard. Free macOS Input Method that auto-detects the language and converts to the right alphabet as you type — no Cmd+Space, no switching layouts.","archived":false,"fork":false,"pushed_at":"2026-05-13T12:40:06.000Z","size":2186,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T14:18:56.551Z","etag":null,"topics":["bulgarian","cyrillic","imk","input-method","keyboard","language-detection","macos","swift","transliteration"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bulgariamitko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-02T08:01:02.000Z","updated_at":"2026-05-13T12:40:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bulgariamitko/lang-auto-switcher","commit_stats":null,"previous_names":["bulgariamitko/lang-auto-switcher"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/bulgariamitko/lang-auto-switcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulgariamitko%2Flang-auto-switcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulgariamitko%2Flang-auto-switcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulgariamitko%2Flang-auto-switcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulgariamitko%2Flang-auto-switcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bulgariamitko","download_url":"https://codeload.github.com/bulgariamitko/lang-auto-switcher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulgariamitko%2Flang-auto-switcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33066138,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T11:35:32.926Z","status":"ssl_error","status_checked_at":"2026-05-15T11:35:31.362Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bulgarian","cyrillic","imk","input-method","keyboard","language-detection","macos","swift","transliteration"],"created_at":"2026-04-06T14:04:23.186Z","updated_at":"2026-05-15T12:05:01.950Z","avatar_url":"https://github.com/bulgariamitko.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LangAutoSwitcher\n\n\u003e **Type English and Bulgarian on the same keyboard, without ever switching layouts.**\n\u003e Just type — LangAutoSwitcher figures out which language you meant and converts it to the right alphabet as you go.\n\nFree, open source, native macOS Input Method. No accounts, no telemetry. The only network traffic is a daily check for new versions (can be disabled in the Sparkle update preferences).\n\n| Platform | Status |\n|---|---|\n| **macOS** | ✅ Ready — download and install below |\n| **Linux** (IBus) | 🚧 [Skeleton](langauto-linux/README.md) — Rust core works, input plumbing TODO. Contributors welcome. |\n| **Windows** | 🚧 [Skeleton](langauto-windows/README.md) — Rust core works, input plumbing TODO. Contributors welcome. |\n\nThe phonetic mapping, dictionaries, language detection, and autocorrect all live in a shared Rust crate (`langauto-core`) — porting to a new OS only requires writing the input-method shim for that platform.\n\n```\nYou type:    napisah now kod and sent email to John\nYou see:     написах нов код and sent email to John\n```\n\nThat's the whole idea. No `Cmd+Space`. No mistyped passwords. No half-Cyrillic, half-Latin Facebook posts.\n\n---\n\n## Who is this for?\n\nAnyone who types in **both English and Bulgarian** every day and is tired of:\n\n- Forgetting to switch the keyboard before typing a password\n- Sending Facebook messages that start in one language and end in the other\n- Constantly hitting `Cmd+Space` mid-sentence\n- The standard БДС / Phonetic layout requiring you to *think* about which mode you're in\n\nLangAutoSwitcher just watches what you type and picks the right alphabet for each word. Your existing Cyrillic and English keyboards stay exactly as they are — this is one more option you can switch to from the menu bar 🌐 icon.\n\n---\n\n## How it works\n\n1. You type normally on a regular QWERTY keyboard.\n2. Letters appear **underlined** while a word is being composed.\n3. The moment you press **space**, the word is checked against:\n   - a **234,000-word English dictionary**\n   - a **234,000-word Bulgarian dictionary** (phonetically transliterated)\n4. The winning language commits — either as-is (English) or converted to Cyrillic (Bulgarian).\n5. If a word exists in both languages, it follows the language of the previous word, so your \"flow\" is preserved.\n\nIt auto-corrects common abbreviations too: `u` → `you`, `r` → `are`, plus edit-distance-1 spell correction for both languages.\n\n### Examples\n\n| You type | What appears | What happened |\n|---|---|---|\n| `towa e samo proba` | това е само проба | All Bulgarian words → Cyrillic |\n| `hello how are you` | hello how are you | All English words → kept as-is |\n| `napisah now kod and want to write` | написах нов код and want to write | Auto-switched mid-sentence |\n| `how r u` | how are you | Abbreviation expanded |\n| `kak si` | как си | Bulgarian via transliteration |\n| `john@gmail.com` | john@gmail.com | Emails preserved |\n\n---\n\n## Install (60 seconds)\n\n**1. Download** the latest release:\n👉 [**Download LangAutoSwitcher-v2.7.7.dmg**](https://github.com/bulgariamitko/lang-auto-switcher/releases/latest)\n\n**2. Open the DMG**, then **double-click `Install.command`**. A small Terminal window opens, copies the app into place, and shows you the next steps.\n\n**3. Log out and log back in.** (macOS only discovers new input methods at login — there is no way around this, sorry.)\n\n**4. Add it to your input sources:**\n- Open **System Settings → Keyboard → Input Sources → Edit…**\n- Click **+** in the bottom-left → search for **\"LangAutoSwitcher\"** → **Add**\n\n**5. Switch to it.** Click the 🌐 / flag icon in your menu bar and pick **LangAutoSwitcher**.\n\nNow just type. 🎉\n\n\u003e **Updates after this**: LangAutoSwitcher checks once a day for a new version and pops up an \"Install Update\" dialog when one ships. You only have to do the manual install once.\n\n### Uninstall\n\n```bash\nrm -rf ~/Library/Input\\ Methods/LangAutoSwitcher.app\n```\nThen log out / log back in.\n\n---\n\n## Transliteration mapping\n\nEvery Latin key maps to exactly one Cyrillic letter (no digraphs to remember):\n\n| Key | → | Key | → | Key | → | Key | → |\n|---|---|---|---|---|---|---|---|\n| `a` | а | `i` | и | `q` | я | `y` | ъ |\n| `b` | б | `j` | й | `r` | р | `z` | з |\n| `c` | ц | `k` | к | `s` | с | `[` | ш |\n| `d` | д | `l` | л | `t` | т | `]` | щ |\n| `e` | е | `m` | м | `u` | у | `;` | ж |\n| `f` | ф | `n` | н | `v` | ж | `` ` `` | ч |\n| `g` | г | `o` | о | `w` | в | `\\` | ю |\n| `h` | х | `p` | п | `x` | ь | `'` | ь |\n\nYou almost never need to think about this table — most Bulgarian words are recognized by the dictionary directly from how you'd naturally spell them out (`zdravei`, `blagodarq`, `dobre`).\n\n### Customizing the keymap\n\nDon't like the default mapping? Click the 🌐 menu → **LangAutoSwitcher** → **Edit Keymap…** to open `~/Library/Application Support/LangAutoSwitcher/keymap.json` in your editor. Change any pair (for example remap `v` to `в` instead of `ж`), save the file, then pick **Reload Keymap** from the same menu — your overrides apply immediately. **Reset Keymap to Defaults** restores everything.\n\n---\n\n## Requirements\n\n- macOS 14.0 (Sonoma) or later\n- Apple Silicon or Intel Mac\n\n## Privacy\n\nLangAutoSwitcher runs entirely on your Mac. It does **not**:\n\n- send any text anywhere\n- collect analytics or telemetry\n- log your keystrokes to disk\n\nThe dictionaries ship bundled inside the app.\n\nThe **only** network connection the app makes is a daily HTTPS request to its appcast (`https://bulgariamitko.github.io/lang-auto-switcher/appcast.xml`) to see whether a new version is available — handled by the open-source [Sparkle](https://sparkle-project.org) framework. You can disable update checks at any time in the Sparkle prompt that appears on the first launch.\n\n---\n\n## Build from source\n\nRequires Xcode, [XcodeGen](https://github.com/yonaskolb/XcodeGen), and [Rust](https://rustup.rs):\n\n```bash\nbrew install xcodegen\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nrustup target add x86_64-apple-darwin aarch64-apple-darwin\n\nxcodegen generate\nxcodebuild -project LangAutoSwitcher.xcodeproj -target LangAutoSwitcher -configuration Release build\nbash install.sh\n```\n\nThe Xcode build automatically invokes `scripts/build_rust.sh` to compile the cross-platform `langauto-core` Rust crate as a universal static library.\n\nThen log out / log back in and add it from System Settings as above.\n\n### Run tests\n\n```bash\nswift test_cases.swift     # 163 Swift integration tests\ncargo test                 # 23 Rust unit tests\n```\n\n## Architecture\n\n```\nlangauto-core/        Rust crate — phonetic, dictionaries, detection, autocorrect\nlangauto-linux/       Linux IBus shim (skeleton)\nlangauto-windows/     Windows shim (skeleton)\nLangAutoSwitcher/     macOS Swift app (links langauto-core as static library)\n```\n\nAll shared logic lives in `langauto-core`. Each platform writes its own thin shim that links the core. See [langauto-core/README.md](langauto-core/) for the C ABI.\n\n---\n\n## Adding your own language\n\nThe architecture supports any Latin ↔ non-Latin language pair. To add one:\n\n1. Add mappings to `map_char()` in `langauto-core/src/phonetic.rs`\n2. Drop a word list (one word per line, in the target script) into `LangAutoSwitcher/Resources/`\n3. Wire it up in `langauto-core/src/detector.rs`\n4. Add test cases to `test_cases.swift` and `langauto-core/src/*/tests`\n5. Open a PR\n\nGood candidates: **Russian**, **Ukrainian**, **Serbian** (other Cyrillic languages), **Greek**, **Georgian**, **Armenian**.\n\n## Contributing\n\nPull requests welcome. For bug reports, please include:\n- macOS version\n- What you typed\n- What you expected vs. what appeared\n\n## License\n\nMIT — do whatever you want with it, including for commercial use.\n\n---\n\nIf LangAutoSwitcher saves you time, star ⭐ the repo and share it — that's how other Bulgarian Mac users find it.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulgariamitko%2Flang-auto-switcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbulgariamitko%2Flang-auto-switcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulgariamitko%2Flang-auto-switcher/lists"}