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 @@
-
-
-
-
-
-