From 6c392cfd15f4d70df88af7969596d2d14c87e2df Mon Sep 17 00:00:00 2001 From: TheWhiteDog9487 Date: Sat, 30 Aug 2025 11:40:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E6=94=AF=E6=8C=81WSL?= =?UTF-8?q?=EF=BC=8C=E5=BA=94=E8=AF=A5=E6=98=AF=E8=83=BD=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E6=B2=A1=E5=A4=AA=E5=A4=A7=E6=AF=9B=E7=97=85=EF=BC=8C?= =?UTF-8?q?=E6=9C=89=E9=97=AE=E9=A2=98=E5=86=8D=E8=AF=B4=20=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E4=BF=AE=E6=94=B9=E7=9B=B4=E6=8E=A5=E7=9C=8Bgit?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=AF=94=E8=BE=83=E5=90=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- language.cpp | 156 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 109 insertions(+), 47 deletions(-) diff --git a/language.cpp b/language.cpp index 2666cad..69c17d7 100644 --- a/language.cpp +++ b/language.cpp @@ -3,6 +3,11 @@ #include #include #include + +#ifdef __linux__ +#include +#endif + using namespace std; auto LOCALE = R"( @@ -17,11 +22,65 @@ 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 +LC_ALL="zh_CN.UTF-8" )"s; -string get_linux_distro_name() { - // ChatGPT +enum class System{ + WSL, + Windows, + Linux, + Unsupported }; +enum class User{ + Root, + Other }; + +auto GetCurrentSystemType(){ + 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(); } + #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; } + #pragma warning(suppress : 4996) + if (getenv("OS") != nullptr){ + return System::Windows;} + #pragma warning(suppress : 4996) + else if (getenv("HOME") != nullptr){ + return System::Linux;} + else{ + return System::Unsupported;} } + +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()) { @@ -45,27 +104,32 @@ auto check() { cout << "输入不正确欸,如果想停止本程序的话请按下Ctrl+C" << endl; check();}} -auto Ubuntu(){ - cout << "提示:本程序需要root权限,如果您不是以root运行的本程序,请Ctrl+C终止并重新提权运行" << endl; - cout << "如果确认权限没有问题,请输入y或者yes"; +auto WSL(){ + cout << "开始更新语言配置" << endl; + system("update-locale LANG=zh_CN.UTF-8"); + cout << "语言配置更新完成" << endl; + cout << "更新语言配置需要重启WSL,要现在重启吗?" << endl; check(); + system("cmd.exe /c \"wsl --shutdown\""); } + +auto Ubuntu(){ cout << "即将开始安装并配置简体中文语言包,请输入y或者yes继续,或者按Ctrl+C终止本程序"; check(); system("apt install -y language-pack-zh-hans"); system("locale-gen zh_CN.UTF-8"); if ( filesystem::exists("/etc/locale.conf") ){ - filesystem::copy_file("/etc/locale.conf", "/etc/locale.conf.backup", filesystem::copy_options::update_existing); - fstream locale_conf("/etc/locale.conf", ios::out | ios::trunc); + filesystem::copy_file("/etc/locale.conf", "/etc/locale.conf.backup", filesystem::copy_options::overwrite_existing); + fstream locale_conf("/etc/locale.conf", ios::out bitor ios::trunc); locale_conf << LOCALE << endl; locale_conf.close(); - filesystem::permissions("/etc/locale.conf", filesystem::perms::owner_read | filesystem::perms::owner_write | filesystem::perms::group_read | filesystem::perms::others_read); + filesystem::permissions("/etc/locale.conf", filesystem::perms::owner_read bitor filesystem::perms::owner_write bitor filesystem::perms::group_read bitor filesystem::perms::others_read); cout << "原/etc/locale.conf已经备份为/etc/locale.conf.backup" << endl;} else if ( filesystem::exists("/etc/default/locale") ){ - filesystem::copy_file("/etc/default/locale", "/etc/default/locale.backup", filesystem::copy_options::update_existing); - fstream locale("/etc/default/locale", ios::out | ios::trunc); + filesystem::copy_file("/etc/default/locale", "/etc/default/locale.backup", filesystem::copy_options::overwrite_existing); + fstream locale("/etc/default/locale", ios::out bitor ios::trunc); locale << LOCALE << endl; locale.close(); - filesystem::permissions("/etc/default/locale", filesystem::perms::owner_read | filesystem::perms::owner_write | filesystem::perms::group_read | filesystem::perms::others_read); + filesystem::permissions("/etc/default/locale", filesystem::perms::owner_read bitor filesystem::perms::owner_write bitor filesystem::perms::group_read bitor filesystem::perms::others_read); cout << "原/etc/default/locale已经备份为/etc/default/locale.backup" << endl;} cout << "即将重启以应用语言设置,请保存您未完成的工作以防数据丢失" << endl; cout << "输入y或者yes重启或者按Ctrl+C终止本程序" << endl; @@ -73,21 +137,18 @@ auto Ubuntu(){ system("reboot");} auto Debian(){ - cout << "提示:本程序需要root权限,如果您不是以root运行的本程序,请Ctrl+C终止并重新提权运行" << endl; - cout << "如果确认权限没有问题,请输入y或者yes"; - check(); - filesystem::copy_file("/etc/locale.gen", "/etc/locale.gen.backup", filesystem::copy_options::update_existing); - fstream locale_gen("/etc/locale.gen", ios::out | ios::trunc); + filesystem::copy_file("/etc/locale.gen", "/etc/locale.gen.backup", filesystem::copy_options::overwrite_existing); + fstream locale_gen("/etc/locale.gen", ios::out bitor ios::trunc); locale_gen << "zh_CN.UTF-8 UTF-8" << endl; locale_gen.close(); system("locale-gen"); - filesystem::permissions("/etc/locale.gen", filesystem::perms::owner_read | filesystem::perms::owner_write | filesystem::perms::group_read | filesystem::perms::others_read); + filesystem::permissions("/etc/locale.gen", filesystem::perms::owner_read bitor filesystem::perms::owner_write bitor filesystem::perms::group_read bitor filesystem::perms::others_read); if ( filesystem::exists("/etc/default/locale") ){ - filesystem::copy_file("/etc/default/locale", "/etc/default/locale.backup", filesystem::copy_options::update_existing); - fstream locale("/etc/default/locale", ios::out | ios::trunc); + filesystem::copy_file("/etc/default/locale", "/etc/default/locale.backup", filesystem::copy_options::overwrite_existing); + fstream locale("/etc/default/locale", ios::out bitor ios::trunc); locale << LOCALE << endl; locale.close(); - filesystem::permissions("/etc/default/locale", filesystem::perms::owner_read | filesystem::perms::owner_write | filesystem::perms::group_read | filesystem::perms::others_read); + filesystem::permissions("/etc/default/locale", filesystem::perms::owner_read bitor filesystem::perms::owner_write bitor filesystem::perms::group_read bitor filesystem::perms::others_read); cout << "原/etc/default/locale已经备份为/etc/default/locale.backup" << endl;} cout << "原/etc/locale.gen已经备份为/etc/locale.gen.backup" << endl; cout << "即将重启以应用语言设置,请保存您未完成的工作以防数据丢失" << endl; @@ -96,34 +157,35 @@ auto Debian(){ system("reboot");} int main() { - auto OS = [](){ - #pragma warning(suppress : 4996) - if (getenv("OS") != nullptr){ - return "Windows";} - #pragma warning(suppress : 4996) - else if (getenv("HOME") != nullptr){ - return "Linux";} - else{ - return "未知";}}(); - - if (OS == "Windows"){ + auto OSType = GetCurrentSystemType(); + if (OSType == System::Windows){ cout << "Windows请在“设置”应用中调整语言(❁´◡`❁)。" << endl; - exit(-1);} - else if (OS == "Linux") { - if (get_linux_distro_name().find("Ubuntu") != string::npos){ - cout << "检测到您使用的系统为:" << get_linux_distro_name() << endl; - Ubuntu();} - if (get_linux_distro_name().find("Debian") != string::npos){ - cout << "检测到您使用的系统为:" << get_linux_distro_name() << endl; - Debian();} - if (get_linux_distro_name().find("Armbian") != string::npos){ - cout << "检测到您使用的系统为:" << get_linux_distro_name() << endl; - Debian();} - else { exit(-1); }} - else if (OS == "未知"){ + throw runtime_error("不支持的操作系统"); } + else if (OSType == System::WSL) { + auto OS = GetCurrentSystem(); + cout << "检测到您使用的系统为:" << OS << endl; + cout << "并且该系统工作于WSL环境" << endl; + auto CurrentUser = GetCurrentUser(); + if (CurrentUser == User::Root){ + WSL(); } + else{ + cout << "更改语言配置需要root权限,请使用sudo重新运行本程序" << endl; + throw runtime_error("权限不足"); } } + else if (OSType == System::Linux) { + auto OS = GetCurrentSystem(); + cout << "检测到您使用的系统为:" << OS << endl; + auto CurrentUser = GetCurrentUser(); + if (CurrentUser == User::Other){ + cout << "更改语言文件需要root权限,请使用sudo重新运行本程序" << endl; + throw runtime_error("权限不足"); } + if (OS.find("Ubuntu") != string::npos){ + Ubuntu(); } + if (OS.find("Debian") != string::npos or + OS.find("Armbian") != string::npos){ + Debian(); } } + else if (OSType == System::Unsupported){ cout << "未知操作系统,为确保数据安全将会强制退出。" << endl << "如果是误报,请联系作者修复问题。" << endl; - exit(-1);} -} \ No newline at end of file + throw runtime_error("不支持的操作系统"); } } \ No newline at end of file