diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 66751c3..5281277 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -16,8 +16,8 @@ android {
applicationId = "com.rainy.token"
minSdk = 31
targetSdk = 35
- versionCode = 37
- versionName = "1.7.17"
+ versionCode = 38
+ versionName = "1.7.18"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
diff --git a/app/src/main/java/com/rainy/token/data/repository/TraeRepository.kt b/app/src/main/java/com/rainy/token/data/repository/TraeRepository.kt
index 2f43437..a3d2f74 100644
--- a/app/src/main/java/com/rainy/token/data/repository/TraeRepository.kt
+++ b/app/src/main/java/com/rainy/token/data/repository/TraeRepository.kt
@@ -211,7 +211,7 @@ class TraeRepository constructor(
}
}
}
- if (packCount > 0) {
+ if (packCount > 0 && !isDollarBilling) {
extras["pack_count"] = packCount.toString()
extras["general_credits"] = trimNum(generalSum)
extras["work_credits"] = trimNum(workSum)
diff --git a/app/src/main/java/com/rainy/token/ui/servicedetail/ServiceDetailScreen.kt b/app/src/main/java/com/rainy/token/ui/servicedetail/ServiceDetailScreen.kt
index 473674a..72e490b 100644
--- a/app/src/main/java/com/rainy/token/ui/servicedetail/ServiceDetailScreen.kt
+++ b/app/src/main/java/com/rainy/token/ui/servicedetail/ServiceDetailScreen.kt
@@ -235,9 +235,12 @@ fun ServiceDetailScreen(
item { OllamaUsageCard(uiState.state) }
}
ServiceType.TRAE -> {
- // 每日签到卡;未配置凭据时展示引导卡,避免暴露必然失败的签到按钮
+ // 每日签到卡;未配置凭据时展示引导卡,国际版无签到则展示说明卡
item {
- if (uiState.hasCredential) {
+ val intl = uiState.region != null && uiState.region.equals("INTL", ignoreCase = true)
+ if (intl) {
+ TraeIntlNoCheckinCard()
+ } else if (uiState.hasCredential) {
CheckinCard(
state = checkinState,
todayCheckedIn = checkinInfo?.todayCheckedIn == true,
@@ -1504,6 +1507,26 @@ internal fun TraeAccountInfoCard(state: State) {
extras["pack_count"]?.toIntOrNull()?.takeIf { it > 0 }?.let {
add(stringResource(R.string.extra_label_pack_count) to it.toString())
}
+ if (extras["billing_mode"] == "dollar") {
+ extras["intl.plan_name"]?.let {
+ add(stringResource(R.string.trae_intl_plan_title) to it)
+ }
+ extras["intl.premium_fast_limit"]?.let {
+ add(stringResource(R.string.trae_intl_premium_fast_title) to "$it " + stringResource(R.string.trae_intl_quota_unit))
+ }
+ extras["intl.premium_slow_limit"]?.let {
+ add(stringResource(R.string.trae_intl_premium_slow_title) to "$it " + stringResource(R.string.trae_intl_quota_unit))
+ }
+ extras["intl.advanced_limit"]?.let {
+ add(stringResource(R.string.trae_intl_advanced_title) to "$it " + stringResource(R.string.trae_intl_quota_unit))
+ }
+ extras["intl.auto_completion_limit"]?.let {
+ add(stringResource(R.string.trae_intl_auto_completion_title) to "$it " + stringResource(R.string.trae_intl_quota_unit))
+ }
+ extras["intl.basic_used"]?.let {
+ add(stringResource(R.string.trae_intl_basic_used_title) to it)
+ }
+ }
// 计费方式:两个英文布尔键合并为一行自然语言
val billingLabel = when {
extras["is_credits_billing"] == "true" -> stringResource(R.string.extra_value_billing_credits)
@@ -1531,6 +1554,29 @@ internal fun TraeAccountInfoCard(state: State) {
*
* 旧缓存无 wb_detail_raw 时回退为「资源 #007」简化行。无任何数据时整卡不渲染。
*/
+@Composable
+private fun TraeIntlNoCheckinCard() {
+ Card(
+ modifier = Modifier.fillMaxWidth(),
+ shape = RoundedCornerShape(20.dp),
+ colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface),
+ elevation = CardDefaults.cardElevation(defaultElevation = 0.dp)
+ ) {
+ Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(4.dp)) {
+ Text(
+ text = stringResource(R.string.trae_intl_no_checkin_title),
+ style = MaterialTheme.typography.titleSmall,
+ fontWeight = FontWeight.SemiBold
+ )
+ Text(
+ text = stringResource(R.string.trae_intl_no_checkin_desc),
+ style = MaterialTheme.typography.bodySmall,
+ color = MaterialTheme.colorScheme.outline
+ )
+ }
+ }
+}
+
@Composable
internal fun WorkBuddyResourcesCard(state: State) {
val balance = when (state) {
diff --git a/app/src/main/res/values-b+zh+Hans/strings.xml b/app/src/main/res/values-b+zh+Hans/strings.xml
index ef3fe77..abe73b2 100644
--- a/app/src/main/res/values-b+zh+Hans/strings.xml
+++ b/app/src/main/res/values-b+zh+Hans/strings.xml
@@ -798,4 +798,8 @@
自动补全
次/月
充值 / 升级
+ 套餐
+ 基础用量已用
+ 国际版没有每日签到
+ Trae 国际版按美元计费,使用月度请求额度,没有签到积分体系。
\ No newline at end of file
diff --git a/app/src/main/res/values-b+zh+Hant/strings.xml b/app/src/main/res/values-b+zh+Hant/strings.xml
index 2fe0e33..af27a3d 100644
--- a/app/src/main/res/values-b+zh+Hant/strings.xml
+++ b/app/src/main/res/values-b+zh+Hant/strings.xml
@@ -798,4 +798,8 @@
自動補全
次/月
儲值 / 升級
+ 套餐
+ 基礎用量已用
+ 國際版沒有每日簽到
+ Trae 國際版按美元計費,使用月度請求額度,沒有簽到積分體系。
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 749e51a..2ebfed2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -803,4 +803,8 @@
Auto completion
/mo
Upgrade / Top up
+ Plan
+ Basic usage used
+ International edition has no daily check-in
+ TRAE International uses USD billing with monthly request quotas instead of credit check-ins.
\ No newline at end of file