完善中文luci中文语言包和脚本中文

Add comprehensive Chinese language support with multilingual menu system
现在脚本支持中文显示,以及增设luci的中文语言包。
pull/116/head
longzheng268 1 month ago committed by GitHub
commit 72e02aca12
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,4 +1,4 @@
@echo off @echo off
chcp 866 >NUL chcp 65001 >NUL
SET PYTHONUNBUFFERED=TRUE SET PYTHONUNBUFFERED=TRUE
start cmd /k python\python.exe menu.py start cmd /c "cd /d "%~dp0" && python\python.exe menu.py && pause"

1
.gitignore vendored

@ -5,4 +5,5 @@ data/
tmp/ tmp/
outdir/ outdir/
config.txt config.txt
config.json
full_info.txt full_info.txt

@ -84,7 +84,7 @@
### 核心功能 ### 核心功能
- 🔓 **漏洞利用**: 自动检测并利用小米路由器的已知漏洞 - 🔓 **漏洞利用**: 自动检测并利用小米路由器的已知漏洞
- 🔑 **SSH启用**: 永久启用SSH访问方便高级用户管理 - 🔑 **SSH启用**: 永久启用SSH访问方便高级用户管理
- 🌐 **多语言支持**: 安装英文/俄文语言包 - 🌐 **多语言支持**: 安装英文/俄文/中文语言包,支持中文菜单界面
- 💾 **完整备份**: 创建路由器固件的完整备份 - 💾 **完整备份**: 创建路由器固件的完整备份
- 🔄 **固件刷写**: 支持自定义固件的安装 - 🔄 **固件刷写**: 支持自定义固件的安装
- ⚡ **Bootloader替换**: 支持安装Breed等第三方Bootloader - ⚡ **Bootloader替换**: 支持安装Breed等第三方Bootloader
@ -224,9 +224,44 @@ Select:
3. **安装语言包** 3. **安装语言包**
``` ```
选择 5 → 安装英文/俄文语言包,让路由器界面支持更多语言 选择 5 → 安装英文/俄文/中文语言包,让路由器界面支持更多语言
``` ```
#### 语言界面设置
首次启动工具时,会显示语言选择菜单:
```
Language / 语言 / Язык
1 - English
2 - 中文 (Chinese)
3 - Русский (Russian)
Select language [1-English, 2-中文, 3-Русский]:
```
选择对应数字即可切换到相应语言的菜单界面。语言设置会保存在 `config.json` 文件中。
**中文界面预览**:
```
==========================================================
小米路由器破解工具
1 - 设置IP地址 (当前值: 192.168.31.1)
2 - 连接设备 (安装漏洞利用)
3 - 读取完整设备信息
4 - 创建完整备份
5 - 安装 英文/俄文/中文 语言包
6 - 安装永久SSH
7 - 安装固件 (从 "firmware" 目录)
8 - {{{ 其他功能 }}}
9 - [[ 重启设备 ]]
0 - 退出
请选择:
```
## 🔍 详细功能说明 ## 🔍 详细功能说明
### 主菜单功能 ### 主菜单功能
@ -266,13 +301,33 @@ Select:
- **备份格式**: 二进制镜像文件 - **备份格式**: 二进制镜像文件
- **存储位置**: `backup/` 目录 - **存储位置**: `backup/` 目录
#### 5. 安装英文/俄文语言包 #### #### 5. 安装多语言包
- **支持语言**: 英文、俄文
- **安装方式**: **语言包功能详解**
1. 上传语言文件到路由器
2. 修改系统配置 **支持的语言**:
3. 重启相关服务 - **英文 (English)**: 完整的英文界面和语言包
- **卸载**: 通过扩展菜单选项5可以卸载 - **中文 (Chinese)**: 完整的中文界面和语言包
- **俄文 (Russian)**: 完整的俄文界面和语言包
**功能特点**:
- 🌐 **智能语言选择**: 首次运行自动显示语言选择菜单
- 💾 **持久化配置**: 语言选择保存在 `config.json` 中,下次启动自动应用
- 🔄 **实时切换**: 可通过重新运行程序切换语言
- 📱 **完整本地化**: 包括菜单、提示信息、错误消息等全面本地化
- 🎯 **路由器语言包**: 支持为路由器安装对应的语言包文件
**安装方式**:
1. 上传语言文件到路由器
2. 修改系统配置
3. 重启相关服务
4. **卸载**: 通过扩展菜单选项5可以卸载
**技术实现**:
- 使用 UTF-8 编码支持多语言字符显示
- Windows 批处理文件使用 `chcp 65001` 支持中文显示
- 模块化翻译系统,易于扩展新语言
- 基于 `.po` 格式的标准化语言包管理
#### 6. 安装永久SSH #### 6. 安装永久SSH
- **功能**: 启用持久化的SSH访问 - **功能**: 启用持久化的SSH访问
@ -627,6 +682,12 @@ git push origin feature/new-feature
**⚠️ 免责声明**: 本工具仅供学习和研究使用。使用本工具进行的任何操作,风险由用户自行承担。开发者不对因使用本工具而造成的任何损失负责。 **⚠️ 免责声明**: 本工具仅供学习和研究使用。使用本工具进行的任何操作,风险由用户自行承担。开发者不对因使用本工具而造成的任何损失负责。
## 🖼️ 界面展示 / Interface Preview
![成功执行界面](image/display-successful.png)
*工具成功执行后的界面展示 / Interface after successful execution*
--- ---
## English Summary ## English Summary
@ -639,7 +700,7 @@ git push origin feature/new-feature
- **Full firmware backup** and selective partition backup - **Full firmware backup** and selective partition backup
- **Custom firmware installation** including OpenWrt support - **Custom firmware installation** including OpenWrt support
- **Bootloader replacement** (Breed support) - **Bootloader replacement** (Breed support)
- **Multi-language support** (EN/RU language packs) - **Multi-language support** (EN/RU/ZH language packs with Chinese menu interface)
- **Advanced features** like password change, log reading, feature unlocking - **Advanced features** like password change, log reading, feature unlocking
### Quick Start ### Quick Start

@ -0,0 +1,143 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Language translations for menu system
# Supported languages: en (English), zh (Chinese), ru (Russian)
TRANSLATIONS = {
'en': {
'title': 'Xiaomi MiR Patcher',
'main_menu': [
'Set IP-address (current value: {})',
'Connect to device (install exploit)',
'Read full device info',
'Create full backup',
'Install EN/RU/ZH languages',
'Install permanent SSH',
'Install firmware (from directory "firmware")',
'{{{ Other functions }}}',
'[[ Reboot device ]]',
'Exit'
],
'extended_menu': [
'Set IP-address (current value: {})',
'Change root password',
'Read dmesg and syslog',
'Create a backup of the specified partition',
'Uninstall EN/RU/ZH languages',
'Set kernel boot address',
'Install Breed bootloader',
'__test__',
'[[ Reboot device ]]',
'Return to main menu'
],
'prompts': {
'select': 'Select: ',
'choice': 'Choice: ',
'enter_ip': 'Enter device IP-address: ',
'extended_functions': '(extended functions)',
'language_menu': 'Language / 语言 / Язык',
'language_prompt': 'Select language [1-English, 2-中文, 3-Русский]: '
}
},
'zh': {
'title': '小米路由器破解工具',
'main_menu': [
'设置IP地址 (当前值: {})',
'连接设备 (安装漏洞利用)',
'读取完整设备信息',
'创建完整备份',
'安装 英文/俄文/中文 语言包',
'安装永久SSH',
'安装固件 (从 "firmware" 目录)',
'{{{ 其他功能 }}}',
'[[ 重启设备 ]]',
'退出'
],
'extended_menu': [
'设置IP地址 (当前值: {})',
'修改root密码',
'读取dmesg和系统日志',
'创建指定分区备份',
'卸载 英文/俄文/中文 语言包',
'设置内核启动地址',
'安装Breed引导程序',
'__测试__',
'[[ 重启设备 ]]',
'返回主菜单'
],
'prompts': {
'select': '请选择: ',
'choice': '请选择: ',
'enter_ip': '请输入设备IP地址: ',
'extended_functions': '(扩展功能)',
'language_menu': 'Language / 语言 / Язык',
'language_prompt': '选择语言 [1-English, 2-中文, 3-Русский]: '
}
},
'ru': {
'title': 'Xiaomi MiR Patcher',
'main_menu': [
'Установить IP-адрес (текущее значение: {})',
'Подключиться к устройству (установить эксплойт)',
'Читать полную информацию об устройстве',
'Создать полную резервную копию',
'Установить языки EN/RU/ZH',
'Установить постоянный SSH',
'Установить прошивку (из папки "firmware")',
'{{{ Другие функции }}}',
'[[ Перезагрузить устройство ]]',
'Выход'
],
'extended_menu': [
'Установить IP-адрес (текущее значение: {})',
'Изменить пароль root',
'Прочитать dmesg и syslog',
'Создать резервную копию указанного раздела',
'Удалить языки EN/RU/ZH',
'Установить адрес загрузки ядра',
'Установить загрузчик Breed',
'__тест__',
'[[ Перезагрузить устройство ]]',
'Вернуться в главное меню'
],
'prompts': {
'select': 'Выбрать: ',
'choice': 'Выбор: ',
'enter_ip': 'Введите IP-адрес устройства: ',
'extended_functions': '(расширенные функции)',
'language_menu': 'Language / 语言 / Язык',
'language_prompt': 'Выберите язык [1-English, 2-中文, 3-Русский]: '
}
}
}
def get_translation(lang, key, *args):
"""Get translated text for given language and key"""
if lang not in TRANSLATIONS:
lang = 'en' # fallback to English
trans = TRANSLATIONS[lang]
if key in trans:
if isinstance(trans[key], list):
return trans[key]
elif args:
return trans[key].format(*args)
else:
return trans[key]
elif key in trans.get('prompts', {}):
text = trans['prompts'][key]
if args:
return text.format(*args)
return text
else:
# fallback to English only if we're not already using English
if lang != 'en':
return get_translation('en', key, *args)
else:
# If key not found even in English, return a default message
return f"[Missing translation: {key}]"
def get_supported_languages():
"""Get list of supported language codes"""
return list(TRANSLATIONS.keys())

@ -0,0 +1,63 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import json
CONFIG_FILE = 'config.json'
def load_config():
"""Load configuration from file"""
if os.path.exists(CONFIG_FILE):
try:
with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
except (json.JSONDecodeError, IOError):
pass
return {}
def save_config(config):
"""Save configuration to file"""
try:
with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
json.dump(config, f, ensure_ascii=False, indent=2)
return True
except IOError:
return False
def get_language():
"""Get current language setting"""
config = load_config()
return config.get('language', 'en')
def set_language(lang):
"""Set language preference"""
config = load_config()
config['language'] = lang
return save_config(config)
def show_language_menu():
"""Show language selection menu"""
print()
print("=" * 58)
print()
print("Language / 语言 / Язык")
print()
print(" 1 - English")
print(" 2 - 中文 (Chinese)")
print(" 3 - Русский (Russian)")
print()
while True:
choice = input("Select language [1-English, 2-中文, 3-Русский]: ").strip()
if choice == '1':
set_language('en')
return 'en'
elif choice == '2':
set_language('zh')
return 'zh'
elif choice == '3':
set_language('ru')
return 'ru'
else:
print("Invalid choice. Please enter 1, 2, or 3.")

@ -8,34 +8,39 @@ import subprocess
import xmir_base import xmir_base
import gateway import gateway
from gateway import die from gateway import die
import i18n
import lang_config
gw = gateway.Gateway(detect_device = False, detect_ssh = False) gw = gateway.Gateway(detect_device = False, detect_ssh = False)
# Check for language preference or show language menu
current_lang = lang_config.get_language()
if current_lang not in i18n.get_supported_languages():
current_lang = lang_config.show_language_menu()
def get_header(delim, suffix = ''): def get_header(delim, suffix = ''):
header = delim*58 + '\n' header = delim*58 + '\n'
header += '\n' header += '\n'
header += 'Xiaomi MiR Patcher {} \n'.format(suffix) title = i18n.get_translation(current_lang, 'title')
header += '{} {} \n'.format(title, suffix)
header += '\n' header += '\n'
return header return header
def menu1_show(): def menu1_show():
gw.load_config() gw.load_config()
print(get_header('=')) print(get_header('='))
print(' 1 - Set IP-address (current value: {})'.format(gw.ip_addr)) menu_items = i18n.get_translation(current_lang, 'main_menu')
print(' 2 - Connect to device (install exploit)') for i, item in enumerate(menu_items, 1):
print(' 3 - Read full device info') if i == 1: # IP address item needs formatting
print(' 4 - Create full backup') print(' {} - {}'.format(i, item.format(gw.ip_addr)))
print(' 5 - Install EN/RU languages') else:
print(' 6 - Install permanent SSH') print(' {} - {}'.format(i if i <= 9 else 0, item))
print(' 7 - Install firmware (from directory "firmware")')
print(' 8 - {{{ Other functions }}}')
print(' 9 - [[ Reboot device ]]')
print(' 0 - Exit')
def menu1_process(id): def menu1_process(id):
if id == 1: if id == 1:
ip_addr = input("Enter device IP-address: ") ip_prompt = i18n.get_translation(current_lang, 'enter_ip')
ip_addr = input(ip_prompt)
return [ "gateway.py", ip_addr ] return [ "gateway.py", ip_addr ]
if id == 2: return "connect.py" if id == 2: return "connect.py"
if id == 3: return "read_info.py" if id == 3: return "read_info.py"
@ -49,21 +54,19 @@ def menu1_process(id):
return None return None
def menu2_show(): def menu2_show():
print(get_header('-', '(extended functions)')) extended_suffix = i18n.get_translation(current_lang, 'extended_functions')
print(' 1 - Set IP-address (current value: {})'.format(gw.ip_addr)) print(get_header('-', extended_suffix))
print(' 2 - Change root password') menu_items = i18n.get_translation(current_lang, 'extended_menu')
print(' 3 - Read dmesg and syslog') for i, item in enumerate(menu_items, 1):
print(' 4 - Create a backup of the specified partition') if i == 1: # IP address item needs formatting
print(' 5 - Uninstall EN/RU languages') print(' {} - {}'.format(i, item.format(gw.ip_addr)))
print(' 6 - Set kernel boot address') else:
print(' 7 - Install Breed bootloader') print(' {} - {}'.format(i if i <= 9 else 0, item))
print(' 8 - __test__')
print(' 9 - [[ Reboot device ]]')
print(' 0 - Return to main menu')
def menu2_process(id): def menu2_process(id):
if id == 1: if id == 1:
ip_addr = input("Enter device IP-address: ") ip_prompt = i18n.get_translation(current_lang, 'enter_ip')
ip_addr = input(ip_prompt)
return [ "gateway.py", ip_addr ] return [ "gateway.py", ip_addr ]
if id == 2: return "passw.py" if id == 2: return "passw.py"
if id == 3: return "read_dmesg.py" if id == 3: return "read_dmesg.py"
@ -79,10 +82,10 @@ def menu2_process(id):
def menu_show(level): def menu_show(level):
if level == 1: if level == 1:
menu1_show() menu1_show()
return 'Select: ' return i18n.get_translation(current_lang, 'select')
else: else:
menu2_show() menu2_show()
return 'Choice: ' return i18n.get_translation(current_lang, 'choice')
def menu_process(level, id): def menu_process(level, id):
if level == 1: if level == 1:

@ -1,5 +1,5 @@
@echo off @echo off
chcp 866 >NUL chcp 65001 >NUL
SET PYTHONUNBUFFERED=TRUE SET PYTHONUNBUFFERED=TRUE
if "%~1"=="" goto menu if "%~1"=="" goto menu

Loading…
Cancel
Save