Skip to content

zh-TW support: restore upstream's fcitx5 and Noto CJK, add Traditional Chinese locale and Bopomofo input #175

Description

@k5953837

🤖 This issue was written by Claude Opus 5 (an Anthropic AI model) on behalf of @k5953837, who asked it to add Traditional Chinese support and to read the project's contribution rules first. The upstream package list, the package sizes, and the mirror state below were read directly from the pinned Omarchy tree and the live Arch Linux ARM mirrors on 2026-09-09. The branch described under “Status and blocker” passes guest/test locally; the factory image itself has not been built, for the reason given there.

Summary

The factory guest cannot display or type Traditional Chinese today. It generates only en_US.UTF-8, ships no CJK font, and omits fcitx5, so Chinese text renders as tofu boxes and there is no way to enter it.

The part worth stating up front: upstream Omarchy already ships the pieces that make this work. At the pinned release (4.0.2, 346e69e1c), install/omarchy-base.packages contains:

35: fcitx5
36: fcitx5-gtk
37: fcitx5-qt
88: noto-fonts-cjk

guest/packages.txt — the intentionally trimmed ARM64 transaction — drops all four. So this is not a request to add something Omarchy lacks. It is a request to restore what the trim removed, plus the Traditional-Chinese-specific pieces upstream does not cover.

The trim has already cost one bug: #91, where the omitted fcitx5 binary left upstream's omarchy-fcitx5.service in a 203/EXEC restart loop that flooded the journal. #106 fixed that defensively with a ConditionPathExists=/usr/bin/fcitx5 drop-in — a guard that is self-healing, so installing the package makes it pass with no change to the guard.

Why this belongs here rather than upstream

Two earlier pull requests proposed Simplified Chinese support (#26, #63). Both were withdrawn by their own authors, and #26's closing comment argued the work "belongs in upstream Omarchy... not the Try Omarchy wrapper."

The package list above is the reason I think that reasoning does not hold. Upstream has already made the call to ship fcitx5 and Noto CJK. The gap exists only inside this fork's ARM64 trim, so it can only be closed here. What upstream does not provide, and what is genuinely this project's to decide, is the zh-TW-specific configuration: a Traditional Chinese locale, a font rule that picks TC Han glyph variants over Simplified or Japanese ones, and a Bopomofo engine.

Proposed change

Concern Change
Locale Generate zh_TW.UTF-8 alongside en_US.UTF-8 in configure-rootfs.sh. LANG stays en_US.UTF-8 and KEYMAP stays us — the locale becomes available, not default.
Fonts Restore upstream's noto-fonts-cjk.
Glyph variants New etc/fonts/conf.d/30-*.conf preferring Noto Sans/Serif/Mono CJK TC when the text language is zh-tw or zh-hant. Without it, shared codepoints render with Simplified or Japanese forms.
Input method Restore upstream's fcitx5, fcitx5-gtk, fcitx5-qt; add fcitx5-chewing for Bopomofo.
Input method defaults Seed /etc/skel/.config/fcitx5/profile with keyboard-us as the first item and chewing as the second, so a user who never presses Ctrl+Space sees no change at all.
XWayland XMODIFIERS=@im=fcitx in environment.d. GTK_IM_MODULE/QT_IM_MODULE are deliberately left unset so native Wayland GTK4/Qt6 apps keep using text-input-v3, which Hyprland implements.
Chromium Append --enable-wayland-ime to upstream's /etc/skel/.config/chromium-flags.conf. Chromium on Wayland ignores input methods without it, and Chromium is the browser this image ships.

Net effect for an existing English-speaking user: none. The default session language, keyboard layout, and first input method are unchanged.

Deliberately excluded

  • fcitx5-chinese-addons — hard-depends on qt6-webengine, which does not fit the 6144 MiB factory image. Add Chinese input and locale to the factory guest #63 hit the same wall. Bopomofo via fcitx5-chewing does not need it.
  • fcitx5-configtool — upstream does not ship it either, and it pulls a KDE dependency chain (kwidgetsaddons alone is ~15 MiB). Excluded to keep the package set identical to upstream's plus one engine.
  • Raising image.sizeMiB — that value is duplicated as a runtime contract in macos/run-qemu-gpu.sh and asserted in macos/Tests/run-qemu-ssh-contract.test.sh, so changing it is an architecture discussion, not part of this.
  • Localising the macOS launcher UI — unrelated to the guest and a separate proposal.
  • Changing the default language — see above.

Size

Measured Installed Size from pacman -Si in an aarch64 builder container:

Package Installed Size
noto-fonts-cjk 298.79 MiB
fcitx5 20.72 MiB
fcitx5-qt 2.28 MiB
fcitx5-gtk 516 KiB
fcitx5-chewing 171 KiB

Plus new transitive dependencies, of which libchewing (6.78 MiB) is the largest; the exact set is pending the lock refresh below.

guest/scripts/pack-image.sh requires the staged root to stay under 85% of 6144 MiB. I have not been able to measure the actual headroom yet, for the reason below. If it turns out to be tight, adobe-source-han-sans-tw-fonts (38.15 MiB, Traditional Chinese only) is a fallback, at the cost of dropping Japanese and Korean coverage that upstream currently provides.

Status and blocker

The non-package half of this is implemented and passing guest/test on a branch here: locale generation, the fcitx5 profile fragment, the Chromium flag append, the fontconfig rule, the XMODIFIERS entry, and ten new assertions in guest/tests/verify.py covering the contract — including one that the default LANG/KEYMAP stay English.

I cannot complete it yet: adding packages requires regenerating guest/packages.lock.json, and that is blocked by the two upstream drifts in #171 (the builder's rust pin no longer exists on the ALARM mirror, and no single aquamarine currently satisfies both hyprland and hyprtoolkit). I am waiting on that rather than working around it, since CONTRIBUTING.md asks that pinned inputs not be changed independently of their validation code.

Question

Before I open a pull request: is Traditional Chinese support something you want in Try Omarchy? Given that the packages come straight back from upstream's own list and the default English experience is untouched, I think the surface area is small — but #26 and #63 suggest previous contributors were unsure of your position, and I would rather ask than guess.

If you would prefer a narrower first step — for example restoring only noto-fonts-cjk so CJK text renders, and leaving input methods for later — I am happy to split it that way.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions