关于 gplay-subscription-localization
gplay-subscription-localization 是使用 gplay 命令行管理 Google Play 订阅本地化信息的技能。它涵盖批量更新、翻译流程、地区检查与结果验证,并避免改动其他订阅配置。
主要功能
- 01跨地区创建或更新订阅信息
- 02导出并导入翻译后的信息
- 03检查应用支持的地区
- 04仅更新信息而不改基础方案
- 05验证批量更新结果
适用场景
- 01为应用上线本地化订阅
- 02为现有订阅信息应用翻译
- 03更新多个订阅产品
- 04更改后确认信息覆盖的地区
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tamtom/ gplay-cli-skills --skill gplay-subscription-localization安装后在 Claude Code 中输入/gplay-subscription-localization确认已加载。
详细介绍
Google Play 订阅本地化
使用此技能可批量创建或更新所有 Google Play 支持的语言区域中的订阅显示名称、说明和权益。这样就不必再在 Play Console 中逐一手动编辑每种语言。
前提条件
- 已配置身份验证(
gplay auth login或GPLAY_SERVICE_ACCOUNT环境变量)。 - 已知软件包名称(
--package或GPLAY_PACKAGE)。 - 已创建订阅商品(请先使用
gplay subscriptions create)。 - 服务账号具有“编辑和管理您的应用”权限。
Google Play 支持的语言区域
以下是 Google Play 订阅商品信息支持的语言区域:
af, am, ar, hy-AM, az-AZ, eu-ES, be, bn-BD, bg, my-MM, ca,
zh-HK, zh-CN, zh-TW, hr, cs-CZ, da-DK, nl-NL, en-AU, en-CA,
en-GB, en-IN, en-SG, en-US, en-ZA, et, fil, fi-FI, fr-CA,
fr-FR, gl-ES, ka-GE, de-DE, el-GR, gu, he-IL, hi-IN, hu-HU,
is-IS, id, it-IT, ja-JP, kn-IN, kk, km-KH, ko-KR, ky-KG,
lo-LA, lv, lt, mk-MK, ms, ms-MY, ml-IN, mr-IN, mn-MN, ne-NP,
no-NO, fa, pl-PL, pt-BR, pt-PT, pa, ro, rm, ru-RU, sr, si-LK,
sk, sl, es-419, es-ES, es-US, sw, sv-SE, ta-IN, te-IN, th,
tr-TR, uk, ur, vi, zu
验证您的应用已支持哪些语言区域:
EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id')
gplay listings list --package com.example.app --edit $EDIT_ID --output table
Google Play 中的订阅结构
Google Play 订阅采用分层结构:
- 订阅:商品本身(例如“高级版”)
- 商品信息:每种语言区域对应的本地化显示名称、说明和权益
- 基础方案:定价层级(例如“按月”“按年”)
- 优惠:基础方案的促销定价(试用期、入门价)
商品信息在订阅级别设置,并适用于该订阅下的所有基础方案。
工作流:批量本地化订阅
1. 列出已有订阅
gplay subscriptions list --package com.example.app --paginate --output table
2. 获取当前订阅详情
gplay subscriptions get \
--package com.example.app \
--product-id premium_monthly \
--output json --pretty
响应中包含一个以语言区域为键的 listings 对象:
{
"productId": "premium_monthly",
"listings": {
"en-US": {
"title": "Premium Monthly",
"benefits": ["Unlimited access", "No ads"],
"description": "Get premium access to all features"
}
}
}
3. 准备多语言区域商品信息 JSON
创建一个包含所有目标语言区域商品信息的 JSON 文件:
subscription-listings.json:
{
"listings": {
"en-US": {
"title": "Premium Monthly",
"benefits": ["Unlimited access", "No ads", "Priority support"],
"description": "Get premium access to all features every month."
},
"de-DE": {
"title": "Premium Monatlich",
"benefits": ["Unbegrenzter Zugang", "Keine Werbung", "Prioritäts-Support"],
"description": "Erhalten Sie jeden Monat Premium-Zugang zu allen Funktionen."
},
"fr-FR": {
"title": "Premium Mensuel",
"benefits": ["Accès illimité", "Sans publicité", "Support prioritaire"],
"description": "Accédez à toutes les fonctionnalités premium chaque mois."
},
"es-ES": {
"title": "Premium Mensual",
"benefits": ["Acceso ilimitado", "Sin anuncios", "Soporte prioritario"],
"description": "Obtén acceso premium a todas las funciones cada mes."
},
"ja-JP": {
"title": "プレミアム月額",
"benefits": ["無制限アクセス", "広告なし", "優先サポート"],
"description": "毎月すべての機能にプレミアムアクセスできます。"
},
"ko-KR": {
"title": "프리미엄 월간",
"benefits": ["무제한 액세스", "광고 없음", "우선 지원"],
"description": "매달 모든 기능에 프리미엄 액세스를 받으세요."
},
"pt-BR": {
"title": "Premium Mensal",
"benefits": ["Acesso ilimitado", "Sem anúncios", "Suporte prioritário"],
"description": "Tenha acesso premium a todos os recursos todos os meses."
},
"zh-CN": {
"title": "高级月度订阅",
"benefits": ["无限访问", "无广告", "优先支持"],
"description": "每月获得所有功能的高级访问权限。"
}
}
}
4. 使用所有商品信息更新订阅
gplay subscriptions update \
--package com.example.app \
--product-id premium_monthly \
--json @subscription-listings.json \
--update-mask listings
--update-mask listings 可确保只修改商品信息字段,不更改基础方案及其他配置。
5. 验证
gplay subscriptions get \
--package com.example.app \
--product-id premium_monthly \
--output json --pretty
检查 listings 对象中是否包含所有语言区域。
工作流:导出、翻译、导入
1. 导出当前订阅数据
gplay subscriptions get \
--package com.example.app \
--product-id premium_monthly \
--output json --pretty > subscription-export.json
2. 提取待翻译的商品信息
使用 jq 提取商品信息:
jq '.listings' subscription-export.json > listings-to-translate.json
3. 发送翻译
将 listings-to-translate.json 发送给您的翻译服务或团队。其结构简单,每种语言区域对应一组键值对。
4. 将翻译后的商品信息合并回来
收到翻译后,生成更新 JSON:
jq -n --slurpfile translations translated-listings.json \
'{ listings: $translations[0] }' > subscription-update.json
5. 导入翻译后的商品信息
gplay subscriptions update \
--package com.example.app \
--product-id premium_monthly \
--json @subscription-update.json \
--update-mask listings
工作流:批量本地化应用中的所有订阅
#!/bin/bash
# bulk-localize-subscriptions.sh
PACKAGE="com.example.app"
LISTINGS_FILE="subscription-listings.json"
# Get all subscription product IDs
PRODUCT_IDS=$(gplay subscriptions list \
--package "$PACKAGE" \
--paginate | jq -r '.[].productId')
for PRODUCT_ID in $PRODUCT_IDS; do
echo "Updating listings for: $PRODUCT_ID"
gplay subscriptions update \
--package "$PACKAGE" \
--product-id "$PRODUCT_ID" \
--json "@$LISTINGS_FILE" \
--update-mask listings
echo "Done: $PRODUCT_ID"
done
echo "All subscriptions updated."
对于显示名称各不相同的订阅,请使用各商品对应的 JSON 文件:
for PRODUCT_ID in $PRODUCT_IDS; do
LISTINGS_FILE="listings/${PRODUCT_ID}.json"
if [ -f "$LISTINGS_FILE" ]; then
gplay subscriptions update \
--package "$PACKAGE" \
--product-id "$PRODUCT_ID" \
--json "@$LISTINGS_FILE" \
--update-mask listings
else
echo "Warning: No listings file for $PRODUCT_ID, skipping."
fi
done
工作流:本地化订阅的基础方案和优惠
在一次调用中创建包含本地化商品信息和基础方案的新订阅:
gplay subscriptions create \
--package com.example.app \
--product-id premium_yearly \
--json @full-subscription.json
full-subscription.json:
{
"productId": "premium_yearly",
"listings": {
"en-US": {
"title": "Premium Yearly",
"benefits": ["Unlimited access", "No ads", "2 months free"],
"description": "Save with annual premium access."
},
"de-DE": {
"title": "Premium Jährlich",
"benefits": ["Unbegrenzter Zugang", "Keine Werbung", "2 Monate gratis"],
"description": "Sparen Sie mit jährlichem Premium-Zugang."
},
"fr-FR": {
"title": "Premium Annuel",
"benefits": ["Accès illimité", "Sans publicité", "2 mois offerts"],
"description": "Économisez avec l'accès premium annuel."
},
"ja-JP": {
"title": "プレミアム年間",
"benefits": ["無制限アクセス", "広告なし", "2ヶ月無料"],
"description": "年間プレミアムアクセスでお得に。"
}
},
"basePlans": [
{
"basePlanId": "yearly",
"state": "ACTIVE",
"autoRenewingBasePlanType": {
"billingPeriodDuration": "P1Y",
"gracePeriodDuration": "P7D",
"resubscribeState": "RESUBSCRIBE_STATE_ACTIVE",
"prorationMode": "CHARGE_ON_NEXT_BILLING_DATE"
},
"regionalConfigs": [
{
"regionCode": "US",
"price": {
"currencyCode": "USD",
"units": "49",
"nanos": 990000000
}
}
]
}
]
}
工作流:本地化优惠标签
优惠支持本地化的 offerTags,可用于在应用中显示:
gplay offers update \
--package com.example.app \
--product-id premium_monthly \
--base-plan-id monthly \
--offer-id free_trial_7d \
--json @offer-update.json
offer-update.json:
{
"offerTags": [
{"tag": "free-trial"},
{"tag": "7-days"}
]
}
注意:Google Play API 中的优惠标签不区分语言区域。它们是开发者定义的标识符,用于在应用中进行筛选。请在应用代码中本地化面向用户的优惠标签文本,而不要在 Play Console 中本地化。
验证语言区域代码
检查您的应用已有商店商品信息的语言区域:
EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id')
gplay listings list --package com.example.app --edit $EDIT_ID --output table
此命令会列出所有包含商店商品信息的语言区域。您的订阅商品信息至少应覆盖这些相同的语言区域。
查看某个商品信息支持的完整语言区域列表:
gplay listings list --package com.example.app --edit $EDIT_ID \
| jq -r '.[].language'
JSON 模板:最简多语言区域订阅
复制并自定义此模板,快速完成本地化:
{
"listings": {
"en-US": { "title": "TITLE_EN", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_EN" },
"de-DE": { "title": "TITLE_DE", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_DE" },
"fr-FR": { "title": "TITLE_FR", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_FR" },
"es-ES": { "title": "TITLE_ES", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_ES" },
"it-IT": { "title": "TITLE_IT", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_IT" },
"ja-JP": { "title": "TITLE_JA", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_JA" },
"ko-KR": { "title": "TITLE_KO", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_KO" },
"pt-BR": { "title": "TITLE_PT_BR", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_PT_BR" },
"ru-RU": { "title": "TITLE_RU", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_RU" },
"zh-CN": { "title": "TITLE_ZH_CN", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_ZH_CN" },
"zh-TW": { "title": "TITLE_ZH_TW", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_ZH_TW" },
"ar": { "title": "TITLE_AR", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_AR" },
"hi-IN": { "title": "TITLE_HI", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_HI" },
"tr-TR": { "title": "TITLE_TR", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_TR" },
"pl-PL": { "title": "TITLE_PL", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_PL" },
"nl-NL": { "title": "TITLE_NL", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_NL" },
"sv-SE": { "title": "TITLE_SV", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_SV" },
"th": { "title": "TITLE_TH", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_TH" },
"vi": { "title": "TITLE_VI", "benefits": ["BENEFIT_1", "BENEFIT_2"], "description": "DESC_VI" }
}
}
Agent 行为
- 进行更改前,始终列出已有订阅及其当前的商品信息。
- 仅更新本地化元数据时,使用
--update-mask listings,以避免覆盖基础方案或定价。 - 用户只提供一个显示名称时,所有地区都使用该名称(各地名称相同)。
- 用户按地区提供了翻译后的名称时,各地区使用对应的名称。
- 如果提供了权益或描述,则将其包含在内。否则,在 JSON 中省略。
- 验证时使用
--output table,以便用户直观确认。 - 中间自动化步骤使用默认 JSON 输出。
- 批量更新后,始终获取订阅以验证是否完整。
- 如果更新失败,记录产品 ID 和错误,然后继续处理剩余订阅。最后汇总报告所有失败项。
- 运行命令前,始终使用
--help确认确切的标志。
注意事项
- 订阅商品信息会按订阅原子性地更新:一次
update调用即可一次性设置所有地区。 - 与 App Store Connect 不同,Google Play 不要求按地区分别调用创建命令。商品信息对象是一个独立的 JSON 字段。
--update-mask标志至关重要:若不使用,更新调用可能会覆盖基础方案和定价。- 标题最长为 55 个字符。权益最多 4 项。描述最长为 80 个字符。
- 在列表命令中使用
--paginate,确保返回所有订阅。 - 检查 JSON 输出时使用
--pretty,以便于人工阅读。 - 始终使用
--help验证确切命令的标志。