feat: 应用内语言切换(跟随系统/简/繁/英)+ 繁体中文支持 + 应用名/署名分语言
- 新增 LocaleManager:语言偏好存 SharedPreferences,createConfigurationContext + LocaleList 包装 Application/MainActivity 的 attachBaseContext(零新依赖) - 设置页新增语言卡片与选择对话框:跟随系统 / 简体中文 / 繁體中文 / English - 新增繁体中文 values-b+zh+Hant(434 条,OpenCC s2twp 台湾标准转换+人工修正) - 简体目录改为 values-b+zh+Hans(BCP-47,与繁体对称;AGP9 不接受 values-zh-Hans) - widget_brand 可翻译:英=Rainy / 简繁=雨晴喵;app_name 可翻译:英=RainyToken / 简繁=雨晴Token - 资源三语言 434/434/434 对齐,占位符零差异
This commit is contained in:
parent
13acca37ed
commit
4107954080
@ -1,5 +1,6 @@
|
|||||||
package com.rainy.token
|
package com.rainy.token
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
@ -20,6 +21,11 @@ import dagger.hilt.android.AndroidEntryPoint
|
|||||||
*/
|
*/
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
override fun attachBaseContext(newBase: Context) {
|
||||||
|
// 应用内语言偏好在此层生效:recreate() 后资源按所选语言重新解析
|
||||||
|
super.attachBaseContext(com.rainy.token.util.LocaleManager.wrapContext(newBase))
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
enableEdgeToEdge()
|
enableEdgeToEdge()
|
||||||
|
|||||||
@ -12,6 +12,12 @@ import dagger.hilt.android.HiltAndroidApp
|
|||||||
*/
|
*/
|
||||||
@HiltAndroidApp
|
@HiltAndroidApp
|
||||||
class RainyTokenApplication : Application() {
|
class RainyTokenApplication : Application() {
|
||||||
|
override fun attachBaseContext(base: Context) {
|
||||||
|
// 应用内语言偏好(跟随系统 / 中文 / English)在 Application 层生效,
|
||||||
|
// 保证 appContext 与系统级回调(如小组件)之外的代码都使用所选语言。
|
||||||
|
super.attachBaseContext(com.rainy.token.util.LocaleManager.wrapContext(base))
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
appContext = applicationContext
|
appContext = applicationContext
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.rainy.token.ui.settings
|
package com.rainy.token.ui.settings
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
@ -17,6 +18,7 @@ import androidx.compose.foundation.lazy.items
|
|||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.ArrowBack
|
import androidx.compose.material.icons.filled.ArrowBack
|
||||||
|
import androidx.compose.material3.AlertDialog
|
||||||
import androidx.compose.material3.Card
|
import androidx.compose.material3.Card
|
||||||
import androidx.compose.material3.CardDefaults
|
import androidx.compose.material3.CardDefaults
|
||||||
import androidx.compose.material3.CircularProgressIndicator
|
import androidx.compose.material3.CircularProgressIndicator
|
||||||
@ -26,13 +28,18 @@ import androidx.compose.material3.IconButton
|
|||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TextButton
|
||||||
import androidx.compose.material3.TopAppBar
|
import androidx.compose.material3.TopAppBar
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@ -50,6 +57,7 @@ import com.rainy.token.R
|
|||||||
import com.rainy.token.ui.components.AppTips
|
import com.rainy.token.ui.components.AppTips
|
||||||
import com.rainy.token.ui.theme.InkMuted
|
import com.rainy.token.ui.theme.InkMuted
|
||||||
import com.rainy.token.ui.theme.StrawberryPink
|
import com.rainy.token.ui.theme.StrawberryPink
|
||||||
|
import com.rainy.token.util.LocaleManager
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置页(雨晴风格重做版)。
|
* 设置页(雨晴风格重做版)。
|
||||||
@ -74,6 +82,7 @@ fun SettingsScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
|
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
|
||||||
|
var showLanguageDialog by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
containerColor = Color.Transparent,
|
containerColor = Color.Transparent,
|
||||||
@ -133,6 +142,9 @@ fun SettingsScreen(
|
|||||||
onClick = { onEditCredential(status.service) }
|
onClick = { onEditCredential(status.service) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
item {
|
||||||
|
LanguageCard(onClick = { showLanguageDialog = true })
|
||||||
|
}
|
||||||
item {
|
item {
|
||||||
TipsCard(onClick = { onOpenTips() })
|
TipsCard(onClick = { onOpenTips() })
|
||||||
}
|
}
|
||||||
@ -146,6 +158,102 @@ fun SettingsScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (showLanguageDialog) {
|
||||||
|
LanguageDialog(onDismiss = { showLanguageDialog = false })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun LanguageCard(onClick: () -> Unit) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val current = LocaleManager.getLocaleCode(context)
|
||||||
|
val labelRes = when (current) {
|
||||||
|
"zh" -> R.string.app_locale_zh
|
||||||
|
"zh-Hant" -> R.string.app_locale_zh_hant
|
||||||
|
"en" -> R.string.app_locale_en
|
||||||
|
else -> R.string.app_locale_follow_system
|
||||||
|
}
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.clickable { onClick() },
|
||||||
|
shape = RoundedCornerShape(20.dp),
|
||||||
|
colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface),
|
||||||
|
elevation = CardDefaults.cardElevation(defaultElevation = 0.dp)
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.padding(16.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = "🌐",
|
||||||
|
style = MaterialTheme.typography.titleLarge
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(12.dp))
|
||||||
|
Column(modifier = Modifier.weight(1f)) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.title_language),
|
||||||
|
style = MaterialTheme.typography.titleMedium,
|
||||||
|
fontWeight = FontWeight.SemiBold
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = stringResource(labelRes),
|
||||||
|
style = MaterialTheme.typography.bodySmall,
|
||||||
|
color = InkMuted,
|
||||||
|
modifier = Modifier.padding(top = 2.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun LanguageDialog(onDismiss: () -> Unit) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val current = LocaleManager.getLocaleCode(context)
|
||||||
|
val options: List<Pair<String?, Int>> = listOf(
|
||||||
|
null to R.string.app_locale_follow_system,
|
||||||
|
"zh" to R.string.app_locale_zh,
|
||||||
|
"zh-Hant" to R.string.app_locale_zh_hant,
|
||||||
|
"en" to R.string.app_locale_en
|
||||||
|
)
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = onDismiss,
|
||||||
|
title = { Text(stringResource(R.string.dialog_language_title)) },
|
||||||
|
text = {
|
||||||
|
Column {
|
||||||
|
options.forEach { (code, labelRes) ->
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.clickable {
|
||||||
|
LocaleManager.saveLocale(context, code)
|
||||||
|
onDismiss()
|
||||||
|
// 重建 Activity 让资源按新语言重新解析
|
||||||
|
(context as? Activity)?.recreate()
|
||||||
|
}
|
||||||
|
.padding(vertical = 12.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(labelRes),
|
||||||
|
style = MaterialTheme.typography.bodyMedium,
|
||||||
|
modifier = Modifier.weight(1f)
|
||||||
|
)
|
||||||
|
if (current == code) {
|
||||||
|
Text("✓", color = StrawberryPink, style = MaterialTheme.typography.bodyMedium)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
confirmButton = {
|
||||||
|
TextButton(onClick = onDismiss) {
|
||||||
|
Text(stringResource(R.string.action_cancel))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
55
app/src/main/java/com/rainy/token/util/LocaleManager.kt
Normal file
55
app/src/main/java/com/rainy/token/util/LocaleManager.kt
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package com.rainy.token.util
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 应用内语言偏好管理(自建轻量方案,不引入 appcompat 依赖)。
|
||||||
|
*
|
||||||
|
* 语言值约定:
|
||||||
|
* - `null`(未设置)= 跟随系统
|
||||||
|
* - `"zh"` = 简体中文(匹配 values-b+zh+Hans,BCP-47 写法,覆盖中国大陆等简体地区)
|
||||||
|
* - `"zh-Hant"` = 繁体中文(匹配 values-b+zh+Hant,BCP-47 写法,覆盖台/港/澳所有繁体地区)
|
||||||
|
* - `"en"` = English(匹配默认 values/ 英文资源)
|
||||||
|
*
|
||||||
|
* 注:AGP 9 资源合并器不接受 values-zh-Hans/values-zh-Hant 目录名,故用等价的
|
||||||
|
* BCP-47 写法 values-b+zh+Hans / values-b+zh+Hant;编译产物同为
|
||||||
|
* language=zh + script=Hans/Hant 配置。
|
||||||
|
*
|
||||||
|
* 在 [Application] 与 [MainActivity] 的 attachBaseContext 中调用 [wrapContext]
|
||||||
|
* 应用偏好;切换语言后由设置页保存偏好并 recreate Activity 触发重新解析。
|
||||||
|
*/
|
||||||
|
object LocaleManager {
|
||||||
|
|
||||||
|
private const val PREFS_NAME = "locale_prefs"
|
||||||
|
private const val KEY_LOCALE = "locale"
|
||||||
|
|
||||||
|
/** 当前保存的语言代码;null = 跟随系统 */
|
||||||
|
fun getLocaleCode(context: Context): String? {
|
||||||
|
val code = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
||||||
|
.getString(KEY_LOCALE, null) ?: return null
|
||||||
|
return code.takeIf { it == "zh" || it == "zh-Hant" || it == "en" }
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 保存语言偏好;传 null 表示跟随系统 */
|
||||||
|
fun saveLocale(context: Context, code: String?) {
|
||||||
|
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
||||||
|
.edit()
|
||||||
|
.putString(KEY_LOCALE, code)
|
||||||
|
.apply()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 把 base context 包装上应用语言配置;未设置偏好时原样返回 */
|
||||||
|
fun wrapContext(base: Context): Context {
|
||||||
|
val code = getLocaleCode(base) ?: return base
|
||||||
|
val locale = when (code) {
|
||||||
|
"zh" -> Locale.SIMPLIFIED_CHINESE
|
||||||
|
"zh-Hant" -> Locale.forLanguageTag("zh-Hant")
|
||||||
|
else -> Locale.ENGLISH
|
||||||
|
}
|
||||||
|
val config = Configuration(base.resources.configuration)
|
||||||
|
config.setLocales(android.os.LocaleList(locale))
|
||||||
|
return base.createConfigurationContext(config)
|
||||||
|
}
|
||||||
|
}
|
||||||
489
app/src/main/res/values-b+zh+Hans/strings.xml
Normal file
489
app/src/main/res/values-b+zh+Hans/strings.xml
Normal file
@ -0,0 +1,489 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="widget_name">AI用量面板</string>
|
||||||
|
<string name="widget_description">OpenCode Go 用量 + DeepSeek 余额,自动刷新</string>
|
||||||
|
<string name="widget_brand">雨晴喵</string>
|
||||||
|
<string name="app_name">雨晴Token</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ══════════ 通用动作 ══════════ -->
|
||||||
|
<string name="action_back">返回</string>
|
||||||
|
<string name="action_cancel">取消</string>
|
||||||
|
<string name="action_confirm_add">确认添加</string>
|
||||||
|
<string name="action_got_it">我知道了</string>
|
||||||
|
<string name="action_refresh">刷新</string>
|
||||||
|
<string name="action_settings">设置</string>
|
||||||
|
<string name="action_delete">删除</string>
|
||||||
|
<string name="action_clear">清除</string>
|
||||||
|
<string name="action_save">保存</string>
|
||||||
|
<string name="action_jump">跳转</string>
|
||||||
|
<string name="action_prev_page">◀ 上一页</string>
|
||||||
|
<string name="action_next_page">下一页 ▶</string>
|
||||||
|
<string name="action_add_widget">添加小组件到桌面</string>
|
||||||
|
<string name="title_language">语言</string>
|
||||||
|
<string name="dialog_language_title">选择语言</string>
|
||||||
|
<string name="app_locale_follow_system">跟随系统</string>
|
||||||
|
<string name="app_locale_zh">简体中文</string>
|
||||||
|
<string name="app_locale_zh_hant">繁體中文</string>
|
||||||
|
<string name="app_locale_en">English</string>
|
||||||
|
<string name="action_view_detail">查看详情</string>
|
||||||
|
<string name="action_view_usage_detail">查看用量详情</string>
|
||||||
|
<string name="action_view_raw_data">详细数据</string>
|
||||||
|
<string name="action_sync_usage">同步用量数据</string>
|
||||||
|
<string name="action_login_save">我已登录,保存</string>
|
||||||
|
<string name="action_keep_waiting">继续等待</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 通用文案 ══════════ -->
|
||||||
|
<string name="common_loading">加载中…</string>
|
||||||
|
<string name="common_unknown">未知错误</string>
|
||||||
|
<string name="common_all_models">全部模型</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 页面标题 ══════════ -->
|
||||||
|
<string name="nav_empty_title">👈 选择服务查看详情</string>
|
||||||
|
<string name="nav_empty_subtitle">点击左侧卡片即可</string>
|
||||||
|
<string name="title_settings">设置</string>
|
||||||
|
<string name="title_credentials">凭据管理</string>
|
||||||
|
<string name="title_about">关于 RainyToken</string>
|
||||||
|
<string name="title_tips">使用小技巧</string>
|
||||||
|
<string name="title_debug_log">调试日志</string>
|
||||||
|
<string name="title_usage_detail">用量详情</string>
|
||||||
|
<string name="title_overview">总统计</string>
|
||||||
|
<string name="title_raw_data">详细数据</string>
|
||||||
|
<string name="title_chart">统计图表</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 状态徽章 ══════════ -->
|
||||||
|
<string name="status_not_configured">未配置</string>
|
||||||
|
<string name="status_configured">已配置</string>
|
||||||
|
<string name="status_expired">已过期</string>
|
||||||
|
<string name="status_relogin">需重登</string>
|
||||||
|
<string name="status_refresh_failed">刷新失败</string>
|
||||||
|
<string name="status_not_fetched">未获取</string>
|
||||||
|
<string name="status_waiting">待获取</string>
|
||||||
|
<string name="status_normal">正常</string>
|
||||||
|
<string name="status_not_configured_add">未配置 · 点击添加</string>
|
||||||
|
<string name="status_ok_valid">已配置 · 凭据有效</string>
|
||||||
|
<string name="status_expired_reconfigure">已过期 · 点击重新配置</string>
|
||||||
|
<string name="status_need_reverify">需要重新验证</string>
|
||||||
|
<string name="status_manual_mode">手动输入模式</string>
|
||||||
|
<string name="status_credential_configured">凭据已配置</string>
|
||||||
|
<string name="status_not_configured_cred">未配置凭据</string>
|
||||||
|
<string name="status_loading">加载中</string>
|
||||||
|
<string name="status_fresh">最新</string>
|
||||||
|
<string name="status_stale">缓存</string>
|
||||||
|
<string name="status_failed">失败</string>
|
||||||
|
<string name="status_pending_input">待输入</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 仪表盘 ══════════ -->
|
||||||
|
<string name="dashboard_subtitle">AI 余额一览</string>
|
||||||
|
<string name="footer_never_fetched">从未获取</string>
|
||||||
|
<string name="footer_just_updated">刚刚更新</string>
|
||||||
|
<string name="footer_minutes_ago">%1$d 分钟前更新</string>
|
||||||
|
<string name="footer_hours_ago">%1$d 小时前更新</string>
|
||||||
|
<string name="footer_updated_at">%1$s 更新</string>
|
||||||
|
<string name="dashboard_drag_hint">💡 长按卡片可拖拽排序</string>
|
||||||
|
<string name="dashboard_error_prefix">⚠ %1$s</string>
|
||||||
|
|
||||||
|
<string name="dashboard_footer_privacy">本地加密存储,不上传任何数据</string>
|
||||||
|
<string name="dialog_add_widget_title">添加桌面小组件?</string>
|
||||||
|
<string name="dialog_add_widget_body">确认后会请求桌面启动器添加雨晴Token小组件。部分系统仍会弹出系统确认窗口。</string>
|
||||||
|
<string name="toast_shortcut_permission_denied">桌面快捷方式权限已被拒绝,请在系统设置中允许后重试</string>
|
||||||
|
<string name="toast_add_rejected">桌面未接受添加请求,请检查启动器权限</string>
|
||||||
|
<string name="toast_picker_unsupported">当前桌面不支持应用内添加,请在桌面长按 → 小组件 → 查找雨晴Token</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 服务卡片 ══════════ -->
|
||||||
|
<string name="service_click_to_configure">点击配置凭据</string>
|
||||||
|
<string name="service_pull_to_refresh">下拉刷新</string>
|
||||||
|
<string name="service_unavailable">服务当前不可用</string>
|
||||||
|
<string name="service_monthly_used">本月已用 %1$s%2$s</string>
|
||||||
|
<string name="service_remaining">剩余</string>
|
||||||
|
<string name="service_used_total"> · 已用 %1$s / 共 %2$s</string>
|
||||||
|
<string name="service_used_label">%1$s 已用</string>
|
||||||
|
<string name="service_5h_used">5h 已用</string>
|
||||||
|
<string name="service_plan_suffix">· %1$s</string>
|
||||||
|
<string name="service_reset_in">%1$s 后重置</string>
|
||||||
|
<string name="service_desc_deepseek">REST API · ¥</string>
|
||||||
|
<string name="service_desc_opencode_go">WebView 抓取 · 5h 配额</string>
|
||||||
|
<string name="service_desc_commandcode_go">JSON API · $</string>
|
||||||
|
<string name="service_desc_codex">ChatGPT Plus · Codex 额度</string>
|
||||||
|
<string name="service_desc_ollama">Cookie 抓取 · Cloud 配额</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 时长标签(DurationText 注入用) ══════════ -->
|
||||||
|
<string name="format_day">天</string>
|
||||||
|
<string name="format_hour">小时</string>
|
||||||
|
<string name="format_minute">分</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 用量窗口 ══════════ -->
|
||||||
|
<string name="window_5h">5 小时</string>
|
||||||
|
<string name="window_5h_short">5h</string>
|
||||||
|
<string name="window_5h_usage">5h 用量</string>
|
||||||
|
<string name="window_5h_rolling">5 小时滚动</string>
|
||||||
|
<string name="window_weekly">本周</string>
|
||||||
|
<string name="window_monthly">本月</string>
|
||||||
|
<string name="window_every_month">每月</string>
|
||||||
|
<string name="window_usage">用量</string>
|
||||||
|
<string name="usage_window_title">用量窗口%1$s</string>
|
||||||
|
<string name="usage_window_title_plain">用量窗口</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 用量统计 ══════════ -->
|
||||||
|
<string name="usage_title_opencode">OpenCode 用量</string>
|
||||||
|
<string name="usage_title_commandcode">CommandCode 用量</string>
|
||||||
|
<string name="usage_record_count">%1$d 条记录</string>
|
||||||
|
<string name="usage_click_to_sync">点击同步</string>
|
||||||
|
<string name="usage_input_tokens">输入 Token</string>
|
||||||
|
<string name="usage_output_tokens">输出 Token</string>
|
||||||
|
<string name="usage_reasoning_tokens">推理 Token</string>
|
||||||
|
<string name="usage_total_cost">总花费</string>
|
||||||
|
<string name="usage_cache_read">缓存读取 %1$s</string>
|
||||||
|
<string name="usage_cache_write">缓存写入 %1$s</string>
|
||||||
|
<string name="usage_no_data_sync">暂无数据,点击 🔄 同步</string>
|
||||||
|
<string name="usage_new_records">✓ 新增 %1$d 条</string>
|
||||||
|
<string name="usage_click_to_switch"> 点击切换</string>
|
||||||
|
<string name="usage_utc0_note">所有时间按 UTC+0 计算</string>
|
||||||
|
<string name="msg_utc8_on">已切换到 UTC+8,图表按北京时间显示</string>
|
||||||
|
<string name="msg_utc0_on">已切换到 UTC+0,图表按世界协调时显示</string>
|
||||||
|
<string name="usage_spent_total">已用 $%1$s / 共 $%2$s</string>
|
||||||
|
<string name="usage_remaining">剩余 $%1$s</string>
|
||||||
|
<string name="usage_extra_credits">额外充值</string>
|
||||||
|
<string name="section_by_model">按模型统计</string>
|
||||||
|
<string name="section_by_day">按天统计(UTC+0)</string>
|
||||||
|
<string name="model_count">%1$d 个模型</string>
|
||||||
|
<string name="model_count_short">%1$d 个</string>
|
||||||
|
<string name="date_start">开始时间</string>
|
||||||
|
<string name="date_end">结束时间</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 图表 ══════════ -->
|
||||||
|
<string name="chart_cost">消耗金额 (USD)</string>
|
||||||
|
<string name="chart_requests">API 请求次数</string>
|
||||||
|
<string name="chart_tokens">Token 消耗</string>
|
||||||
|
<string name="chart_stack_output">输出</string>
|
||||||
|
<string name="chart_stack_input">输入(未命中)</string>
|
||||||
|
<string name="chart_stack_cache">命中缓存</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 原始数据 ══════════ -->
|
||||||
|
<string name="header_time">时间</string>
|
||||||
|
<string name="header_model">模型</string>
|
||||||
|
<string name="header_input_cache">输入(缓存)</string>
|
||||||
|
<string name="header_output">输出</string>
|
||||||
|
<string name="header_cost">成本</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 时间筛选 ══════════ -->
|
||||||
|
<string name="time_all">全部</string>
|
||||||
|
<string name="time_last_5h">最近5小时</string>
|
||||||
|
<string name="time_last_12h">最近12小时</string>
|
||||||
|
<string name="time_last_24h">最近24小时</string>
|
||||||
|
<string name="time_today">今天</string>
|
||||||
|
<string name="time_yesterday">昨天</string>
|
||||||
|
<string name="time_last_7d">最近7天</string>
|
||||||
|
<string name="time_last_30d">最近30天</string>
|
||||||
|
<string name="time_this_month">当月</string>
|
||||||
|
<string name="time_custom">自定义</string>
|
||||||
|
<string name="time_custom_day">自定义天</string>
|
||||||
|
<string name="time_custom_month">自定义月</string>
|
||||||
|
<string name="time_custom_range">自定义时间</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 设置页 ══════════ -->
|
||||||
|
<string name="about_description">统一查询 AI 余额的小工具。\n本地加密存储凭据,不上传任何数据。</string>
|
||||||
|
<string name="tips_view_all">查看全部 %1$d 条隐藏操作</string>
|
||||||
|
<string name="debug_log_desc">查看 token 刷新、网络请求等调试记录</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 凭据编辑 ══════════ -->
|
||||||
|
<string name="credential_configured_cookies">✓ 已配置登录态(%1$d 个 Cookie)</string>
|
||||||
|
<string name="help_cookie_title">如何获取 Cookie?</string>
|
||||||
|
<string name="help_cookie_1">1. 在桌面 Chrome 打开下方登录入口</string>
|
||||||
|
<string name="help_cookie_2">2. 用 GitHub / Google 登录(不会被拦截)</string>
|
||||||
|
<string name="help_cookie_3">3. 登录后按 F12 → Application → Cookies</string>
|
||||||
|
<string name="help_cookie_4">4. 复制该站点下的所有 Cookie 粘贴到上面输入框</string>
|
||||||
|
<string name="help_cookie_5">格式:name1=value1; name2=value2</string>
|
||||||
|
<string name="help_ocgo_title">如何获取 OpenCode Go 凭据?</string>
|
||||||
|
<string name="help_ocgo_1">1. 桌面 Chrome 打开 opencode.ai/auth</string>
|
||||||
|
<string name="help_ocgo_2">2. 用 GitHub / Google 登录(Google 不会拦截 Chrome)</string>
|
||||||
|
<string name="help_ocgo_3">3. 登录后跳转到 dashboard,URL 形如:</string>
|
||||||
|
<string name="help_ocgo_4"> https://opencode.ai/workspace/{id}/go</string>
|
||||||
|
<string name="help_ocgo_5">4. 复制 URL 中的 {id} 段 → workspaceId</string>
|
||||||
|
<string name="help_ocgo_6">5. F12 → Application → Cookies</string>
|
||||||
|
<string name="help_ocgo_7">6. 找到域名 opencode.ai 下名为 auth 的 Cookie</string>
|
||||||
|
<string name="help_ocgo_8">7. 复制它的 Value 字段 → auth cookie</string>
|
||||||
|
<string name="help_ocgo_note">注意:只填 auth 一个 Cookie 即可,不要整个 Cookie 字符串</string>
|
||||||
|
<string name="help_ccgo_title">如何获取 CommandCode Go 凭据?</string>
|
||||||
|
<string name="help_ccgo_1">1. 打开 https://commandcode.ai 并登录 GitHub</string>
|
||||||
|
<string name="help_ccgo_2">▸ 获取 API Key(必填):</string>
|
||||||
|
<string name="help_ccgo_3"> 右上角头像 → Settings → API Keys → 创建一个 Key</string>
|
||||||
|
<string name="help_ccgo_4">▸ 获取全部 Cookie(用于用量记录):</string>
|
||||||
|
<string name="help_ccgo_5"> F12 → Application → Cookies → commandcode.ai</string>
|
||||||
|
<string name="help_ccgo_6"> 选中所有 Cookie,复制整个 Cookie 字符串</string>
|
||||||
|
<string name="help_ccgo_7"> 粘贴到下方输入框即可,无需逐个挑选</string>
|
||||||
|
<string name="help_ccgo_note">提示:不填 Cookie 也能正常查看余额,只是用量记录为空。</string>
|
||||||
|
<string name="help_codex_title">如何获取 Codex auth.json?</string>
|
||||||
|
<string name="help_codex_1">1. 在终端运行 codex-oauth-proxy 或</string>
|
||||||
|
<string name="help_codex_2"> codex-proxy,完成 ChatGPT 登录</string>
|
||||||
|
<string name="help_codex_3">2. 凭证文件保存在:</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 提示/错误消息 ══════════ -->
|
||||||
|
<string name="msg_saved">已保存</string>
|
||||||
|
<string name="msg_credentials_saved">已保存凭据</string>
|
||||||
|
<string name="msg_connect_success_balance">连接成功!余额: %1$s %2$s</string>
|
||||||
|
<string name="msg_connect_success_saved">连接成功,凭据已保存</string>
|
||||||
|
<string name="error_api_key_empty">API Key 不能为空</string>
|
||||||
|
<string name="error_json_format">JSON 格式错误</string>
|
||||||
|
<string name="error_credential_rejected">服务拒绝该凭据 (401/403)</string>
|
||||||
|
<string name="error_credential_changed_test">测试期间凭据已变更</string>
|
||||||
|
<string name="error_rate_limited">请求过于频繁 (429)</string>
|
||||||
|
<string name="error_server">服务端错误 (%1$d)</string>
|
||||||
|
<string name="error_network">网络错误:%1$s</string>
|
||||||
|
<string name="error_rollback_done">,已恢复原凭据</string>
|
||||||
|
<string name="error_rollback_skipped">,检测到凭据已变化,未执行回滚</string>
|
||||||
|
<string name="error_test_failed">测试失败。%1$s%2$s</string>
|
||||||
|
<string name="error_test_not_supported">暂不支持测试此服务</string>
|
||||||
|
<string name="error_auth_cookie_workspace">auth cookie 和 workspaceId 都需要填写</string>
|
||||||
|
<string name="error_cookie_empty">Cookie 不能为空</string>
|
||||||
|
<string name="error_credential_not_configured">凭据未配置</string>
|
||||||
|
<string name="error_credential_not_configured_expired">凭据未配置或已过期</string>
|
||||||
|
<string name="error_credential_invalid_reconfigure">凭据无效,请在设置中重新配置</string>
|
||||||
|
<string name="error_credential_invalid_relogin">凭据无效,请重新登录</string>
|
||||||
|
<string name="error_credential_changed_reload">凭据已变更,正在重新加载</string>
|
||||||
|
<string name="error_credential_changed_retry">凭据已变更,请重新操作</string>
|
||||||
|
<string name="error_network_check">网络异常,请检查网络</string>
|
||||||
|
<string name="error_network_generic">网络异常</string>
|
||||||
|
<string name="error_server_http">服务端异常 (HTTP %1$d)</string>
|
||||||
|
<string name="error_rate_limited_retry">请求过于频繁%1$s</string>
|
||||||
|
<string name="error_rate_limited_retry_suffix">,请 %1$d 秒后重试</string>
|
||||||
|
<string name="error_trigger_not_supported">不支持激活用量</string>
|
||||||
|
<string name="error_select_model_first">请先选择模型</string>
|
||||||
|
<string name="error_cookie_not_found">未抓到 Cookie,请确认已登录</string>
|
||||||
|
<string name="error_login_url_missing">未配置登录 URL</string>
|
||||||
|
<string name="error_oauth_url_prefix">URL 应以 %1$s 开头</string>
|
||||||
|
<string name="error_oauth_auth_failed">授权失败: %1$s</string>
|
||||||
|
<string name="error_oauth_state_mismatch">State 不匹配,请重试</string>
|
||||||
|
<string name="error_oauth_missing_code">回调缺少授权码</string>
|
||||||
|
<string name="error_oauth_token_exchange">Token 交换失败,请查看调试日志</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 触发用量 ══════════ -->
|
||||||
|
<string name="trigger_success_title">✓ 用量已激活</string>
|
||||||
|
<string name="trigger_success_header">✓ 激活成功</string>
|
||||||
|
<string name="trigger_result_title">请求结果</string>
|
||||||
|
<string name="trigger_error_prefix">错误: %1$s</string>
|
||||||
|
<string name="trigger_response_body">响应内容:\n%1$s</string>
|
||||||
|
<string name="trigger_success_model">模型: %1$s</string>
|
||||||
|
<string name="trigger_success_response_id">响应 ID: %1$s</string>
|
||||||
|
<string name="trigger_reply_header">回复:</string>
|
||||||
|
<string name="trigger_reply_empty">(空)</string>
|
||||||
|
<string name="trigger_reply_missing">(无回复内容)</string>
|
||||||
|
<string name="trigger_parse_failed">(响应解析失败,但请求已发出)</string>
|
||||||
|
<string name="trigger_usage_prompt_completion_total">用量: prompt=%1$s completion=%2$s total=%3$s tokens</string>
|
||||||
|
<string name="trigger_usage_input_output">用量: input=%1$s output=%2$s tokens</string>
|
||||||
|
<string name="error_token_refresh_failed">token 刷新失败:%1$s</string>
|
||||||
|
|
||||||
|
<!-- ══════════ WebView 登录 ══════════ -->
|
||||||
|
<string name="title_webview_login">登录 %1$s</string>
|
||||||
|
<string name="dialog_login_done_title">完成登录了吗?</string>
|
||||||
|
<string name="dialog_login_done_body">如果你已经在页面上完成登录但页面没有跳转,可点击下方按钮让我抓取 Cookie 并保存登录态。</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 调试日志 ══════════ -->
|
||||||
|
<string name="debug_log_empty">暂无日志记录\n刷新 Codex 用量后这里会出现调试信息</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 小组件 ══════════ -->
|
||||||
|
<string name="widget_title_opencode">OpenCode Go · 用量</string>
|
||||||
|
<string name="widget_deepseek_balance">DeepSeek 余额</string>
|
||||||
|
<string name="widget_auto_refresh">自动刷新</string>
|
||||||
|
<string name="widget_service_quota">%1$s · 额度</string>
|
||||||
|
<string name="widget_quota_with_plan">%1$s · %2$s</string>
|
||||||
|
<string name="widget_updated_at">更新 %1$s</string>
|
||||||
|
<string name="widget_no_data">暂无数据</string>
|
||||||
|
<string name="widget_refreshing">刷新中…</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 小技巧(AppTips) ══════════ -->
|
||||||
|
<string name="tip_1_title">长按卡片拖拽排序</string>
|
||||||
|
<string name="tip_1_hint">长按首页卡片可以拖拽排序</string>
|
||||||
|
<string name="tip_1_detail">在首页长按任意服务卡片即可拖拽到想要的位置,排序会自动保存。</string>
|
||||||
|
<string name="tip_2_title">小组件点左上角进 APP</string>
|
||||||
|
<string name="tip_2_hint">小组件左上角标识可打开 APP</string>
|
||||||
|
<string name="tip_2_detail">桌面小组件左上角 RainyToken › 标识可以点击打开应用,其它区域点击切换服务。</string>
|
||||||
|
<string name="tip_3_title">图表点击查看详情</string>
|
||||||
|
<string name="tip_3_hint">点击图表柱子可查看时段详情</string>
|
||||||
|
<string name="tip_3_detail">在用量图表上点击或滑动手指,可查看对应时段的详细数值。</string>
|
||||||
|
<string name="tip_4_title">图表标题可点击</string>
|
||||||
|
<string name="tip_4_hint">点击图表标题弹出按模型明细</string>
|
||||||
|
<string name="tip_4_detail">图表卡片标题(如「消耗金额」)点击后会弹出按模型拆分的明细。</string>
|
||||||
|
<string name="tip_5_title">切换图表时区</string>
|
||||||
|
<string name="tip_5_hint">用量详情页可切换 UTC+0 / UTC+8</string>
|
||||||
|
<string name="tip_5_detail">用量详情页顶部可切换 UTC+0 / UTC+8,图表标签会跟随切换。</string>
|
||||||
|
<string name="tip_6_title">CCGO 清除并重新同步</string>
|
||||||
|
<string name="tip_6_hint">CCGO 详情页可清除缓存重新同步</string>
|
||||||
|
<string name="tip_6_detail">CCGO 用量详情页右上角「清除」可删除本地缓存并重新拉取全部数据。</string>
|
||||||
|
<string name="tip_7_title">查看用量详情</string>
|
||||||
|
<string name="tip_7_hint">服务卡片底部可进入用量图表</string>
|
||||||
|
<string name="tip_7_detail">有凭据的服务卡片底部会出现「查看用量详情」入口,点击进入图表统计。</string>
|
||||||
|
<string name="tip_8_title">原始数据浏览</string>
|
||||||
|
<string name="tip_8_hint">用量详情页右上角可查看原始记录</string>
|
||||||
|
<string name="tip_8_detail">用量详情页右上角「详细数据」可查看每条原始调用记录,支持分页跳转。</string>
|
||||||
|
<string name="tip_9_title">下拉刷新联动用量</string>
|
||||||
|
<string name="tip_9_hint">下拉刷新会同步余额和用量</string>
|
||||||
|
<string name="tip_9_detail">首页下拉刷新不仅刷新余额,还会自动同步 OCGO / CCGO 用量记录。</string>
|
||||||
|
<string name="tip_10_title">凭据获取教程</string>
|
||||||
|
<string name="tip_10_hint">凭据页底部有获取教程</string>
|
||||||
|
<string name="tip_10_detail">凭据编辑页底部的「如何获取」按钮有针对每个服务的详细操作步骤。</string>
|
||||||
|
<string name="tip_11_title">剪贴板自动导入</string>
|
||||||
|
<string name="tip_11_hint">Codex 支持从剪贴板一键导入</string>
|
||||||
|
<string name="tip_11_detail">Codex 凭据页支持「从剪贴板自动导入」,粘贴 auth.json 后一键填入。</string>
|
||||||
|
<string name="tip_12_title">详细数据页码跳转</string>
|
||||||
|
<string name="tip_12_hint">原始数据页可输入页码直跳</string>
|
||||||
|
<string name="tip_12_detail">原始数据页底部可输入页码直接跳转,数据量大时不必逐页翻。</string>
|
||||||
|
<string name="tip_13_title">小组件自动刷新</string>
|
||||||
|
<string name="tip_13_hint">划到小组件会自动刷新余额</string>
|
||||||
|
<string name="tip_13_detail">桌面小组件划到负一屏时会自动刷新余额,也可手动点 ↻ 按钮刷新。</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 图表/明细(B 组迁移) ══════════ -->
|
||||||
|
<string name="count_times">%1$d次</string>
|
||||||
|
<string name="date_select_day">选择日期</string>
|
||||||
|
<string name="date_select_month">选择月份(任意一天)</string>
|
||||||
|
<string name="date_pick_start">开始日期</string>
|
||||||
|
<string name="date_pick_end">结束日期</string>
|
||||||
|
<string name="chart_detail_cost">消费明细</string>
|
||||||
|
<string name="chart_detail_requests">调用次数明细</string>
|
||||||
|
<string name="chart_detail_tokens">Token 明细</string>
|
||||||
|
<string name="dialog_clear_title">清除数据</string>
|
||||||
|
<string name="dialog_clear_body">此操作将清除所有 CommandCode 用量本地缓存并重新同步,需要几秒钟完成。</string>
|
||||||
|
<string name="dialog_clear_confirm_question">是否继续?</string>
|
||||||
|
<string name="action_confirm_countdown">确认(%1$ds)</string>
|
||||||
|
<string name="action_confirm_clear">确认清除</string>
|
||||||
|
<string name="action_close">关闭</string>
|
||||||
|
<string name="range_from">从 %1$s</string>
|
||||||
|
<string name="range_to">至 %1$s</string>
|
||||||
|
<string name="action_apply_custom_range">应用自定义范围</string>
|
||||||
|
<string name="action_confirm">确定</string>
|
||||||
|
<string name="date_end_before_start">结束日期不能早于开始日期 %1$s</string>
|
||||||
|
<string name="time_hm">时间 %1$s:%2$s</string>
|
||||||
|
<string name="common_no_data">暂无数据</string>
|
||||||
|
<string name="chart_total_label">合计: %1$s</string>
|
||||||
|
<string name="usage_total">总计</string>
|
||||||
|
<string name="usage_records">记录数</string>
|
||||||
|
<string name="stat_cache_read">缓存读取</string>
|
||||||
|
<string name="stat_cache_write">缓存写入</string>
|
||||||
|
<string name="usage_cache_breakdown">缓存 Token 细分</string>
|
||||||
|
<string name="usage_cache_read_note">※ 缓存读取已计入「输入 Token」</string>
|
||||||
|
<string name="usage_calls">%1$d 次调用</string>
|
||||||
|
<string name="date_format_md">MM月dd日 EEEE</string>
|
||||||
|
<string name="daily_count_cost">%1$d 次 · $%2$s</string>
|
||||||
|
<string name="raw_record_title">原始数据</string>
|
||||||
|
<string name="stat_cache_write_5m">缓存写入(5m)</string>
|
||||||
|
<string name="stat_cache_write_1h">缓存写入(1h)</string>
|
||||||
|
<string name="raw_cost_usd">成本(USD)</string>
|
||||||
|
<string name="raw_cost_raw">成本(Raw)</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 凭据编辑(C 组迁移) ══════════ -->
|
||||||
|
<string name="help_codex_4"> ~/.config/codex-oauth-proxy/auth.json</string>
|
||||||
|
<string name="help_codex_5">3. 用文本编辑器打开该文件,</string>
|
||||||
|
<string name="help_codex_6"> 复制全部内容粘贴到上方输入框</string>
|
||||||
|
<string name="help_codex_7"> JSON 格式示例:</string>
|
||||||
|
<string name="help_codex_8"> {"tokens": {</string>
|
||||||
|
<string name="help_codex_9"> "access_token": "...",</string>
|
||||||
|
<string name="help_codex_10"> "refresh_token": "...",</string>
|
||||||
|
<string name="help_codex_11"> "expiresAt": 1783727108252</string>
|
||||||
|
<string name="help_codex_12"> }}</string>
|
||||||
|
<string name="help_codex_note">提示:导入后 APP 会自动刷新 token,</string>
|
||||||
|
<string name="help_codex_note2">不需要手动更新。</string>
|
||||||
|
<string name="credential_title_ollama">Ollama Pro 凭据</string>
|
||||||
|
<string name="credential_hint_ollama">需要从浏览器复制完整 Cookie。登录 ollama.com/settings 后,在 DevTools → Network → 请求头里找到 Cookie 行复制。</string>
|
||||||
|
<string name="credential_update">更新凭据</string>
|
||||||
|
<string name="credential_save">保存凭据</string>
|
||||||
|
<string name="action_test_and_save">测试并保存</string>
|
||||||
|
<string name="action_open_ollama_settings">在浏览器中打开 Ollama Settings</string>
|
||||||
|
<string name="action_copy_login_url">复制登录 URL 到剪贴板</string>
|
||||||
|
<string name="activate_api_key_optional">一键激活用量 API Key(可选)</string>
|
||||||
|
<string name="hint_ollama_trigger_key">填入 Ollama Cloud API Key 后,可在详情页一键发送请求激活用量统计。从 ollama.com/settings → API Keys 获取。</string>
|
||||||
|
<string name="placeholder_ollama_api_key">ollama-xxx 或 sk-xxx</string>
|
||||||
|
<string name="action_save_api_key">保存 API Key</string>
|
||||||
|
<string name="credential_title_opencode_go">OpenCode Go 凭据</string>
|
||||||
|
<string name="credential_hint_opencode_go">需要 auth cookie + workspaceId 两个值。APP 会用 OkHttp 抓 dashboard 并自动解析 5h/周/月 三档用量。</string>
|
||||||
|
<string name="action_import_from_clipboard">从剪贴板自动导入</string>
|
||||||
|
<string name="placeholder_workspace_id">dashboard URL 中的 {id} 段</string>
|
||||||
|
<string name="field_auth_cookie_value">auth Cookie 值</string>
|
||||||
|
<string name="placeholder_auth_cookie">F12 → Cookies → opencode.ai → auth 的 Value</string>
|
||||||
|
<string name="action_how_get_two_values">如何获取这两个值?</string>
|
||||||
|
<string name="action_open_login_entry">在浏览器中打开登录入口</string>
|
||||||
|
<string name="hint_opencode_trigger_key">填入 OpenCode Zen API Key 后,可在详情页一键发送请求激活用量统计。从 opencode.ai/settings → API Keys 获取。</string>
|
||||||
|
<string name="credential_title_ccgo">CommandCode Go 凭据</string>
|
||||||
|
<string name="credential_hint_ccgo">需要 API Key(拉余额)。Session Cookie(可选)在浏览器 DevTools 复制,用于拉用量记录。不填也可正常查看余额。</string>
|
||||||
|
<string name="placeholder_api_key_from_settings">从 Settings → API Keys 生成</string>
|
||||||
|
<string name="field_session_cookie_optional">Session Cookie(可选)</string>
|
||||||
|
<string name="placeholder_session_cookie">F12 → Cookies → commandcode.ai → 全选复制粘贴即可</string>
|
||||||
|
<string name="action_how_get_api_key_cookie">如何获取 API Key 和 Cookie?</string>
|
||||||
|
<string name="api_key_form_title">请输入 API Key</string>
|
||||||
|
<string name="api_key_form_hint">凭据会使用 Android Keystore (AES-256 GCM) 加密后存储到本机 DataStore。</string>
|
||||||
|
<string name="action_update">更新</string>
|
||||||
|
<string name="credential_title_codex">Codex / ChatGPT Plus 凭据</string>
|
||||||
|
<string name="credential_hint_codex">推荐使用 OAuth 登录自动获取凭据。也可手动粘贴 auth.json 内容。</string>
|
||||||
|
<string name="action_oauth_login">🔐 OAuth 登录(推荐)</string>
|
||||||
|
<string name="or_manual_import">── 或手动导入 ──</string>
|
||||||
|
<string name="field_auth_json">auth.json 完整内容</string>
|
||||||
|
<string name="placeholder_auth_json">粘贴 {"tokens": {...}} 完整 JSON</string>
|
||||||
|
<string name="credential_import_save">导入并保存</string>
|
||||||
|
<string name="action_how_get_auth_json">如何获取 auth.json?</string>
|
||||||
|
<string name="manual_cookie_title">粘贴登录态</string>
|
||||||
|
<string name="manual_cookie_hint">Google OAuth 会拒绝 APP 内置 WebView,所以请用浏览器登录后把 Cookie 粘到这里。</string>
|
||||||
|
<string name="field_cookie_string">Cookie 字符串</string>
|
||||||
|
<string name="action_save_cookie">保存 Cookie</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 服务详情/凭据校验(D 组迁移) ══════════ -->
|
||||||
|
<string name="error_parse_failed">数据解析失败: %1$s</string>
|
||||||
|
<string name="window_every_week">每周</string>
|
||||||
|
<string name="msg_model_call_count">模型调用次数</string>
|
||||||
|
<string name="msg_stale_cache">缓存数据 · %1$s</string>
|
||||||
|
<string name="msg_showing_last_balance">显示的是上次成功获取的余额</string>
|
||||||
|
<string name="msg_monthly_spent">本月消费 %1$s%2$s</string>
|
||||||
|
<string name="msg_balance_breakdown">余额构成</string>
|
||||||
|
<string name="msg_granted_balance">赠送余额</string>
|
||||||
|
<string name="msg_topped_up_balance">自费充值</string>
|
||||||
|
<string name="msg_loading_models">加载模型列表...</string>
|
||||||
|
<string name="msg_select_model">选择模型</string>
|
||||||
|
<string name="action_refresh_models">刷新模型列表</string>
|
||||||
|
<string name="msg_triggering">激活中...</string>
|
||||||
|
<string name="action_retry_trigger">重试激活用量</string>
|
||||||
|
<string name="action_trigger_usage">⚡ 一键激活用量</string>
|
||||||
|
<string name="action_refresh_balance">刷新余额</string>
|
||||||
|
<string name="action_relogin">重新登录</string>
|
||||||
|
<string name="action_configure_credential">配置凭据</string>
|
||||||
|
<string name="main_card_current_balance">当前余额</string>
|
||||||
|
<string name="main_card_5h_usage">5h 实时用量</string>
|
||||||
|
<string name="main_card_monthly_balance">月度余额</string>
|
||||||
|
<string name="main_card_session_usage">Session 用量</string>
|
||||||
|
<string name="msg_please_select_model">请选择模型</string>
|
||||||
|
<string name="trigger_error_detail">错误详情:</string>
|
||||||
|
<string name="trigger_api_response">API 响应内容:</string>
|
||||||
|
<string name="action_copy">复制</string>
|
||||||
|
<string name="msg_key_length">*** (长度 %1$d) ***</string>
|
||||||
|
<string name="msg_key_masked">%1$s***%2$s (长度 %3$d)</string>
|
||||||
|
<string name="error_cookie_format">Cookie 格式错误,应为 name1=value1; name2=value2</string>
|
||||||
|
<string name="msg_cookies_saved">已保存 %1$d 个 Cookie</string>
|
||||||
|
<string name="error_auth_json_empty">请粘贴 auth.json 内容</string>
|
||||||
|
<string name="error_auth_json_missing_tokens">auth.json 缺少 access_token 或 refresh_token</string>
|
||||||
|
<string name="msg_codex_saved">已保存 Codex 凭据,token 到期后会自动刷新</string>
|
||||||
|
<string name="error_auth_json_parse">解析失败:%1$s</string>
|
||||||
|
<string name="msg_connect_success_dollar">连接成功!余额: $%1$s</string>
|
||||||
|
<string name="msg_api_key_saved">API Key 已保存</string>
|
||||||
|
<string name="msg_connect_success_session">连接成功!Session: %1$s%% · %2$s</string>
|
||||||
|
<string name="msg_credential_deleted">凭据已删除</string>
|
||||||
|
<string name="error_clipboard_empty">剪贴板为空</string>
|
||||||
|
<string name="msg_clipboard_ws_auth">已识别 workspaceId 和 auth cookie</string>
|
||||||
|
<string name="msg_clipboard_ws_only">已识别 workspaceId,请再粘贴 auth cookie</string>
|
||||||
|
<string name="msg_clipboard_auth_only">已识别 auth cookie,请再粘贴 workspaceId</string>
|
||||||
|
<string name="error_clipboard_none">未识别到有效凭据</string>
|
||||||
|
|
||||||
|
<!-- ══════════ Codex OAuth 登录页 ══════════ -->
|
||||||
|
<string name="oauth_screen_title">Codex OAuth 登录</string>
|
||||||
|
<string name="oauth_exchanging">正在交换 Token...</string>
|
||||||
|
<string name="action_retry">重试</string>
|
||||||
|
<string name="oauth_headless_title">无头模式登录</string>
|
||||||
|
<string name="oauth_steps">1. 点击「在浏览器中打开」或复制下方链接到浏览器\n2. 在 OpenAI 页面完成登录和授权\n3. 浏览器会跳转到一个 localhost 地址(页面打不开是正常的)\n4. 复制浏览器地址栏的完整 URL 粘贴到下方输入框\n5. 点击「提交回调 URL」</string>
|
||||||
|
<string name="oauth_auth_url_label">授权链接</string>
|
||||||
|
<string name="action_open_in_browser">在浏览器中打开</string>
|
||||||
|
<string name="action_copy_link">复制链接</string>
|
||||||
|
<string name="oauth_paste_callback_hint">── 登录后粘贴回调 URL ──</string>
|
||||||
|
<string name="oauth_callback_url_label">回调 URL</string>
|
||||||
|
<string name="oauth_callback_url_placeholder">http://localhost:1455/auth/callback?code=...</string>
|
||||||
|
<string name="action_submit_callback">提交回调 URL</string>
|
||||||
|
<string name="action_regenerate_link">重新生成授权链接</string>
|
||||||
|
<string name="oauth_preparing">正在准备授权...</string>
|
||||||
|
</resources>
|
||||||
489
app/src/main/res/values-b+zh+Hant/strings.xml
Normal file
489
app/src/main/res/values-b+zh+Hant/strings.xml
Normal file
@ -0,0 +1,489 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="widget_name">AI用量面板</string>
|
||||||
|
<string name="widget_description">OpenCode Go 用量 + DeepSeek 餘額,自動重新整理</string>
|
||||||
|
<string name="widget_brand">雨晴喵</string>
|
||||||
|
<string name="app_name">雨晴Token</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ══════════ 通用动作 ══════════ -->
|
||||||
|
<string name="action_back">返回</string>
|
||||||
|
<string name="action_cancel">取消</string>
|
||||||
|
<string name="action_confirm_add">確認新增</string>
|
||||||
|
<string name="action_got_it">我知道了</string>
|
||||||
|
<string name="action_refresh">重新整理</string>
|
||||||
|
<string name="action_settings">設定</string>
|
||||||
|
<string name="action_delete">刪除</string>
|
||||||
|
<string name="action_clear">清除</string>
|
||||||
|
<string name="action_save">儲存</string>
|
||||||
|
<string name="action_jump">跳轉</string>
|
||||||
|
<string name="action_prev_page">◀ 上一頁</string>
|
||||||
|
<string name="action_next_page">下一頁 ▶</string>
|
||||||
|
<string name="action_add_widget">新增小工具到桌面</string>
|
||||||
|
<string name="title_language">語言</string>
|
||||||
|
<string name="dialog_language_title">選擇語言</string>
|
||||||
|
<string name="app_locale_follow_system">跟隨系統</string>
|
||||||
|
<string name="app_locale_zh">簡體中文</string>
|
||||||
|
<string name="app_locale_zh_hant">繁體中文</string>
|
||||||
|
<string name="app_locale_en">English</string>
|
||||||
|
<string name="action_view_detail">檢視詳情</string>
|
||||||
|
<string name="action_view_usage_detail">檢視用量詳情</string>
|
||||||
|
<string name="action_view_raw_data">詳細數據</string>
|
||||||
|
<string name="action_sync_usage">同步用量數據</string>
|
||||||
|
<string name="action_login_save">我已登入,儲存</string>
|
||||||
|
<string name="action_keep_waiting">繼續等待</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 通用文案 ══════════ -->
|
||||||
|
<string name="common_loading">載入中…</string>
|
||||||
|
<string name="common_unknown">未知錯誤</string>
|
||||||
|
<string name="common_all_models">全部模型</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 页面标题 ══════════ -->
|
||||||
|
<string name="nav_empty_title">👈 選擇服務檢視詳情</string>
|
||||||
|
<string name="nav_empty_subtitle">點選左側卡片即可</string>
|
||||||
|
<string name="title_settings">設定</string>
|
||||||
|
<string name="title_credentials">憑據管理</string>
|
||||||
|
<string name="title_about">關於 RainyToken</string>
|
||||||
|
<string name="title_tips">使用小技巧</string>
|
||||||
|
<string name="title_debug_log">除錯日誌</string>
|
||||||
|
<string name="title_usage_detail">用量詳情</string>
|
||||||
|
<string name="title_overview">總統計</string>
|
||||||
|
<string name="title_raw_data">詳細數據</string>
|
||||||
|
<string name="title_chart">統計圖表</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 状态徽章 ══════════ -->
|
||||||
|
<string name="status_not_configured">未配置</string>
|
||||||
|
<string name="status_configured">已配置</string>
|
||||||
|
<string name="status_expired">已過期</string>
|
||||||
|
<string name="status_relogin">需重登</string>
|
||||||
|
<string name="status_refresh_failed">重新整理失敗</string>
|
||||||
|
<string name="status_not_fetched">未獲取</string>
|
||||||
|
<string name="status_waiting">待獲取</string>
|
||||||
|
<string name="status_normal">正常</string>
|
||||||
|
<string name="status_not_configured_add">未配置 · 點選新增</string>
|
||||||
|
<string name="status_ok_valid">已配置 · 憑據有效</string>
|
||||||
|
<string name="status_expired_reconfigure">已過期 · 點選重新配置</string>
|
||||||
|
<string name="status_need_reverify">需要重新驗證</string>
|
||||||
|
<string name="status_manual_mode">手動輸入模式</string>
|
||||||
|
<string name="status_credential_configured">憑據已配置</string>
|
||||||
|
<string name="status_not_configured_cred">未配置憑據</string>
|
||||||
|
<string name="status_loading">載入中</string>
|
||||||
|
<string name="status_fresh">最新</string>
|
||||||
|
<string name="status_stale">快取</string>
|
||||||
|
<string name="status_failed">失敗</string>
|
||||||
|
<string name="status_pending_input">待輸入</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 仪表盘 ══════════ -->
|
||||||
|
<string name="dashboard_subtitle">AI 餘額一覽</string>
|
||||||
|
<string name="footer_never_fetched">從未獲取</string>
|
||||||
|
<string name="footer_just_updated">剛剛更新</string>
|
||||||
|
<string name="footer_minutes_ago">%1$d 分鐘前更新</string>
|
||||||
|
<string name="footer_hours_ago">%1$d 小時前更新</string>
|
||||||
|
<string name="footer_updated_at">%1$s 更新</string>
|
||||||
|
<string name="dashboard_drag_hint">💡 長按卡片可拖曳排序</string>
|
||||||
|
<string name="dashboard_error_prefix">⚠ %1$s</string>
|
||||||
|
|
||||||
|
<string name="dashboard_footer_privacy">本地加密儲存,不上傳任何數據</string>
|
||||||
|
<string name="dialog_add_widget_title">新增桌面小工具?</string>
|
||||||
|
<string name="dialog_add_widget_body">確認後會請求桌面啟動器新增雨晴Token小工具。部分系統仍會彈出系統確認視窗。</string>
|
||||||
|
<string name="toast_shortcut_permission_denied">桌面快捷方式權限已被拒絕,請在系統設定中允許後重試</string>
|
||||||
|
<string name="toast_add_rejected">桌面未接受新增請求,請檢查啟動器權限</string>
|
||||||
|
<string name="toast_picker_unsupported">當前桌面不支援應用內新增,請在桌面長按 → 小工具 → 查詢雨晴Token</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 服务卡片 ══════════ -->
|
||||||
|
<string name="service_click_to_configure">點選配置憑據</string>
|
||||||
|
<string name="service_pull_to_refresh">下拉重新整理</string>
|
||||||
|
<string name="service_unavailable">服務當前不可用</string>
|
||||||
|
<string name="service_monthly_used">本月已用 %1$s%2$s</string>
|
||||||
|
<string name="service_remaining">剩餘</string>
|
||||||
|
<string name="service_used_total"> · 已用 %1$s / 共 %2$s</string>
|
||||||
|
<string name="service_used_label">%1$s 已用</string>
|
||||||
|
<string name="service_5h_used">5h 已用</string>
|
||||||
|
<string name="service_plan_suffix">· %1$s</string>
|
||||||
|
<string name="service_reset_in">%1$s 後重置</string>
|
||||||
|
<string name="service_desc_deepseek">REST API · ¥</string>
|
||||||
|
<string name="service_desc_opencode_go">WebView 抓取 · 5h 配額</string>
|
||||||
|
<string name="service_desc_commandcode_go">JSON API · $</string>
|
||||||
|
<string name="service_desc_codex">ChatGPT Plus · Codex 額度</string>
|
||||||
|
<string name="service_desc_ollama">Cookie 抓取 · Cloud 配額</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 时长标签(DurationText 注入用) ══════════ -->
|
||||||
|
<string name="format_day">天</string>
|
||||||
|
<string name="format_hour">小時</string>
|
||||||
|
<string name="format_minute">分</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 用量窗口 ══════════ -->
|
||||||
|
<string name="window_5h">5 小時</string>
|
||||||
|
<string name="window_5h_short">5h</string>
|
||||||
|
<string name="window_5h_usage">5h 用量</string>
|
||||||
|
<string name="window_5h_rolling">5 小時滾動</string>
|
||||||
|
<string name="window_weekly">本週</string>
|
||||||
|
<string name="window_monthly">本月</string>
|
||||||
|
<string name="window_every_month">每月</string>
|
||||||
|
<string name="window_usage">用量</string>
|
||||||
|
<string name="usage_window_title">用量視窗%1$s</string>
|
||||||
|
<string name="usage_window_title_plain">用量視窗</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 用量统计 ══════════ -->
|
||||||
|
<string name="usage_title_opencode">OpenCode 用量</string>
|
||||||
|
<string name="usage_title_commandcode">CommandCode 用量</string>
|
||||||
|
<string name="usage_record_count">%1$d 條記錄</string>
|
||||||
|
<string name="usage_click_to_sync">點選同步</string>
|
||||||
|
<string name="usage_input_tokens">輸入 Token</string>
|
||||||
|
<string name="usage_output_tokens">輸出 Token</string>
|
||||||
|
<string name="usage_reasoning_tokens">推理 Token</string>
|
||||||
|
<string name="usage_total_cost">總花費</string>
|
||||||
|
<string name="usage_cache_read">快取讀取 %1$s</string>
|
||||||
|
<string name="usage_cache_write">快取寫入 %1$s</string>
|
||||||
|
<string name="usage_no_data_sync">暫無數據,點選 🔄 同步</string>
|
||||||
|
<string name="usage_new_records">✓ 新增 %1$d 條</string>
|
||||||
|
<string name="usage_click_to_switch"> 點選切換</string>
|
||||||
|
<string name="usage_utc0_note">所有時間按 UTC+0 計算</string>
|
||||||
|
<string name="msg_utc8_on">已切換到 UTC+8,圖表按北京時間顯示</string>
|
||||||
|
<string name="msg_utc0_on">已切換到 UTC+0,圖表按世界協調時顯示</string>
|
||||||
|
<string name="usage_spent_total">已用 $%1$s / 共 $%2$s</string>
|
||||||
|
<string name="usage_remaining">剩餘 $%1$s</string>
|
||||||
|
<string name="usage_extra_credits">額外充值</string>
|
||||||
|
<string name="section_by_model">按模型統計</string>
|
||||||
|
<string name="section_by_day">按天統計(UTC+0)</string>
|
||||||
|
<string name="model_count">%1$d 個模型</string>
|
||||||
|
<string name="model_count_short">%1$d 個</string>
|
||||||
|
<string name="date_start">開始時間</string>
|
||||||
|
<string name="date_end">結束時間</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 图表 ══════════ -->
|
||||||
|
<string name="chart_cost">消耗金額 (USD)</string>
|
||||||
|
<string name="chart_requests">API 請求次數</string>
|
||||||
|
<string name="chart_tokens">Token 消耗</string>
|
||||||
|
<string name="chart_stack_output">輸出</string>
|
||||||
|
<string name="chart_stack_input">輸入(未命中)</string>
|
||||||
|
<string name="chart_stack_cache">命中快取</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 原始数据 ══════════ -->
|
||||||
|
<string name="header_time">時間</string>
|
||||||
|
<string name="header_model">模型</string>
|
||||||
|
<string name="header_input_cache">輸入(快取)</string>
|
||||||
|
<string name="header_output">輸出</string>
|
||||||
|
<string name="header_cost">成本</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 时间筛选 ══════════ -->
|
||||||
|
<string name="time_all">全部</string>
|
||||||
|
<string name="time_last_5h">最近5小時</string>
|
||||||
|
<string name="time_last_12h">最近12小時</string>
|
||||||
|
<string name="time_last_24h">最近24小時</string>
|
||||||
|
<string name="time_today">今天</string>
|
||||||
|
<string name="time_yesterday">昨天</string>
|
||||||
|
<string name="time_last_7d">最近7天</string>
|
||||||
|
<string name="time_last_30d">最近30天</string>
|
||||||
|
<string name="time_this_month">當月</string>
|
||||||
|
<string name="time_custom">自定義</string>
|
||||||
|
<string name="time_custom_day">自定義天</string>
|
||||||
|
<string name="time_custom_month">自定義月</string>
|
||||||
|
<string name="time_custom_range">自定義時間</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 设置页 ══════════ -->
|
||||||
|
<string name="about_description">統一查詢 AI 餘額的小工具。\n本地加密儲存憑據,不上傳任何數據。</string>
|
||||||
|
<string name="tips_view_all">檢視全部 %1$d 條隱藏操作</string>
|
||||||
|
<string name="debug_log_desc">檢視 token 重新整理、網路請求等除錯記錄</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 凭据编辑 ══════════ -->
|
||||||
|
<string name="credential_configured_cookies">✓ 已配置登入態(%1$d 個 Cookie)</string>
|
||||||
|
<string name="help_cookie_title">如何獲取 Cookie?</string>
|
||||||
|
<string name="help_cookie_1">1. 在桌面 Chrome 開啟下方登入入口</string>
|
||||||
|
<string name="help_cookie_2">2. 用 GitHub / Google 登入(不會被攔截)</string>
|
||||||
|
<string name="help_cookie_3">3. 登入後按 F12 → Application → Cookies</string>
|
||||||
|
<string name="help_cookie_4">4. 複製該站點下的所有 Cookie 貼上到上面輸入框</string>
|
||||||
|
<string name="help_cookie_5">格式:name1=value1; name2=value2</string>
|
||||||
|
<string name="help_ocgo_title">如何獲取 OpenCode Go 憑據?</string>
|
||||||
|
<string name="help_ocgo_1">1. 桌面 Chrome 開啟 opencode.ai/auth</string>
|
||||||
|
<string name="help_ocgo_2">2. 用 GitHub / Google 登入(Google 不會攔截 Chrome)</string>
|
||||||
|
<string name="help_ocgo_3">3. 登入後跳轉到 dashboard,URL 形如:</string>
|
||||||
|
<string name="help_ocgo_4"> https://opencode.ai/workspace/{id}/go</string>
|
||||||
|
<string name="help_ocgo_5">4. 複製 URL 中的 {id} 段 → workspaceId</string>
|
||||||
|
<string name="help_ocgo_6">5. F12 → Application → Cookies</string>
|
||||||
|
<string name="help_ocgo_7">6. 找到域名 opencode.ai 下名為 auth 的 Cookie</string>
|
||||||
|
<string name="help_ocgo_8">7. 複製它的 Value 欄位 → auth cookie</string>
|
||||||
|
<string name="help_ocgo_note">注意:只填 auth 一個 Cookie 即可,不要整個 Cookie 字串</string>
|
||||||
|
<string name="help_ccgo_title">如何獲取 CommandCode Go 憑據?</string>
|
||||||
|
<string name="help_ccgo_1">1. 開啟 https://commandcode.ai 並登入 GitHub</string>
|
||||||
|
<string name="help_ccgo_2">▸ 獲取 API Key(必填):</string>
|
||||||
|
<string name="help_ccgo_3"> 右上角頭像 → Settings → API Keys → 建立一個 Key</string>
|
||||||
|
<string name="help_ccgo_4">▸ 獲取全部 Cookie(用於用量記錄):</string>
|
||||||
|
<string name="help_ccgo_5"> F12 → Application → Cookies → commandcode.ai</string>
|
||||||
|
<string name="help_ccgo_6"> 選中所有 Cookie,複製整個 Cookie 字串</string>
|
||||||
|
<string name="help_ccgo_7"> 貼上到下方輸入框即可,無需逐個挑選</string>
|
||||||
|
<string name="help_ccgo_note">提示:不填 Cookie 也能正常檢視餘額,只是用量記錄為空。</string>
|
||||||
|
<string name="help_codex_title">如何獲取 Codex auth.json?</string>
|
||||||
|
<string name="help_codex_1">1. 在終端執行 codex-oauth-proxy 或</string>
|
||||||
|
<string name="help_codex_2"> codex-proxy,完成 ChatGPT 登入</string>
|
||||||
|
<string name="help_codex_3">2. 憑證檔案儲存在:</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 提示/错误消息 ══════════ -->
|
||||||
|
<string name="msg_saved">已儲存</string>
|
||||||
|
<string name="msg_credentials_saved">已儲存憑據</string>
|
||||||
|
<string name="msg_connect_success_balance">連線成功!餘額: %1$s %2$s</string>
|
||||||
|
<string name="msg_connect_success_saved">連線成功,憑據已儲存</string>
|
||||||
|
<string name="error_api_key_empty">API Key 不能為空</string>
|
||||||
|
<string name="error_json_format">JSON 格式錯誤</string>
|
||||||
|
<string name="error_credential_rejected">服務拒絕該憑據 (401/403)</string>
|
||||||
|
<string name="error_credential_changed_test">測試期間憑據已變更</string>
|
||||||
|
<string name="error_rate_limited">請求過於頻繁 (429)</string>
|
||||||
|
<string name="error_server">服務端錯誤 (%1$d)</string>
|
||||||
|
<string name="error_network">網路錯誤:%1$s</string>
|
||||||
|
<string name="error_rollback_done">,已恢復原憑據</string>
|
||||||
|
<string name="error_rollback_skipped">,檢測到憑據已變化,未執行回滾</string>
|
||||||
|
<string name="error_test_failed">測試失敗。%1$s%2$s</string>
|
||||||
|
<string name="error_test_not_supported">暫不支援測試此服務</string>
|
||||||
|
<string name="error_auth_cookie_workspace">auth cookie 和 workspaceId 都需要填寫</string>
|
||||||
|
<string name="error_cookie_empty">Cookie 不能為空</string>
|
||||||
|
<string name="error_credential_not_configured">憑據未配置</string>
|
||||||
|
<string name="error_credential_not_configured_expired">憑據未配置或已過期</string>
|
||||||
|
<string name="error_credential_invalid_reconfigure">憑據無效,請在設定中重新配置</string>
|
||||||
|
<string name="error_credential_invalid_relogin">憑據無效,請重新登入</string>
|
||||||
|
<string name="error_credential_changed_reload">憑據已變更,正在重新載入</string>
|
||||||
|
<string name="error_credential_changed_retry">憑據已變更,請重新操作</string>
|
||||||
|
<string name="error_network_check">網路異常,請檢查網路</string>
|
||||||
|
<string name="error_network_generic">網路異常</string>
|
||||||
|
<string name="error_server_http">服務端異常 (HTTP %1$d)</string>
|
||||||
|
<string name="error_rate_limited_retry">請求過於頻繁%1$s</string>
|
||||||
|
<string name="error_rate_limited_retry_suffix">,請 %1$d 秒後重試</string>
|
||||||
|
<string name="error_trigger_not_supported">不支援啟用用量</string>
|
||||||
|
<string name="error_select_model_first">請先選擇模型</string>
|
||||||
|
<string name="error_cookie_not_found">未抓到 Cookie,請確認已登入</string>
|
||||||
|
<string name="error_login_url_missing">未配置登入 URL</string>
|
||||||
|
<string name="error_oauth_url_prefix">URL 應以 %1$s 開頭</string>
|
||||||
|
<string name="error_oauth_auth_failed">授權失敗: %1$s</string>
|
||||||
|
<string name="error_oauth_state_mismatch">State 不匹配,請重試</string>
|
||||||
|
<string name="error_oauth_missing_code">回撥缺少授權碼</string>
|
||||||
|
<string name="error_oauth_token_exchange">Token 交換失敗,請檢視除錯日誌</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 触发用量 ══════════ -->
|
||||||
|
<string name="trigger_success_title">✓ 用量已啟用</string>
|
||||||
|
<string name="trigger_success_header">✓ 啟用成功</string>
|
||||||
|
<string name="trigger_result_title">請求結果</string>
|
||||||
|
<string name="trigger_error_prefix">錯誤: %1$s</string>
|
||||||
|
<string name="trigger_response_body">響應內容:\n%1$s</string>
|
||||||
|
<string name="trigger_success_model">模型: %1$s</string>
|
||||||
|
<string name="trigger_success_response_id">響應 ID: %1$s</string>
|
||||||
|
<string name="trigger_reply_header">回覆:</string>
|
||||||
|
<string name="trigger_reply_empty">(空)</string>
|
||||||
|
<string name="trigger_reply_missing">(無回覆內容)</string>
|
||||||
|
<string name="trigger_parse_failed">(響應解析失敗,但請求已發出)</string>
|
||||||
|
<string name="trigger_usage_prompt_completion_total">用量: prompt=%1$s completion=%2$s total=%3$s tokens</string>
|
||||||
|
<string name="trigger_usage_input_output">用量: input=%1$s output=%2$s tokens</string>
|
||||||
|
<string name="error_token_refresh_failed">token 重新整理失敗:%1$s</string>
|
||||||
|
|
||||||
|
<!-- ══════════ WebView 登录 ══════════ -->
|
||||||
|
<string name="title_webview_login">登入 %1$s</string>
|
||||||
|
<string name="dialog_login_done_title">完成登入了嗎?</string>
|
||||||
|
<string name="dialog_login_done_body">如果你已經在頁面上完成登入但頁面沒有跳轉,可點選下方按鈕讓我抓取 Cookie 並儲存登入態。</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 调试日志 ══════════ -->
|
||||||
|
<string name="debug_log_empty">暫無日誌記錄\n重新整理 Codex 用量後這裡會出現除錯資訊</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 小组件 ══════════ -->
|
||||||
|
<string name="widget_title_opencode">OpenCode Go · 用量</string>
|
||||||
|
<string name="widget_deepseek_balance">DeepSeek 餘額</string>
|
||||||
|
<string name="widget_auto_refresh">自動重新整理</string>
|
||||||
|
<string name="widget_service_quota">%1$s · 額度</string>
|
||||||
|
<string name="widget_quota_with_plan">%1$s · %2$s</string>
|
||||||
|
<string name="widget_updated_at">更新 %1$s</string>
|
||||||
|
<string name="widget_no_data">暫無數據</string>
|
||||||
|
<string name="widget_refreshing">重新整理中…</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 小技巧(AppTips) ══════════ -->
|
||||||
|
<string name="tip_1_title">長按卡片拖曳排序</string>
|
||||||
|
<string name="tip_1_hint">長按首頁卡片可以拖曳排序</string>
|
||||||
|
<string name="tip_1_detail">在首頁長按任意服務卡片即可拖曳到想要的位置,排序會自動儲存。</string>
|
||||||
|
<string name="tip_2_title">小工具點左上角進 APP</string>
|
||||||
|
<string name="tip_2_hint">小工具左上角標識可開啟 APP</string>
|
||||||
|
<string name="tip_2_detail">桌面小工具左上角 RainyToken › 標識可以點選開啟應用,其它區域點選切換服務。</string>
|
||||||
|
<string name="tip_3_title">圖表點選檢視詳情</string>
|
||||||
|
<string name="tip_3_hint">點選圖表柱子可檢視時段詳情</string>
|
||||||
|
<string name="tip_3_detail">在用量圖表上點選或滑動手指,可檢視對應時段的詳細數值。</string>
|
||||||
|
<string name="tip_4_title">圖表標題可點選</string>
|
||||||
|
<string name="tip_4_hint">點選圖表標題彈出按模型明細</string>
|
||||||
|
<string name="tip_4_detail">圖表卡片標題(如「消耗金額」)點選後會彈出按模型拆分的明細。</string>
|
||||||
|
<string name="tip_5_title">切換圖表時區</string>
|
||||||
|
<string name="tip_5_hint">用量詳情頁可切換 UTC+0 / UTC+8</string>
|
||||||
|
<string name="tip_5_detail">用量詳情頁頂部可切換 UTC+0 / UTC+8,圖表標籤會跟隨切換。</string>
|
||||||
|
<string name="tip_6_title">CCGO 清除並重新同步</string>
|
||||||
|
<string name="tip_6_hint">CCGO 詳情頁可清除快取重新同步</string>
|
||||||
|
<string name="tip_6_detail">CCGO 用量詳情頁右上角「清除」可刪除本地快取並重新拉取全部數據。</string>
|
||||||
|
<string name="tip_7_title">檢視用量詳情</string>
|
||||||
|
<string name="tip_7_hint">服務卡片底部可進入用量圖表</string>
|
||||||
|
<string name="tip_7_detail">有憑據的服務卡片底部會出現「檢視用量詳情」入口,點選進入圖表統計。</string>
|
||||||
|
<string name="tip_8_title">原始數據瀏覽</string>
|
||||||
|
<string name="tip_8_hint">用量詳情頁右上角可檢視原始記錄</string>
|
||||||
|
<string name="tip_8_detail">用量詳情頁右上角「詳細數據」可檢視每條原始呼叫記錄,支援分頁跳轉。</string>
|
||||||
|
<string name="tip_9_title">下拉重新整理聯動用量</string>
|
||||||
|
<string name="tip_9_hint">下拉重新整理會同步餘額和用量</string>
|
||||||
|
<string name="tip_9_detail">首頁下拉重新整理不僅重新整理餘額,還會自動同步 OCGO / CCGO 用量記錄。</string>
|
||||||
|
<string name="tip_10_title">憑據獲取教程</string>
|
||||||
|
<string name="tip_10_hint">憑據頁底部有獲取教程</string>
|
||||||
|
<string name="tip_10_detail">憑據編輯頁底部的「如何獲取」按鈕有針對每個服務的詳細操作步驟。</string>
|
||||||
|
<string name="tip_11_title">剪貼簿自動匯入</string>
|
||||||
|
<string name="tip_11_hint">Codex 支援從剪貼簿一鍵匯入</string>
|
||||||
|
<string name="tip_11_detail">Codex 憑據頁支援「從剪貼簿自動匯入」,貼上 auth.json 後一鍵填入。</string>
|
||||||
|
<string name="tip_12_title">詳細數據頁碼跳轉</string>
|
||||||
|
<string name="tip_12_hint">原始數據頁可輸入頁碼直跳</string>
|
||||||
|
<string name="tip_12_detail">原始數據頁底部可輸入頁碼直接跳轉,數據量大時不必逐頁翻。</string>
|
||||||
|
<string name="tip_13_title">小工具自動重新整理</string>
|
||||||
|
<string name="tip_13_hint">劃到小工具會自動重新整理餘額</string>
|
||||||
|
<string name="tip_13_detail">桌面小工具劃到負一屏時會自動重新整理餘額,也可手動點 ↻ 按鈕重新整理。</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 图表/明细(B 组迁移) ══════════ -->
|
||||||
|
<string name="count_times">%1$d次</string>
|
||||||
|
<string name="date_select_day">選擇日期</string>
|
||||||
|
<string name="date_select_month">選擇月份(任意一天)</string>
|
||||||
|
<string name="date_pick_start">開始日期</string>
|
||||||
|
<string name="date_pick_end">結束日期</string>
|
||||||
|
<string name="chart_detail_cost">消費明細</string>
|
||||||
|
<string name="chart_detail_requests">呼叫次數明細</string>
|
||||||
|
<string name="chart_detail_tokens">Token 明細</string>
|
||||||
|
<string name="dialog_clear_title">清除數據</string>
|
||||||
|
<string name="dialog_clear_body">此操作將清除所有 CommandCode 用量本地快取並重新同步,需要幾秒鐘完成。</string>
|
||||||
|
<string name="dialog_clear_confirm_question">是否繼續?</string>
|
||||||
|
<string name="action_confirm_countdown">確認(%1$ds)</string>
|
||||||
|
<string name="action_confirm_clear">確認清除</string>
|
||||||
|
<string name="action_close">關閉</string>
|
||||||
|
<string name="range_from">從 %1$s</string>
|
||||||
|
<string name="range_to">至 %1$s</string>
|
||||||
|
<string name="action_apply_custom_range">應用自定義範圍</string>
|
||||||
|
<string name="action_confirm">確定</string>
|
||||||
|
<string name="date_end_before_start">結束日期不能早於開始日期 %1$s</string>
|
||||||
|
<string name="time_hm">時間 %1$s:%2$s</string>
|
||||||
|
<string name="common_no_data">暫無數據</string>
|
||||||
|
<string name="chart_total_label">合計: %1$s</string>
|
||||||
|
<string name="usage_total">總計</string>
|
||||||
|
<string name="usage_records">記錄數</string>
|
||||||
|
<string name="stat_cache_read">快取讀取</string>
|
||||||
|
<string name="stat_cache_write">快取寫入</string>
|
||||||
|
<string name="usage_cache_breakdown">快取 Token 細分</string>
|
||||||
|
<string name="usage_cache_read_note">※ 快取讀取已計入「輸入 Token」</string>
|
||||||
|
<string name="usage_calls">%1$d 次呼叫</string>
|
||||||
|
<string name="date_format_md">MM月dd日 EEEE</string>
|
||||||
|
<string name="daily_count_cost">%1$d 次 · $%2$s</string>
|
||||||
|
<string name="raw_record_title">原始數據</string>
|
||||||
|
<string name="stat_cache_write_5m">快取寫入(5m)</string>
|
||||||
|
<string name="stat_cache_write_1h">快取寫入(1h)</string>
|
||||||
|
<string name="raw_cost_usd">成本(USD)</string>
|
||||||
|
<string name="raw_cost_raw">成本(Raw)</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 凭据编辑(C 组迁移) ══════════ -->
|
||||||
|
<string name="help_codex_4"> ~/.config/codex-oauth-proxy/auth.json</string>
|
||||||
|
<string name="help_codex_5">3. 用文字編輯器開啟該檔案,</string>
|
||||||
|
<string name="help_codex_6"> 複製全部內容貼上到上方輸入框</string>
|
||||||
|
<string name="help_codex_7"> JSON 格式示例:</string>
|
||||||
|
<string name="help_codex_8"> {"tokens": {</string>
|
||||||
|
<string name="help_codex_9"> "access_token": "...",</string>
|
||||||
|
<string name="help_codex_10"> "refresh_token": "...",</string>
|
||||||
|
<string name="help_codex_11"> "expiresAt": 1783727108252</string>
|
||||||
|
<string name="help_codex_12"> }}</string>
|
||||||
|
<string name="help_codex_note">提示:匯入後 APP 會自動重新整理 token,</string>
|
||||||
|
<string name="help_codex_note2">不需要手動更新。</string>
|
||||||
|
<string name="credential_title_ollama">Ollama Pro 憑據</string>
|
||||||
|
<string name="credential_hint_ollama">需要從瀏覽器複製完整 Cookie。登入 ollama.com/settings 後,在 DevTools → Network → 請求頭裡找到 Cookie 行複製。</string>
|
||||||
|
<string name="credential_update">更新憑據</string>
|
||||||
|
<string name="credential_save">儲存憑據</string>
|
||||||
|
<string name="action_test_and_save">測試並儲存</string>
|
||||||
|
<string name="action_open_ollama_settings">在瀏覽器中開啟 Ollama Settings</string>
|
||||||
|
<string name="action_copy_login_url">複製登入 URL 到剪貼簿</string>
|
||||||
|
<string name="activate_api_key_optional">一鍵啟用用量 API Key(可選)</string>
|
||||||
|
<string name="hint_ollama_trigger_key">填入 Ollama Cloud API Key 後,可在詳情頁一鍵傳送請求啟用用量統計。從 ollama.com/settings → API Keys 獲取。</string>
|
||||||
|
<string name="placeholder_ollama_api_key">ollama-xxx 或 sk-xxx</string>
|
||||||
|
<string name="action_save_api_key">儲存 API Key</string>
|
||||||
|
<string name="credential_title_opencode_go">OpenCode Go 憑據</string>
|
||||||
|
<string name="credential_hint_opencode_go">需要 auth cookie + workspaceId 兩個值。APP 會用 OkHttp 抓 dashboard 並自動解析 5h/周/月 三檔用量。</string>
|
||||||
|
<string name="action_import_from_clipboard">從剪貼簿自動匯入</string>
|
||||||
|
<string name="placeholder_workspace_id">dashboard URL 中的 {id} 段</string>
|
||||||
|
<string name="field_auth_cookie_value">auth Cookie 值</string>
|
||||||
|
<string name="placeholder_auth_cookie">F12 → Cookies → opencode.ai → auth 的 Value</string>
|
||||||
|
<string name="action_how_get_two_values">如何獲取這兩個值?</string>
|
||||||
|
<string name="action_open_login_entry">在瀏覽器中開啟登入入口</string>
|
||||||
|
<string name="hint_opencode_trigger_key">填入 OpenCode Zen API Key 後,可在詳情頁一鍵傳送請求啟用用量統計。從 opencode.ai/settings → API Keys 獲取。</string>
|
||||||
|
<string name="credential_title_ccgo">CommandCode Go 憑據</string>
|
||||||
|
<string name="credential_hint_ccgo">需要 API Key(拉餘額)。Session Cookie(可選)在瀏覽器 DevTools 複製,用於拉用量記錄。不填也可正常檢視餘額。</string>
|
||||||
|
<string name="placeholder_api_key_from_settings">從 Settings → API Keys 生成</string>
|
||||||
|
<string name="field_session_cookie_optional">Session Cookie(可選)</string>
|
||||||
|
<string name="placeholder_session_cookie">F12 → Cookies → commandcode.ai → 全選複製貼上即可</string>
|
||||||
|
<string name="action_how_get_api_key_cookie">如何獲取 API Key 和 Cookie?</string>
|
||||||
|
<string name="api_key_form_title">請輸入 API Key</string>
|
||||||
|
<string name="api_key_form_hint">憑據會使用 Android Keystore (AES-256 GCM) 加密後儲存到本機 DataStore。</string>
|
||||||
|
<string name="action_update">更新</string>
|
||||||
|
<string name="credential_title_codex">Codex / ChatGPT Plus 憑據</string>
|
||||||
|
<string name="credential_hint_codex">推薦使用 OAuth 登入自動獲取憑據。也可手動貼上 auth.json 內容。</string>
|
||||||
|
<string name="action_oauth_login">🔐 OAuth 登入(推薦)</string>
|
||||||
|
<string name="or_manual_import">── 或手動匯入 ──</string>
|
||||||
|
<string name="field_auth_json">auth.json 完整內容</string>
|
||||||
|
<string name="placeholder_auth_json">貼上 {"tokens": {...}} 完整 JSON</string>
|
||||||
|
<string name="credential_import_save">匯入並儲存</string>
|
||||||
|
<string name="action_how_get_auth_json">如何獲取 auth.json?</string>
|
||||||
|
<string name="manual_cookie_title">貼上登入態</string>
|
||||||
|
<string name="manual_cookie_hint">Google OAuth 會拒絕 APP 內建 WebView,所以請用瀏覽器登入後把 Cookie 粘到這裡。</string>
|
||||||
|
<string name="field_cookie_string">Cookie 字串</string>
|
||||||
|
<string name="action_save_cookie">儲存 Cookie</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 服务详情/凭据校验(D 组迁移) ══════════ -->
|
||||||
|
<string name="error_parse_failed">數據解析失敗: %1$s</string>
|
||||||
|
<string name="window_every_week">每週</string>
|
||||||
|
<string name="msg_model_call_count">模型呼叫次數</string>
|
||||||
|
<string name="msg_stale_cache">快取數據 · %1$s</string>
|
||||||
|
<string name="msg_showing_last_balance">顯示的是上次成功獲取的餘額</string>
|
||||||
|
<string name="msg_monthly_spent">本月消費 %1$s%2$s</string>
|
||||||
|
<string name="msg_balance_breakdown">餘額構成</string>
|
||||||
|
<string name="msg_granted_balance">贈送餘額</string>
|
||||||
|
<string name="msg_topped_up_balance">自費充值</string>
|
||||||
|
<string name="msg_loading_models">載入模型列表...</string>
|
||||||
|
<string name="msg_select_model">選擇模型</string>
|
||||||
|
<string name="action_refresh_models">重新整理模型列表</string>
|
||||||
|
<string name="msg_triggering">啟用中...</string>
|
||||||
|
<string name="action_retry_trigger">重試啟用用量</string>
|
||||||
|
<string name="action_trigger_usage">⚡ 一鍵啟用用量</string>
|
||||||
|
<string name="action_refresh_balance">重新整理餘額</string>
|
||||||
|
<string name="action_relogin">重新登入</string>
|
||||||
|
<string name="action_configure_credential">配置憑據</string>
|
||||||
|
<string name="main_card_current_balance">當前餘額</string>
|
||||||
|
<string name="main_card_5h_usage">5h 實時用量</string>
|
||||||
|
<string name="main_card_monthly_balance">月度餘額</string>
|
||||||
|
<string name="main_card_session_usage">Session 用量</string>
|
||||||
|
<string name="msg_please_select_model">請選擇模型</string>
|
||||||
|
<string name="trigger_error_detail">錯誤詳情:</string>
|
||||||
|
<string name="trigger_api_response">API 響應內容:</string>
|
||||||
|
<string name="action_copy">複製</string>
|
||||||
|
<string name="msg_key_length">*** (長度 %1$d) ***</string>
|
||||||
|
<string name="msg_key_masked">%1$s***%2$s (長度 %3$d)</string>
|
||||||
|
<string name="error_cookie_format">Cookie 格式錯誤,應為 name1=value1; name2=value2</string>
|
||||||
|
<string name="msg_cookies_saved">已儲存 %1$d 個 Cookie</string>
|
||||||
|
<string name="error_auth_json_empty">請貼上 auth.json 內容</string>
|
||||||
|
<string name="error_auth_json_missing_tokens">auth.json 缺少 access_token 或 refresh_token</string>
|
||||||
|
<string name="msg_codex_saved">已儲存 Codex 憑據,token 到期後會自動重新整理</string>
|
||||||
|
<string name="error_auth_json_parse">解析失敗:%1$s</string>
|
||||||
|
<string name="msg_connect_success_dollar">連線成功!餘額: $%1$s</string>
|
||||||
|
<string name="msg_api_key_saved">API Key 已儲存</string>
|
||||||
|
<string name="msg_connect_success_session">連線成功!Session: %1$s%% · %2$s</string>
|
||||||
|
<string name="msg_credential_deleted">憑據已刪除</string>
|
||||||
|
<string name="error_clipboard_empty">剪貼簿為空</string>
|
||||||
|
<string name="msg_clipboard_ws_auth">已識別 workspaceId 和 auth cookie</string>
|
||||||
|
<string name="msg_clipboard_ws_only">已識別 workspaceId,請再貼上 auth cookie</string>
|
||||||
|
<string name="msg_clipboard_auth_only">已識別 auth cookie,請再貼上 workspaceId</string>
|
||||||
|
<string name="error_clipboard_none">未識別到有效憑據</string>
|
||||||
|
|
||||||
|
<!-- ══════════ Codex OAuth 登录页 ══════════ -->
|
||||||
|
<string name="oauth_screen_title">Codex OAuth 登入</string>
|
||||||
|
<string name="oauth_exchanging">正在交換 Token...</string>
|
||||||
|
<string name="action_retry">重試</string>
|
||||||
|
<string name="oauth_headless_title">無頭模式登入</string>
|
||||||
|
<string name="oauth_steps">1. 點選「在瀏覽器中開啟」或複製下方連結到瀏覽器\n2. 在 OpenAI 頁面完成登入和授權\n3. 瀏覽器會跳轉到一個 localhost 地址(頁面打不開是正常的)\n4. 複製瀏覽器位址列的完整 URL 貼上到下方輸入框\n5. 點選「提交回撥 URL」</string>
|
||||||
|
<string name="oauth_auth_url_label">授權連結</string>
|
||||||
|
<string name="action_open_in_browser">在瀏覽器中開啟</string>
|
||||||
|
<string name="action_copy_link">複製連結</string>
|
||||||
|
<string name="oauth_paste_callback_hint">── 登入後貼上回撥 URL ──</string>
|
||||||
|
<string name="oauth_callback_url_label">回撥 URL</string>
|
||||||
|
<string name="oauth_callback_url_placeholder">http://localhost:1455/auth/callback?code=...</string>
|
||||||
|
<string name="action_submit_callback">提交回撥 URL</string>
|
||||||
|
<string name="action_regenerate_link">重新生成授權連結</string>
|
||||||
|
<string name="oauth_preparing">正在準備授權...</string>
|
||||||
|
</resources>
|
||||||
@ -1,14 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<!-- ══════════ 品牌资源(translatable=false,所有语言共用,不参与翻译) ══════════ -->
|
<!-- ══════════ 品牌资源(translatable=false,所有语言共用,不参与翻译) ══════════ -->
|
||||||
<string name="app_name" translatable="false">雨晴Token</string>
|
<string name="brand_token" translatable="false">RainyToken</string>
|
||||||
<string name="widget_brand" translatable="false">雨晴喵</string>
|
<string name="dashboard_footer_version" translatable="false">RainyToken · v1.0</string>
|
||||||
<string name="brand_token" translatable="false">RainyToken</string>
|
|
||||||
<string name="dashboard_footer_version" translatable="false">RainyToken · v1.0</string>
|
|
||||||
|
|
||||||
<!-- ══════════ 小组件名称/描述 ══════════ -->
|
<!-- ══════════ 应用名称(跟随语言:中文系统显示中文名,其他显示英文名) ══════════ -->
|
||||||
|
<string name="app_name">RainyToken</string>
|
||||||
|
|
||||||
|
<!-- ══════════ 小组件名称/描述/署名 ══════════ -->
|
||||||
<string name="widget_name">AI Usage Panel</string>
|
<string name="widget_name">AI Usage Panel</string>
|
||||||
<string name="widget_description">OpenCode Go usage + DeepSeek balance, auto-refresh</string>
|
<string name="widget_description">OpenCode Go usage + DeepSeek balance, auto-refresh</string>
|
||||||
|
<string name="widget_brand">Rainy</string>
|
||||||
|
|
||||||
<!-- ══════════ 通用动作 ══════════ -->
|
<!-- ══════════ 通用动作 ══════════ -->
|
||||||
<string name="action_back">Back</string>
|
<string name="action_back">Back</string>
|
||||||
@ -24,6 +26,12 @@
|
|||||||
<string name="action_prev_page">◀ Prev</string>
|
<string name="action_prev_page">◀ Prev</string>
|
||||||
<string name="action_next_page">Next ▶</string>
|
<string name="action_next_page">Next ▶</string>
|
||||||
<string name="action_add_widget">Add widget to home screen</string>
|
<string name="action_add_widget">Add widget to home screen</string>
|
||||||
|
<string name="title_language">Language</string>
|
||||||
|
<string name="dialog_language_title">Select language</string>
|
||||||
|
<string name="app_locale_follow_system">Follow system</string>
|
||||||
|
<string name="app_locale_zh">简体中文</string>
|
||||||
|
<string name="app_locale_zh_hant">繁體中文</string>
|
||||||
|
<string name="app_locale_en">English</string>
|
||||||
<string name="action_view_detail">View details</string>
|
<string name="action_view_detail">View details</string>
|
||||||
<string name="action_view_usage_detail">View usage details</string>
|
<string name="action_view_usage_detail">View usage details</string>
|
||||||
<string name="action_view_raw_data">Raw data</string>
|
<string name="action_view_raw_data">Raw data</string>
|
||||||
@ -114,8 +122,8 @@
|
|||||||
<string name="window_5h_short">5h</string>
|
<string name="window_5h_short">5h</string>
|
||||||
<string name="window_5h_usage">5h usage</string>
|
<string name="window_5h_usage">5h usage</string>
|
||||||
<string name="window_5h_rolling">5-hour rolling</string>
|
<string name="window_5h_rolling">5-hour rolling</string>
|
||||||
<string name="window_weekly">This week</string>
|
<string name="window_weekly">Week</string>
|
||||||
<string name="window_monthly">This month</string>
|
<string name="window_monthly">Month</string>
|
||||||
<string name="window_every_month">Monthly</string>
|
<string name="window_every_month">Monthly</string>
|
||||||
<string name="window_usage">Usage</string>
|
<string name="window_usage">Usage</string>
|
||||||
<string name="usage_window_title">Usage window%1$s</string>
|
<string name="usage_window_title">Usage window%1$s</string>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user