From 9dea0643530d4a9f839df2e4d5beb6f3bba9d154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Tue, 30 Dec 2025 19:24:10 +0800 Subject: [PATCH] Refactor string resources: rename and reorganize - Rename error strings to use error_ prefix consistently - Rename success strings to use success_ prefix - Rename failure strings to use failed_ prefix - Reorganize strings by feature groups with section comments - Remove unused shortcuts.xml and manifest references - Update all Kotlin code references --- app/src/main/AndroidManifest.xml | 7 - .../nekohasekai/sfa/compose/MainActivity.kt | 10 +- .../screen/dashboard/DashboardScreen.kt | 4 +- .../screen/dashboard/ProfilePickerSheet.kt | 4 +- .../compose/screen/dashboard/ProfilesCard.kt | 4 +- .../sfa/compose/screen/log/LogScreen.kt | 6 +- .../profile/EditProfileContentScreen.kt | 2 +- .../screen/profile/EditProfileViewModel.kt | 2 +- .../compose/screen/settings/SettingsScreen.kt | 2 +- .../sfa/compose/util/QRCodeUtils.kt | 4 +- app/src/main/res/values-zh-rCN/strings.xml | 389 +++++++------ app/src/main/res/values/strings.xml | 531 ++++++++++-------- app/src/main/res/xml/shortcuts.xml | 13 - 13 files changed, 525 insertions(+), 453 deletions(-) delete mode 100644 app/src/main/res/xml/shortcuts.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3f63578..5a46530 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,10 +40,6 @@ android:theme="@style/AppTheme" tools:targetApi="31"> - - - stringResource(R.string.notification_permission_title) - Alert.StartCommandServer -> stringResource(R.string.service_error_title_start_command_server) - Alert.CreateService -> stringResource(R.string.service_error_title_create_service) - Alert.StartService -> stringResource(R.string.service_error_title_start_service) + Alert.StartCommandServer -> stringResource(R.string.error_start_command_server) + Alert.CreateService -> stringResource(R.string.error_create_service) + Alert.StartService -> stringResource(R.string.error_start_service) else -> null } val dialogMessage = when (alertType) { - Alert.RequestVPNPermission -> stringResource(R.string.service_error_missing_permission) + Alert.RequestVPNPermission -> stringResource(R.string.error_missing_vpn_permission) Alert.RequestNotificationPermission -> stringResource(R.string.notification_permission_required_description) - Alert.EmptyConfiguration -> stringResource(R.string.service_error_empty_configuration) + Alert.EmptyConfiguration -> stringResource(R.string.error_empty_configuration) else -> message } diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/DashboardScreen.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/DashboardScreen.kt index 052a466..7398a4e 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/DashboardScreen.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/DashboardScreen.kt @@ -59,7 +59,7 @@ fun DashboardScreen( val note = uiState.deprecatedNotes.first() AlertDialog( onDismissRequest = { }, - title = { Text(stringResource(R.string.service_error_title_deprecated_warning)) }, + title = { Text(stringResource(R.string.error_deprecated_warning)) }, text = { Text(note.message) }, confirmButton = { TextButton(onClick = { viewModel.dismissDeprecatedNote() }) { @@ -73,7 +73,7 @@ fun DashboardScreen( viewModel.sendGlobalEvent(UiEvent.OpenUrl(note.migrationLink)) viewModel.dismissDeprecatedNote() }) { - Text(stringResource(R.string.service_error_deprecated_warning_documentation)) + Text(stringResource(R.string.error_deprecated_documentation)) } } } else { diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/ProfilePickerSheet.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/ProfilePickerSheet.kt index b207623..cc8b6fa 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/ProfilePickerSheet.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/ProfilePickerSheet.kt @@ -261,7 +261,7 @@ private fun ProfilePickerRow( withContext(Dispatchers.Main) { Toast.makeText( context, - context.getString(R.string.profile_saved_successfully), + context.getString(R.string.success_profile_saved), Toast.LENGTH_SHORT, ).show() } @@ -269,7 +269,7 @@ private fun ProfilePickerRow( withContext(Dispatchers.Main) { Toast.makeText( context, - "${context.getString(R.string.profile_save_failed)}: ${e.message}", + "${context.getString(R.string.failed_save_profile)}: ${e.message}", Toast.LENGTH_SHORT, ).show() } diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/ProfilesCard.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/ProfilesCard.kt index e251ff7..c84f617 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/ProfilesCard.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/dashboard/ProfilesCard.kt @@ -215,7 +215,7 @@ fun ProfilesCard( withContext(Dispatchers.Main) { Toast.makeText( context, - context.getString(R.string.profile_saved_successfully), + context.getString(R.string.success_profile_saved), Toast.LENGTH_SHORT, ).show() } @@ -223,7 +223,7 @@ fun ProfilesCard( withContext(Dispatchers.Main) { Toast.makeText( context, - "${context.getString(R.string.profile_save_failed)}: ${e.message}", + "${context.getString(R.string.failed_save_profile)}: ${e.message}", Toast.LENGTH_SHORT, ).show() } diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/log/LogScreen.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/log/LogScreen.kt index 27db7f2..e0698c1 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/log/LogScreen.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/log/LogScreen.kt @@ -438,14 +438,14 @@ fun LogScreen( outputStream.flush() Toast.makeText( context, - context.getString(R.string.logs_saved_successfully), + context.getString(R.string.success_logs_saved), Toast.LENGTH_SHORT, ).show() } } catch (e: Exception) { Toast.makeText( context, - context.getString(R.string.failed_to_save_logs, e.message), + context.getString(R.string.failed_save_logs, e.message), Toast.LENGTH_SHORT, ).show() } @@ -667,7 +667,7 @@ fun LogScreen( } catch (e: Exception) { Toast.makeText( context, - context.getString(R.string.failed_to_share_logs, e.message), + context.getString(R.string.failed_share_logs, e.message), Toast.LENGTH_SHORT, ).show() } diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/profile/EditProfileContentScreen.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/profile/EditProfileContentScreen.kt index 049c81d..c7d32a3 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/profile/EditProfileContentScreen.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/profile/EditProfileContentScreen.kt @@ -125,7 +125,7 @@ fun EditProfileContentScreen( if (uiState.showSaveSuccessMessage) { Toast.makeText( context, - context.getString(R.string.configuration_saved), + context.getString(R.string.success_configuration_saved), Toast.LENGTH_SHORT, ).show() viewModel.clearSaveSuccessMessage() diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/profile/EditProfileViewModel.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/profile/EditProfileViewModel.kt index 18a2697..7457fcf 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/profile/EditProfileViewModel.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/profile/EditProfileViewModel.kt @@ -334,7 +334,7 @@ class EditProfileViewModel(application: Application) : AndroidViewModel(applicat Toast.makeText( context, context.getString( - io.nekohasekai.sfa.R.string.failed_to_read_configuration, + io.nekohasekai.sfa.R.string.failed_read_configuration, e.message, ), Toast.LENGTH_SHORT, diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/SettingsScreen.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/SettingsScreen.kt index 4c20f6e..a6382ec 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/SettingsScreen.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/SettingsScreen.kt @@ -215,7 +215,7 @@ fun SettingsScreen(navController: NavController) { ListItem( headlineContent = { Text( - stringResource(R.string.service_error_deprecated_warning_documentation), + stringResource(R.string.error_deprecated_documentation), style = MaterialTheme.typography.bodyLarge, ) }, diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/util/QRCodeUtils.kt b/app/src/main/java/io/nekohasekai/sfa/compose/util/QRCodeUtils.kt index cb224d1..e3fff20 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/util/QRCodeUtils.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/util/QRCodeUtils.kt @@ -81,7 +81,7 @@ suspend fun saveQRCodeToGallery( withContext(Dispatchers.Main) { Toast.makeText( context, - context.getString(io.nekohasekai.sfa.R.string.failed_to_save_qr_code, e.message), + context.getString(io.nekohasekai.sfa.R.string.failed_save_qr_code, e.message), Toast.LENGTH_LONG, ).show() e.printStackTrace() @@ -137,7 +137,7 @@ suspend fun shareQRCodeImage( withContext(Dispatchers.Main) { Toast.makeText( context, - context.getString(io.nekohasekai.sfa.R.string.failed_to_share_qr_code, e.message), + context.getString(io.nekohasekai.sfa.R.string.failed_share_qr_code, e.message), Toast.LENGTH_LONG, ).show() e.printStackTrace() diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a3c44eb..78a1e50 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,18 +1,96 @@ - 停止 + + 应用版本 + + + 取消 + 保存 + 放弃 + 编辑 + 关闭 + 关闭 + 停止 + 重置 + 销毁 + 清除 + 搜索 + 操作 + 启动 + 取消选择 + 展开 + 收起 + 全部展开 + 全部收起 + 上一个 + 下一个 + 更新 + 阅读更多 不,谢谢 + 选项 + 更多选项 + + + 启用 + 禁用 + 加载中... + 计算中... + 自动 + 成功 + 默认 + + 仪表 配置 日志 设置 + 应用 新建配置 编辑配置 编辑配置 调试 - 切换 + 连接 + 其他 + 扫描结果 + + + 服务未启动 + 启动中 + 停止中 + 已启动 + + + 仪表项目 + 内存 + 协程 + 上传 + 下载 + 入站 + 出站 + Clash 模式 + 模式 + 系统代理 + 测试 + 拖动手柄重新排序项目 + 拖动重新排序 + 重置顺序 + + + 关闭所有连接? + + + 没有配置的配置文件 + 添加配置文件 + 更新配置文件 + 分享配置文件 + 导入远程配置 + 您确定要导入远程配置文件 %1$s 吗?您将连接到 %2$s 来下载配置。 + 从本地文件导入配置 + 扫描配置二维码 + 从头创建新配置文件 + 当前平台不支持 iCloud 配置文件 名称 类型 @@ -27,68 +105,62 @@ 最低值为 15 本地 远程 + 远程 • %s 创建 导入 从文件导入 扫描二维码 - 前置摄像头 - 使用 MLKit 扫描 - 灯光 手动创建 - 撤销 - 重做 - 格式化 - 删除 - 分享 - 服务未启动 - 启动中 - 停止中 - 已启动 - 启用 - 禁用 - 错误 - 您的设备缺少 Android 标准文件选择器,请安装一个,例如 Material Files。 - 加载中... - 缺少 VPN 权限 - 空配置 - 启动命令服务器 - 创建服务 - 启动服务 - 弃用警告 - 文档 + 配置覆盖 + 基本信息 + 远程配置 + 最后更新:%s + 内容 + JSON 查看器 + JSON 编辑器 + 查看配置 + 另存为文件 + 分享为文件 + 未保存的更改 + 您有未保存的更改。要放弃它们吗? + 配置文件二维码:%s + + 选中 - 核心版本 + + + 日志级别 + 过滤器:%s + 清除 + 清除日志 + 搜索日志… + 日志已复制到剪贴板 + 没有日志可复制 + 没有日志可分享 + 分享日志 + 已选择 %d 项 + 未选择 + 复制到剪贴板 + 保存到文件 + + + 服务 核心 + 核心版本 数据大小 - 计算中... - 选项 - 禁用弃用警告 + 关于 + 源代码 + 赞助 工作目录 - 销毁 + 禁用弃用警告 忽略内存限制 不对 sing-box 强制执行内存限制。 自动重定向 需要 ROOT 权限 + 系统 HTTP 代理 + + 分应用代理 - 自动检查更新 - 检查更新 - 没有可用的更新 - 有新版本可用:%s - 更新 - 更新轨道 - 稳定版 - 测试版 - 当前轨道尚不支持检查更新 - 应用版本 - 操作 - 应用 - 后台权限 - 申请必要的权限以使 VPN 正常运行。 如果您使用的是中国公司生产的设备,则授予权限后该卡可能不会消失。 - 阅读更多 - 忽略电池优化 - 导入远程配置 - 您确定要导入远程配置文件 %1$s 吗?您将连接到 %2$s 来下载配置。 - 配置覆盖 代理模式 白名单 仅允许选定的应用程序通过 VPN @@ -116,59 +188,43 @@ 导出到剪切板 扫描 中国应用 - App 图标 - 剪切板为空 - 已导出到剪切板 - 已从剪贴板导入 - 扫描中... - 未找到匹配的应用 - 找到以下应用程序,请选择您想要的操作。 - 扫描结果 - 取消选择 管理 + App 图标 托管模式 自动排除中国应用 - 当前平台不支持 iCloud 配置文件 - 搜索 - 展开 - 收起 - 全部展开 - 全部收起 - 关闭 - 关闭所有连接? - %d 个图标 - 未找到图标 - 没有匹配 \"%s\" 的图标 - 系统 HTTP 代理 - 赞助 - 启动 + 模式 + 通过 Play 商店安装时,分应用代理需要 Shizuku。Google Play 拒绝允许我们使用 QUERY_ALL_PACKAGES 权限(同时不禁止其他类似应用这样做),而这是列出应用程序所必需的。 + 通过 Play 商店安装时,分应用代理需要 ROOT。Google Play 拒绝允许我们使用 QUERY_ALL_PACKAGES 权限(同时不禁止其他类似应用这样做),而这是列出应用程序所必需的。 + 需要 Root 或 Shizuku 权限来获取完整应用列表 + + + 后台权限 + 申请必要的权限以使 VPN 正常运行。 如果您使用的是中国公司生产的设备,则授予权限后该卡可能不会消失。 + 忽略电池优化 位置权限 您的个人资料包含 <strong><tt>wifi_ssid</tt> 或 <tt>wifi_bssid</tt> 路由规则</strong>。为了使它们正常工作,sing-box 在<strong>后台</strong>使用 <strong>位置</strong> 权限来获取有关所连接 Wi-Fi 网络的信息。该信息将<strong>仅用于路由目的</strong>。 在 Android 10 及更高版本中,需要<strong>后台位置</strong>权限。选择<strong>始终允许</strong>以授予权限。 通知权限 sing-box 无法在没有发送通知权限的情况下显示实时网速。请授予权限或禁用实时网速通知后再启动服务。 - 模式 - 通过 Play 商店安装时,分应用代理需要 Shizuku。Google Play 拒绝允许我们使用 QUERY_ALL_PACKAGES 权限(同时不禁止其他类似应用这样做),而这是列出应用程序所必需的。 - 通过 Play 商店安装时,分应用代理需要 ROOT。Google Play 拒绝允许我们使用 QUERY_ALL_PACKAGES 权限(同时不禁止其他类似应用这样做),而这是列出应用程序所必需的。 - 启动 Shizuku - 授权 Shizuku - 获取 Shizuku 需要 Root 权限 Root 权限被拒绝 - 需要 Root 或 Shizuku 权限来获取完整应用列表 - 连接 - 其他 - 没有配置的配置文件 - 内存 - 协程 - 上传 - 下载 - 入站 - 出站 - Clash 模式 - 模式 - 系统代理 - 测试 + + + 检查更新 + 自动检查更新 + 更新轨道 + 稳定版 + 测试版 + 当前轨道尚不支持检查更新 + 没有可用的更新 + 有新版本可用:%s + + + 获取 Shizuku + 启动 Shizuku + 授权 Shizuku + + 刚刚 昨天 现在 @@ -185,98 +241,87 @@ %d 天前 + + + 撤销 + 重做 + 格式化 + 删除 + 分享 + + + 错误 + 缺少 VPN 权限 + 空配置 空文件 解码配置文件失败:%s 无效的 sing-box 配置:%s - 仪表项目 - 重置顺序 - 重置 - 拖动手柄重新排序项目 - 拖动重新排序 - 添加配置文件 - 从本地文件导入配置 - 扫描配置二维码 - 从头创建新配置文件 - 配置文件保存成功 - 保存配置文件失败:%s - 远程 • %s - 更新配置文件 - 更多选项 - 编辑 - 另存为文件 - 分享为文件 - 服务 - 关于 - 源代码 - 未保存的更改 - 您有未保存的更改。要放弃它们吗? - 放弃 - 保存 - 分享配置文件 - 取消 - 日志已复制到剪贴板 - 没有日志可复制 - 日志保存成功 - 保存日志失败:%s - 分享日志失败:%s - 没有日志可分享 + 启动命令服务器 + 创建服务 + 启动服务 + 弃用警告 + 文档 + 您的设备缺少 Android 标准文件选择器,请安装一个,例如 Material Files。 + + + 保存配置文件失败:%s + 保存日志失败:%s + 分享日志失败:%s + 保存二维码失败:%s + 分享二维码失败:%s + 读取配置失败:%s + + + 配置文件保存成功 + 日志保存成功 + 配置已保存 已复制到剪贴板 二维码已保存到相册 - 保存二维码失败:%s - 分享二维码失败:%s + + + 剪切板为空 + 已导出到剪切板 + 已从剪贴板导入 + + + 前置摄像头 + 使用 MLKit 扫描 + 灯光 + 扫描中... + 未找到匹配的应用 + 找到以下应用程序,请选择您想要的操作。 + + + 图标 + %d 个图标 + 未找到图标 + 没有匹配 \"%s\" 的图标 + 配置文件图标 + 选择图标 + 选择配置文件图标 + 搜索图标... + 搜索图标 + 关闭搜索 + 当前:%s + 分类 + 所有图标 + 返回分类 + + + 分享二维码 + + + 在文档中查找 + + 返回 滚动到底部 退出选择模式 复制选中 清除搜索 二维码 - 搜索日志… - 分享日志 - 分享二维码 恢复日志 暂停日志 折叠搜索 搜索日志 - 配置文件二维码:%s - - 基本信息 - 图标 - 默认 - 远程配置 - 最后更新:%s - 内容 - JSON 查看器 - JSON 编辑器 - 成功 - 读取配置失败:%s - - 查看配置 - 清除 - 上一个 - 下一个 - 关闭 - 配置已保存 - 在文档中查找 - - 配置文件图标 - 选择图标 - 搜索图标... - 关闭搜索 - 搜索图标 - 当前:%s - 分类 - 所有图标 - 返回分类 - 选择配置文件图标 - 自动 - - - 过滤器:%s - 清除 - 日志级别 - 复制到剪贴板 - 保存到文件 - 清除日志 - 已选择 %d 项 - 未选择 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6b2e137..76b7797 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,60 +1,70 @@ + sing-box - Stop + App version + + OK + Cancel + Save + Discard + Edit + Close + Dismiss + Stop + Reset + Destroy + Clear + Browse + Search + Action + Start + Deselect + Expand + Collapse + Expand All + Collapse All + Previous + Next + Update + Read More No, thanks + Options + More options + + + Enabled + Disabled + Loading… + Calculating... + Auto + Success + Default + + Dashboard Profiles Logs Settings + App New Profile Edit Profile Edit Configuration Groups Debug Connections - No connections - All - Active - Closed - Date - Traffic - Total Traffic - Search connections… - Close - Close All - State - Connection Details - Basic Information - Metadata - Created At - Closed At - Duration - Uplink - Downlink - Inbound - Inbound Type - IP Version - Network - Source - Destination - Domain - Protocol - User - From Outbound - Match Rule - Outbound - Outbound Type - Chain - Process Information - Process ID - User ID - User Name - Process Path - Package Name Others - No profiles configured + Scan Result + + + Service not started + Starting + Stopping + Started + + + Dashboard Items Memory Goroutines Upload @@ -65,7 +75,63 @@ Mode System Proxy Test - Toggle + Drag handle to reorder items + Drag to reorder + Reset order + + + No connections + Search connections… + Close all connections? + All + Active + Closed + Date + Traffic + Total Traffic + Close + Close All + State + Connection Details + Basic Information + Metadata + Process Information + Created At + Closed At + Duration + Uplink + Downlink + Inbound + Inbound Type + Outbound + Outbound Type + IP Version + Network + Source + Destination + Domain + Protocol + User + From Outbound + Match Rule + Chain + Process ID + User ID + User Name + Process Path + Package Name + + + No profiles configured + Add Profile + Update profile + Share Profile + Import remote profile + Are you sure to import remote profile %1$s? You will connect to %2$s to download the configuration. + Import configuration from a local file + Scan a configuration QR code + Create a new profile from scratch + iCloud profile is not support on current platform Name Type Source @@ -75,118 +141,68 @@ Share Share URL as QR Code Required - Just now - Yesterday - Now - 1d - %dm - %dh - %dd - - %d minute ago - %d minutes ago - - - %d hour ago - %d hours ago - - - %d day ago - %d days ago - Update Auto Update Auto Update Interval (Minutes) Minimum value is 15 Local Remote + Remote • %s Create New Import Import from file Scan QR code - Front camera - MLKit analyzer - Torch Create Manually - Undo - Redo - Format - Delete - Share - Service not started - Starting - Stopping - Started - Enabled - Disabled - Error - Your device lacks an Android standard file selector, please install one, such as Material Files. - Loading… - Missiong VPN permission - Empty configuration - Empty file - Failed to decode profile: %s - Invalid sing-box configuration: %s - Start command server - Create service - Start service - Deprecated Warning - Documentation + Profile Override + Basic Information + Remote Configuration + Last updated: %s + Content + JSON Viewer + JSON Editor + View Configuration + Save As File + Share As File + Unsaved Changes + You have unsaved changes. Do you want to discard them? + Profile QR Code: %s + + Selected - Core Version + + + Log Level + Filter: %s + Clear + Clear Logs + Search logs… + Logs copied to clipboard + No logs to copy + No logs to share + Share Logs + %d selected + Not selected + To Clipboard + To File + + + Service Core + Core Version Data Size - Calculating... - Options - Disable Deprecated Warnings + About + Source Code + Sponsor Working Directory - Destroy + Disable Deprecated Warnings Ignore Memory Limit Do not enforce memory limits on sing-box. Auto Redirect ROOT permission required + System HTTP Proxy + + Per-App Proxy - Automatic Update Check - Would you like to enable automatic update checking from **Play Store**? - Would you like to enable automatic update checking from **GitHub**? - Check Update - No updates available - New version available: %s - Update - Update Track - Stable - Beta - Current track does not support update checking yet - View Release - Downloading… - Silent Install - Silent Install - Install updates without interaction - Install Method - PackageInstaller - Shizuku - ROOT - Install permission not granted - Grant Install Permission - Allow installing apps from this source - Shizuku is not installed or not running - Shizuku allows apps to use system APIs directly with higher privileges - Get Shizuku - Start Shizuku - Request Shizuku - %s is not available or permission denied - Auto Update - Automatically download and install updates in background - App version - Action - App - Background permission - Apply for the necessary permissions in order for the VPN to function properly.\n\nIf you are using a device made by a Chinese company, the card may not disappear after the permission is granted. - Read More - Ignore - Import remote profile - Are you sure to import remote profile %1$s? You will connect to %2$s to download the configuration. - Profile Override Proxy Mode Include Only selected apps are allowed through the VPN @@ -214,134 +230,165 @@ Export to clipboard Scan China apps - App icon - Clipboard is empty - Exported to clipboard - Imported from clipboard - Scanning… - No matching apps found - Found the following apps, please choose the action you want. - Scan Result - Deselect Manage + App icon Managed Mode Automatically Exclude China apps - iCloud profile is not support on current platform - Search - Expand - Collapse - Expand All - Collapse All - Close - Close all connections? - %d icons - No icons found - No icons match \"%s\" - System HTTP Proxy - Sponsor - Start + Mode + When installed from the Play Store, per-app proxy requires Shizuku. Google Play refuses to allow us to use the QUERY_ALL_PACKAGES permission (while not prohibiting other similar apps from doing so), which is required for listing apps. + When installed from the Play Store, per-app proxy requires ROOT. Google Play refuses to allow us to use the QUERY_ALL_PACKAGES permission (while not prohibiting other similar apps from doing so), which is required for listing apps. + Root or Shizuku access required to get the complete app list + + + Background permission + Apply for the necessary permissions in order for the VPN to function properly.\n\nIf you are using a device made by a Chinese company, the card may not disappear after the permission is granted. + Ignore Location permission Your profile contains <strong><tt>wifi_ssid</tt> or <tt>wifi_bssid</tt> routing rules</strong>. To make them work, sing-box uses the <strong>location</strong> permission <strong>in the background</strong> to get information about the connected Wi-Fi network. The information will be used <strong>for routing purposes only</strong>. On Android 10 and up, <strong>background location</strong> permission is required. Select <strong>Allow all the time</strong> to grant the permission. Notification permission sing-box is unable to show real-time network speeds without the permission to send notifications. Please grant the permission or disable real-time network speeds notification before starting the service. - Mode - When installed from the Play Store, per-app proxy requires Shizuku. Google Play refuses to allow us to use the QUERY_ALL_PACKAGES permission (while not prohibiting other similar apps from doing so), which is required for listing apps. - When installed from the Play Store, per-app proxy requires ROOT. Google Play refuses to allow us to use the QUERY_ALL_PACKAGES permission (while not prohibiting other similar apps from doing so), which is required for listing apps. Root access required Root access denied - Root or Shizuku access required to get the complete app list - Dashboard Items - Reset order - Reset - Drag handle to reorder items - Drag to reorder - Add Profile - Import configuration from a local file - Scan a configuration QR code - Create a new profile from scratch - Profile saved successfully - Failed to save profile: %s - Remote • %s - Update profile - More options - Edit - Save As File - Share As File - Service - About - Source Code - Unsaved Changes - You have unsaved changes. Do you want to discard them? - Discard - Save - Share Profile - Cancel - Logs copied to clipboard - No logs to copy - Logs saved successfully - Failed to save logs: %s - Failed to share logs: %s - No logs to share + + + Check Update + Automatic Update Check + Would you like to enable automatic update checking from **Play Store**? + Would you like to enable automatic update checking from **GitHub**? + Update Track + Stable + Beta + Current track does not support update checking yet + View Release + Downloading… + No updates available + New version available: %s + Auto Update + Automatically download and install updates in background + + + Silent Install + Silent Install + Install updates without interaction + Install Method + %s is not available or permission denied + PackageInstaller + Shizuku + ROOT + Install permission not granted + Grant Install Permission + Allow installing apps from this source + + + Shizuku is not installed or not running + Shizuku allows apps to use system APIs directly with higher privileges + Get Shizuku + Start Shizuku + Request Shizuku + + + Just now + Yesterday + Now + 1d + %dm + %dh + %dd + + %d minute ago + %d minutes ago + + + %d hour ago + %d hours ago + + + %d day ago + %d days ago + + + + Undo + Redo + Format + Delete + Share + + + Error + Missiong VPN permission + Empty configuration + Empty file + Failed to decode profile: %s + Invalid sing-box configuration: %s + Start command server + Create service + Start service + Deprecated Warning + Documentation + Your device lacks an Android standard file selector, please install one, such as Material Files. + No file manager found + + + Failed to save profile: %s + Failed to save logs: %s + Failed to share logs: %s + Failed to save QR code: %s + Failed to share QR code: %s + Failed to read configuration: %s + + + Profile saved successfully + Logs saved successfully + Configuration saved Copied to clipboard QR code saved to gallery - Failed to save QR code: %s - Failed to share QR code: %s + + + Clipboard is empty + Exported to clipboard + Imported from clipboard + + + Front camera + MLKit analyzer + Torch + Scanning… + No matching apps found + Found the following apps, please choose the action you want. + + + Icon + %d icons + No icons found + No icons match \"%s\" + Profile Icon + Select Icon + Select Profile Icon + Search icons... + Search icons + Close search + Current: %s + Categories + All Icons + Back to categories + + + Share QR Code + + + Find in document + + Back Scroll to bottom Exit selection mode Copy selected Clear search QR Code - Search logs… - Share Logs - Share QR Code Resume logs Pause logs Collapse search Search logs - Profile QR Code: %s - - Basic Information - Icon - Default - Remote Configuration - Last updated: %s - Content - JSON Viewer - JSON Editor - Success - Failed to read configuration: %s - - View Configuration - Clear - Previous - Next - Dismiss - Configuration saved - Find in document - - Profile Icon - Select Icon - Search icons... - Close search - Search icons - Current: %s - Categories - All Icons - Back to categories - Select Profile Icon - Auto - - - Filter: %s - Clear - Log Level - To Clipboard - To File - Clear Logs - %d selected - Not selected - Browse - No file manager found diff --git a/app/src/main/res/xml/shortcuts.xml b/app/src/main/res/xml/shortcuts.xml deleted file mode 100644 index fa52b45..0000000 --- a/app/src/main/res/xml/shortcuts.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -