Skip to content

v2.3.0 - Language visibility & progressive translation

Choose a tag to compare

@puritysb puritysb released this 20 Jul 22:22
· 40 commits to main since this release

ViewLingo 2.3.0

This release is mostly about two things: making language support visible, and making a text-heavy screen feel like it's doing something while it translates.

Languages

  • Language names appear in your own language. Lists now show a language's own name followed by its name in your app language — "ไทย (Thai)" rather than just "ไทย" — so you can tell what you're picking.
  • Fixed: the app could show fewer languages than your Mac supports. An empty answer from the translation framework at launch pinned a hardcoded fallback list for a full hour, while the Mac itself supported far more. If a language you needed looked missing, this was probably why. ViewLingo supports every language macOS can translate, and picks up new ones without an app update.
  • One row per language in the source list. It previously showed a separate row for every regional variant the framework reports — nine rows for English alone — which looked nothing like the list in System Settings. Choosing a source language says what might appear on your screen, where the region makes no difference. Simplified and Traditional Chinese stay separate. The target-language picker is unchanged, and existing settings are migrated.
  • Japanese is no longer mistaken for Traditional Chinese. The detector scored 確, 認, 問, 題, 運 and 業 as Chinese indicators, but these are everyday Japanese kanji — 確認 is one of the most common Japanese words. Affected text was translated and then dropped at display time for not being a language you'd selected, so it appeared and then vanished. A Chinese variant is now only returned if you actually list Chinese as a source language.
  • Language packs are detected as soon as you come back. Installed-language state is re-checked when the app becomes active — exactly when you return from System Settings after downloading a pack.

A fallback when a language pack is missing

macOS translates on-device and needs a language pack downloaded once before it can work offline. Normally macOS presents its own download prompt when a pack is missing, and installs it in place. But reviewers on macOS 26 described the other outcome — a capture that comes back empty with no explanation, which reads as the app being broken.

For that case, ViewLingo now checks whether a missing pack is the cause and, if so, names the languages needed and offers to open the settings. It asks once per language pair per launch.

Speed and responsiveness

  • The first translation after launch is much faster. Model prewarming previously started when a viewfinder was created, but people capture a second or two later, so the real request still paid the cold-start cost. It now starts at app launch. Measured cold, a first translation ran anywhere from under two seconds to nearly ten; warmed, it settles at about one.

  • Results appear as they finish. A dense screen used to sit blank until everything was translated. Translation is now split into chunks that render the moment each one completes, so the screen fills in progressively.

    On the honest framing of this: the total time is unchanged. On-device translation costs roughly 8ms per character plus a fixed ~180ms per text segment, and no way of invoking it — batched, concurrent, or sequential — moves that number. What changed is when you start seeing results.

  • Live Mode is steadier on video. On sustained high-change content the capture interval now has a floor instead of racing toward 0.05s, which was causing flicker, heat, and unstable overlays.

Fixes

  • Loading indicators no longer vanish while a large translation is still running.
  • Live Mode recovers automatically when a translation gets stuck.
  • Live Mode no longer redraws the overlay every frame on a static screen.
  • The rating prompt no longer appears on top of the translation it's asking about; it waits until the next time you open the viewfinder.
  • Translation history no longer corrupts its own file when a capture writes many entries at once.

Requires macOS 15.0 or later. Optimized for Apple Silicon — it runs on Intel Macs, but translation and text recognition are noticeably slower there.
Translation runs entirely on your device — no network requests, and nothing on your screen leaves your Mac.

Full technical changelog: CHANGELOG.md