
如何让 coreutils 输出非英文提示信息locale 文件放置路径与 LANG 变量覆盖【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutilscoreutilsRust 实现的 GNU coreutils 跨平台重写版的帮助信息和错误提示默认是英文的因为en-US.ftl文件在构建时直接嵌入二进制任何安装方式下英文都能用。想让同一套二进制输出其他语言的提示需要做两件事把对应语言的 Fluent 文件locale.ftl放到程序运行时能找到的位置再通过LANG环境变量告诉程序使用哪个语言。本文以仓库中唯一内置的非英文语言——法语fr-FR为例说明 locale 文件该放在哪里、如何覆盖语言、以及怎么验证输出确实变了。语言是怎么被选中的程序启动时通过detect_system_locale()读取LANG环境变量例如fr_FR.UTF-8去掉编码部分后解析语言标识如果LANG未设置或解析失败回退到常量DEFAULT_LOCALE en-US见 locale.rs。也就是说LANG只影响语言选择编码后缀会被剥掉fr-FR和fr_FR.UTF-8指向同一个语言包单次运行时可以用LANGxx-XX command的方式临时覆盖不必修改 shell 配置。文档给出的覆盖示例是LANGja-JP ./target/debug/ls注意仓库源码树里只带了法语翻译ja-JP这类语言没有对应.ftl文件时会回退到嵌入式英文。要找日语等其他语言的翻译文件需要参考 l10n.md 中提到的uutils/coreutils-l10n翻译仓库不在本仓库内。locale 文件放在哪里每个工具有一组翻译文件源码树中的布局是src/uu/utility/locales/locale.ftl例如src/uu/ls/locales/en-US.ftl嵌入二进制和src/uu/ls/locales/fr-FR.ftl运行时从文件系统加载通用字符串在 src/uucore/locales/ 下。查找路径按构建模式区分依据 l10n.md开发构建debug路径相对 crate 源码解析为$CARGO_MANIFEST_DIR/../uu/utility/locales/。所以在源码树里直接跑./target/debug/下的二进制fr-FR.ftl已经在树里不需要任何放置操作。发布构建release路径相对可执行文件所在目录解析文档列出的查找顺序为executable_dir/locales/utility/ prefix/share/locales/utility/ ~/.local/share/coreutils/locales/utility/ ~/.cargo/share/coreutils/locales/utility/ /usr/share/coreutils/locales/utility/若以上位置都找不到外部 locale 文件系统回退到嵌入式英文语言包不会报错。以ls的法语翻译为例放到用户级目录的最小操作是mkdir -p ~/.local/share/coreutils/locales/ls cp src/uu/ls/locales/fr-FR.ftl ~/.local/share/coreutils/locales/ls/cp只会写到你自己的 home 目录如果用的是cargo install装的可执行文件把fr-FR.ftl放进executable_dir/locales/ls/同样可行。utility目录里只需要放对应语言的.ftl文件即可加载逻辑要求该目录下的语言文件成功读入通用字符串找不到时会用二进制内嵌的英文兜底。验证输出是否为法语仓库的本地化测试 tests/test_localization_and_colors.rs 给出了两个可直接复用的判断标准--help输出中Usage:应变为Utilisation:错误信息中的error应变为erreur。手动验证# 帮助信息应看到 Utilisation: 而非 Usage: LANGfr_FR.UTF-8 ./target/debug/coreutils ls --help # 错误信息stderr 中应出现 erreur LANGfr_FR.UTF-8 ./target/debug/coreutils ls --invalid-option如果输出仍是英文按以下顺序排查LANG是否真的传进了进程echo $LANG或按上面的形式内联设置当前是 debug 构建还是 release 构建debug 构建读源码树release 构建只查可执行文件相对路径放错目录会导致回退英文语言目录名是否拼写正确fr-FR与.ftl文件名前缀一致文件内容需为合法 Fluent 语法。另外uucore 自带的本地化单元测试覆盖 bundle 加载、复数逻辑、语言回退等场景可用文档 l10n.md 中给出的命令运行cargo test --lib -p uucore需要知道的限制英文永远可用en-US.ftl在构建时生成并嵌入二进制cargo install这类不带 locale 目录的安装方式下也只有英文逐条消息回退请求的语言文件里缺某条消息时先回退英文英文也没有则返回消息 ID 本身不会崩溃初始化是一次性的本地化状态按线程用OnceLock存储每个线程初始化一次重复初始化返回错误所以运行中改LANG不影响已启动的进程仓库内能开箱即用验证的非英文语言只有fr-FR法语是唯一随源码树分发的翻译目的是让测试可以用非英文 locale 跑通其他语言需要自行获取coreutils-l10n翻译仓库中的.ftl文件并按上述路径放置。更多实现细节线程局部存储、Unicode 隔离处理、Fluent 宏用法见 l10n.md 与 src/uucore/src/lib/mods/locale.rs。【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考