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:
WaterRain 2026-08-01 13:43:05 +00:00
parent 13acca37ed
commit 4107954080
No known key found for this signature in database
7 changed files with 1168 additions and 7 deletions

View File

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

View File

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

View File

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

View 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)
}
}

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

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

View File

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