[ Technical exchange] 我的NixOS企业微信可以输入中文了!
Tofloor
poster avatar
carry on
deepin
4 hours ago
Author

我用claude跑这个问题,最后解决了,这是claude给的总结,有没有大佬可以解释下 然后解决下这个问题 我不想搞这么麻烦

`完整的永久解决方案总结:
根本原因
玲珑容器内 deepin glibc 2.38 的 /usr/lib/locale 只有 C.utf8,缺少 zh_CN.UTF-8,导致 Wine 的 XIM 初始化时 locale 为空,无法与 fcitx5 建立输入法连接。
永久配置

  1. NixOS configuration.nix
    nix# fcitx5 输入法
    i18n.inputMethod = {
    enable = true;
    type = "fcitx5";
    fcitx5.addons = with pkgs; [
    fcitx5-chinese-addons
    fcitx5-rime
    fcitx5-gtk
    libsForQt5.fcitx5-qt
    ];
    };

玲珑容器 Qt5/GTK 插件路径

systemd.tmpfiles.rules = [
"C /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so 755 root root - ${pkgs.libsForQt5.fcitx5-qt}/lib/qt-5.15.18/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so"
"C /usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules/im-fcitx5.so 755 root root - ${pkgs.fcitx5-gtk}/lib/gtk-3.0/3.0.0/immodules/im-fcitx5.so"
];
2. fcitx5 启用 XIM 前端
bashmkdir -p ~/.config/fcitx5/conf
cat > ~/.config/fcitx5/conf/xim.conf << 'EOF'
[XIM]
UseOnTheSpotStyle=False
EOF
3. 玲珑应用环境变量
bashmkdir -p ~/.config/linglong/apps/com.qq.weixin.work.deepin
cat > ~/.config/linglong/apps/com.qq.weixin.work.deepin/config.json << 'EOF'
{
"env": {
"GTK_IM_MODULE": "fcitx",
"QT_IM_MODULE": "fcitx",
"XMODIFIERS": "@im=fcitx",
"LANG": "zh_CN.UTF-8",
"LC_CTYPE": "zh_CN.UTF-8",
"LANGUAGE": "zh_CN:zh",
"CLUTTER_IM_MODULE": "xim"
}
}
EOF
4. 生成 zh_CN locale 并注入容器(关键步骤)
bash#!/bin/bash

找 deepin-base layer

BASE_LAYER=$(grep -rl '"id": "org.deepin.base"' /var/lib/linglong/layers/*/info.json
| head -1 | xargs dirname)

找 deepin-foundation layer(包含 /usr/lib/locale)

FOUNDATION_LAYER=$(grep -rl '"id": "org.deepin.base.wine"' /var/lib/linglong/layers/*/info.json
| head -1 | xargs dirname)

LOCALE_TARGET="$FOUNDATION_LAYER/files/usr/lib/locale"

if [ ! -d "$LOCALE_TARGET/zh_CN.UTF-8" ]; then
TMPDIR=$(mktemp -d)
trap "rm -rf $TMPDIR" EXIT

复制 locale 源文件

for f in zh_CN iso14651_t1_common iso14651_t1 iso14651_t1_pinyin i18n POSIX; do
cp "BASE_LAYER/files/usr/share/i18n/locales/f" "$TMPDIR/"
done
cp "BASE_LAYER/files/usr/share/i18n/locales/translit_"* "TMPDIR/" 2>/dev/null || true

解压 charmap

cp "BASE_LAYER/files/usr/share/i18n/charmaps/UTF-8.gz" "TMPDIR/"
gunzip -f "$TMPDIR/UTF-8.gz"

用 deepin 自己的 localedef 生成

mkdir -p "$HOME/.locale"
I18NPATH="TMPDIR" "BASE_LAYER/files/usr/bin/localedef" --no-archive
-i "$TMPDIR/zh_CN"
-f "$TMPDIR/UTF-8"
"$HOME/.locale/zh_CN.UTF-8"

注入到容器

sudo cp -r "HOME/.locale/zh_CN.UTF-8" "LOCALE_TARGET/"
sudo ln -sf "LOCALE_TARGET/zh_CN.UTF-8" "LOCALE_TARGET/zh_CN.utf8"
echo "Done: zh_CN.UTF-8 locale injected into linglong container"
else
echo "Already exists, skipping."
fi
把这个脚本保存为 ~/scripts/setup-deepin-locale.sh,在 NixOS 重装或 deepin-foundation layer 更新后重新执行一次即可。`

Reply Favorite View the author
All Replies
avatar
carry on
deepin
4 hours ago
#1
It has been deleted!
avatar
carry on
deepin
3 hours ago
#2

NixOS 玲珑企业微信 fcitx5 中文输入修复方案

问题根因

玲珑容器内 deepin glibc 2.38 的 /usr/lib/locale 缺少 zh_CN.UTF-8,导致 Wine XIM 初始化时 locale 为空,无法与 fcitx5 建立输入法连接。


1. /etc/nixos/configuration.nix

# fcitx5 输入法
i18n.inputMethod = {
  enable = true;
  type = "fcitx5";
  fcitx5.addons = with pkgs; [
    fcitx5-chinese-addons
    fcitx5-rime
    fcitx5-gtk
    libsForQt5.fcitx5-qt
  ];
};

# 玲珑容器 Qt5/GTK 插件路径
systemd.tmpfiles.rules = [
  "C /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so 755 root root - ${pkgs.libsForQt5.fcitx5-qt}/lib/qt-5.15.18/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so"
  "C /usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules/im-fcitx5.so 755 root root - ${pkgs.fcitx5-gtk}/lib/gtk-3.0/3.0.0/immodules/im-fcitx5.so"
];

# 自动生成 zh_CN locale 注入玲珑容器
system.activationScripts.deepinWineLocale = {
  deps = [];
  text = let
    script = pkgs.replaceVars ./scripts/setup-deepin-locale.sh {
      gzip = pkgs.gzip;
    };
  in ''
    ${pkgs.bash}/bin/bash ${script}
  '';
};

2. /etc/nixos/scripts/setup-deepin-locale.sh

#!/bin/bash

USER_HOME="/home/luozenan"
LOCALE_DIR="$USER_HOME/.locale"

# 找 deepin-base layer
BASE_LAYER=$(grep -rl '"id": "org.deepin.base"' /var/lib/linglong/layers/*/info.json \
  2>/dev/null | head -1 | xargs -r dirname 2>/dev/null)

# 找 deepin-foundation layer(包含 /usr/lib/locale)
FOUNDATION_LAYER=$(grep -rl '"id": "org.deepin.base.wine"' /var/lib/linglong/layers/*/info.json \
  2>/dev/null | head -1 | xargs -r dirname 2>/dev/null)

if [ -z "$BASE_LAYER" ] || [ -z "$FOUNDATION_LAYER" ]; then
  echo "deepin-wine-locale: layers not found, skipping."
  exit 0
fi

LOCALE_TARGET="$FOUNDATION_LAYER/files/usr/lib/locale"

if [ -d "$LOCALE_TARGET/zh_CN.UTF-8" ]; then
  echo "deepin-wine-locale: already exists, skipping."
  exit 0
fi

echo "deepin-wine-locale: generating zh_CN.UTF-8..."
TMPDIR=$(mktemp -d)
LOCALE_TMP=$(mktemp -d)
trap "rm -rf $TMPDIR $LOCALE_TMP" EXIT

for f in zh_CN iso14651_t1_common iso14651_t1 iso14651_t1_pinyin i18n POSIX; do
  cp "$BASE_LAYER/files/usr/share/i18n/locales/$f" "$TMPDIR/"
done
cp "$BASE_LAYER/files/usr/share/i18n/locales/translit_"* "$TMPDIR/" 2>/dev/null || true

cp "$BASE_LAYER/files/usr/share/i18n/charmaps/UTF-8.gz" "$TMPDIR/"
@gzip@/bin/gunzip -f "$TMPDIR/UTF-8.gz"

mkdir -p "$LOCALE_TMP"
I18NPATH="$TMPDIR" "$BASE_LAYER/files/usr/bin/localedef" --no-archive \
  -i "$TMPDIR/zh_CN" \
  -f "$TMPDIR/UTF-8" \
  "$LOCALE_TMP/zh_CN.UTF-8"

mkdir -p "$LOCALE_TARGET"
rm -rf "$LOCALE_TARGET/zh_CN.UTF-8" "$LOCALE_TARGET/zh_CN.utf8"
cp -r "$LOCALE_TMP/zh_CN.UTF-8" "$LOCALE_TARGET/"
ln -sf "$LOCALE_TARGET/zh_CN.UTF-8" "$LOCALE_TARGET/zh_CN.utf8"

echo "deepin-wine-locale: done."

3. ~/.config/fcitx5/conf/xim.conf

[XIM]
UseOnTheSpotStyle=False

4. ~/.config/linglong/apps/com.qq.weixin.work.deepin/config.json

{
  "env": {
    "GTK_IM_MODULE": "fcitx",
    "QT_IM_MODULE": "fcitx",
    "XMODIFIERS": "@im=fcitx",
    "LANG": "zh_CN.UTF-8",
    "LC_CTYPE": "zh_CN.UTF-8",
    "LANGUAGE": "zh_CN:zh",
    "CLUTTER_IM_MODULE": "xim"
  }
}

应用步骤

# 1. 把脚本加入 Git 追踪
cd /etc/nixos
git add scripts/setup-deepin-locale.sh

# 2. 重建系统(自动执行 locale 生成脚本)
sudo nixos-rebuild switch

# 3. 重启 fcitx5 确保 XIM 前端加载
pkill fcitx5 && sleep 1 && fcitx5 &

# 4. 启动企业微信
ll-cli run com.qq.weixin.work.deepin &

注意事项

脚本只在 zh_CN.UTF-8 目录不存在时运行。deepin-foundation layer 更新后需要手动触发重新生成:

FOUNDATION_LAYER=$(grep -rl '"id": "org.deepin.base.wine"' /var/lib/linglong/layers/*/info.json \
  | head -1 | xargs -r dirname)
sudo rm -rf "$FOUNDATION_LAYER/files/usr/lib/locale/zh_CN.UTF-8"
sudo nixos-rebuild switch
Reply View the author
avatar
流星追月
deepin
3 hours ago
#3

缺少 zh_CN.UTF-8,就是缺少文本协议,加个协议就行,估计不想加。

Reply View the author