50 Commits

Author SHA1 Message Date
TheWhiteDog9487 c66b063b88 Merge pull request #2 from TheWhiteDog9487/C#
重写到C#
2026-08-11 16:32:12 +08:00
TheWhiteDog9487 e603b7d733 当权限不足时,自动使用sudo重启自身 2026-08-11 16:28:49 +08:00
TheWhiteDog9487 7913305260 彻底移除P/Invoke,以解决运行时DLL找不到的问题
虽然不需要调用libc了,但是仍然需要静态链接,不然还是会出问题
2026-08-11 16:27:17 +08:00
TheWhiteDog9487 1cfa17d340 修复很多问题 2026-08-08 13:52:24 +08:00
TheWhiteDog9487 d5cf0c9910 修缮 2026-08-08 12:19:54 +08:00
TheWhiteDog9487 d4550e240c 对部分TryParse无法直接完成映射的系统进行特判
虽然现在只要ArchLinux一个,但之后应该会变成部分
2026-08-08 11:57:06 +08:00
TheWhiteDog9487 3493263324 修复依赖于可能不存在的libicu的问题 2026-08-08 11:15:22 +08:00
TheWhiteDog9487 1e633b0e8b 修复ARM64下无法运行Action的问题 2026-08-08 11:03:06 +08:00
TheWhiteDog9487 a79d7459e9 重写到C# 2026-08-08 10:34:26 +08:00
TheWhiteDog9487 04d944b7d3 支持ArchLinux
移除针对WSL的环境变量需求
配置完成之后不再需要重启
2026-06-28 17:32:38 +08:00
TheWhiteDog9487 a7ef4ee63a - Debian写入前检查是否存在处于激活状态的简体中文locale,如果存在则跳过写入
- 如果文件打开失败,抛出异常
2026-05-25 15:08:58 +08:00
TheWhiteDog9487 f4678ef4a6 Update README.md 2026-05-24 14:48:43 +08:00
TheWhiteDog9487 acab359e53 修复Action不使用静态链接的问题 2026-05-24 14:38:03 +08:00
TheWhiteDog9487 35957099c8 优化Debian的逻辑,实际上只需要生成locale然后update-locale就可以了
更新兼容性列表
优化对于WSL的判断
2026-05-24 14:31:35 +08:00
TheWhiteDog9487 3ef4bd3948 不再上传Action构建到仓库内以避免仓库体积持续膨胀
后续每个更新我都会手动发release
2026-05-24 13:57:31 +08:00
TheWhiteDog9487 5a7444aebf 使用musl替换glibc,并在输出内移除调试符号以减小产物大小 2026-05-24 13:55:59 +08:00
TheWhiteDog9487 a3e3816eb7 这咋还掉索引了呢 2025-12-03 22:08:53 +08:00
TheWhiteDog9487 87c365623e Action里更新一些过时的信息 2025-12-03 22:03:18 +08:00
TheWhiteDog9487 9a35d2a5a9 增加Git忽略项 2025-12-03 21:55:32 +08:00
TheWhiteDog9487 b98c727529 格式化 2025-12-03 21:55:14 +08:00
TheWhiteDog9487 92dcc3895e 增加明确的ciso646导入 2025-12-03 21:53:57 +08:00
TheWhiteDog9487 7bf325d911 WSL的支持范围锁定到Ubuntu
Debian我这测试没反应,不清楚啥原因
2025-12-03 21:53:11 +08:00
TheWhiteDog9487 85b148f463 WSL也需要安装语言包,不然像nano这样的还是没中文 2025-12-03 21:52:17 +08:00
TheWhiteDog9487 3f8daf2607 抛弃对Windows的探测,直接丢进Unsupported里面 2025-12-03 21:50:06 +08:00
TheWhiteDog9487 8187525cbe 正式支持WSL,应该是能正常用没太大毛病,有问题再说
其他修改直接看git版本比较吧
2025-08-30 11:40:56 +08:00
TheWhiteDog9487 e97f6e4330 Update README.md 2025-04-22 13:03:58 +08:00
TheWhiteDog9487 fac3c9c595 Update build.yml 2024-10-13 11:04:58 +08:00
TheWhiteDog9487 511f959718 修复Workflow 2024-10-12 19:03:43 +08:00
TheWhiteDog9487 a38c1b5c23 更新代码,适配新版本Ubuntu 2024-10-12 18:28:56 +08:00
TheWhiteDog9487 ff5ac3ccb5 更新Workflow配置 2024-10-12 18:28:23 +08:00
TheWhiteDog9487 fe6236cbb1 添加全自动化Workflow 2024-10-12 04:16:59 +00:00
TheWhiteDog9487 654356ca8f Update README.md 2023-05-09 07:43:33 +08:00
TheWhiteDog9487 6839818577 新增加aarch64架构支持 2023-05-08 01:55:20 +00:00
TheWhiteDog9487 3038813cd5 Update README.md 2023-05-07 10:50:14 +08:00
TheWhiteDog9487 879be09e0e Update README.md 2023-04-24 17:30:26 +08:00
TheWhiteDog9487 362c7bbebd Create LICENSE 2023-04-24 14:43:35 +08:00
TheWhiteDog9487 1b823cfd8e 修正支持列表 2023-04-23 17:28:28 +08:00
TheWhiteDog9487 8df45e64b5 超大号更新,Debian现已加入豪华套餐 2023-04-23 17:22:49 +08:00
TheWhiteDog9487 f1013b978c 超大号更新,Debian现已加入豪华套餐 2023-04-23 17:09:08 +08:00
TheWhiteDog9487 67761e4a48 Update README.md 2023-04-20 08:24:44 +08:00
TheWhiteDog9487 f2d9ae0b33 debian软件包名都不一样怎么能用呢? 2023-01-17 12:09:06 +08:00
TheWhiteDog9487 b0c23c6117 搞定 2023-01-17 12:04:58 +08:00
TheWhiteDog9487 334d54aaf3 搞定 2023-01-17 12:03:30 +08:00
TheWhiteDog9487 aca7719d42 继续修复Bug,换个新方法 2023-01-17 11:55:19 +08:00
TheWhiteDog9487 afc0193d28 修复22.04不工作的问题 2022-09-22 09:48:41 +08:00
TheWhiteDog9487 7ca685cd38 淘汰shell版本,cpp版本增加确定机制 2022-03-06 11:34:18 +08:00
TheWhiteDog9487 21a8314317 再次修改README 2022-01-24 15:12:00 +08:00
TheWhiteDog9487 e5c6d2263d 更新README说明和CPP源文件,缺少一个空格我不能接受 2022-01-24 15:09:44 +08:00
TheWhiteDog9487 6cbc4c3b38 更新获取链接 2022-01-24 11:44:09 +08:00
TheWhiteDog9487 22b3e10f3e commit 2022-01-24 11:34:25 +08:00
9 changed files with 268 additions and 40 deletions
+3
View File
@@ -0,0 +1,3 @@
* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
+42
View File
@@ -0,0 +1,42 @@
name: 构建二进制可执行文件
on:
workflow_dispatch:
pull_request:
paths:
- "language.cs"
# 只在源代码被更新时运行
push:
paths:
- "language.cs"
jobs:
build:
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-latest
artifact: language
- runner: ubuntu-26.04-arm
artifact: language_arm
steps:
- uses: actions/checkout@v7
- name: 编译
run: |
docker run --rm \
-v "${{ github.workspace }}":/src \
-w /src \
alpine:latest /bin/sh -c '
apk update
apk add build-base dotnet10-sdk clang
dotnet publish language.cs /t:Rebuild --disable-build-servers --force '
- name: 重命名
if: ${{ matrix.runner == 'ubuntu-26.04-arm' }}
run: sudo mv artifacts/language/language artifacts/language/language_arm
- uses: actions/upload-artifact@v7
with:
name: ${{ matrix.artifact }}
path: artifacts/language/${{ matrix.artifact }}
+2
View File
@@ -0,0 +1,2 @@
.vscode
artifacts
+11
View File
@@ -0,0 +1,11 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
+64 -24
View File
@@ -1,34 +1,74 @@
# 一键切换Ubuntu系统到简体中文
## 两个版本
1.C++
2.纯Shell
## 不同版本区别
这两个版本的唯一区别就是运行方式不一样,功能和结构没有任何区别
不信你可以去看源代码,C++版本我只是用了system函数执行shell语句,效果不能说天差地别吧,至少也能说是一模一样
***
## 简介
将Linux的系统语言切换到简体中文
## 支持的系统
- Debian
- Armbian
- Ubuntu
- Arch Linux
- CachyOS
## 测试通过的系统
### **x86_64**
| 系统名称 | 版本 |
| - | - |
| Debian | 13.2 <br/> 11.6 |
| Ubuntu | 26.04 LTS <br/> 25.10 <br/> 25.04 <br/> 24.10 <br/> 24.04.1 LTS <br/> 22.04 LTS <br/> 20.04 LTS |
| Arch Linux | 滚动发行 |
### **aarch64**
| 系统名称 | 版本 |
| - | - |
| Debian | 11.5 |
## 使用方法
# **注意!程序运行完之后会自动重启目标电脑/服务器,请确保没有未保存的工作!否则后果自负!**
确保已经安装wget或者有其他方法可以传输文件
### **x86_64**
```shell
apt update && apt install -y wget
sudo su
wget https://github.com/TheWhiteDog9487/lag2cn/releases/latest/download/language
chmod +x language
./language
rm language
```
***
下面两个版本选一个就行
***
下载程序(Shell)
### **aarch64**
```shell
wget https://raw.githubusercontent.com/TheWhiteDog9487/ubuntu-language-onekey-zh_cn/main/language.sh
sudo su
wget https://github.com/TheWhiteDog9487/lag2cn/releases/latest/download/language_arm
chmod +x language_arm
./language_arm
rm language_arm
```
下载程序(C++)
## 关于可用性
对每一个系统版本进行实际测试是不现实的,我会尽量保证可用性,但是更新之后的测试只会在最新版本进行
并且,由于各种系统版本众多来源复杂,哪怕是最新版本也未必100%可用
故此,如果您在使用过程中遇到问题,请在GitHub仓库打开一个新的issue,我会尽力处理
## 如果你想自行编译
所需依赖项:
- .NET 10 SDK
- Clang
- build-base或其他等效工具集
推荐使用Alpine Linux进行编译,因为Alpine的系统libc就是musl,编译出的产物可以直接用而不需要管目标系统glibc的版本问题
您可以使用下面的Docker命令获得一个Alpine环境
```shell
wget https://raw.githubusercontent.com/TheWhiteDog9487/ubuntu-language-onekey-zh_cn/main/language
docker run --rm -it -v .:/src -w /src alpine
```
运行程序(Shell)
如果您位于中国大陆境内,推荐先对apk进行换源,以加速软件包下载
```shell
sudo bash language.sh
# https://help.mirrors.cernet.edu.cn/alpine/
printf '%s' 'https://mirrors.cernet.edu.cn/alpine/latest-stable/main
https://mirrors.cernet.edu.cn/alpine/latest-stable/community
' | tee /etc/apk/repositories
```
运行程序(C++)
安装依赖项
```shell
sudo chmod o+x language
sudo ./language
```
apk update
apk add --no-cache clang build-base dotnet10-sdk
```
然后进行编译
```shell
dotnet publish language.cs
```
你需要的ELF会出现在`artifacts/language/`文件夹内
BIN
View File
Binary file not shown.
-9
View File
@@ -1,9 +0,0 @@
#include<cstdlib>
using namespace std;
int main(){
system("apt install -y language-pack-zh-hans");
system("locale-gen zh_CN.UTF-8");
system("mv /etc/default/locale /etc/default/locale.backup");
system("touch /etc/default/locale");
system("echo LANG=\"zh_CN.UTF-8\" > /etc/default/locale");
system("reboot");}
+146
View File
@@ -0,0 +1,146 @@
#!/usr/bin/env -S dotnet --
// https://learn.microsoft.com/zh-cn/dotnet/core/sdk/file-based-apps
#:property PublishAot=true
#:property StaticExecutable=true
#:property OptimizationPreference=Speed
// #:property OptimizationPreference=Size
#:property InvariantGlobalization=true
// ↑ 这个东西需要libicu
// #:property StackTraceSupport=false
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
void CheckUser(string DisplayMessage = "即将开始更新语言配置"){
Console.WriteLine(DisplayMessage);
Console.WriteLine("按回车继续,按Esc取消");
while (true){
var KeyInfo = Console.ReadKey(true);
if (KeyInfo.Key == ConsoleKey.Enter){
return; }
else if (KeyInfo.Key == ConsoleKey.Escape){
Environment.Exit(0); } } }
bool IsRunningInsideWSL(){
string VersionFile = File.ReadAllText("/proc/version");
string KernelOsReleaseFile = File.ReadAllText("/proc/sys/kernel/osrelease");
if (VersionFile.Contains("Microsoft") || VersionFile.Contains("WSL")){
return true; }
if (KernelOsReleaseFile.Contains("microsoft") || KernelOsReleaseFile.Contains("WSL")){
return true; }
return false; }
void ExecuteCommand(string Command,
List<string>? Arguments = null,
Action<int, string, string?>? WhenErrorThrown = null){
List<string> StandardError = [];
int ExitCode = 0;
try{
using var Process = new Process();
Process.StartInfo.FileName = Command;
if (Arguments != null){
foreach (var Argument in Arguments){
Process.StartInfo.ArgumentList.Add(Argument); } }
Process.StartInfo.RedirectStandardError = true;
Process.ErrorDataReceived += (_, Event) => {
if (Event.Data != null){
Console.WriteLine(Event.Data);
StandardError.Add(Event.Data + "\n"); } };
Process.Start();
Process.BeginErrorReadLine();
Process.WaitForExit();
ExitCode = Process.ExitCode;
if (ExitCode != 0){
throw new Exception($"命令执行失败,退出代码: {ExitCode}"); } }
catch (Exception ExceptionInstance){
WhenErrorThrown ??= (ExitCode, StandardError, ExceptionMessage) => {
Console.WriteLine(@$"
命令执行失败
退出代码: {ExitCode}
stderr: {StandardError}
异常信息: {ExceptionMessage ?? ""}"); };
WhenErrorThrown(ExitCode, string.Join("\n", StandardError), ExceptionInstance.Message);
throw; } }
string OsDescription = RuntimeInformation.OSDescription;
if (Enum.TryParse<SupportedLinuxDistributions>(OsDescription.Split(' ')[0], out var CurrentSystem) == false){
if (OsDescription.Contains("Arch Linux")){
CurrentSystem = SupportedLinuxDistributions.ArchLinux; }
else{
string CurrentSupportedLinuxDistributions = string.Join(", ", Enum.GetNames<SupportedLinuxDistributions>());
string Message = @$"
当前系统为 {OsDescription}
当前仅支持 {CurrentSupportedLinuxDistributions}
强行使用可能会造成不可预知的问题
为避免出现故障,程序会强制退出
如果是误报,请在GitHub仓库打开一个新的issue。
".Trim();
throw new NotSupportedException(Message); } }
if (Environment.IsPrivilegedProcess == false) {
using var Process = new Process();
Process.StartInfo.FileName = "sudo";
Process.StartInfo.ArgumentList.Add(Environment.ProcessPath ?? throw new Exception("无法获取当前程序路径"));
Console.WriteLine("更改语言文件需要root权限,当前用户权限不足");
Console.WriteLine("正在尝试使用sudo重新运行程序");
Console.WriteLine("如果您当前登录的用户拥有密码,请在sudo提示符中输入密码");
Process.Start();
Process.WaitForExit();
Environment.Exit(Process.ExitCode); }
Console.WriteLine($"探测到当前系统为 {OsDescription}");
switch (CurrentSystem){
case SupportedLinuxDistributions.Debian or SupportedLinuxDistributions.Armbian: {
CheckUser();
Console.WriteLine("正在检查语言配置");
string[] NewContent = [];
using var FileStream = new FileStream("/etc/locale.gen", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
using (var StreamReader = new StreamReader(FileStream, Encoding.UTF8, true, 1024, true)){
NewContent = [.. StreamReader.ReadToEnd()
.Split("\n")
.Select(Line => Line.Trim())
.Select(Line => {
if (Line.Contains("zh_CN.UTF-8 UTF-8")){
Line = "zh_CN.UTF-8 UTF-8"; }
return Line; } ) ]; }
FileStream.SetLength(0);
FileStream.Seek(0, SeekOrigin.Begin);
using (var StreamWriter = new StreamWriter(FileStream, Encoding.UTF8)){
foreach (var Line in NewContent){
StreamWriter.WriteLine(Line); } }
Console.WriteLine("正在生成语言配置");
ExecuteCommand("locale-gen");
Console.WriteLine("正在更新语言配置");
ExecuteCommand("update-locale", ["LANG=zh_CN.UTF-8"]);
break; }
case SupportedLinuxDistributions.Ubuntu: {
CheckUser("即将开始安装中文语言包");
Console.WriteLine("正在更新apt软件包源");
ExecuteCommand("apt", ["update"]);
Console.WriteLine("正在安装中文语言包");
ExecuteCommand("apt", ["install", "language-pack-zh-hans", "-y"]);
Console.WriteLine("正在更新语言配置");
ExecuteCommand("update-locale", ["LANG=zh_CN.UTF-8"]);
break; }
case SupportedLinuxDistributions.ArchLinux or SupportedLinuxDistributions.CachyOS: {
CheckUser();
Console.WriteLine("开始更新语言配置");
ExecuteCommand("localectl", ["set-locale", "LANG=zh_CN.UTF-8"]);
if (IsRunningInsideWSL()){
// https://wiki.archlinuxcn.org/wiki/%E5%9C%A8_WSL_%E4%B8%8A%E5%AE%89%E8%A3%85_Arch_Linux#%E4%BF%AE%E6%94%B9%E5%8C%BA%E5%9F%9F%E8%AE%BE%E7%BD%AE
Console.WriteLine("检测到您正在WSL中运行Arch Linux,正在创建 /etc/locale.conf -> /etc/default/locale 符号链接");
if (File.Exists("/etc/default/locale")){
File.Move("/etc/default/locale", "/etc/default/locale.bak", true); }
File.CreateSymbolicLink("/etc/default/locale", "/etc/locale.conf"); }
break; } }
Console.WriteLine("配置完成,更改将在您下一次登录Shell时生效,按任意键退出");
Console.ReadKey(true);
enum SupportedLinuxDistributions {
Debian,
Armbian,
Ubuntu,
ArchLinux,
CachyOS }
-7
View File
@@ -1,7 +0,0 @@
apt update
apt install -y language-pack-zh-hans
locale-gen zh_CN.UTF-8
mv /etc/default/locale /etc/default/locale.backup
touch /etc/default/locale
echo LANG="zh_CN.UTF-8" > /etc/default/locale
reboot