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
This commit is contained in:
世界
2025-12-30 19:24:10 +08:00
parent be1f6a2711
commit 9dea064353
13 changed files with 525 additions and 453 deletions

View File

@@ -40,10 +40,6 @@
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
tools:targetApi="31"> tools:targetApi="31">
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
<activity <activity
android:name=".LauncherActivity" android:name=".LauncherActivity"
android:exported="true" android:exported="true"
@@ -102,9 +98,6 @@
android:launchMode="singleTask" android:launchMode="singleTask"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity> </activity>
<activity <activity

View File

@@ -1098,17 +1098,17 @@ class MainActivity : ComponentActivity(), ServiceConnection.Callback {
val title = val title =
when (alertType) { when (alertType) {
Alert.RequestNotificationPermission -> stringResource(R.string.notification_permission_title) Alert.RequestNotificationPermission -> stringResource(R.string.notification_permission_title)
Alert.StartCommandServer -> stringResource(R.string.service_error_title_start_command_server) Alert.StartCommandServer -> stringResource(R.string.error_start_command_server)
Alert.CreateService -> stringResource(R.string.service_error_title_create_service) Alert.CreateService -> stringResource(R.string.error_create_service)
Alert.StartService -> stringResource(R.string.service_error_title_start_service) Alert.StartService -> stringResource(R.string.error_start_service)
else -> null else -> null
} }
val dialogMessage = val dialogMessage =
when (alertType) { 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.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 else -> message
} }

View File

@@ -59,7 +59,7 @@ fun DashboardScreen(
val note = uiState.deprecatedNotes.first() val note = uiState.deprecatedNotes.first()
AlertDialog( AlertDialog(
onDismissRequest = { }, onDismissRequest = { },
title = { Text(stringResource(R.string.service_error_title_deprecated_warning)) }, title = { Text(stringResource(R.string.error_deprecated_warning)) },
text = { Text(note.message) }, text = { Text(note.message) },
confirmButton = { confirmButton = {
TextButton(onClick = { viewModel.dismissDeprecatedNote() }) { TextButton(onClick = { viewModel.dismissDeprecatedNote() }) {
@@ -73,7 +73,7 @@ fun DashboardScreen(
viewModel.sendGlobalEvent(UiEvent.OpenUrl(note.migrationLink)) viewModel.sendGlobalEvent(UiEvent.OpenUrl(note.migrationLink))
viewModel.dismissDeprecatedNote() viewModel.dismissDeprecatedNote()
}) { }) {
Text(stringResource(R.string.service_error_deprecated_warning_documentation)) Text(stringResource(R.string.error_deprecated_documentation))
} }
} }
} else { } else {

View File

@@ -261,7 +261,7 @@ private fun ProfilePickerRow(
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( Toast.makeText(
context, context,
context.getString(R.string.profile_saved_successfully), context.getString(R.string.success_profile_saved),
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,
).show() ).show()
} }
@@ -269,7 +269,7 @@ private fun ProfilePickerRow(
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( Toast.makeText(
context, context,
"${context.getString(R.string.profile_save_failed)}: ${e.message}", "${context.getString(R.string.failed_save_profile)}: ${e.message}",
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,
).show() ).show()
} }

View File

@@ -215,7 +215,7 @@ fun ProfilesCard(
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( Toast.makeText(
context, context,
context.getString(R.string.profile_saved_successfully), context.getString(R.string.success_profile_saved),
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,
).show() ).show()
} }
@@ -223,7 +223,7 @@ fun ProfilesCard(
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( Toast.makeText(
context, context,
"${context.getString(R.string.profile_save_failed)}: ${e.message}", "${context.getString(R.string.failed_save_profile)}: ${e.message}",
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,
).show() ).show()
} }

View File

@@ -438,14 +438,14 @@ fun LogScreen(
outputStream.flush() outputStream.flush()
Toast.makeText( Toast.makeText(
context, context,
context.getString(R.string.logs_saved_successfully), context.getString(R.string.success_logs_saved),
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,
).show() ).show()
} }
} catch (e: Exception) { } catch (e: Exception) {
Toast.makeText( Toast.makeText(
context, context,
context.getString(R.string.failed_to_save_logs, e.message), context.getString(R.string.failed_save_logs, e.message),
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,
).show() ).show()
} }
@@ -667,7 +667,7 @@ fun LogScreen(
} catch (e: Exception) { } catch (e: Exception) {
Toast.makeText( Toast.makeText(
context, context,
context.getString(R.string.failed_to_share_logs, e.message), context.getString(R.string.failed_share_logs, e.message),
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,
).show() ).show()
} }

View File

@@ -125,7 +125,7 @@ fun EditProfileContentScreen(
if (uiState.showSaveSuccessMessage) { if (uiState.showSaveSuccessMessage) {
Toast.makeText( Toast.makeText(
context, context,
context.getString(R.string.configuration_saved), context.getString(R.string.success_configuration_saved),
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,
).show() ).show()
viewModel.clearSaveSuccessMessage() viewModel.clearSaveSuccessMessage()

View File

@@ -334,7 +334,7 @@ class EditProfileViewModel(application: Application) : AndroidViewModel(applicat
Toast.makeText( Toast.makeText(
context, context,
context.getString( context.getString(
io.nekohasekai.sfa.R.string.failed_to_read_configuration, io.nekohasekai.sfa.R.string.failed_read_configuration,
e.message, e.message,
), ),
Toast.LENGTH_SHORT, Toast.LENGTH_SHORT,

View File

@@ -215,7 +215,7 @@ fun SettingsScreen(navController: NavController) {
ListItem( ListItem(
headlineContent = { headlineContent = {
Text( Text(
stringResource(R.string.service_error_deprecated_warning_documentation), stringResource(R.string.error_deprecated_documentation),
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
) )
}, },

View File

@@ -81,7 +81,7 @@ suspend fun saveQRCodeToGallery(
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( Toast.makeText(
context, 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, Toast.LENGTH_LONG,
).show() ).show()
e.printStackTrace() e.printStackTrace()
@@ -137,7 +137,7 @@ suspend fun shareQRCodeImage(
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText( Toast.makeText(
context, 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, Toast.LENGTH_LONG,
).show() ).show()
e.printStackTrace() e.printStackTrace()

View File

@@ -1,18 +1,96 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<resources> <resources>
<string name="stop">停止</string> <!-- App -->
<string name="app_version_title">应用版本</string>
<!-- Common Actions -->
<string name="ok"></string> <string name="ok"></string>
<string name="cancel">取消</string>
<string name="save">保存</string>
<string name="discard">放弃</string>
<string name="edit">编辑</string>
<string name="close">关闭</string>
<string name="dismiss">关闭</string>
<string name="stop">停止</string>
<string name="reset">重置</string>
<string name="destroy">销毁</string>
<string name="clear">清除</string>
<string name="search">搜索</string>
<string name="action">操作</string>
<string name="action_start">启动</string>
<string name="action_deselect">取消选择</string>
<string name="expand">展开</string>
<string name="collapse">收起</string>
<string name="expand_all">全部展开</string>
<string name="collapse_all">全部收起</string>
<string name="previous">上一个</string>
<string name="next">下一个</string>
<string name="update">更新</string>
<string name="read_more">阅读更多</string>
<string name="no_thanks">不,谢谢</string> <string name="no_thanks">不,谢谢</string>
<string name="options">选项</string>
<string name="more_options">更多选项</string>
<!-- Common States -->
<string name="enabled">启用</string>
<string name="disabled">禁用</string>
<string name="loading">加载中...</string>
<string name="calculating">计算中...</string>
<string name="auto">自动</string>
<string name="success">成功</string>
<string name="default_text">默认</string>
<!-- Navigation Titles -->
<string name="title_dashboard">仪表</string> <string name="title_dashboard">仪表</string>
<string name="title_configuration">配置</string> <string name="title_configuration">配置</string>
<string name="title_log">日志</string> <string name="title_log">日志</string>
<string name="title_settings">设置</string> <string name="title_settings">设置</string>
<string name="title_app_settings">应用</string>
<string name="title_new_profile">新建配置</string> <string name="title_new_profile">新建配置</string>
<string name="title_edit_profile">编辑配置</string> <string name="title_edit_profile">编辑配置</string>
<string name="title_edit_configuration">编辑配置</string> <string name="title_edit_configuration">编辑配置</string>
<string name="title_groups"></string> <string name="title_groups"></string>
<string name="title_debug">调试</string> <string name="title_debug">调试</string>
<string name="quick_toggle">切换</string> <string name="title_connections">连接</string>
<string name="title_others">其他</string>
<string name="title_scan_result">扫描结果</string>
<!-- Status -->
<string name="status_default">服务未启动</string>
<string name="status_starting">启动中</string>
<string name="status_stopping">停止中</string>
<string name="status_started">已启动</string>
<!-- Dashboard -->
<string name="dashboard_items">仪表项目</string>
<string name="memory">内存</string>
<string name="goroutines">协程</string>
<string name="upload">上传</string>
<string name="download">下载</string>
<string name="connections_in">入站</string>
<string name="connections_out">出站</string>
<string name="clash_mode">Clash 模式</string>
<string name="mode">模式</string>
<string name="system_proxy">系统代理</string>
<string name="url_test">测试</string>
<string name="drag_handle_to_reorder">拖动手柄重新排序项目</string>
<string name="drag_to_reorder">拖动重新排序</string>
<string name="reset_order">重置顺序</string>
<!-- Connections -->
<string name="close_connections_confirm">关闭所有连接?</string>
<!-- Profiles -->
<string name="no_profiles">没有配置的配置文件</string>
<string name="add_profile">添加配置文件</string>
<string name="update_profile">更新配置文件</string>
<string name="share_profile">分享配置文件</string>
<string name="import_remote_profile">导入远程配置</string>
<string name="import_remote_profile_message">您确定要导入远程配置文件 %1$s 吗?您将连接到 %2$s 来下载配置。</string>
<string name="import_from_file_description">从本地文件导入配置</string>
<string name="scan_qr_code_description">扫描配置二维码</string>
<string name="create_new_profile_description">从头创建新配置文件</string>
<string name="icloud_profile_unsupported">当前平台不支持 iCloud 配置文件</string>
<string name="profile_name">名称</string> <string name="profile_name">名称</string>
<string name="profile_type">类型</string> <string name="profile_type">类型</string>
<string name="profile_source"></string> <string name="profile_source"></string>
@@ -27,68 +105,62 @@
<string name="profile_auto_update_interval_minimum_hint">最低值为 15</string> <string name="profile_auto_update_interval_minimum_hint">最低值为 15</string>
<string name="profile_type_local">本地</string> <string name="profile_type_local">本地</string>
<string name="profile_type_remote">远程</string> <string name="profile_type_remote">远程</string>
<string name="profile_type_remote_updated">远程 • %s</string>
<string name="profile_source_create_new">创建</string> <string name="profile_source_create_new">创建</string>
<string name="profile_source_import">导入</string> <string name="profile_source_import">导入</string>
<string name="profile_add_import_file">从文件导入</string> <string name="profile_add_import_file">从文件导入</string>
<string name="profile_add_scan_qr_code">扫描二维码</string> <string name="profile_add_scan_qr_code">扫描二维码</string>
<string name="profile_add_scan_use_front_camera">前置摄像头</string>
<string name="profile_add_scan_use_vendor_analyzer">使用 MLKit 扫描</string>
<string name="profile_add_scan_enable_torch">灯光</string>
<string name="profile_add_create_manually">手动创建</string> <string name="profile_add_create_manually">手动创建</string>
<string name="menu_undo">撤销</string> <string name="profile_override">配置覆盖</string>
<string name="menu_redo">重做</string> <string name="basic_information">基本信息</string>
<string name="menu_format">格式化</string> <string name="remote_configuration">远程配置</string>
<string name="menu_delete">删除</string> <string name="last_updated_format">最后更新:%s</string>
<string name="menu_share">分享</string> <string name="content">内容</string>
<string name="status_default">服务未启动</string> <string name="json_viewer">JSON 查看器</string>
<string name="status_starting">启动中</string> <string name="json_editor">JSON 编辑器</string>
<string name="status_stopping">停止中</string> <string name="view_configuration">查看配置</string>
<string name="status_started">已启动</string> <string name="save_as_file">另存为文件</string>
<string name="enabled">启用</string> <string name="share_as_file">分享为文件</string>
<string name="disabled">禁用</string> <string name="unsaved_changes">未保存的更改</string>
<string name="error_title">错误</string> <string name="unsaved_changes_message">您有未保存的更改。要放弃它们吗?</string>
<string name="file_manager_missing">您的设备缺少 Android 标准文件选择器,请安装一个,例如 Material Files。</string> <string name="profile_qr_code_text">配置文件二维码:%s</string>
<string name="loading">加载中...</string>
<string name="service_error_missing_permission">缺少 VPN 权限</string> <!-- Groups -->
<string name="service_error_empty_configuration">空配置</string>
<string name="service_error_title_start_command_server">启动命令服务器</string>
<string name="service_error_title_create_service">创建服务</string>
<string name="service_error_title_start_service">启动服务</string>
<string name="service_error_title_deprecated_warning">弃用警告</string>
<string name="service_error_deprecated_warning_documentation">文档</string>
<string name="group_selected_title">选中</string> <string name="group_selected_title">选中</string>
<string name="core_version_title">核心版本</string>
<!-- Log -->
<string name="log_level">日志级别</string>
<string name="filter_label">过滤器:%s</string>
<string name="clear_filter">清除</string>
<string name="clear_logs">清除日志</string>
<string name="search_logs_placeholder">搜索日志…</string>
<string name="logs_copied_to_clipboard">日志已复制到剪贴板</string>
<string name="no_logs_to_copy">没有日志可复制</string>
<string name="no_logs_to_share">没有日志可分享</string>
<string name="intent_share_logs">分享日志</string>
<string name="selected_count">已选择 %d 项</string>
<string name="not_selected">未选择</string>
<string name="save_to_clipboard">复制到剪贴板</string>
<string name="save_to_file">保存到文件</string>
<!-- Settings -->
<string name="service">服务</string>
<string name="core">核心</string> <string name="core">核心</string>
<string name="core_version_title">核心版本</string>
<string name="core_data_size">数据大小</string> <string name="core_data_size">数据大小</string>
<string name="calculating">计算中...</string> <string name="about">关于</string>
<string name="options">选项</string> <string name="source_code">源代码</string>
<string name="disable_deprecated_warnings">禁用弃用警告</string> <string name="sponsor">赞助</string>
<string name="working_directory">工作目录</string> <string name="working_directory">工作目录</string>
<string name="destroy">销毁</string> <string name="disable_deprecated_warnings">禁用弃用警告</string>
<string name="ignore_memory_limit">忽略内存限制</string> <string name="ignore_memory_limit">忽略内存限制</string>
<string name="ignore_memory_limit_description">不对 sing-box 强制执行内存限制。</string> <string name="ignore_memory_limit_description">不对 sing-box 强制执行内存限制。</string>
<string name="auto_redirect">自动重定向</string> <string name="auto_redirect">自动重定向</string>
<string name="auto_redirect_description">需要 ROOT 权限</string> <string name="auto_redirect_description">需要 ROOT 权限</string>
<string name="system_http_proxy">系统 HTTP 代理</string>
<!-- Per-App Proxy -->
<string name="per_app_proxy">分应用代理</string> <string name="per_app_proxy">分应用代理</string>
<string name="check_update_automatic">自动检查更新</string>
<string name="check_update">检查更新</string>
<string name="no_updates_available">没有可用的更新</string>
<string name="new_version_available">有新版本可用:%s</string>
<string name="update">更新</string>
<string name="update_track">更新轨道</string>
<string name="update_track_stable">稳定版</string>
<string name="update_track_beta">测试版</string>
<string name="update_track_not_supported">当前轨道尚不支持检查更新</string>
<string name="app_version_title">应用版本</string>
<string name="action">操作</string>
<string name="title_app_settings">应用</string>
<string name="background_permission">后台权限</string>
<string name="background_permission_description">申请必要的权限以使 VPN 正常运行。 如果您使用的是中国公司生产的设备,则授予权限后该卡可能不会消失。</string>
<string name="read_more">阅读更多</string>
<string name="request_background_permission">忽略电池优化</string>
<string name="import_remote_profile">导入远程配置</string>
<string name="import_remote_profile_message">您确定要导入远程配置文件 %1$s 吗?您将连接到 %2$s 来下载配置。</string>
<string name="profile_override">配置覆盖</string>
<string name="per_app_proxy_mode">代理模式</string> <string name="per_app_proxy_mode">代理模式</string>
<string name="per_app_proxy_mode_include">白名单</string> <string name="per_app_proxy_mode_include">白名单</string>
<string name="per_app_proxy_mode_include_description">仅允许选定的应用程序通过 VPN</string> <string name="per_app_proxy_mode_include_description">仅允许选定的应用程序通过 VPN</string>
@@ -116,59 +188,43 @@
<string name="per_app_proxy_export">导出到剪切板</string> <string name="per_app_proxy_export">导出到剪切板</string>
<string name="per_app_proxy_scan">扫描</string> <string name="per_app_proxy_scan">扫描</string>
<string name="per_app_proxy_scan_china_apps">中国应用</string> <string name="per_app_proxy_scan_china_apps">中国应用</string>
<string name="content_description_app_icon">App 图标</string>
<string name="toast_clipboard_empty">剪切板为空</string>
<string name="toast_copied_to_clipboard">已导出到剪切板</string>
<string name="toast_imported_from_clipboard">已从剪贴板导入</string>
<string name="message_scanning">扫描中...</string>
<string name="message_scan_app_no_apps_found">未找到匹配的应用</string>
<string name="message_scan_app_found">找到以下应用程序,请选择您想要的操作。</string>
<string name="title_scan_result">扫描结果</string>
<string name="action_deselect">取消选择</string>
<string name="per_app_proxy_manage">管理</string> <string name="per_app_proxy_manage">管理</string>
<string name="content_description_app_icon">App 图标</string>
<string name="per_app_proxy_managed_mode">托管模式</string> <string name="per_app_proxy_managed_mode">托管模式</string>
<string name="per_app_proxy_managed_mode_description">自动排除中国应用</string> <string name="per_app_proxy_managed_mode_description">自动排除中国应用</string>
<string name="icloud_profile_unsupported">当前平台不支持 iCloud 配置文件</string> <string name="per_app_proxy_package_query_mode">模式</string>
<string name="search">搜索</string> <string name="per_app_proxy_shizuku_required">通过 Play 商店安装时,分应用代理需要 Shizuku。Google Play 拒绝允许我们使用 QUERY_ALL_PACKAGES 权限(同时不禁止其他类似应用这样做),而这是列出应用程序所必需的。</string>
<string name="expand">展开</string> <string name="per_app_proxy_root_required">通过 Play 商店安装时,分应用代理需要 ROOT。Google Play 拒绝允许我们使用 QUERY_ALL_PACKAGES 权限(同时不禁止其他类似应用这样做),而这是列出应用程序所必需的。</string>
<string name="collapse">收起</string> <string name="privileged_access_required">需要 Root 或 Shizuku 权限来获取完整应用列表</string>
<string name="expand_all">全部展开</string>
<string name="collapse_all">全部收起</string> <!-- Permissions -->
<string name="close">关闭</string> <string name="background_permission">后台权限</string>
<string name="close_connections_confirm">关闭所有连接?</string> <string name="background_permission_description">申请必要的权限以使 VPN 正常运行。 如果您使用的是中国公司生产的设备,则授予权限后该卡可能不会消失。</string>
<string name="icon_count_format">%d 个图标</string> <string name="request_background_permission">忽略电池优化</string>
<string name="no_icons_found">未找到图标</string>
<string name="no_icons_match">没有匹配 \"%s\" 的图标</string>
<string name="system_http_proxy">系统 HTTP 代理</string>
<string name="sponsor">赞助</string>
<string name="action_start">启动</string>
<string name="location_permission_title">位置权限</string> <string name="location_permission_title">位置权限</string>
<string name="location_permission_description">您的个人资料包含 &lt;strong&gt;&lt;tt&gt;wifi_ssid&lt;/tt&gt;&lt;tt&gt;wifi_bssid&lt;/tt&gt; 路由规则&lt;/strong&gt;。为了使它们正常工作sing-box 在&lt;strong&gt;后台&lt;/strong&gt;使用 &lt;strong&gt;位置&lt;/strong&gt; 权限来获取有关所连接 Wi-Fi 网络的信息。该信息将&lt;strong&gt;仅用于路由目的&lt;/strong&gt;</string> <string name="location_permission_description">您的个人资料包含 &lt;strong&gt;&lt;tt&gt;wifi_ssid&lt;/tt&gt;&lt;tt&gt;wifi_bssid&lt;/tt&gt; 路由规则&lt;/strong&gt;。为了使它们正常工作sing-box 在&lt;strong&gt;后台&lt;/strong&gt;使用 &lt;strong&gt;位置&lt;/strong&gt; 权限来获取有关所连接 Wi-Fi 网络的信息。该信息将&lt;strong&gt;仅用于路由目的&lt;/strong&gt;</string>
<string name="location_permission_background_description">在 Android 10 及更高版本中,需要&lt;strong&gt;后台位置&lt;/strong&gt;权限。选择&lt;strong&gt;始终允许&lt;/strong&gt;以授予权限。</string> <string name="location_permission_background_description">在 Android 10 及更高版本中,需要&lt;strong&gt;后台位置&lt;/strong&gt;权限。选择&lt;strong&gt;始终允许&lt;/strong&gt;以授予权限。</string>
<string name="notification_permission_title">通知权限</string> <string name="notification_permission_title">通知权限</string>
<string name="notification_permission_required_description">sing-box 无法在没有发送通知权限的情况下显示实时网速。请授予权限或禁用实时网速通知后再启动服务。</string> <string name="notification_permission_required_description">sing-box 无法在没有发送通知权限的情况下显示实时网速。请授予权限或禁用实时网速通知后再启动服务。</string>
<string name="per_app_proxy_package_query_mode">模式</string>
<string name="per_app_proxy_shizuku_required">通过 Play 商店安装时,分应用代理需要 Shizuku。Google Play 拒绝允许我们使用 QUERY_ALL_PACKAGES 权限(同时不禁止其他类似应用这样做),而这是列出应用程序所必需的。</string>
<string name="per_app_proxy_root_required">通过 Play 商店安装时,分应用代理需要 ROOT。Google Play 拒绝允许我们使用 QUERY_ALL_PACKAGES 权限(同时不禁止其他类似应用这样做),而这是列出应用程序所必需的。</string>
<string name="start_shizuku">启动 Shizuku</string>
<string name="request_shizuku">授权 Shizuku</string>
<string name="get_shizuku">获取 Shizuku</string>
<string name="root_access_required">需要 Root 权限</string> <string name="root_access_required">需要 Root 权限</string>
<string name="root_access_denied">Root 权限被拒绝</string> <string name="root_access_denied">Root 权限被拒绝</string>
<string name="privileged_access_required">需要 Root 或 Shizuku 权限来获取完整应用列表</string>
<string name="title_connections">连接</string> <!-- Updates -->
<string name="title_others">其他</string> <string name="check_update">检查更新</string>
<string name="no_profiles">没有配置的配置文件</string> <string name="check_update_automatic">自动检查更新</string>
<string name="memory">内存</string> <string name="update_track">更新轨道</string>
<string name="goroutines">协程</string> <string name="update_track_stable">稳定版</string>
<string name="upload">上传</string> <string name="update_track_beta">测试版</string>
<string name="download">下载</string> <string name="update_track_not_supported">当前轨道尚不支持检查更新</string>
<string name="connections_in">入站</string> <string name="no_updates_available">没有可用的更新</string>
<string name="connections_out">出站</string> <string name="new_version_available">有新版本可用:%s</string>
<string name="clash_mode">Clash 模式</string>
<string name="mode">模式</string> <!-- Shizuku -->
<string name="system_proxy">系统代理</string> <string name="get_shizuku">获取 Shizuku</string>
<string name="url_test">测试</string> <string name="start_shizuku">启动 Shizuku</string>
<string name="request_shizuku">授权 Shizuku</string>
<!-- Time -->
<string name="time_just_now">刚刚</string> <string name="time_just_now">刚刚</string>
<string name="time_yesterday">昨天</string> <string name="time_yesterday">昨天</string>
<string name="time_now">现在</string> <string name="time_now">现在</string>
@@ -185,98 +241,87 @@
<plurals name="time_days_ago"> <plurals name="time_days_ago">
<item quantity="other">%d 天前</item> <item quantity="other">%d 天前</item>
</plurals> </plurals>
<!-- Menu -->
<string name="menu_undo">撤销</string>
<string name="menu_redo">重做</string>
<string name="menu_format">格式化</string>
<string name="menu_delete">删除</string>
<string name="menu_share">分享</string>
<!-- Errors -->
<string name="error_title">错误</string>
<string name="error_missing_vpn_permission">缺少 VPN 权限</string>
<string name="error_empty_configuration">空配置</string>
<string name="error_empty_file">空文件</string> <string name="error_empty_file">空文件</string>
<string name="error_decode_profile">解码配置文件失败:%s</string> <string name="error_decode_profile">解码配置文件失败:%s</string>
<string name="error_invalid_configuration">无效的 sing-box 配置:%s</string> <string name="error_invalid_configuration">无效的 sing-box 配置:%s</string>
<string name="dashboard_items">仪表项目</string> <string name="error_start_command_server">启动命令服务器</string>
<string name="reset_order">重置顺序</string> <string name="error_create_service">创建服务</string>
<string name="reset">重置</string> <string name="error_start_service">启动服务</string>
<string name="drag_handle_to_reorder">拖动手柄重新排序项目</string> <string name="error_deprecated_warning">弃用警告</string>
<string name="drag_to_reorder">拖动重新排序</string> <string name="error_deprecated_documentation">文档</string>
<string name="add_profile">添加配置文件</string> <string name="file_manager_missing">您的设备缺少 Android 标准文件选择器,请安装一个,例如 Material Files。</string>
<string name="import_from_file_description">从本地文件导入配置</string>
<string name="scan_qr_code_description">扫描配置二维码</string> <!-- Failed Operations -->
<string name="create_new_profile_description">从头创建新配置文件</string> <string name="failed_save_profile">保存配置文件失败:%s</string>
<string name="profile_saved_successfully">配置文件保存成功</string> <string name="failed_save_logs">保存日志失败:%s</string>
<string name="profile_save_failed">保存配置文件失败:%s</string> <string name="failed_share_logs">分享日志失败:%s</string>
<string name="profile_type_remote_updated">远程 • %s</string> <string name="failed_save_qr_code">保存二维码失败:%s</string>
<string name="update_profile">更新配置文件</string> <string name="failed_share_qr_code">分享二维码失败:%s</string>
<string name="more_options">更多选项</string> <string name="failed_read_configuration">读取配置失败:%s</string>
<string name="edit">编辑</string>
<string name="save_as_file">另存为文件</string> <!-- Success Messages -->
<string name="share_as_file">分享为文件</string> <string name="success_profile_saved">配置文件保存成功</string>
<string name="service">服务</string> <string name="success_logs_saved">日志保存成功</string>
<string name="about">关于</string> <string name="success_configuration_saved">配置已保存</string>
<string name="source_code">源代码</string>
<string name="unsaved_changes">未保存的更改</string>
<string name="unsaved_changes_message">您有未保存的更改。要放弃它们吗?</string>
<string name="discard">放弃</string>
<string name="save">保存</string>
<string name="share_profile">分享配置文件</string>
<string name="cancel">取消</string>
<string name="logs_copied_to_clipboard">日志已复制到剪贴板</string>
<string name="no_logs_to_copy">没有日志可复制</string>
<string name="logs_saved_successfully">日志保存成功</string>
<string name="failed_to_save_logs">保存日志失败:%s</string>
<string name="failed_to_share_logs">分享日志失败:%s</string>
<string name="no_logs_to_share">没有日志可分享</string>
<string name="copied_to_clipboard">已复制到剪贴板</string> <string name="copied_to_clipboard">已复制到剪贴板</string>
<string name="qr_code_saved_to_gallery">二维码已保存到相册</string> <string name="qr_code_saved_to_gallery">二维码已保存到相册</string>
<string name="failed_to_save_qr_code">保存二维码失败:%s</string>
<string name="failed_to_share_qr_code">分享二维码失败:%s</string> <!-- Toast Messages -->
<string name="toast_clipboard_empty">剪切板为空</string>
<string name="toast_copied_to_clipboard">已导出到剪切板</string>
<string name="toast_imported_from_clipboard">已从剪贴板导入</string>
<!-- Scanning -->
<string name="profile_add_scan_use_front_camera">前置摄像头</string>
<string name="profile_add_scan_use_vendor_analyzer">使用 MLKit 扫描</string>
<string name="profile_add_scan_enable_torch">灯光</string>
<string name="message_scanning">扫描中...</string>
<string name="message_scan_app_no_apps_found">未找到匹配的应用</string>
<string name="message_scan_app_found">找到以下应用程序,请选择您想要的操作。</string>
<!-- Icon Selection -->
<string name="icon">图标</string>
<string name="icon_count_format">%d 个图标</string>
<string name="no_icons_found">未找到图标</string>
<string name="no_icons_match">没有匹配 \"%s\" 的图标</string>
<string name="profile_icon">配置文件图标</string>
<string name="select_icon">选择图标</string>
<string name="select_profile_icon">选择配置文件图标</string>
<string name="search_icons_placeholder">搜索图标...</string>
<string name="search_icons">搜索图标</string>
<string name="close_search">关闭搜索</string>
<string name="current_icon_format">当前:%s</string>
<string name="categories">分类</string>
<string name="all_icons">所有图标</string>
<string name="back_to_categories">返回分类</string>
<!-- QR Code -->
<string name="intent_share_qr_code">分享二维码</string>
<!-- Search -->
<string name="search_placeholder">在文档中查找</string>
<!-- Content Descriptions (Accessibility) -->
<string name="content_description_back">返回</string> <string name="content_description_back">返回</string>
<string name="content_description_scroll_to_bottom">滚动到底部</string> <string name="content_description_scroll_to_bottom">滚动到底部</string>
<string name="content_description_exit_selection_mode">退出选择模式</string> <string name="content_description_exit_selection_mode">退出选择模式</string>
<string name="content_description_copy_selected">复制选中</string> <string name="content_description_copy_selected">复制选中</string>
<string name="content_description_clear_search">清除搜索</string> <string name="content_description_clear_search">清除搜索</string>
<string name="content_description_qr_code">二维码</string> <string name="content_description_qr_code">二维码</string>
<string name="search_logs_placeholder">搜索日志…</string>
<string name="intent_share_logs">分享日志</string>
<string name="intent_share_qr_code">分享二维码</string>
<string name="content_description_resume_logs">恢复日志</string> <string name="content_description_resume_logs">恢复日志</string>
<string name="content_description_pause_logs">暂停日志</string> <string name="content_description_pause_logs">暂停日志</string>
<string name="content_description_collapse_search">折叠搜索</string> <string name="content_description_collapse_search">折叠搜索</string>
<string name="content_description_search_logs">搜索日志</string> <string name="content_description_search_logs">搜索日志</string>
<string name="profile_qr_code_text">配置文件二维码:%s</string>
<!-- Profile Edit Screen -->
<string name="basic_information">基本信息</string>
<string name="icon">图标</string>
<string name="default_text">默认</string>
<string name="remote_configuration">远程配置</string>
<string name="last_updated_format">最后更新:%s</string>
<string name="content">内容</string>
<string name="json_viewer">JSON 查看器</string>
<string name="json_editor">JSON 编辑器</string>
<string name="success">成功</string>
<string name="failed_to_read_configuration">读取配置失败:%s</string>
<!-- Profile Content Editor -->
<string name="view_configuration">查看配置</string>
<string name="clear">清除</string>
<string name="previous">上一个</string>
<string name="next">下一个</string>
<string name="dismiss">关闭</string>
<string name="configuration_saved">配置已保存</string>
<string name="search_placeholder">在文档中查找</string>
<!-- Icon Selection -->
<string name="profile_icon">配置文件图标</string>
<string name="select_icon">选择图标</string>
<string name="search_icons_placeholder">搜索图标...</string>
<string name="close_search">关闭搜索</string>
<string name="search_icons">搜索图标</string>
<string name="current_icon_format">当前:%s</string>
<string name="categories">分类</string>
<string name="all_icons">所有图标</string>
<string name="back_to_categories">返回分类</string>
<string name="select_profile_icon">选择配置文件图标</string>
<string name="auto">自动</string>
<!-- New Profile Screen -->
<!-- Log Screen -->
<string name="filter_label">过滤器:%s</string>
<string name="clear_filter">清除</string>
<string name="log_level">日志级别</string>
<string name="save_to_clipboard">复制到剪贴板</string>
<string name="save_to_file">保存到文件</string>
<string name="clear_logs">清除日志</string>
<string name="selected_count">已选择 %d 项</string>
<string name="not_selected">未选择</string>
</resources> </resources>

View File

@@ -1,60 +1,70 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<resources> <resources>
<!-- App -->
<string name="app_name" translatable="false">sing-box</string> <string name="app_name" translatable="false">sing-box</string>
<string name="stop">Stop</string> <string name="app_version_title">App version</string>
<!-- Common Actions -->
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="cancel">Cancel</string>
<string name="save">Save</string>
<string name="discard">Discard</string>
<string name="edit">Edit</string>
<string name="close">Close</string>
<string name="dismiss">Dismiss</string>
<string name="stop">Stop</string>
<string name="reset">Reset</string>
<string name="destroy">Destroy</string>
<string name="clear">Clear</string>
<string name="browse">Browse</string>
<string name="search">Search</string>
<string name="action">Action</string>
<string name="action_start">Start</string>
<string name="action_deselect">Deselect</string>
<string name="expand">Expand</string>
<string name="collapse">Collapse</string>
<string name="expand_all">Expand All</string>
<string name="collapse_all">Collapse All</string>
<string name="previous">Previous</string>
<string name="next">Next</string>
<string name="update">Update</string>
<string name="read_more">Read More</string>
<string name="no_thanks">No, thanks</string> <string name="no_thanks">No, thanks</string>
<string name="options">Options</string>
<string name="more_options">More options</string>
<!-- Common States -->
<string name="enabled">Enabled</string>
<string name="disabled">Disabled</string>
<string name="loading">Loading…</string>
<string name="calculating">Calculating...</string>
<string name="auto">Auto</string>
<string name="success">Success</string>
<string name="default_text">Default</string>
<!-- Navigation Titles -->
<string name="title_dashboard">Dashboard</string> <string name="title_dashboard">Dashboard</string>
<string name="title_configuration">Profiles</string> <string name="title_configuration">Profiles</string>
<string name="title_log">Logs</string> <string name="title_log">Logs</string>
<string name="title_settings">Settings</string> <string name="title_settings">Settings</string>
<string name="title_app_settings">App</string>
<string name="title_new_profile">New Profile</string> <string name="title_new_profile">New Profile</string>
<string name="title_edit_profile">Edit Profile</string> <string name="title_edit_profile">Edit Profile</string>
<string name="title_edit_configuration">Edit Configuration</string> <string name="title_edit_configuration">Edit Configuration</string>
<string name="title_groups">Groups</string> <string name="title_groups">Groups</string>
<string name="title_debug">Debug</string> <string name="title_debug">Debug</string>
<string name="title_connections">Connections</string> <string name="title_connections">Connections</string>
<string name="empty_connections">No connections</string>
<string name="connection_state_all">All</string>
<string name="connection_state_active">Active</string>
<string name="connection_state_closed">Closed</string>
<string name="connection_sort_date">Date</string>
<string name="connection_sort_traffic">Traffic</string>
<string name="connection_sort_traffic_total">Total Traffic</string>
<string name="search_connections">Search connections…</string>
<string name="connection_close">Close</string>
<string name="connection_close_all">Close All</string>
<string name="connection_state">State</string>
<string name="connection_details">Connection Details</string>
<string name="connection_section_basic">Basic Information</string>
<string name="connection_section_metadata">Metadata</string>
<string name="connection_created_at">Created At</string>
<string name="connection_closed_at">Closed At</string>
<string name="connection_duration">Duration</string>
<string name="connection_uplink">Uplink</string>
<string name="connection_downlink">Downlink</string>
<string name="connection_inbound">Inbound</string>
<string name="connection_inbound_type">Inbound Type</string>
<string name="connection_ip_version">IP Version</string>
<string name="connection_network">Network</string>
<string name="connection_source">Source</string>
<string name="connection_destination">Destination</string>
<string name="connection_domain">Domain</string>
<string name="connection_protocol">Protocol</string>
<string name="connection_user">User</string>
<string name="connection_from_outbound">From Outbound</string>
<string name="connection_match_rule">Match Rule</string>
<string name="connection_outbound">Outbound</string>
<string name="connection_outbound_type">Outbound Type</string>
<string name="connection_chain">Chain</string>
<string name="connection_section_process">Process Information</string>
<string name="connection_process_id">Process ID</string>
<string name="connection_user_id">User ID</string>
<string name="connection_user_name">User Name</string>
<string name="connection_process_path">Process Path</string>
<string name="connection_package_name">Package Name</string>
<string name="title_others">Others</string> <string name="title_others">Others</string>
<string name="no_profiles">No profiles configured</string> <string name="title_scan_result">Scan Result</string>
<!-- Status -->
<string name="status_default">Service not started</string>
<string name="status_starting">Starting</string>
<string name="status_stopping">Stopping</string>
<string name="status_started">Started</string>
<!-- Dashboard -->
<string name="dashboard_items">Dashboard Items</string>
<string name="memory">Memory</string> <string name="memory">Memory</string>
<string name="goroutines">Goroutines</string> <string name="goroutines">Goroutines</string>
<string name="upload">Upload</string> <string name="upload">Upload</string>
@@ -65,7 +75,63 @@
<string name="mode">Mode</string> <string name="mode">Mode</string>
<string name="system_proxy">System Proxy</string> <string name="system_proxy">System Proxy</string>
<string name="url_test">Test</string> <string name="url_test">Test</string>
<string name="quick_toggle">Toggle</string> <string name="drag_handle_to_reorder">Drag handle to reorder items</string>
<string name="drag_to_reorder">Drag to reorder</string>
<string name="reset_order">Reset order</string>
<!-- Connections -->
<string name="empty_connections">No connections</string>
<string name="search_connections">Search connections…</string>
<string name="close_connections_confirm">Close all connections?</string>
<string name="connection_state_all">All</string>
<string name="connection_state_active">Active</string>
<string name="connection_state_closed">Closed</string>
<string name="connection_sort_date">Date</string>
<string name="connection_sort_traffic">Traffic</string>
<string name="connection_sort_traffic_total">Total Traffic</string>
<string name="connection_close">Close</string>
<string name="connection_close_all">Close All</string>
<string name="connection_state">State</string>
<string name="connection_details">Connection Details</string>
<string name="connection_section_basic">Basic Information</string>
<string name="connection_section_metadata">Metadata</string>
<string name="connection_section_process">Process Information</string>
<string name="connection_created_at">Created At</string>
<string name="connection_closed_at">Closed At</string>
<string name="connection_duration">Duration</string>
<string name="connection_uplink">Uplink</string>
<string name="connection_downlink">Downlink</string>
<string name="connection_inbound">Inbound</string>
<string name="connection_inbound_type">Inbound Type</string>
<string name="connection_outbound">Outbound</string>
<string name="connection_outbound_type">Outbound Type</string>
<string name="connection_ip_version">IP Version</string>
<string name="connection_network">Network</string>
<string name="connection_source">Source</string>
<string name="connection_destination">Destination</string>
<string name="connection_domain">Domain</string>
<string name="connection_protocol">Protocol</string>
<string name="connection_user">User</string>
<string name="connection_from_outbound">From Outbound</string>
<string name="connection_match_rule">Match Rule</string>
<string name="connection_chain">Chain</string>
<string name="connection_process_id">Process ID</string>
<string name="connection_user_id">User ID</string>
<string name="connection_user_name">User Name</string>
<string name="connection_process_path">Process Path</string>
<string name="connection_package_name">Package Name</string>
<!-- Profiles -->
<string name="no_profiles">No profiles configured</string>
<string name="add_profile">Add Profile</string>
<string name="update_profile">Update profile</string>
<string name="share_profile">Share Profile</string>
<string name="import_remote_profile">Import remote profile</string>
<string name="import_remote_profile_message">Are you sure to import remote profile %1$s? You will connect to %2$s to download the configuration.</string>
<string name="import_from_file_description">Import configuration from a local file</string>
<string name="scan_qr_code_description">Scan a configuration QR code</string>
<string name="create_new_profile_description">Create a new profile from scratch</string>
<string name="icloud_profile_unsupported">iCloud profile is not support on current platform</string>
<string name="profile_name">Name</string> <string name="profile_name">Name</string>
<string name="profile_type">Type</string> <string name="profile_type">Type</string>
<string name="profile_source">Source</string> <string name="profile_source">Source</string>
@@ -75,118 +141,68 @@
<string name="profile_share">Share</string> <string name="profile_share">Share</string>
<string name="profile_share_url">Share URL as QR Code</string> <string name="profile_share_url">Share URL as QR Code</string>
<string name="profile_input_required">Required</string> <string name="profile_input_required">Required</string>
<string name="time_just_now">Just now</string>
<string name="time_yesterday">Yesterday</string>
<string name="time_now">Now</string>
<string name="time_yesterday_short">1d</string>
<string name="time_minutes_short">%dm</string>
<string name="time_hours_short">%dh</string>
<string name="time_days_short">%dd</string>
<plurals name="time_minutes_ago">
<item quantity="one">%d minute ago</item>
<item quantity="other">%d minutes ago</item>
</plurals>
<plurals name="time_hours_ago">
<item quantity="one">%d hour ago</item>
<item quantity="other">%d hours ago</item>
</plurals>
<plurals name="time_days_ago">
<item quantity="one">%d day ago</item>
<item quantity="other">%d days ago</item>
</plurals>
<string name="profile_update">Update</string> <string name="profile_update">Update</string>
<string name="profile_auto_update">Auto Update</string> <string name="profile_auto_update">Auto Update</string>
<string name="profile_auto_update_interval">Auto Update Interval (Minutes)</string> <string name="profile_auto_update_interval">Auto Update Interval (Minutes)</string>
<string name="profile_auto_update_interval_minimum_hint">Minimum value is 15</string> <string name="profile_auto_update_interval_minimum_hint">Minimum value is 15</string>
<string name="profile_type_local">Local</string> <string name="profile_type_local">Local</string>
<string name="profile_type_remote">Remote</string> <string name="profile_type_remote">Remote</string>
<string name="profile_type_remote_updated">Remote • %s</string>
<string name="profile_source_create_new">Create New</string> <string name="profile_source_create_new">Create New</string>
<string name="profile_source_import">Import</string> <string name="profile_source_import">Import</string>
<string name="profile_add_import_file">Import from file</string> <string name="profile_add_import_file">Import from file</string>
<string name="profile_add_scan_qr_code">Scan QR code</string> <string name="profile_add_scan_qr_code">Scan QR code</string>
<string name="profile_add_scan_use_front_camera">Front camera</string>
<string name="profile_add_scan_use_vendor_analyzer">MLKit analyzer</string>
<string name="profile_add_scan_enable_torch">Torch</string>
<string name="profile_add_create_manually">Create Manually</string> <string name="profile_add_create_manually">Create Manually</string>
<string name="menu_undo">Undo</string> <string name="profile_override">Profile Override</string>
<string name="menu_redo">Redo</string> <string name="basic_information">Basic Information</string>
<string name="menu_format">Format</string> <string name="remote_configuration">Remote Configuration</string>
<string name="menu_delete">Delete</string> <string name="last_updated_format">Last updated: %s</string>
<string name="menu_share">Share</string> <string name="content">Content</string>
<string name="status_default">Service not started</string> <string name="json_viewer">JSON Viewer</string>
<string name="status_starting">Starting</string> <string name="json_editor">JSON Editor</string>
<string name="status_stopping">Stopping</string> <string name="view_configuration">View Configuration</string>
<string name="status_started">Started</string> <string name="save_as_file">Save As File</string>
<string name="enabled">Enabled</string> <string name="share_as_file">Share As File</string>
<string name="disabled">Disabled</string> <string name="unsaved_changes">Unsaved Changes</string>
<string name="error_title">Error</string> <string name="unsaved_changes_message">You have unsaved changes. Do you want to discard them?</string>
<string name="file_manager_missing">Your device lacks an Android standard file selector, please install one, such as Material Files.</string> <string name="profile_qr_code_text">Profile QR Code: %s</string>
<string name="loading">Loading…</string>
<string name="service_error_missing_permission">Missiong VPN permission</string> <!-- Groups -->
<string name="service_error_empty_configuration">Empty configuration</string>
<string name="error_empty_file">Empty file</string>
<string name="error_decode_profile">Failed to decode profile: %s</string>
<string name="error_invalid_configuration">Invalid sing-box configuration: %s</string>
<string name="service_error_title_start_command_server">Start command server</string>
<string name="service_error_title_create_service">Create service</string>
<string name="service_error_title_start_service">Start service</string>
<string name="service_error_title_deprecated_warning">Deprecated Warning</string>
<string name="service_error_deprecated_warning_documentation">Documentation</string>
<string name="group_selected_title">Selected</string> <string name="group_selected_title">Selected</string>
<string name="core_version_title">Core Version</string>
<!-- Log -->
<string name="log_level">Log Level</string>
<string name="filter_label">Filter: %s</string>
<string name="clear_filter">Clear</string>
<string name="clear_logs">Clear Logs</string>
<string name="search_logs_placeholder">Search logs…</string>
<string name="logs_copied_to_clipboard">Logs copied to clipboard</string>
<string name="no_logs_to_copy">No logs to copy</string>
<string name="no_logs_to_share">No logs to share</string>
<string name="intent_share_logs">Share Logs</string>
<string name="selected_count">%d selected</string>
<string name="not_selected">Not selected</string>
<string name="save_to_clipboard">To Clipboard</string>
<string name="save_to_file">To File</string>
<!-- Settings -->
<string name="service">Service</string>
<string name="core">Core</string> <string name="core">Core</string>
<string name="core_version_title">Core Version</string>
<string name="core_data_size">Data Size</string> <string name="core_data_size">Data Size</string>
<string name="calculating">Calculating...</string> <string name="about">About</string>
<string name="options">Options</string> <string name="source_code">Source Code</string>
<string name="disable_deprecated_warnings">Disable Deprecated Warnings</string> <string name="sponsor">Sponsor</string>
<string name="working_directory">Working Directory</string> <string name="working_directory">Working Directory</string>
<string name="destroy">Destroy</string> <string name="disable_deprecated_warnings">Disable Deprecated Warnings</string>
<string name="ignore_memory_limit">Ignore Memory Limit</string> <string name="ignore_memory_limit">Ignore Memory Limit</string>
<string name="ignore_memory_limit_description">Do not enforce memory limits on sing-box.</string> <string name="ignore_memory_limit_description">Do not enforce memory limits on sing-box.</string>
<string name="auto_redirect">Auto Redirect</string> <string name="auto_redirect">Auto Redirect</string>
<string name="auto_redirect_description">ROOT permission required</string> <string name="auto_redirect_description">ROOT permission required</string>
<string name="system_http_proxy">System HTTP Proxy</string>
<!-- Per-App Proxy -->
<string name="per_app_proxy">Per-App Proxy</string> <string name="per_app_proxy">Per-App Proxy</string>
<string name="check_update_automatic">Automatic Update Check</string>
<string name="check_update_prompt_play">Would you like to enable automatic update checking from **Play Store**?</string>
<string name="check_update_prompt_github">Would you like to enable automatic update checking from **GitHub**?</string>
<string name="check_update">Check Update</string>
<string name="no_updates_available">No updates available</string>
<string name="new_version_available">New version available: %s</string>
<string name="update">Update</string>
<string name="update_track">Update Track</string>
<string name="update_track_stable">Stable</string>
<string name="update_track_beta">Beta</string>
<string name="update_track_not_supported">Current track does not support update checking yet</string>
<string name="view_release">View Release</string>
<string name="downloading">Downloading…</string>
<string name="silent_install">Silent Install</string>
<string name="silent_install_title">Silent Install</string>
<string name="silent_install_description">Install updates without interaction</string>
<string name="silent_install_method">Install Method</string>
<string name="install_method_package_installer">PackageInstaller</string>
<string name="install_method_shizuku">Shizuku</string>
<string name="install_method_root">ROOT</string>
<string name="package_installer_not_available">Install permission not granted</string>
<string name="grant_install_permission">Grant Install Permission</string>
<string name="grant_install_permission_description">Allow installing apps from this source</string>
<string name="shizuku_not_available">Shizuku is not installed or not running</string>
<string name="shizuku_description">Shizuku allows apps to use system APIs directly with higher privileges</string>
<string name="get_shizuku">Get Shizuku</string>
<string name="start_shizuku">Start Shizuku</string>
<string name="request_shizuku">Request Shizuku</string>
<string name="silent_install_verify_failed">%s is not available or permission denied</string>
<string name="auto_update">Auto Update</string>
<string name="auto_update_description">Automatically download and install updates in background</string>
<string name="app_version_title">App version</string>
<string name="action">Action</string>
<string name="title_app_settings">App</string>
<string name="background_permission">Background permission</string>
<string name="background_permission_description">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.</string>
<string name="read_more">Read More</string>
<string name="request_background_permission">Ignore</string>
<string name="import_remote_profile">Import remote profile</string>
<string name="import_remote_profile_message">Are you sure to import remote profile %1$s? You will connect to %2$s to download the configuration.</string>
<string name="profile_override">Profile Override</string>
<string name="per_app_proxy_mode">Proxy Mode</string> <string name="per_app_proxy_mode">Proxy Mode</string>
<string name="per_app_proxy_mode_include">Include</string> <string name="per_app_proxy_mode_include">Include</string>
<string name="per_app_proxy_mode_include_description">Only selected apps are allowed through the VPN</string> <string name="per_app_proxy_mode_include_description">Only selected apps are allowed through the VPN</string>
@@ -214,134 +230,165 @@
<string name="per_app_proxy_export">Export to clipboard</string> <string name="per_app_proxy_export">Export to clipboard</string>
<string name="per_app_proxy_scan">Scan</string> <string name="per_app_proxy_scan">Scan</string>
<string name="per_app_proxy_scan_china_apps">China apps</string> <string name="per_app_proxy_scan_china_apps">China apps</string>
<string name="content_description_app_icon">App icon</string>
<string name="toast_clipboard_empty">Clipboard is empty</string>
<string name="toast_copied_to_clipboard">Exported to clipboard</string>
<string name="toast_imported_from_clipboard">Imported from clipboard</string>
<string name="message_scanning">Scanning…</string>
<string name="message_scan_app_no_apps_found">No matching apps found</string>
<string name="message_scan_app_found">Found the following apps, please choose the action you want.</string>
<string name="title_scan_result">Scan Result</string>
<string name="action_deselect">Deselect</string>
<string name="per_app_proxy_manage">Manage</string> <string name="per_app_proxy_manage">Manage</string>
<string name="content_description_app_icon">App icon</string>
<string name="per_app_proxy_managed_mode">Managed Mode</string> <string name="per_app_proxy_managed_mode">Managed Mode</string>
<string name="per_app_proxy_managed_mode_description">Automatically Exclude China apps</string> <string name="per_app_proxy_managed_mode_description">Automatically Exclude China apps</string>
<string name="icloud_profile_unsupported">iCloud profile is not support on current platform</string> <string name="per_app_proxy_package_query_mode">Mode</string>
<string name="search">Search</string> <string name="per_app_proxy_shizuku_required">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.</string>
<string name="expand">Expand</string> <string name="per_app_proxy_root_required">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.</string>
<string name="collapse">Collapse</string> <string name="privileged_access_required">Root or Shizuku access required to get the complete app list</string>
<string name="expand_all">Expand All</string>
<string name="collapse_all">Collapse All</string> <!-- Permissions -->
<string name="close">Close</string> <string name="background_permission">Background permission</string>
<string name="close_connections_confirm">Close all connections?</string> <string name="background_permission_description">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.</string>
<string name="icon_count_format">%d icons</string> <string name="request_background_permission">Ignore</string>
<string name="no_icons_found">No icons found</string>
<string name="no_icons_match">No icons match \"%s\"</string>
<string name="system_http_proxy">System HTTP Proxy</string>
<string name="sponsor">Sponsor</string>
<string name="action_start">Start</string>
<string name="location_permission_title">Location permission</string> <string name="location_permission_title">Location permission</string>
<string name="location_permission_description">Your profile contains &lt;strong&gt;&lt;tt&gt;wifi_ssid&lt;/tt&gt; or &lt;tt&gt;wifi_bssid&lt;/tt&gt; routing rules&lt;/strong&gt;. To make them work, sing-box uses the &lt;strong&gt;location&lt;/strong&gt; permission &lt;strong&gt;in the background&lt;/strong&gt; to get information about the connected Wi-Fi network. The information will be used &lt;strong&gt;for routing purposes only&lt;/strong&gt;.</string> <string name="location_permission_description">Your profile contains &lt;strong&gt;&lt;tt&gt;wifi_ssid&lt;/tt&gt; or &lt;tt&gt;wifi_bssid&lt;/tt&gt; routing rules&lt;/strong&gt;. To make them work, sing-box uses the &lt;strong&gt;location&lt;/strong&gt; permission &lt;strong&gt;in the background&lt;/strong&gt; to get information about the connected Wi-Fi network. The information will be used &lt;strong&gt;for routing purposes only&lt;/strong&gt;.</string>
<string name="location_permission_background_description">On Android 10 and up, &lt;strong&gt;background location&lt;/strong&gt; permission is required. Select &lt;strong&gt;Allow all the time&lt;/strong&gt; to grant the permission.</string> <string name="location_permission_background_description">On Android 10 and up, &lt;strong&gt;background location&lt;/strong&gt; permission is required. Select &lt;strong&gt;Allow all the time&lt;/strong&gt; to grant the permission.</string>
<string name="notification_permission_title">Notification permission</string> <string name="notification_permission_title">Notification permission</string>
<string name="notification_permission_required_description">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.</string> <string name="notification_permission_required_description">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.</string>
<string name="per_app_proxy_package_query_mode">Mode</string>
<string name="per_app_proxy_shizuku_required">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.</string>
<string name="per_app_proxy_root_required">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.</string>
<string name="root_access_required">Root access required</string> <string name="root_access_required">Root access required</string>
<string name="root_access_denied">Root access denied</string> <string name="root_access_denied">Root access denied</string>
<string name="privileged_access_required">Root or Shizuku access required to get the complete app list</string>
<string name="dashboard_items">Dashboard Items</string> <!-- Updates -->
<string name="reset_order">Reset order</string> <string name="check_update">Check Update</string>
<string name="reset">Reset</string> <string name="check_update_automatic">Automatic Update Check</string>
<string name="drag_handle_to_reorder">Drag handle to reorder items</string> <string name="check_update_prompt_play">Would you like to enable automatic update checking from **Play Store**?</string>
<string name="drag_to_reorder">Drag to reorder</string> <string name="check_update_prompt_github">Would you like to enable automatic update checking from **GitHub**?</string>
<string name="add_profile">Add Profile</string> <string name="update_track">Update Track</string>
<string name="import_from_file_description">Import configuration from a local file</string> <string name="update_track_stable">Stable</string>
<string name="scan_qr_code_description">Scan a configuration QR code</string> <string name="update_track_beta">Beta</string>
<string name="create_new_profile_description">Create a new profile from scratch</string> <string name="update_track_not_supported">Current track does not support update checking yet</string>
<string name="profile_saved_successfully">Profile saved successfully</string> <string name="view_release">View Release</string>
<string name="profile_save_failed">Failed to save profile: %s</string> <string name="downloading">Downloading…</string>
<string name="profile_type_remote_updated">Remote • %s</string> <string name="no_updates_available">No updates available</string>
<string name="update_profile">Update profile</string> <string name="new_version_available">New version available: %s</string>
<string name="more_options">More options</string> <string name="auto_update">Auto Update</string>
<string name="edit">Edit</string> <string name="auto_update_description">Automatically download and install updates in background</string>
<string name="save_as_file">Save As File</string>
<string name="share_as_file">Share As File</string> <!-- Silent Install -->
<string name="service">Service</string> <string name="silent_install">Silent Install</string>
<string name="about">About</string> <string name="silent_install_title">Silent Install</string>
<string name="source_code">Source Code</string> <string name="silent_install_description">Install updates without interaction</string>
<string name="unsaved_changes">Unsaved Changes</string> <string name="silent_install_method">Install Method</string>
<string name="unsaved_changes_message">You have unsaved changes. Do you want to discard them?</string> <string name="silent_install_verify_failed">%s is not available or permission denied</string>
<string name="discard">Discard</string> <string name="install_method_package_installer">PackageInstaller</string>
<string name="save">Save</string> <string name="install_method_shizuku">Shizuku</string>
<string name="share_profile">Share Profile</string> <string name="install_method_root">ROOT</string>
<string name="cancel">Cancel</string> <string name="package_installer_not_available">Install permission not granted</string>
<string name="logs_copied_to_clipboard">Logs copied to clipboard</string> <string name="grant_install_permission">Grant Install Permission</string>
<string name="no_logs_to_copy">No logs to copy</string> <string name="grant_install_permission_description">Allow installing apps from this source</string>
<string name="logs_saved_successfully">Logs saved successfully</string>
<string name="failed_to_save_logs">Failed to save logs: %s</string> <!-- Shizuku -->
<string name="failed_to_share_logs">Failed to share logs: %s</string> <string name="shizuku_not_available">Shizuku is not installed or not running</string>
<string name="no_logs_to_share">No logs to share</string> <string name="shizuku_description">Shizuku allows apps to use system APIs directly with higher privileges</string>
<string name="get_shizuku">Get Shizuku</string>
<string name="start_shizuku">Start Shizuku</string>
<string name="request_shizuku">Request Shizuku</string>
<!-- Time -->
<string name="time_just_now">Just now</string>
<string name="time_yesterday">Yesterday</string>
<string name="time_now">Now</string>
<string name="time_yesterday_short">1d</string>
<string name="time_minutes_short">%dm</string>
<string name="time_hours_short">%dh</string>
<string name="time_days_short">%dd</string>
<plurals name="time_minutes_ago">
<item quantity="one">%d minute ago</item>
<item quantity="other">%d minutes ago</item>
</plurals>
<plurals name="time_hours_ago">
<item quantity="one">%d hour ago</item>
<item quantity="other">%d hours ago</item>
</plurals>
<plurals name="time_days_ago">
<item quantity="one">%d day ago</item>
<item quantity="other">%d days ago</item>
</plurals>
<!-- Menu -->
<string name="menu_undo">Undo</string>
<string name="menu_redo">Redo</string>
<string name="menu_format">Format</string>
<string name="menu_delete">Delete</string>
<string name="menu_share">Share</string>
<!-- Errors -->
<string name="error_title">Error</string>
<string name="error_missing_vpn_permission">Missiong VPN permission</string>
<string name="error_empty_configuration">Empty configuration</string>
<string name="error_empty_file">Empty file</string>
<string name="error_decode_profile">Failed to decode profile: %s</string>
<string name="error_invalid_configuration">Invalid sing-box configuration: %s</string>
<string name="error_start_command_server">Start command server</string>
<string name="error_create_service">Create service</string>
<string name="error_start_service">Start service</string>
<string name="error_deprecated_warning">Deprecated Warning</string>
<string name="error_deprecated_documentation">Documentation</string>
<string name="file_manager_missing">Your device lacks an Android standard file selector, please install one, such as Material Files.</string>
<string name="no_file_manager">No file manager found</string>
<!-- Failed Operations -->
<string name="failed_save_profile">Failed to save profile: %s</string>
<string name="failed_save_logs">Failed to save logs: %s</string>
<string name="failed_share_logs">Failed to share logs: %s</string>
<string name="failed_save_qr_code">Failed to save QR code: %s</string>
<string name="failed_share_qr_code">Failed to share QR code: %s</string>
<string name="failed_read_configuration">Failed to read configuration: %s</string>
<!-- Success Messages -->
<string name="success_profile_saved">Profile saved successfully</string>
<string name="success_logs_saved">Logs saved successfully</string>
<string name="success_configuration_saved">Configuration saved</string>
<string name="copied_to_clipboard">Copied to clipboard</string> <string name="copied_to_clipboard">Copied to clipboard</string>
<string name="qr_code_saved_to_gallery">QR code saved to gallery</string> <string name="qr_code_saved_to_gallery">QR code saved to gallery</string>
<string name="failed_to_save_qr_code">Failed to save QR code: %s</string>
<string name="failed_to_share_qr_code">Failed to share QR code: %s</string> <!-- Toast Messages -->
<string name="toast_clipboard_empty">Clipboard is empty</string>
<string name="toast_copied_to_clipboard">Exported to clipboard</string>
<string name="toast_imported_from_clipboard">Imported from clipboard</string>
<!-- Scanning -->
<string name="profile_add_scan_use_front_camera">Front camera</string>
<string name="profile_add_scan_use_vendor_analyzer">MLKit analyzer</string>
<string name="profile_add_scan_enable_torch">Torch</string>
<string name="message_scanning">Scanning…</string>
<string name="message_scan_app_no_apps_found">No matching apps found</string>
<string name="message_scan_app_found">Found the following apps, please choose the action you want.</string>
<!-- Icon Selection -->
<string name="icon">Icon</string>
<string name="icon_count_format">%d icons</string>
<string name="no_icons_found">No icons found</string>
<string name="no_icons_match">No icons match \"%s\"</string>
<string name="profile_icon">Profile Icon</string>
<string name="select_icon">Select Icon</string>
<string name="select_profile_icon">Select Profile Icon</string>
<string name="search_icons_placeholder">Search icons...</string>
<string name="search_icons">Search icons</string>
<string name="close_search">Close search</string>
<string name="current_icon_format">Current: %s</string>
<string name="categories">Categories</string>
<string name="all_icons">All Icons</string>
<string name="back_to_categories">Back to categories</string>
<!-- QR Code -->
<string name="intent_share_qr_code">Share QR Code</string>
<!-- Search -->
<string name="search_placeholder">Find in document</string>
<!-- Content Descriptions (Accessibility) -->
<string name="content_description_back">Back</string> <string name="content_description_back">Back</string>
<string name="content_description_scroll_to_bottom">Scroll to bottom</string> <string name="content_description_scroll_to_bottom">Scroll to bottom</string>
<string name="content_description_exit_selection_mode">Exit selection mode</string> <string name="content_description_exit_selection_mode">Exit selection mode</string>
<string name="content_description_copy_selected">Copy selected</string> <string name="content_description_copy_selected">Copy selected</string>
<string name="content_description_clear_search">Clear search</string> <string name="content_description_clear_search">Clear search</string>
<string name="content_description_qr_code">QR Code</string> <string name="content_description_qr_code">QR Code</string>
<string name="search_logs_placeholder">Search logs…</string>
<string name="intent_share_logs">Share Logs</string>
<string name="intent_share_qr_code">Share QR Code</string>
<string name="content_description_resume_logs">Resume logs</string> <string name="content_description_resume_logs">Resume logs</string>
<string name="content_description_pause_logs">Pause logs</string> <string name="content_description_pause_logs">Pause logs</string>
<string name="content_description_collapse_search">Collapse search</string> <string name="content_description_collapse_search">Collapse search</string>
<string name="content_description_search_logs">Search logs</string> <string name="content_description_search_logs">Search logs</string>
<string name="profile_qr_code_text">Profile QR Code: %s</string>
<!-- Profile Edit Screen -->
<string name="basic_information">Basic Information</string>
<string name="icon">Icon</string>
<string name="default_text">Default</string>
<string name="remote_configuration">Remote Configuration</string>
<string name="last_updated_format">Last updated: %s</string>
<string name="content">Content</string>
<string name="json_viewer">JSON Viewer</string>
<string name="json_editor">JSON Editor</string>
<string name="success">Success</string>
<string name="failed_to_read_configuration">Failed to read configuration: %s</string>
<!-- Profile Content Editor -->
<string name="view_configuration">View Configuration</string>
<string name="clear">Clear</string>
<string name="previous">Previous</string>
<string name="next">Next</string>
<string name="dismiss">Dismiss</string>
<string name="configuration_saved">Configuration saved</string>
<string name="search_placeholder">Find in document</string>
<!-- Icon Selection -->
<string name="profile_icon">Profile Icon</string>
<string name="select_icon">Select Icon</string>
<string name="search_icons_placeholder">Search icons...</string>
<string name="close_search">Close search</string>
<string name="search_icons">Search icons</string>
<string name="current_icon_format">Current: %s</string>
<string name="categories">Categories</string>
<string name="all_icons">All Icons</string>
<string name="back_to_categories">Back to categories</string>
<string name="select_profile_icon">Select Profile Icon</string>
<string name="auto">Auto</string>
<!-- New Profile Screen -->
<!-- Log Screen -->
<string name="filter_label">Filter: %s</string>
<string name="clear_filter">Clear</string>
<string name="log_level">Log Level</string>
<string name="save_to_clipboard">To Clipboard</string>
<string name="save_to_file">To File</string>
<string name="clear_logs">Clear Logs</string>
<string name="selected_count">%d selected</string>
<string name="not_selected">Not selected</string>
<string name="browse">Browse</string>
<string name="no_file_manager">No file manager found</string>
</resources> </resources>

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:icon="@mipmap/ic_launcher"
android:shortcutId="toggle"
android:shortcutLongLabel="@string/quick_toggle"
android:shortcutShortLabel="@string/quick_toggle">
<intent
android:action="android.intent.action.MAIN"
android:targetClass="io.nekohasekai.sfa.ui.ShortcutActivity"
android:targetPackage="io.nekohasekai.sfa" />
</shortcut>
</shortcuts>