Просмотр исходного кода

refactor: onboarding 页面文案与错误提示资源化

- 新增 onboarding_* 字符串资源(values + zh-rCN/rHK/rTW),
  替换欢迎页标题/摘要/按钮与 WebDav 恢复流程中的硬编码中文
- AppLog 内部日志与代码注释保留中文,非用户可见
HapeLee 2 месяцев назад
Родитель
Сommit
ed1ca0f6dc

+ 1 - 1
app/src/main/java/io/legado/app/feature/onboarding/OnboardingContract.kt

@@ -6,7 +6,7 @@ import kotlinx.collections.immutable.ImmutableList
 
 
 /**
 /**
  * 欢迎引导流程(隐私 → WebDav → 书籍文件夹 → 主题)的 Compose 契约。
  * 欢迎引导流程(隐私 → WebDav → 书籍文件夹 → 主题)的 Compose 契约。
- * 页面文案沿用旧 WelcomeActivity 的中文硬编码文案。
+ * 页面文案见 strings.xml 的 onboarding_* 资源。
  */
  */
 @Stable
 @Stable
 data class OnboardingUiState(
 data class OnboardingUiState(

+ 26 - 17
app/src/main/java/io/legado/app/feature/onboarding/OnboardingScreen.kt

@@ -372,22 +372,31 @@ private fun ThemePage(state: OnboardingUiState, onIntent: (OnboardingIntent) ->
     }
     }
 }
 }
 
 
-private fun pageTitle(page: Int): String = when (page) {
-    0 -> "欢迎!"
-    1 -> "备份与恢复"
-    2 -> "书籍文件夹"
-    else -> "主题样式"
-}
+@Composable
+private fun pageTitle(page: Int): String = stringResource(
+    when (page) {
+        0 -> R.string.onboarding_title_welcome
+        1 -> R.string.onboarding_title_backup
+        2 -> R.string.onboarding_title_book_folder
+        else -> R.string.onboarding_title_theme
+    }
+)
 
 
-private fun pageSummary(page: Int): String = when (page) {
-    0 -> "请先阅读应用的服务条款与用户协议。"
-    1 -> "此处可设置云同步与恢复应用备份。"
-    2 -> "请选择保存本地书籍的文件夹。"
-    else -> "在这里设置您喜爱的样式。"
-}
+@Composable
+private fun pageSummary(page: Int): String = stringResource(
+    when (page) {
+        0 -> R.string.onboarding_summary_welcome
+        1 -> R.string.onboarding_summary_backup
+        2 -> R.string.onboarding_summary_book_folder
+        else -> R.string.onboarding_summary_theme
+    }
+)
 
 
-private fun nextButtonText(page: Int, pageCount: Int): String = when {
-    page == 0 -> "阅读并同意"
-    page == pageCount - 1 -> "完成"
-    else -> "下一步"
-}
+@Composable
+private fun nextButtonText(page: Int, pageCount: Int): String = stringResource(
+    when {
+        page == 0 -> R.string.onboarding_next_agree
+        page == pageCount - 1 -> R.string.onboarding_next_done
+        else -> R.string.onboarding_next_step
+    }
+)

+ 32 - 7
app/src/main/java/io/legado/app/feature/onboarding/OnboardingViewModel.kt

@@ -92,7 +92,12 @@ class OnboardingViewModel(
                 runCatching { webDavBackupUseCase.test() }
                 runCatching { webDavBackupUseCase.test() }
                     .onFailure {
                     .onFailure {
                         AppLog.put("WebDav测试连接出错\n${it.localizedMessage}", it)
                         AppLog.put("WebDav测试连接出错\n${it.localizedMessage}", it)
-                        appCtx.toastOnUi("WebDavError\n${it.localizedMessage}")
+                        appCtx.toastOnUi(
+                            appCtx.getString(
+                                R.string.onboarding_webdav_test_error,
+                                it.localizedMessage ?: ""
+                            )
+                        )
                     }
                     }
             }
             }
             OnboardingIntent.FetchBackups -> fetchBackups()
             OnboardingIntent.FetchBackups -> fetchBackups()
@@ -170,7 +175,7 @@ class OnboardingViewModel(
                 webDavBackupUseCase.refreshConfig()
                 webDavBackupUseCase.refreshConfig()
                 val names = webDavBackupUseCase.getBackupNames()
                 val names = webDavBackupUseCase.getBackupNames()
                 if (webDavBackupUseCase.isJianGuoYun && names.size > 700) {
                 if (webDavBackupUseCase.isJianGuoYun && names.size > 700) {
-                    appCtx.toastOnUi("由于坚果云限制列出文件数量,部分备份可能未显示,请及时清理旧备份")
+                    appCtx.toastOnUi(R.string.onboarding_jianguoyun_limit)
                 }
                 }
                 if (names.isEmpty()) {
                 if (names.isEmpty()) {
                     throw NoStackTraceException("Web dav no back up file")
                     throw NoStackTraceException("Web dav no back up file")
@@ -186,7 +191,10 @@ class OnboardingViewModel(
                 _uiState.update {
                 _uiState.update {
                     it.copy(
                     it.copy(
                         busyText = null,
                         busyText = null,
-                        restoreErrorMessage = "WebDavError\n${e.localizedMessage}\n将从本地备份恢复。",
+                        restoreErrorMessage = appCtx.getString(
+                            R.string.onboarding_restore_error_dialog,
+                            e.localizedMessage ?: ""
+                        ),
                     )
                     )
                 }
                 }
             }
             }
@@ -196,14 +204,24 @@ class OnboardingViewModel(
     private fun restoreWebDav(name: String) {
     private fun restoreWebDav(name: String) {
         busyJob?.cancel()
         busyJob?.cancel()
         busyJob = viewModelScope.launch {
         busyJob = viewModelScope.launch {
-            _uiState.update { it.copy(backupNames = null, busyText = "恢复中…") }
+            _uiState.update {
+                it.copy(
+                    backupNames = null,
+                    busyText = appCtx.getString(R.string.onboarding_restoring)
+                )
+            }
             try {
             try {
                 webDavBackupUseCase.restore(name)
                 webDavBackupUseCase.restore(name)
             } catch (e: CancellationException) {
             } catch (e: CancellationException) {
                 throw e
                 throw e
             } catch (e: Exception) {
             } catch (e: Exception) {
                 AppLog.put("WebDav恢复出错\n${e.localizedMessage}", e)
                 AppLog.put("WebDav恢复出错\n${e.localizedMessage}", e)
-                appCtx.toastOnUi("WebDav恢复出错\n${e.localizedMessage}")
+                appCtx.toastOnUi(
+                    appCtx.getString(
+                        R.string.onboarding_webdav_restore_error,
+                        e.localizedMessage ?: ""
+                    )
+                )
             } finally {
             } finally {
                 _uiState.update { it.copy(busyText = null) }
                 _uiState.update { it.copy(busyText = null) }
             }
             }
@@ -213,14 +231,21 @@ class OnboardingViewModel(
     private fun restoreLocal(uriString: String) {
     private fun restoreLocal(uriString: String) {
         busyJob?.cancel()
         busyJob?.cancel()
         busyJob = viewModelScope.launch {
         busyJob = viewModelScope.launch {
-            _uiState.update { it.copy(busyText = "恢复中…") }
+            _uiState.update {
+                it.copy(busyText = appCtx.getString(R.string.onboarding_restoring))
+            }
             try {
             try {
                 Restore.restore(appCtx, uriString.toUri())
                 Restore.restore(appCtx, uriString.toUri())
             } catch (e: CancellationException) {
             } catch (e: CancellationException) {
                 throw e
                 throw e
             } catch (e: Exception) {
             } catch (e: Exception) {
                 AppLog.put("本地恢复出错\n${e.localizedMessage}", e)
                 AppLog.put("本地恢复出错\n${e.localizedMessage}", e)
-                appCtx.toastOnUi("本地恢复出错\n${e.localizedMessage}")
+                appCtx.toastOnUi(
+                    appCtx.getString(
+                        R.string.onboarding_local_restore_error,
+                        e.localizedMessage ?: ""
+                    )
+                )
             } finally {
             } finally {
                 _uiState.update { it.copy(busyText = null) }
                 _uiState.update { it.copy(busyText = null) }
             }
             }

+ 17 - 0
app/src/main/res/values-zh-rCN/strings.xml

@@ -1674,6 +1674,23 @@
     <string name="first_read">请先阅读应用的服务条款与用户协议。</string>
     <string name="first_read">请先阅读应用的服务条款与用户协议。</string>
     <string name="welcome_book_folder_tip">设置本地书籍保存目录,后续也可在设置中修改。</string>
     <string name="welcome_book_folder_tip">设置本地书籍保存目录,后续也可在设置中修改。</string>
     <string name="welcome_book_folder_not_selected">未选择文件夹</string>
     <string name="welcome_book_folder_not_selected">未选择文件夹</string>
+    <string name="onboarding_title_welcome">欢迎!</string>
+    <string name="onboarding_title_backup">备份与恢复</string>
+    <string name="onboarding_title_book_folder">书籍文件夹</string>
+    <string name="onboarding_title_theme">主题样式</string>
+    <string name="onboarding_summary_welcome">请先阅读应用的服务条款与用户协议。</string>
+    <string name="onboarding_summary_backup">此处可设置云同步与恢复应用备份。</string>
+    <string name="onboarding_summary_book_folder">请选择保存本地书籍的文件夹。</string>
+    <string name="onboarding_summary_theme">在这里设置您喜爱的样式。</string>
+    <string name="onboarding_next_agree">阅读并同意</string>
+    <string name="onboarding_next_step">下一步</string>
+    <string name="onboarding_next_done">完成</string>
+    <string name="onboarding_restoring">恢复中…</string>
+    <string name="onboarding_jianguoyun_limit">由于坚果云限制列出文件数量,部分备份可能未显示,请及时清理旧备份</string>
+    <string name="onboarding_restore_error_dialog">WebDavError\n%1$s\n将从本地备份恢复。</string>
+    <string name="onboarding_webdav_restore_error">WebDav恢复出错\n%1$s</string>
+    <string name="onboarding_webdav_test_error">WebDavError\n%1$s</string>
+    <string name="onboarding_local_restore_error">本地恢复出错\n%1$s</string>
     <string name="config_btn">配置底部按钮</string>
     <string name="config_btn">配置底部按钮</string>
     <string name="more_actions_config">配置更多菜单</string>
     <string name="more_actions_config">配置更多菜单</string>
     <string name="compact_grid">紧凑网格</string>
     <string name="compact_grid">紧凑网格</string>

+ 17 - 0
app/src/main/res/values-zh-rHK/strings.xml

@@ -1380,6 +1380,23 @@
     <string name="auto_check_new_backup_s">打开软件时检查是否有新备份,有新备份时提示是否更新</string>
     <string name="auto_check_new_backup_s">打开软件时检查是否有新备份,有新备份时提示是否更新</string>
     <string name="welcome_book_folder_tip">设置本地书籍保存目录,后续也可在设置中修改。</string>
     <string name="welcome_book_folder_tip">设置本地书籍保存目录,后续也可在设置中修改。</string>
     <string name="welcome_book_folder_not_selected">未选择文件夹</string>
     <string name="welcome_book_folder_not_selected">未选择文件夹</string>
+    <string name="onboarding_title_welcome">欢迎!</string>
+    <string name="onboarding_title_backup">备份与恢复</string>
+    <string name="onboarding_title_book_folder">书籍文件夹</string>
+    <string name="onboarding_title_theme">主题样式</string>
+    <string name="onboarding_summary_welcome">请先阅读应用的服务条款与用户协议。</string>
+    <string name="onboarding_summary_backup">此处可设置云同步与恢复应用备份。</string>
+    <string name="onboarding_summary_book_folder">请选择保存本地书籍的文件夹。</string>
+    <string name="onboarding_summary_theme">在这里设置您喜爱的样式。</string>
+    <string name="onboarding_next_agree">阅读并同意</string>
+    <string name="onboarding_next_step">下一步</string>
+    <string name="onboarding_next_done">完成</string>
+    <string name="onboarding_restoring">恢复中…</string>
+    <string name="onboarding_jianguoyun_limit">由于坚果云限制列出文件数量,部分备份可能未显示,请及时清理旧备份</string>
+    <string name="onboarding_restore_error_dialog">WebDavError\n%1$s\n将从本地备份恢复。</string>
+    <string name="onboarding_webdav_restore_error">WebDav恢复出错\n%1$s</string>
+    <string name="onboarding_webdav_test_error">WebDavError\n%1$s</string>
+    <string name="onboarding_local_restore_error">本地恢复出错\n%1$s</string>
     <string name="top_bar_opacity">頂欄不透明度</string>
     <string name="top_bar_opacity">頂欄不透明度</string>
     <string name="top_bar_opacity_summary">%d</string>
     <string name="top_bar_opacity_summary">%d</string>
     <string name="bottom_bar_opacity">底欄不透明度</string>
     <string name="bottom_bar_opacity">底欄不透明度</string>

+ 17 - 0
app/src/main/res/values-zh-rTW/strings.xml

@@ -1384,6 +1384,23 @@
     <string name="auto_check_new_backup_s">打开软件时检查是否有新备份,有新备份时提示是否更新</string>
     <string name="auto_check_new_backup_s">打开软件时检查是否有新备份,有新备份时提示是否更新</string>
     <string name="welcome_book_folder_tip">设置本地书籍保存目录,后续也可在设置中修改。</string>
     <string name="welcome_book_folder_tip">设置本地书籍保存目录,后续也可在设置中修改。</string>
     <string name="welcome_book_folder_not_selected">未选择文件夹</string>
     <string name="welcome_book_folder_not_selected">未选择文件夹</string>
+    <string name="onboarding_title_welcome">欢迎!</string>
+    <string name="onboarding_title_backup">备份与恢复</string>
+    <string name="onboarding_title_book_folder">书籍文件夹</string>
+    <string name="onboarding_title_theme">主题样式</string>
+    <string name="onboarding_summary_welcome">请先阅读应用的服务条款与用户协议。</string>
+    <string name="onboarding_summary_backup">此处可设置云同步与恢复应用备份。</string>
+    <string name="onboarding_summary_book_folder">请选择保存本地书籍的文件夹。</string>
+    <string name="onboarding_summary_theme">在这里设置您喜爱的样式。</string>
+    <string name="onboarding_next_agree">阅读并同意</string>
+    <string name="onboarding_next_step">下一步</string>
+    <string name="onboarding_next_done">完成</string>
+    <string name="onboarding_restoring">恢复中…</string>
+    <string name="onboarding_jianguoyun_limit">由于坚果云限制列出文件数量,部分备份可能未显示,请及时清理旧备份</string>
+    <string name="onboarding_restore_error_dialog">WebDavError\n%1$s\n将从本地备份恢复。</string>
+    <string name="onboarding_webdav_restore_error">WebDav恢复出错\n%1$s</string>
+    <string name="onboarding_webdav_test_error">WebDavError\n%1$s</string>
+    <string name="onboarding_local_restore_error">本地恢复出错\n%1$s</string>
     <string name="top_bar_opacity">頂欄不透明度</string>
     <string name="top_bar_opacity">頂欄不透明度</string>
     <string name="top_bar_opacity_summary">%d</string>
     <string name="top_bar_opacity_summary">%d</string>
     <string name="bottom_bar_opacity">底欄不透明度</string>
     <string name="bottom_bar_opacity">底欄不透明度</string>

+ 17 - 0
app/src/main/res/values/strings.xml

@@ -1729,6 +1729,23 @@
     <string name="first_read">Please read the Terms of Service and User Agreement first.</string>
     <string name="first_read">Please read the Terms of Service and User Agreement first.</string>
     <string name="welcome_book_folder_tip">Set where local books are stored. You can change it later in Settings.</string>
     <string name="welcome_book_folder_tip">Set where local books are stored. You can change it later in Settings.</string>
     <string name="welcome_book_folder_not_selected">No folder selected</string>
     <string name="welcome_book_folder_not_selected">No folder selected</string>
+    <string name="onboarding_title_welcome">Welcome!</string>
+    <string name="onboarding_title_backup">Backup &amp; Restore</string>
+    <string name="onboarding_title_book_folder">Book Folder</string>
+    <string name="onboarding_title_theme">Theme Style</string>
+    <string name="onboarding_summary_welcome">Please read the terms of service and user agreement first.</string>
+    <string name="onboarding_summary_backup">Set up cloud sync and restore app backups here.</string>
+    <string name="onboarding_summary_book_folder">Choose the folder for saving local books.</string>
+    <string name="onboarding_summary_theme">Set up your favorite style here.</string>
+    <string name="onboarding_next_agree">Agree &amp; Continue</string>
+    <string name="onboarding_next_step">Next</string>
+    <string name="onboarding_next_done">Done</string>
+    <string name="onboarding_restoring">Restoring…</string>
+    <string name="onboarding_jianguoyun_limit">Due to the Jianguoyun limit on the number of listed files, some backups may not be shown. Please clean up old backups.</string>
+    <string name="onboarding_restore_error_dialog">WebDavError\n%1$s\nWill restore from local backup.</string>
+    <string name="onboarding_webdav_restore_error">WebDav restore error\n%1$s</string>
+    <string name="onboarding_webdav_test_error">WebDavError\n%1$s</string>
+    <string name="onboarding_local_restore_error">Local restore error\n%1$s</string>
     <string name="config_btn">Configure Bottom Buttons</string>
     <string name="config_btn">Configure Bottom Buttons</string>
     <string name="more_actions_config">Configure More Menu</string>
     <string name="more_actions_config">Configure More Menu</string>
     <string name="compact_grid">Compact Grid</string>
     <string name="compact_grid">Compact Grid</string>