Logs page renders blank when LANG is a CJK locale on Flatpak (monospace resolves to proportional Noto Sans CJK)

未關閉 適合新手
#8,107 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
2/5
預估耗時
1-3 小時
新手友好度
76/100
Issue 類型
缺陷
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
rust, typescript
領域
desktop, frontend

研究方向

從 packages/ui/src/composables/terminal.ts 開始,issue 指出終端在這裡將字型系列設為通用的 monospace;檢查 Logs 頁面如何設定 xterm.js,以及附近的測試是否涵蓋終端渲染。在 Flatpak 中使用 CJK LANG 重現,並與 en_US.UTF-8 比較。當日誌和空狀態都能在 CJK locale 下渲染時,工作即完成。

由索引模型根據 Issue 內容生成。

描述

Please confirm the following
  • I checked the existing issues for duplicate problems
  • I have tried resolving the issue using the support portal
  • I have ensured my Modrinth App installation is up to date
What version of the Modrinth App are you using?

0.22.0 (Flathub, com.modrinth.ModrinthApp, runtime org.gnome.Platform/x86_64/49)

What operating systems are you seeing the problem on?

Linux — Fedora 44, KDE Plasma (Wayland), system locale zh_CN.UTF-8

Describe the bug

When the system/process locale is Chinese (LANG=zh_CN.UTF-8), the instance Logs page renders an entirely blank terminal, even though the logs are read successfully.

The page chrome (search box, level filters, log-source dropdown) works, and the dropdown correctly lists latest.log, crash reports, and rotated .log.gz files. Selecting any of them still leaves the terminal blank. The empty-state message/frog does not appear either, which suggests the xterm.js terminal never renders any text.

Launching the same Flatpak with LANG=en_US.UTF-8 makes the Logs page work normally, so the data/back-end side is fine — this is a rendering issue.

The same instance shows:

  • LANG=zh_CN.UTF-8: an empty white terminal area
Image
  • LANG=en_US.UTF-8: empty-state bubble and log contents render normally
Image
Steps to reproduce
  1. Use a system with LANG=zh_CN.UTF-8 (or any CJK locale), and install Modrinth App from Flathub.
  2. Open an instance that has logs (or launch the instance once so logs exist).
  3. Go to the instance Logs tab.
  4. Observe that the terminal area is completely blank, including no empty-state text.

Optional control:

flatpak run --env=LANG=en_US.UTF-8 com.modrinth.ModrinthApp

→ the Logs page renders correctly.

Expected behavior

The Logs page should display the live log / selected log file regardless of the system locale.

Additional context / root cause analysis

Inside the Flatpak sandbox, fontconfig resolves the generic monospace family differently depending on locale:

$ flatpak run --command=sh com.modrinth.ModrinthApp -c \
    'LANG=en_US.UTF-8 fc-match monospace; LANG=zh_CN.UTF-8 fc-match monospace'
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
NotoSansCJK-VF.ttc: "Noto Sans CJK SC" "Regular"

Noto Sans CJK SC is a proportional CJK font, not a monospace font. The console component hard-codes the generic family:

// packages/ui/src/composables/terminal.ts (v0.22.0)
fontFamily: 'monospace',

xterm.js requires a monospace font for its character-width measurement. When the generic monospace alias resolves to a proportional (and variable) CJK font, the terminal produces no visible output at all — not even the empty-state bubble.

Note that the actual monospace CJK font is present in the sandbox (fc-list shows Noto Sans Mono CJK SC); fontconfig just prefers the proportional Noto Sans CJK SC under zh_CN.

Workaround (app-local, does not affect other apps):

Create ~/.var/app/com.modrinth.ModrinthApp/config/fontconfig/fonts.conf:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
  <match target="pattern">
    <test qual="any" name="family"><string>monospace</string></test>
    <edit name="family" mode="prepend" binding="strong">
      <string>DejaVu Sans Mono</string>
    </edit>
  </match>
</fontconfig>

After this, LANG=zh_CN.UTF-8 fc-match monospace inside the sandbox returns DejaVu Sans Mono and the Logs page renders again (CJK characters fall back to Noto CJK automatically).

Suggested fix: don't rely on the bare generic monospace alias for the terminal. Use an explicit monospace stack, e.g.

fontFamily: "'DejaVu Sans Mono', 'Noto Sans Mono', 'Noto Sans Mono CJK SC', 'Liberation Mono', monospace",

and/or ship a known monospace font with the app. It may also be worth checking whether xterm.js needs a guard against a resolved proportional font.

主要語言
Rust
星號
2.5k
分支
663
平均合併
2 天 11 小時
30 天內合併 PR
122

環境準備

這個專案沒有提供開發容器、Dockerfile 或貢獻指南,環境需要你自己搭建:先看它的 README,通用步驟見我們的新手貢獻指南。

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

modrinth/code 的其他 Issue

查看 modrinth/code 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。