carry on
deepin
4 hours ago It has been deleted!
玲珑容器内 deepin glibc 2.38 的 /usr/lib/locale 缺少 zh_CN.UTF-8,导致 Wine XIM 初始化时 locale 为空,无法与 fcitx5 建立输入法连接。
/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}
'';
};
/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."
~/.config/fcitx5/conf/xim.conf[XIM]
UseOnTheSpotStyle=False
~/.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
缺少 zh_CN.UTF-8,就是缺少文本协议,加个协议就行,估计不想加。
Popular Ranking
ChangePopular Events
More
我用claude跑这个问题,最后解决了,这是claude给的总结,有没有大佬可以解释下 然后解决下这个问题 我不想搞这么麻烦
`完整的永久解决方案总结:
根本原因
玲珑容器内 deepin glibc 2.38 的 /usr/lib/locale 只有 C.utf8,缺少 zh_CN.UTF-8,导致 Wine 的 XIM 初始化时 locale 为空,无法与 fcitx5 建立输入法连接。
永久配置
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 更新后重新执行一次即可。`