desktop: five sections by job (Release, Store page, Revenue, Players, Health), Game services view, sidebar by attention

- app view: 12 tabs become 5 sections, each with a header (what it is for, the one next step from state
  already read) and its sub views in a segmented control; 1-5 jump, Ctrl+Shift+[ ] cycle, Ctrl+K and the
  context menu list sections and sub views; old tab ids, section and section/sub links all resolve
- Players > Game services (games only): both stores, one row per leaderboard / achievement with its
  languages and each store's state, Game Center locale map, Play API-disabled state with the console plan
- games status --json: items, localeMap, playApiDisabled; inspect summary: games
- sidebar: apps grouped by attention / in progress / live / not on a store, one status line each, studio
  filter, workspace as a footer icon row
- boot check opens places like a person (section, then sub view)
This commit is contained in:
CRTkafa 2026-10-24 13:01:50 +08:00
parent 98cd1d3c92
commit 0ef27cf2e4
22 changed files with 918 additions and 115 deletions

View file

@ -2116,4 +2116,106 @@ export const en = {
'cm.copyPrincipal': "Service account / key",
'cm.copyProfile': "Profile name",
'cm.openAccounts': "Open Studios & accounts",
"sec.release": "Release",
"sec.store": "Store page",
"sec.revenue": "Revenue",
"sec.players": "Players",
"sec.health": "Health",
"sec.release.for": "Get a version to players on both stores: builds, TestFlight, review and rollout.",
"sec.store.for": "What people see on the store: texts per language, screenshots and app details.",
"sec.revenue.for": "What the app sells and for how much: in-app products, subscriptions and prices.",
"sec.players.for": "What players say, and for games what they can earn: reviews, Game Center, Play Games.",
"sec.health.for": "Is the app well and ready: crashes and ANRs, growth, checks to fix first, more tools.",
"sec.views": "{section} views",
"tab.games": "Game services",
"next.open": "Open {where}",
"next.rejected": "{version} was rejected on {store}",
"next.halted": "{version} is halted on {store}",
"next.blockers": "{count} blockers before submit",
"next.blockers_one": "1 blocker before submit",
"next.rollout": "{version} is rolling out at {share}",
"next.approved": "{version} is approved: release it",
"next.submit": "Submit {version} for review",
"next.review": "{version} is in review",
"next.managed": "{version} waits in Publishing overview (managed publishing)",
"next.upload": "Upload a first build",
"next.live": "Live: {version}",
"next.notRead": "Stores not read yet",
"next.storeLive": "The live store page, read from the stores",
"next.listingProblems": "{count} listing problems",
"next.listingProblems_one": "1 listing problem",
"next.unsaved": "{count} unsaved edits",
"next.unsaved_one": "1 unsaved edit",
"next.listingsUnread": "Listings not checked yet",
"next.storeOk": "Store page in step with the config",
"next.catalogDiff": "{count} products differ between the stores",
"next.catalogDiff_one": "1 product differs between the stores",
"next.noProducts": "No products yet: add one",
"next.products": "{products} products · {subs} subscriptions",
"next.reviews": "{count} reviews without a reply",
"next.reviews_one": "1 review without a reply",
"next.reviewsUnread": "Reviews not read yet",
"next.reviewsOk": "All reviews answered",
"next.gamesApiOff": "Play Games Services API is off",
"next.gamesBlockers": "{count} game services blockers",
"next.gamesBlockers_one": "1 game services blocker",
"next.gamesSync": "Game services: {count} changes to sync",
"next.gamesSync_one": "Game services: 1 change to sync",
"next.fixFirst": "{count} problems to fix first",
"next.fixFirst_one": "1 problem to fix first",
"next.warnings": "{count} warnings to look at",
"next.warnings_one": "1 warning to look at",
"next.healthOk": "No problems found",
"side.gAttention": "Needs attention",
"side.gProgress": "In progress",
"side.gLive": "Live",
"side.gDraft": "Not on a store yet",
"side.missing": "Folder missing",
"side.rejected": "Rejected · {what}",
"side.halted": "Halted · {what}",
"side.blockers": "{count} blockers",
"side.blockers_one": "1 blocker",
"side.rollout": "Rollout {share} · {what}",
"side.review": "In review · {what}",
"side.approved": "Approved · {what}",
"side.draft": "Draft · {what}",
"side.live": "Live · {version}",
"side.liveWarn": "Live · {version} · {count} warnings",
"side.liveWarn_one": "Live · {version} · 1 warning",
"side.storeOnly": "Store only · not read yet",
"side.notRead": "Not read yet",
"side.warnings": "{count} warnings",
"side.warnings_one": "1 warning",
"side.notOnStore": "No store version yet",
"side.ignored": "Ignored",
"side.studioFilter": "Show apps of a studio",
"side.allStudios": "All",
"games.keep": "In step",
"games.update": "Differs",
"games.create": "Missing",
"games.notOnStore": "Not on this store",
"games.notListed": "Not planned",
"games.notRead": "Not read",
"games.item": "Item",
"games.name": "Name",
"games.points": "Points",
"games.languages": "Languages",
"games.leaderboard": "Leaderboard",
"games.achievement": "Achievement",
"games.hidden": "hidden until earned",
"games.localeChanges": "Game Center languages: {list}",
"games.checkAgain": "Check again",
"games.apiOffTitle": "Play Games Services API is off.",
"games.apiOffText": "Turn on {api} in the service account's Google Cloud project, wait a minute, then check again.",
"games.itemsTitle": "Leaderboards and achievements",
"games.itemsSub": "One list in the config, mapped to both stores: each store's state against the config.",
"games.refresh": "Read again",
"games.noItems": "No leaderboards or achievements in the config yet (games.leaderboards, games.achievements).",
"games.notReadYet": "Reading game services…",
"games.images": "Images of leaderboards and achievements are added in the consoles; on Play the existing icon is kept on every sync.",
"games.localeMap": "Game Center locale map",
"games.localeMapSub": "Config language to the locale the live Game Center uses (games.localeMap).",
"games.mapSet": "Set",
"games.mapSuggested": "Suggested",
"games.mapHint": "Add to games.localeMap: {entries}",
} as const;

View file

@ -2118,4 +2118,106 @@ export const tr: Record<keyof typeof en, string> = {
'cm.copyPrincipal': "Hizmet hesabı / anahtar",
'cm.copyProfile': "Profil adı",
'cm.openAccounts': "Stüdyolar ve hesapları aç",
"sec.release": "Yayın",
"sec.store": "Mağaza sayfası",
"sec.revenue": "Gelir",
"sec.players": "Oyuncular",
"sec.health": "Sağlık",
"sec.release.for": "Bir sürümü iki mağazada oyunculara ulaştır: build, TestFlight, inceleme ve dağıtım.",
"sec.store.for": "Mağazada insanların gördüğü: dile göre metinler, ekran görüntüleri ve uygulama bilgileri.",
"sec.revenue.for": "Uygulamanın sattıkları ve fiyatları: uygulama içi ürünler, abonelikler ve fiyatlar.",
"sec.players.for": "Oyuncuların söyledikleri ve oyunlarda kazanabilecekleri: yorumlar, Game Center, Play Games.",
"sec.health.for": "Uygulama sağlıklı ve hazır mı: çökmeler ve ANR, büyüme, önce düzeltilecek kontroller, diğer araçlar.",
"sec.views": "{section} görünümleri",
"tab.games": "Oyun servisleri",
"next.open": "{where} aç",
"next.rejected": "{version}, {store} tarafından reddedildi",
"next.halted": "{version}, {store} üzerinde durduruldu",
"next.blockers": "Göndermeden önce {count} engel",
"next.blockers_one": "Göndermeden önce 1 engel",
"next.rollout": "{version} dağıtımı {share} seviyesinde",
"next.approved": "{version} onaylandı: yayınla",
"next.submit": "{version} sürümünü incelemeye gönder",
"next.review": "{version} incelemede",
"next.managed": "{version} Yayınlama özeti'nde bekliyor (yönetilen yayınlama)",
"next.upload": "İlk build'i yükle",
"next.live": "Yayında: {version}",
"next.notRead": "Mağazalar henüz okunmadı",
"next.storeLive": "Mağazalardan okunan canlı mağaza sayfası",
"next.listingProblems": "{count} mağaza metni sorunu",
"next.listingProblems_one": "1 mağaza metni sorunu",
"next.unsaved": "{count} kaydedilmemiş düzenleme",
"next.unsaved_one": "1 kaydedilmemiş düzenleme",
"next.listingsUnread": "Mağaza metinleri henüz kontrol edilmedi",
"next.storeOk": "Mağaza sayfası yapılandırmayla uyumlu",
"next.catalogDiff": "{count} ürün mağazalar arasında farklı",
"next.catalogDiff_one": "1 ürün mağazalar arasında farklı",
"next.noProducts": "Henüz ürün yok: bir tane ekle",
"next.products": "{products} ürün · {subs} abonelik",
"next.reviews": "{count} yorum yanıtsız",
"next.reviews_one": "1 yorum yanıtsız",
"next.reviewsUnread": "Yorumlar henüz okunmadı",
"next.reviewsOk": "Tüm yorumlar yanıtlandı",
"next.gamesApiOff": "Play Games Services API kapalı",
"next.gamesBlockers": "{count} oyun servisi engeli",
"next.gamesBlockers_one": "1 oyun servisi engeli",
"next.gamesSync": "Oyun servisleri: eşitlenecek {count} değişiklik",
"next.gamesSync_one": "Oyun servisleri: eşitlenecek 1 değişiklik",
"next.fixFirst": "Önce düzeltilecek {count} sorun",
"next.fixFirst_one": "Önce düzeltilecek 1 sorun",
"next.warnings": "Bakılacak {count} uyarı",
"next.warnings_one": "Bakılacak 1 uyarı",
"next.healthOk": "Sorun bulunmadı",
"side.gAttention": "İlgi bekliyor",
"side.gProgress": "Sürüyor",
"side.gLive": "Yayında",
"side.gDraft": "Henüz mağazada değil",
"side.missing": "Klasör bulunamadı",
"side.rejected": "Reddedildi · {what}",
"side.halted": "Durduruldu · {what}",
"side.blockers": "{count} engel",
"side.blockers_one": "1 engel",
"side.rollout": "Dağıtım {share} · {what}",
"side.review": "İncelemede · {what}",
"side.approved": "Onaylandı · {what}",
"side.draft": "Taslak · {what}",
"side.live": "Yayında · {version}",
"side.liveWarn": "Yayında · {version} · {count} uyarı",
"side.liveWarn_one": "Yayında · {version} · 1 uyarı",
"side.storeOnly": "Yalnız mağaza · henüz okunmadı",
"side.notRead": "Henüz okunmadı",
"side.warnings": "{count} uyarı",
"side.warnings_one": "1 uyarı",
"side.notOnStore": "Henüz mağaza sürümü yok",
"side.ignored": "Yok sayıldı",
"side.studioFilter": "Bir stüdyonun uygulamalarını göster",
"side.allStudios": "Tümü",
"games.keep": "Uyumlu",
"games.update": "Farklı",
"games.create": "Eksik",
"games.notOnStore": "Bu mağazada değil",
"games.notListed": "Planlanmadı",
"games.notRead": "Okunmadı",
"games.item": "Öğe",
"games.name": "Ad",
"games.points": "Puan",
"games.languages": "Diller",
"games.leaderboard": "Skor tablosu",
"games.achievement": "Başarım",
"games.hidden": "kazanılana kadar gizli",
"games.localeChanges": "Game Center dilleri: {list}",
"games.checkAgain": "Yeniden kontrol et",
"games.apiOffTitle": "Play Games Services API kapalı.",
"games.apiOffText": "Hizmet hesabının Google Cloud projesinde {api} açın, bir dakika bekleyin, sonra yeniden kontrol edin.",
"games.itemsTitle": "Skor tabloları ve başarımlar",
"games.itemsSub": "Yapılandırmada tek liste, iki mağazaya eşlenir: her mağazanın yapılandırmaya göre durumu.",
"games.refresh": "Yeniden oku",
"games.noItems": "Yapılandırmada henüz skor tablosu veya başarım yok (games.leaderboards, games.achievements).",
"games.notReadYet": "Oyun servisleri okunuyor…",
"games.images": "Skor tablosu ve başarım görselleri konsollarda eklenir; Play'de mevcut simge her eşitlemede korunur.",
"games.localeMap": "Game Center dil eşlemesi",
"games.localeMapSub": "Yapılandırma dilinden canlı Game Center'ın kullandığı dile (games.localeMap).",
"games.mapSet": "Ayarlı",
"games.mapSuggested": "Önerilen",
"games.mapHint": "games.localeMap'e ekleyin: {entries}",
};