11 Commits

7 changed files with 44 additions and 245 deletions
-40
View File
@@ -1,40 +0,0 @@
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 }}
+1 -4
View File
@@ -2,7 +2,4 @@
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。 # 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
################################################################################ ################################################################################
.vs /.vs
.vscode
a.out
build
-11
View File
@@ -1,11 +0,0 @@
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.
+17 -26
View File
@@ -1,34 +1,25 @@
# 一键切换Ubuntu(和Debian)系统到简体中文 # 一键切换Ubuntu系统到简体中文
## 测试通过的系统 ## 这个程序有且仅在Ubuntu系统上测试过,18.04及以上应该都不会有问题。
### **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|
### **aarch64** ***
|系统名称|版本|
|-|-| ## 编程语言
|Debian|11.5| C++
原本shell那个版本已经被彻底淘汰了,因为我从头到尾就不会bash,用cpp还能做更多设置
***
## 使用方法 ## 使用方法
### **x86_64** 确保已经安装wget或者有其他方法可以传输文件
```shell ```shell
sudo -E su
# 如果是WSL环境必须使用-E参数保留环境变量,否则权限提升之后WSL_DISTRO_NAME会消失
# 如果不是WSL,可以不加这个参数,只提权就好
apt update && apt install -y wget 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 ```shell
sudo -E su wget https://raw.githubusercontent.com/TheWhiteDog9487/ubuntu-language-onekey-zh_cn/main/language
# 如果是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.
+14 -164
View File
@@ -1,182 +1,32 @@
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <fstream>
#include <filesystem>
#include <ciso646>
#ifdef __linux__
#include <unistd.h>
#endif
using namespace std; 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() { auto check() {
cout << "请输入您的选项(输入y或者yes继续)"; cout << "请输入您的选项(输入y或者yes继续)";
string userin = ""; string userin;
cin >> userin; cin >> userin;
if (userin == "y" or userin == "yes") if (userin == "y" or userin == "yes")
return; return;
else{ else
cout << "输入不正确欸,如果想停止本程序的话请按下Ctrl+C" << endl; cout << "输入不正确欸,如果想停止本程序的话请按下Ctrl+C" << endl;
check(); } } check();}
auto RebootIfIsWSL(){ int main(){
if (GetCurrentSystemType() == System::WSL){ cout << "提示:本程序需要root权限,如果您不是以root运行的本程序,请Ctrl+C终止并重新提权运行" << endl;
system("wsl.exe --terminate $WSL_DISTRO_NAME"); } } cout << "如果确认权限没有问题,请输入y或者yes";
check();
auto Ubuntu(){
cout << "即将开始安装并配置简体中文语言包,请输入y或者yes继续,或者按Ctrl+C终止本程序"; cout << "即将开始安装并配置简体中文语言包,请输入y或者yes继续,或者按Ctrl+C终止本程序";
check(); check();
cout << "开始更新语言配置" << endl;
system("apt update");
system("apt install -y language-pack-zh-hans"); system("apt install -y language-pack-zh-hans");
system("update-locale LANG=zh_CN.UTF-8"); system("locale-gen zh_CN.UTF-8");
cout << "语言配置更新完成" << endl; system("mv /etc/default/locale /etc/default/locale.backup");
system("wget https://raw.githubusercontent.com/TheWhiteDog9487/ubuntu-language-onekey-zh_cn/main/locale");
system("mv locale /etc/default/locale");
system("chmod 644 /etc/default/locale");
cout << "原/etc/default/locale已经备份为/etc/default/locale.backup" << endl;
cout << "即将重启以应用语言设置,请保存您未完成的工作以防数据丢失" << endl; cout << "即将重启以应用语言设置,请保存您未完成的工作以防数据丢失" << endl;
cout << "输入y或者yes重启或者按Ctrl+C终止本程序" << endl; cout << "输入y或者yes重启或者按Ctrl+C终止本程序" << endl;
check(); check();
RebootIfIsWSL(); system("reboot");}
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(); } } }
+12
View File
@@ -0,0 +1,12 @@
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh:en_US:en"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_ALL=zh_CN.UTF-8