39 Commits

Author SHA1 Message Date
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
6 changed files with 245 additions and 31 deletions
+40
View File
@@ -0,0 +1,40 @@
name: 构建二进制可执行文件
on:
workflow_dispatch:
push:
paths:
- "language.cpp"
# 只在源代码被更新时运行
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- target: x86_64-linux-musl
artifact: language
- target: aarch64-linux-musl
artifact: language_arm
steps:
- uses: actions/checkout@v6
- name: 下载 musl 工具链
uses: lmq8267/dl-musl@main
with:
target: ${{ matrix.target }}
static: true
- name: 编译
run: |
if [ "${{ matrix.target }}" = "x86_64-linux-musl" ]; then
"$CXX" -o "${{ matrix.artifact }}" -std=c++23 -s --static language.cpp
else
"$CXX" -o "${{ matrix.artifact }}" -std=c++23 -s --static language.cpp
fi
- uses: actions/upload-artifact@v5
with:
name: ${{ matrix.artifact }}
path: ${{ matrix.artifact }}
+4 -1
View File
@@ -2,4 +2,7 @@
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
################################################################################
/.vs
.vs
.vscode
a.out
build
+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.
+26 -17
View File
@@ -1,25 +1,34 @@
# 一键切换Ubuntu系统到简体中文
## 这个程序有且仅在Ubuntu系统上测试过,18.04及以上应该都不会有问题,非Debian系列应该都用不了
# 一键切换Ubuntu(和Debian)系统到简体中文
## 测试通过的系统
### **x86_64**
|系统名称|版本|
|-|-|
|Debian|13.2 <br/> 11.6|
|Ubuntu|26.04 LTS <br/> 25.04 <br/> 24.10 <br/> 24.04.1 LTS <br/> 22.04 LTS <br/> 20.04 LTS|
***
## 编程语言
C++
原本shell那个版本已经被彻底淘汰了,因为我从头到尾就不会bash,用cpp还能做更多设置
***
### **aarch64**
|系统名称|版本|
|-|-|
|Debian|11.5|
## 使用方法
确保已经安装wget或者有其他方法可以传输文件
### **x86_64**
```shell
sudo -E su
# 如果是WSL环境必须使用-E参数保留环境变量,否则权限提升之后WSL_DISTRO_NAME会消失
# 如果不是WSL,可以不加这个参数,只提权就好
apt update && apt install -y wget
wget https://github.com/TheWhiteDog9487/ubuntu-language-onekey-zh_cn/releases/latest/download/language
chmod +x language
./language
```
***
下载程序
### **aarch64**
```shell
wget https://raw.githubusercontent.com/TheWhiteDog9487/ubuntu-language-onekey-zh_cn/main/language
sudo -E su
# 如果是WSL环境必须使用-E参数保留环境变量,否则权限提升之后WSL_DISTRO_NAME会消失
# 如果不是WSL,可以不加这个参数,只提权就好
apt update && apt install -y wget
wget https://github.com/TheWhiteDog9487/ubuntu-language-onekey-zh_cn/releases/latest/download/language_arm
chmod +x language_arm
./language_arm
```
运行程序
```shell
sudo chmod o+x language
sudo ./language
```
BIN
View File
Binary file not shown.
+164 -13
View File
@@ -1,31 +1,182 @@
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
#include <filesystem>
#include <ciso646>
#ifdef __linux__
#include <unistd.h>
#endif
using namespace std;
enum class System{
WSL,
Linux,
Unsupported };
enum class WslDistro{
Ubuntu,
Debian,
Unsupported,
IsNotWsl };
enum class User{
Root,
Other };
auto GetCurrentSystemType(){
#pragma warning(suppress : 4996)
if (getenv("WSL_DISTRO_NAME") != nullptr){
return System::WSL; }
#pragma warning(suppress : 4996)
if (getenv("WSL_INTEROP") != nullptr){
return System::WSL; }
if (filesystem::exists("/proc/version")) {
ifstream version_file("/proc/version");
string version_info = "";
getline(version_file, version_info);
if (version_info.find("Microsoft") != string::npos or
version_info.find("WSL") != string::npos) {
return System::WSL; }
version_file.close(); }
if (filesystem::exists("/proc/sys/kernel/osrelease")) {
ifstream osrelease_file("/proc/sys/kernel/osrelease");
string osrelease_info = "";
getline(osrelease_file, osrelease_info);
if (osrelease_info.find("microsoft") != string::npos or
osrelease_info.find("WSL") != string::npos) {
return System::WSL; }
osrelease_file.close(); }
#ifdef __linux__
return System::Linux;
#else
return System::Unsupported;
#endif
}
auto GetCurrentWslDistro(){
#pragma warning(suppress : 4996)
if (getenv("WSL_DISTRO_NAME") != nullptr){
string DistroName = getenv("WSL_DISTRO_NAME");
if (DistroName.find("Ubuntu") != string::npos){
return WslDistro::Ubuntu; }
else if (DistroName.find("Debian") != string::npos){
return WslDistro::Debian; }
else{
return WslDistro::Unsupported; } }
else{
return WslDistro::IsNotWsl; } }
auto GetCurrentUser(){
#pragma warning(suppress : 4996)
if (getenv("USER") != nullptr){
string user = getenv("USER");
if (user == "root" or geteuid() == 0){
return User::Root; }
else{
return User::Other; } }
else{
throw runtime_error("无法获取用户信息"); } }
/// @brief 获取当前系统的发行版名称
/// @return 发行版名称,带有版本号
/// @author ChatGPT
auto GetCurrentSystem() {
string distro_name = "";
ifstream release_file("/etc/os-release");
if (release_file.is_open()) {
string line = "";
while (getline(release_file, line)) {
if (line.find("PRETTY_NAME=") != string::npos) {
distro_name = line.substr(line.find("=") + 1);
distro_name.erase(0, 1); // remove opening quote
distro_name.erase(distro_name.size() - 1); // remove closing quote
break;} }
release_file.close(); }
return distro_name; }
auto check() {
cout << "请输入您的选项(输入y或者yes继续)";
string userin;
string userin = "";
cin >> userin;
if (userin == "y" or userin == "yes")
return;
else
else{
cout << "输入不正确欸,如果想停止本程序的话请按下Ctrl+C" << endl;
check();}
check(); } }
int main(){
cout << "提示:本程序需要root权限,如果您不是以root运行的本程序,请Ctrl+C终止并重新提权运行" << endl;
cout << "如果确认权限没有问题,请输入y或者yes";
check();
auto RebootIfIsWSL(){
if (GetCurrentSystemType() == System::WSL){
system("wsl.exe --terminate $WSL_DISTRO_NAME"); } }
auto Ubuntu(){
cout << "即将开始安装并配置简体中文语言包,请输入y或者yes继续,或者按Ctrl+C终止本程序";
check();
cout << "开始更新语言配置" << endl;
system("apt update");
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");
cout << "原/etc/default/locale已经备份为/etc/default/locale.backup" << endl;
system("update-locale LANG=zh_CN.UTF-8");
cout << "语言配置更新完成" << endl;
cout << "即将重启以应用语言设置,请保存您未完成的工作以防数据丢失" << endl;
cout << "输入y或者yes重启或者按Ctrl+C终止本程序" << endl;
check();
system("reboot");}
RebootIfIsWSL();
system("reboot"); }
auto Debian(){
cout << "即将开始更新语言配置,请输入y或者yes继续,或者按Ctrl+C终止本程序";
check();
cout << "开始更新语言配置" << endl;
fstream locale_gen("/etc/locale.gen", ios::app);
locale_gen << '\n' <<
"zh_CN.UTF-8 UTF-8" << endl;
locale_gen.close();
system("locale-gen");
system("update-locale LANG=zh_CN.UTF-8");
cout << "即将重启以应用语言设置,请保存您未完成的工作以防数据丢失" << endl;
cout << "输入y或者yes重启或者按Ctrl+C终止本程序" << endl;
check();
RebootIfIsWSL();
system("reboot");}
auto OsType = GetCurrentSystemType();
int main() {
if (OsType == System::Unsupported){
cout << "未知操作系统,为确保数据安全将会强制退出。"
<< endl
<< "如果是误报,请联系作者修复问题。"
<< endl;
throw runtime_error("不支持的操作系统"); }
auto OS = GetCurrentSystem();
auto Distro = GetCurrentWslDistro();
auto CurrentUser = GetCurrentUser();
if (CurrentUser == User::Other){
cout << "更改语言文件需要root权限,请使用sudo重新运行本程序" << endl;
throw runtime_error("权限不足"); }
if (OsType == System::WSL) {
cout << "检测到您使用的系统为:" << OS << endl;
cout << "并且该系统工作于WSL环境" << endl;
if (Distro == WslDistro::IsNotWsl){
throw runtime_error("无法获取WSL发行版信息"); }
if (Distro == WslDistro::Ubuntu){ Ubuntu(); }
else if (Distro == WslDistro::Debian){ Debian(); }
else{
cout << endl
<< "错误:当前仅适配了Ubuntu和Debian" << endl
<< "强行使用可能会造成不可预知的问题" << endl
<< "为避免出现故障,程序会强制退出" << endl;
throw runtime_error("不支持的发行版"); } }
else if (OsType == System::Linux) {
cout << "检测到您使用的系统为:" << OS << endl;
if (OS.find("Ubuntu") != string::npos){
Ubuntu(); }
if (OS.find("Debian") != string::npos or
OS.find("Armbian") != string::npos){
Debian(); } } }