您尚未登录。

#1 2024-11-13 12:23:36

站台上的车
会员
注册时间: 2024-01-08
帖子: 20

应用程序、桌面环境、终端究竟是如何决定自己用的是什么地区语言的?

从前年开始使用linux到现在也还是没有分清,只知道有以下方案:
        1、通过locale.gen locale.conf来设置全局语言设置

        2、在当前用户目录下创建.xprofile与.xinit文件并在其中写入相应的环境变量来配置桌面环境的语言

        3、通过程序指定的配置文件(如hyprland.conf  .bashrc  .vimrc  ....)来规定启动应用时使用什么语言

        4、安装特定的中文包

        5、通过gui的内部设置设置

但总是遇到有些软件有中文,有些又没有的问题,举个例子:
      使用hyprland与zsh,已经设置了locale.gen为zh_CN.UTF-8和en_US.UTF-8,locale.conf为en_US.UTF-8
      没有在hyprland.conf中特别声明export LANG zh_CN.UTF-8,但在.zshrc中声明了,结果是通过hyprland
      配置文件(即hyprland.conf)自启动的zsh本身使用中文,而同样方法自启动的wofi(没有生成配置文
      件)则使用英文并且通过zsh启动的应用为中文,而通过wofi启动的应用则为英文,最后我直接在hyprland
      的配置文件里写入export LANG zh_CN.UTF-8后,wofi和zsh都用上中文了,启动的应用也全是中文

      结果就是我完全不理解zsh和wofi现在和之前究竟是通过自己的配置文件还是全局设置亦或是桌面环境的配置文件来
      决定自己使用的语言!

所以软件,系统终端,桌面环境究竟是怎么决定自己是使用什么语言,各种设置方法是否有优先级呢?望各位大佬能够帮忙解答一下
谢谢:)


要发车了,谁要登上学习(arch)的火车?:)

离线

#2 2024-11-13 13:00:36

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,943
个人网站

Re: 应用程序、桌面环境、终端究竟是如何决定自己用的是什么地区语言的?

locale.gen 只是指定要生成哪些 locale。locale 是由环境变量 LANG、LC_* 以及(部分软件)LANGUAGE 来确定的。众所周知,环境变量不主动修改的话是会被子进程继承的。

/etc/locale.conf 是系统的 systemd 读取的 locale 配置文件,会作用于所有进程。

.xprofile 是某些登录管理器会读取的 shell 脚本。SDDM 只会对 X11 会话读取这个脚本,lightdm 会对 X11 和 Wayland 会话都读取。

.xinit 是 startx 用的脚本。

LANG 及 LC_* 环境变量中的很多功能(如数字格式、时间格式、排序方法)是 glibc 读取和处理的。常见的国际化方案如 gettext 会读取并使用程序消息文本相关环境变量来确定显示什么消息。

有些软件的语言包是单独打包的(如火狐、LibreOffice)。你不装语言包的话它们就没有对应语言的翻译。

一些程序有自己的翻译选择逻辑,比如火狐,你可以在「首选项」里安装语言包、设置界面语言。

通过环境变量选择界面语言的时候,你要注意该进程会继承到什么样的环境变量。htop 里对着进程按 e 可以查看进程的环境变量。

离线

#3 2024-11-13 17:56:06

站台上的车
会员
注册时间: 2024-01-08
帖子: 20

Re: 应用程序、桌面环境、终端究竟是如何决定自己用的是什么地区语言的?

依云 说:

locale.gen 只是指定要生成哪些 locale。locale 是由环境变量 LANG、LC_* 以及(部分软件)LANGUAGE 来确定的。众所周知,环境变量不主动修改的话是会被子进程继承的。

请教一下依云大大,是不是指即便设置了中文locale,也只是多加了LANG=zh_CN.UTF-8等变量,但如果不特别声明的话,子进程依然直接使用LANG=en_US.UTF-8等环境变量啊?

最近编辑记录 站台上的车 (2024-11-13 17:57:09)


要发车了,谁要登上学习(arch)的火车?:)

离线

#4 2024-11-13 18:38:41

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,943
个人网站

Re: 应用程序、桌面环境、终端究竟是如何决定自己用的是什么地区语言的?

不是。是说子进程不特意设置的话,它的 locale 设置和它的父进程是一样的。

离线

#5 2024-11-13 20:07:12

站台上的车
会员
注册时间: 2024-01-08
帖子: 20

Re: 应用程序、桌面环境、终端究竟是如何决定自己用的是什么地区语言的?

依云 说:

不是。是说子进程不特意设置的话,它的 locale 设置和它的父进程是一样的。

是指类似我的例子里的那个从wofi或者zsh中启动应用的话,应用作为子进程会直接读取wofi和zsh的环境变量吗?

zsh还能理解,因为关闭终端和zsh会直接导致应用关闭。

但我查了一下,使用wofi启动应用并不会将其作为wofi的子进程,wofi本身也不是hyprland的子进程,
为什么我将hyprland的配置文件中加入了中文环境变量后wofi和wofi启动的应用直接都变成中文的了呢?

依云 说:

通过环境变量选择界面语言的时候,你要注意该进程会继承到什么样的环境变量。htop 里对着进程按 e 可以查看进程的环境变量。

难道说进程对变量的继承由进程自己决定继承哪些有关进程的变量吗?有时候从父进程,有时候直接读取系统的环境变量?

还有想请教一下依云大大,如果给程序单独生成一个配置文件,那不论如何启动,是都只按照配置文件中的设置启动程序吗?


要发车了,谁要登上学习(arch)的火车?:)

离线

#6 2024-11-13 20:57:26

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,943
个人网站

Re: 应用程序、桌面环境、终端究竟是如何决定自己用的是什么地区语言的?

没有「系统的环境变量」这回事。所有的环境变量,要么是继承而来,要么是自己设置的。进程对自己的环境变量没有选择,只能继承过来之后修改。创建子进程的时候,父进程可以决定子进程用什么样的环境变量。

配置文件的话,得程序支持才行。

离线

页脚