Steam 在 NixOS 上的中文显示问题总算被修复了

发表于 更新于

前言

长久以来 Steam 在 NixOS 上存在中文字体显示问题,挺让人恼火的。好消息是最近这个问题被修复了,感谢 #312268 这个 pr 的作者。

原因

根据 Steam 官方仓库此 issue 中的回复描述,Steam 运行在一种类似 Flatpak 的容器环境中,且使用自己的 libfontconfig。这会导致以下问题:

  • Steam 无法找到 NixOS 的系统字体文件,因为字体并不会安装在 /usr/share/fonts
  • Steam 跟 NixOS 的 fontconfig 行为可能不同,且无法修改 Steam 容器中 /etc 目录的字体配置。

我印象里自使用 NixOS 起,Steam 就无法显示中文。曾经的讨论告诉我,取消系统的默认字体配置并安装 wqy_zenhei(文泉驿字体)可以让 Steam 显示中文。就像下面这样(参考注释掉的内容):

fonts = {
    enableDefaultPackages = true;
    fontDir.enable = true;

    fonts = with pkgs; [
        noto-fonts
        noto-fonts-cjk
        noto-fonts-extra
        noto-fonts-emoji
        noto-fonts-emoji-blob-bin
        wqy_zenhei # 添加文泉驿字体
    ];

    fontconfig = {
      # 注释掉整个 defaultFonts 部分
      # defaultFonts = {
      #   serif = [ "Noto Serif" ];
      #   sansSerif = [ "Noto Sans CJK SC" ];
      #   monospace = [ "Noto Sans Mono CJK SC" ];
      # };
    }
};

但这样做有明显的缺陷。系统的字体配置模糊化了,各个应用程序的字体显示不会按照自己设想的那样优先使用 Noto Sans CJK SC。为了一个 Steam 搅乱整个系统的字体配置得不偿失,况且文泉驿也是过时的字体。

已修复

现在 Steam 的配置经过 #312268 的调整,已经做了兼容。个人测试下来十分完美。

如果你的的 fonts.fonts 配置中存在中文,那么 Steam 默认不需要做任何改动,开箱就会显示中文。如果你想调整 Steam 的字体,请编辑 ~/.config/fontconfig/fonts.conf

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <!-- 省略其它配置... -->
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>WenQuanYi Zen Hei</family>
    </prefer>
  </alias>
</fontconfig>

效果如图:

Steam 文泉驿字体

很显然,文泉驿的显示效果并不好。且这个字体有一些缺失,我们不再建议使用它。将上述配置中的 WenQuanYi Zen Hei 改为 Noto Sans CJK SC 然后重启 Steam:

Steam 文泉驿字体

这下就基本完美啦。

原理

现在 steam 配置默认会把 NixOS 配置中的字体安装到 Steam 环境中。也就是说我的系统配置包含了 Noto Sans CJK 和文泉驿字体,所以 Steam 的容器环境中也读取到这两个字体。

我们还可以像这样添加系统中没有的字体,让 Steam 单独使用:

programs.steam = {
  # 省略其它配置...
  fontPackages = with pkgs; [ source-han-sans ];
};

这时候重启 Steam 会看到思源黑体。而这个字体在我们的系统中并不存在,它仅被安装到 Steam 环境中。

思源黑体和 Noto Sans 非常相似,你可能看不出区别。但这不表示没有生效。

你可能会疑惑,我们还没有更新 ~/.config/fontconfig/fonts.conf 呢?这是因为 Steam 容器中只有思源一个中文字体,如果配置出错或配置的字体不存在,那么它会将思源黑体作为后备字体显示。

当然更新字体配置文件是应该做的,尤其存在多个中文字体的情况下。还有如果你手动配置 fontPackages 那么默认情况下就不会把系统字体全部安装到 Steam 环境中,这在一定程度上也节省了空间。

结束语

这就是 NixOS 可以正确显示中文的一个小新闻的全部了。

作者头像 一点点入门知识 打赏作者
订阅我的 Telegram 频道

订阅频道第一时间掌握作者博客的最新动态,获取更多的分享。

本文由作者按照 CC BY 4.0 进行授权
分享: