Compare commits

...
14 Commits
Author SHA1 Message Date
d4rken-org-releaser[bot] 3af1af872e Release: 5.2.3-rc0 2026-08-16 19:51:18 +00:00
Matthias Urhahn 1f00925cd8 Merge pull request #680 from d4rken-org/crowdin-update-20260816
General: Update translations from Crowdin
2026-08-16 20:47:28 +02:00
darken 50079e2b7a fix(upgrade): Remove orphaned translation strings failing lint vitals
upgrade_screen_sub_check_failed_title/_message no longer exist in the
English source (removed in 3e6541de). Seven locales still carried
Crowdin TM-poisoned translations for them, tripping ExtraTranslation
in lintVitalGplayBeta/Release.
2026-08-16 20:17:47 +02:00
darken 02ec76980c General: Update app translations from Crowdin 2026-08-16 19:52:33 +02:00
darken 52ad90f77e General: Update fastlane translations from Crowdin 2026-08-16 19:39:06 +02:00
darken 563c6e71f7 fix(upgrade): Invalidate a dead billing connection from refreshStrict too
refreshStrict() throws its incomplete-result error AFTER useConnection
already returned: refreshPurchases hands back a partial result instead of
throwing, so useConnection's dead-binder detection never sees it. A gate
that ran against a connection whose binder died mid-query (partialError
cause chain carrying SERVICE_DISCONNECTED / SERVICE_TIMEOUT) left that
connection installed, and every later purchase check kept talking to the
corpse until something else tore it down.

processReconciliation() already compensated for the refresh()/connect-loop
paths; the strict path had no such call. Extract that dead-connection block
into invalidateOnDeadConnection() and call it from both. The strict path
deliberately does NOT feed the episode clock — a gate the user aborted
mid-purchase is not a reconciliation outcome.
2026-08-16 17:44:02 +02:00
darken a357d77b00 test(upgrade): Cover pending purchases across the billing stack and screen
Ports the pending-purchase coverage alongside the production change.

- BillingConnectionTest / BillingManagerTest: PENDING ingestion, the
  PURCHASED-only entitlement exits, provesAbsence ignoring a surviving
  pending overlay, the reconciliation pass and the ack pass skipping
  pending purchases.
- UpgradeRepoGplayTest: pendingSkus never feeding isPro, the strict
  verify path and PendingPurchaseBillingException on an already-owned
  recovery.
- GplayUpgradeViewModelTest: the shared pre-purchase gate on both paths
  (pending, timeout, error, owned upgrade, renewing subscription with an
  unknown product), the pending-payment launch failure, and the pending
  card rendering while prices are still loading or have failed.
- GplayUpgradeScreenTest / GplayUpgradeOwnershipTest /
  GplayUpgradeScreenHostTest: the card for all three audiences, the
  locked offers and switch button, restore staying enabled, and the
  informational dialog reaching the composition.
2026-08-16 17:44:02 +02:00
darken abc82b0f09 fix(upgrade): Show supporter status on every upgrade screen route
The FOSS upgrade screen's view mapping only surfaced STATUS_UPGRADED on
the manage route. Forced routes (the Pro-locked settings entry)
deliberately don't auto-close, so a supporter completing the sponsor
flow from there stayed on the sales pitch with a live sponsor button --
reading as if sponsoring didn't work, with only the transient thanks
toast saying otherwise. The gplay flavour already renders ownership
state route-independently on this path.

The isPro branch now wins on every route, matching the adjacent
comment's stated intent and gplay's behaviour. Forced routes keep their
don't-auto-close semantics; the durable status view is what
acknowledges the upgrade.
2026-08-16 17:44:02 +02:00
darken 3e6541deec feat(upgrade): Explain a pending Google Play payment on the upgrade screen
A user whose payment Play is still processing now gets an explanation
instead of a screen that keeps selling them the upgrade they already
bought.

- New PendingPurchaseCard, rendered above the ownership/acquisition split
  so it reaches every audience: the acquisition buyer, the owner switching
  products, and the grace user (whose offers box is hidden entirely during
  a young episode) — all three have their purchase actions locked and need
  the same explanation.
- Loaded.hasPendingPurchase is SKU-agnostic: the subscription and the
  one-time purchase are alternatives, so a pending payment for either one
  disables both offers and the ownership switch button. Restore stays
  enabled — re-checking with Play is the useful action here.
- Both purchase paths now run the same pre-purchase gate
  (verifyPurchaseStateNow, bounded): a pending payment answers with the
  informational PurchasePending dialog instead of launching a flow Play
  would reject. The subscription path previously launched unverified, and
  its gate also blocks on an owned upgrade (RestoreSucceeded) and on a
  still-renewing subscription (SubscriptionStillRenewing), so a stale
  screen can't sell Pro to someone who already owns it.
- restorePurchase() reports a found-but-unpaid purchase as PurchasePending
  rather than RestoreFailed, whose copy asserts a completed check and
  steers toward multi-account troubleshooting and support.
- A PendingPurchaseBillingException from a launch maps to the same dialog.
- SubscriptionCheckFailed becomes PurchaseCheckFailed (both paths use it
  now); its string is replaced by
  upgrade_screen_purchase_check_failed_message and the translated entries
  of the old key are removed, along with the already-orphaned
  upgrade_screen_sub_check_failed_title, so ExtraTranslation lint stays
  quiet.
2026-08-16 17:44:02 +02:00
darken 33a972001e feat(upgrade): Carry pending Google Play purchases through the billing stack
Play reports a purchase as PENDING while a slow payment method (cash,
carrier billing, bank transfer) is still being processed. Until now
BillingConnection dropped those at ingestion, so the app had no idea the
user had bought anything: the upgrade screen kept selling, and a second
purchase attempt was rejected by Play with ITEM_ALREADY_OWNED.

Pending purchases now enter the reducer state and travel to the UI, while
every entitlement exit stays PURCHASED-only:

- BillingConnection ingests PURCHASED + PENDING (UNSPECIFIED_STATE is
  still dropped everywhere). The freshUpdates stream keeps receiving only
  PURCHASED, and provesAbsence now ignores a surviving PENDING overlay
  entry, so a payment in progress can't freeze the unconfirmed-episode
  clock.
- combinePurchaseResults gets the sku-type resolver: a PENDING result only
  suppresses the couldn't-verify error when it maps to a known Pro SKU. An
  unknown pending product proves nothing about the type whose query failed.
- PurchaseRefresh now carries provenance (confirmed set,
  hasConfirmedProPurchase, commit-time occurredAt, partialError) instead of
  just the merged view plus isComplete.
- BillingData splits into purchases (entitlement carrier) and
  pendingPurchases via a single from() classifier used at every exit.
- BillingManager gains processReconciliation(), run after the connect
  loop's initial refresh and by refresh(): it re-signals dead-binder
  invalidation and feeds the grace episode clock with the refresh's COMMIT
  time. The ack pass skips pending purchases, which Play rejects
  permanently and would report as a bug every pass.
- BillingConnection.querySubscriptions / BillingManager.querySubscriptions
  are replaced by refreshStrict(): the pre-purchase gate needs both product
  types and the pending state, and still fails closed on anything short of
  a complete round-trip.
- UpgradeRepoGplay exposes Info.pendingSkus (never part of isPro),
  Info.hasAutoRenewingSubscription, verifyPurchaseStateNow() for the gates,
  and reports PendingPurchaseBillingException when an already-owned
  recovery finds a pending payment. The grace branch now carries
  billingData through so pending stays visible while Pro runs on grace.
2026-08-16 17:44:02 +02:00
Matthias Urhahn fe67ce0365 Shrink issue screenshots uploaded as HTML img tags 2026-08-11 14:43:10 +02:00
darken 511944c21c fix(upgrade): Share the settings row title with the upgrade screen
settings_upgrade_status_label lived twice per flavor: once for the
Settings row, once as a raw locale-translated string standing in for
what the upgrade screen otherwise composes from the app name and the
tier qualifier. On gplay the two could drift apart -- 15 of 75
locales showed the wrong word order or an untranslated English
fallback where the composed title used the correct language. The row
now composes through the same brandTitle template gplay's own
upgrade screen title already used, so the two can no longer disagree.

FOSS's value was a support ask ("Sponsor CAPod"), not a composed
brand title, so its wording stays untouched -- the key is renamed to
upgrade_foss_sponsor_label (byte-identical text, all 75 locales) and
both FOSS call sites read that one resource instead.
2026-08-07 22:16:00 +02:00
d4rken-org-releaser[bot] 007282d3f5 Release: 5.2.2-rc1 2026-08-07 18:28:44 +00:00
darken 5ffdf66b9d Fix release builds failing on a missing Play Core annotation
R8 reported com.google.android.gms.common.annotation.NoNullnessRewrite as missing; it is a compile-time-only annotation referenced by review-ktx and absent from the runtime classpath. Adds the same targeted -dontwarn SD Maid SE already uses.
2026-08-07 19:30:15 +02:00
182 changed files with 1669 additions and 644 deletions
+1 -1
View File
@@ -23,4 +23,4 @@ jobs:
thumbnail: thumbnail:
permissions: permissions:
issues: write issues: write
uses: d4rken-org/.github/.github/workflows/thumbnail-images.yml@3756372c3c844e4817c03d27983691f9991a19f4 uses: d4rken-org/.github/.github/workflows/thumbnail-images.yml@94e36d9a67a887e24338f95fd0429925cea21c98
+1 -1
View File
@@ -1 +1 @@
5.2.2-rc0 50202000 5.2.3-rc0 50203000
+3 -1
View File
@@ -5,4 +5,6 @@
# R8 full mode strips no-arg constructors not reachable by static analysis. # R8 full mode strips no-arg constructors not reachable by static analysis.
# Keep all constructors in the work package. Remove when Glance upgrades to work-runtime 2.10+. # Keep all constructors in the work package. Remove when Glance upgrades to work-runtime 2.10+.
# See: https://issuetracker.google.com/issues/243257364 # See: https://issuetracker.google.com/issues/243257364
-keep class androidx.work.** { <init>(...); } -keep class androidx.work.** { <init>(...); }
# Play Core KTX references this compile-time-only GMS annotation not on the runtime classpath
-dontwarn com.google.android.gms.common.annotation.NoNullnessRewrite
@@ -47,6 +47,13 @@ internal enum class FossUpgradeView {
STATUS_UPGRADED, STATUS_UPGRADED,
} }
// The Settings row and the PITCH title both read this one resource, so they cannot name the tier
// differently — unlike the composed brand title, this stays a support ask ("Sponsor CAPod") rather
// than naming the flavor. gplay's counterpart in UpgradeScreen.kt composes from brandTitleText
// instead; each flavor implementation lives only in its own source set.
@Composable
internal fun settingsUpgradeStatusTitle(): String = stringResource(R.string.upgrade_foss_sponsor_label)
@Composable @Composable
fun UpgradeScreenHost( fun UpgradeScreenHost(
route: Nav.Main.Upgrade = Nav.Main.Upgrade(), route: Nav.Main.Upgrade = Nav.Main.Upgrade(),
@@ -115,7 +122,7 @@ internal fun UpgradeScreen(
// Status views describe the existing install, not a support ask — they get the composed // Status views describe the existing install, not a support ask — they get the composed
// flavor title, with the postfix highlighted for supporters like the dashboard does it. // flavor title, with the postfix highlighted for supporters like the dashboard does it.
title = if (view == FossUpgradeView.PITCH) { title = if (view == FossUpgradeView.PITCH) {
AnnotatedString(stringResource(R.string.settings_upgrade_status_label)) AnnotatedString(settingsUpgradeStatusTitle())
} else { } else {
// "CAPod FOSS", not "CAPod Pro": the FOSS flavor's own qualifier resource supplies the // "CAPod FOSS", not "CAPod Pro": the FOSS flavor's own qualifier resource supplies the
// tier word, so the title names this build. The upgraded gate keeps the highlight for // tier word, so the title names this build. The upgraded gate keeps the highlight for
@@ -42,8 +42,10 @@ class UpgradeViewModel @Inject constructor(
// Which presentation the screen shows. The manage route (settings "upgrade status" entry) // Which presentation the screen shows. The manage route (settings "upgrade status" entry)
// gets a status view first; the pitch only appears once a free user asks for the upgrade // gets a status view first; the pitch only appears once a free user asks for the upgrade
// options. Upgrading wins over that choice — completing the sponsor flow from the pitch must // options. Upgrading wins on EVERY route, not just manage: forced routes (Pro-locked settings)
// land on the upgraded status, not back on the ask. null until the route is bound. // stay open after the sponsor flow completes, and the pitch with its live sponsor button reads
// as "sponsoring didn't work" to a fresh supporter — the toast alone is too transient for a
// money moment without a receipt behind it. null until the route is bound.
internal val state: StateFlow<State?> = combine( internal val state: StateFlow<State?> = combine(
routeFlow, routeFlow,
upgradeRepo.upgradeInfo, upgradeRepo.upgradeInfo,
@@ -51,7 +53,7 @@ class UpgradeViewModel @Inject constructor(
) { route, info, showOptions -> ) { route, info, showOptions ->
val view = when { val view = when {
route == null -> null route == null -> null
route.manage && info.isPro -> FossUpgradeView.STATUS_UPGRADED info.isPro -> FossUpgradeView.STATUS_UPGRADED
route.manage && !showOptions -> FossUpgradeView.STATUS_FREE route.manage && !showOptions -> FossUpgradeView.STATUS_FREE
else -> FossUpgradeView.PITCH else -> FossUpgradeView.PITCH
} }
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Ondersteuner sedert %s</string> <string name="upgrade_foss_supporter_since">Ondersteuner sedert %s</string>
<string name="upgrade_foss_supporter_thanks">Dankie dat jy CAPod se ontwikkeling ondersteun!</string> <string name="upgrade_foss_supporter_thanks">Dankie dat jy CAPod se ontwikkeling ondersteun!</string>
<string name="upgrade_foss_sponsor_again_action">Maak borgblad oop</string> <string name="upgrade_foss_sponsor_again_action">Maak borgblad oop</string>
<string name="settings_upgrade_status_label">Ondersteun CAPod</string> <string name="upgrade_foss_sponsor_label">Ondersteun CAPod</string>
<string name="settings_upgrade_status_description">Jou ondersteunersstatus.</string> <string name="settings_upgrade_status_description">Jou ondersteunersstatus.</string>
<string name="upgrade_screen_why_title">Opgraderingsvoordele</string> <string name="upgrade_screen_why_title">Opgraderingsvoordele</string>
<string name="upgrade_screen_how_title">Hoe om te help</string> <string name="upgrade_screen_how_title">Hoe om te help</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ደጋፊ ከ%s ጀምሮ</string> <string name="upgrade_foss_supporter_since">ደጋፊ ከ%s ጀምሮ</string>
<string name="upgrade_foss_supporter_thanks">የCAPod ልማá‰ĩን áˆĩለደገፉ áŠĨናመሰግናለን!</string> <string name="upgrade_foss_supporter_thanks">የCAPod ልማá‰ĩን áˆĩለደገፉ áŠĨናመሰግናለን!</string>
<string name="upgrade_foss_sponsor_again_action">የáˆĩፖንሰር ገáŒŊን ክፈá‰ĩ</string> <string name="upgrade_foss_sponsor_again_action">የáˆĩፖንሰር ገáŒŊን ክፈá‰ĩ</string>
<string name="settings_upgrade_status_label">CAPod ን ደግፍ</string> <string name="upgrade_foss_sponsor_label">CAPod ን ደግፍ</string>
<string name="settings_upgrade_status_description">የáŠĨርáˆĩዎ ደጋፊ áˆáŠ”á‰ŗáĸ</string> <string name="settings_upgrade_status_description">የáŠĨርáˆĩዎ ደጋፊ áˆáŠ”á‰ŗáĸ</string>
<string name="upgrade_screen_why_title">የማáˆģáˆģል áŒĨቅማáŒĨቅሞá‰Ŋ</string> <string name="upgrade_screen_why_title">የማáˆģáˆģል áŒĨቅማáŒĨቅሞá‰Ŋ</string>
<string name="upgrade_screen_how_title">áŠĨንዴá‰ĩ áˆ˜áˆ­á‹ŗá‰ĩ áŠĨንደሚá‰Ŋሉ</string> <string name="upgrade_screen_how_title">áŠĨንዴá‰ĩ áˆ˜áˆ­á‹ŗá‰ĩ áŠĨንደሚá‰Ŋሉ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Ø¯Ø§ØšŲ… Ų…Ų†Ø° %s</string> <string name="upgrade_foss_supporter_since">Ø¯Ø§ØšŲ… Ų…Ų†Ø° %s</string>
<string name="upgrade_foss_supporter_thanks">Ø´ŲƒØąŲ‹Ø§ Ų„Ø¯ØšŲ…Ųƒ ØĒØˇŲˆŲŠØą CAPod!</string> <string name="upgrade_foss_supporter_thanks">Ø´ŲƒØąŲ‹Ø§ Ų„Ø¯ØšŲ…Ųƒ ØĒØˇŲˆŲŠØą CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">؁ØĒØ­ ØĩŲØ­ØŠ Ø§Ų„ØąØšØ§ŲŠØŠ</string> <string name="upgrade_foss_sponsor_again_action">؁ØĒØ­ ØĩŲØ­ØŠ Ø§Ų„ØąØšØ§ŲŠØŠ</string>
<string name="settings_upgrade_status_label">Ø¯ØšŲ… ŲƒØ§Ø¨ŲˆØ¯</string> <string name="upgrade_foss_sponsor_label">Ø¯ØšŲ… ŲƒØ§Ø¨ŲˆØ¯</string>
<string name="settings_upgrade_status_description">Ø­Ø§Ų„ØŠ Ø¯ØšŲ…Ųƒ.</string> <string name="settings_upgrade_status_description">Ø­Ø§Ų„ØŠ Ø¯ØšŲ…Ųƒ.</string>
<string name="upgrade_screen_why_title">Ų…Ø˛Ø§ŲŠØ§ Ø§Ų„ØĒØąŲ‚ŲŠØŠ</string> <string name="upgrade_screen_why_title">Ų…Ø˛Ø§ŲŠØ§ Ø§Ų„ØĒØąŲ‚ŲŠØŠ</string>
<string name="upgrade_screen_how_title">ŲƒŲŠŲŲŠØŠ Ø§Ų„Ų…ØŗØ§ØšØ¯ØŠ</string> <string name="upgrade_screen_how_title">ŲƒŲŠŲŲŠØŠ Ø§Ų„Ų…ØŗØ§ØšØ¯ØŠ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s tarixindən bəri dəstəkçi</string> <string name="upgrade_foss_supporter_since">%s tarixindən bəri dəstəkçi</string>
<string name="upgrade_foss_supporter_thanks">CAPod-un inkişafÄąnÄą dəstəklədiyiniz ÃŧçÃŧn təşəkkÃŧrlər!</string> <string name="upgrade_foss_supporter_thanks">CAPod-un inkişafÄąnÄą dəstəklədiyiniz ÃŧçÃŧn təşəkkÃŧrlər!</string>
<string name="upgrade_foss_sponsor_again_action">Sponsor səhifəsini aç</string> <string name="upgrade_foss_sponsor_again_action">Sponsor səhifəsini aç</string>
<string name="settings_upgrade_status_label">CAPod-u sponsorlaşdÄąrÄąn</string> <string name="upgrade_foss_sponsor_label">CAPod-u sponsorlaşdÄąrÄąn</string>
<string name="settings_upgrade_status_description">Sizin tərəfdar statusu.</string> <string name="settings_upgrade_status_description">Sizin tərəfdar statusu.</string>
<string name="upgrade_screen_why_title">YÃŧksəltmə ÃŧstÃŧnləri</string> <string name="upgrade_screen_why_title">YÃŧksəltmə ÃŧstÃŧnləri</string>
<string name="upgrade_screen_how_title">Necə kÃļmək etmək</string> <string name="upgrade_screen_how_title">Necə kÃļmək etmək</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ĐĄĐŋĐžĐŊŅĐ°Ņ€ С %s</string> <string name="upgrade_foss_supporter_since">ĐĄĐŋĐžĐŊŅĐ°Ņ€ С %s</string>
<string name="upgrade_foss_supporter_thanks">Đ”ĐˇŅĐēŅƒĐš Са ĐŋĐ°Đ´Ņ‚Ņ€Ņ‹ĐŧĐē҃ Ņ€Đ°ĐˇĐ˛Ņ–Ņ†Ņ†Ņ CAPod!</string> <string name="upgrade_foss_supporter_thanks">Đ”ĐˇŅĐēŅƒĐš Са ĐŋĐ°Đ´Ņ‚Ņ€Ņ‹ĐŧĐē҃ Ņ€Đ°ĐˇĐ˛Ņ–Ņ†Ņ†Ņ CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">АдĐēŅ€Ņ‹Ņ†ŅŒ ŅŅ‚Đ°Ņ€ĐžĐŊĐē҃ ҁĐŋĐžĐŊŅĐ°Ņ€ŅŅ‚Đ˛Đ°</string> <string name="upgrade_foss_sponsor_again_action">АдĐēŅ€Ņ‹Ņ†ŅŒ ŅŅ‚Đ°Ņ€ĐžĐŊĐē҃ ҁĐŋĐžĐŊŅĐ°Ņ€ŅŅ‚Đ˛Đ°</string>
<string name="settings_upgrade_status_label">ĐĄĐŋĐžĐŊŅĐ°Ņ€Đ°Đ˛Đ°Ņ†ŅŒ CAPod</string> <string name="upgrade_foss_sponsor_label">ĐĄĐŋĐžĐŊŅĐ°Ņ€Đ°Đ˛Đ°Ņ†ŅŒ CAPod</string>
<string name="settings_upgrade_status_description">Đ’Đ°Ņˆ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŋҀҋ҅ҖĐģҌĐŊŅ–Đēа.</string> <string name="settings_upgrade_status_description">Đ’Đ°Ņˆ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŋҀҋ҅ҖĐģҌĐŊŅ–Đēа.</string>
<string name="upgrade_screen_why_title">ПĐĩŅ€Đ°Đ˛Đ°ĐŗŅ– айĐŊĐ°ŅžĐģĐĩĐŊĐŊŅ</string> <string name="upgrade_screen_why_title">ПĐĩŅ€Đ°Đ˛Đ°ĐŗŅ– айĐŊĐ°ŅžĐģĐĩĐŊĐŊŅ</string>
<string name="upgrade_screen_how_title">Đ¯Đē даĐŋаĐŧĐ°ĐŗŅ‡Ņ‹</string> <string name="upgrade_screen_how_title">Đ¯Đē даĐŋаĐŧĐ°ĐŗŅ‡Ņ‹</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ĐŸĐžĐ´Đ´ŅŠŅ€ĐļĐŊиĐē ĐžŅ‚ %s</string> <string name="upgrade_foss_supporter_since">ĐŸĐžĐ´Đ´ŅŠŅ€ĐļĐŊиĐē ĐžŅ‚ %s</string>
<string name="upgrade_foss_supporter_thanks">БĐģĐ°ĐŗĐžĐ´Đ°Ņ€Đ¸Đŧ ви, ҇Đĩ ĐŋОдĐēŅ€ĐĩĐŋŅŅ‚Đĩ Ņ€Đ°ĐˇĐ˛Đ¸Ņ‚Đ¸ĐĩŅ‚Đž ĐŊа CAPod!</string> <string name="upgrade_foss_supporter_thanks">БĐģĐ°ĐŗĐžĐ´Đ°Ņ€Đ¸Đŧ ви, ҇Đĩ ĐŋОдĐēŅ€ĐĩĐŋŅŅ‚Đĩ Ņ€Đ°ĐˇĐ˛Đ¸Ņ‚Đ¸ĐĩŅ‚Đž ĐŊа CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">ĐžŅ‚Đ˛ĐžŅ€Đ¸ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° Са ҁĐŋĐžĐŊŅĐžŅ€ŅŅ‚Đ˛Đž</string> <string name="upgrade_foss_sponsor_again_action">ĐžŅ‚Đ˛ĐžŅ€Đ¸ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° Са ҁĐŋĐžĐŊŅĐžŅ€ŅŅ‚Đ˛Đž</string>
<string name="settings_upgrade_status_label">ĐĄĐŋĐžĐŊŅĐžŅ€Đ¸Ņ€Đ°ĐšŅ‚Đĩ CAPod</string> <string name="upgrade_foss_sponsor_label">ĐĄĐŋĐžĐŊŅĐžŅ€Đ¸Ņ€Đ°ĐšŅ‚Đĩ CAPod</string>
<string name="settings_upgrade_status_description">Đ’Đ°ŅˆĐ¸ŅŅ‚ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŊа ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐŊиĐē.</string> <string name="settings_upgrade_status_description">Đ’Đ°ŅˆĐ¸ŅŅ‚ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŊа ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐŊиĐē.</string>
<string name="upgrade_screen_why_title">ĐŸŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đ° ĐŊа ĐŊĐ°Đ´ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ‚Đ°</string> <string name="upgrade_screen_why_title">ĐŸŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đ° ĐŊа ĐŊĐ°Đ´ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ‚Đ°</string>
<string name="upgrade_screen_how_title">КаĐē да ĐŋĐžĐŧĐžĐŗĐŊĐĩŅ‚Đĩ</string> <string name="upgrade_screen_how_title">КаĐē да ĐŋĐžĐŧĐžĐŗĐŊĐĩŅ‚Đĩ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s āĻĨ⧇āϕ⧇ āϏāĻŽāĻ°ā§āĻĨāĻ•</string> <string name="upgrade_foss_supporter_since">%s āĻĨ⧇āϕ⧇ āϏāĻŽāĻ°ā§āĻĨāĻ•</string>
<string name="upgrade_foss_supporter_thanks">CAPod-āĻāϰ āωāĻ¨ā§āύāϝāĻŧāύ⧇ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϕ⧇ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻ!</string> <string name="upgrade_foss_supporter_thanks">CAPod-āĻāϰ āωāĻ¨ā§āύāϝāĻŧāύ⧇ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϕ⧇ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻ!</string>
<string name="upgrade_foss_sponsor_again_action">āĻ¸ā§āĻĒāύāϏāϰ āĻĒ⧃āĻˇā§āĻ āĻž āϖ⧁āϞ⧁āύ</string> <string name="upgrade_foss_sponsor_again_action">āĻ¸ā§āĻĒāύāϏāϰ āĻĒ⧃āĻˇā§āĻ āĻž āϖ⧁āϞ⧁āύ</string>
<string name="settings_upgrade_status_label">CAPod-āϕ⧇ āĻ¸ā§āĻĒāĻ¨ā§āϏāϰ āĻ•āϰ⧁āύ</string> <string name="upgrade_foss_sponsor_label">CAPod-āϕ⧇ āĻ¸ā§āĻĒāĻ¨ā§āϏāϰ āĻ•āϰ⧁āύ</string>
<string name="settings_upgrade_status_description">āφāĻĒāύāĻžāϰ āϏāĻŽāĻ°ā§āĻĨāĻ• āĻ¸ā§āĻĨāĻŋāϤāĻŋāĨ¤</string> <string name="settings_upgrade_status_description">āφāĻĒāύāĻžāϰ āϏāĻŽāĻ°ā§āĻĨāĻ• āĻ¸ā§āĻĨāĻŋāϤāĻŋāĨ¤</string>
<string name="upgrade_screen_why_title">āφāĻĒāĻ—ā§āϰ⧇āĻĄ āϏ⧁āĻŦāĻŋāϧāĻž</string> <string name="upgrade_screen_why_title">āφāĻĒāĻ—ā§āϰ⧇āĻĄ āϏ⧁āĻŦāĻŋāϧāĻž</string>
<string name="upgrade_screen_how_title">āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ</string> <string name="upgrade_screen_how_title">āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Col¡laborador des de %s</string> <string name="upgrade_foss_supporter_since">Col¡laborador des de %s</string>
<string name="upgrade_foss_supporter_thanks">Gràcies per donar suport al desenvolupament del CAPod!</string> <string name="upgrade_foss_supporter_thanks">Gràcies per donar suport al desenvolupament del CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Obre la pàgina del patrocinador</string> <string name="upgrade_foss_sponsor_again_action">Obre la pàgina del patrocinador</string>
<string name="settings_upgrade_status_label">Patrocineu el CAPod</string> <string name="upgrade_foss_sponsor_label">Patrocineu el CAPod</string>
<string name="settings_upgrade_status_description">El vostre estat de col¡laborador.</string> <string name="settings_upgrade_status_description">El vostre estat de col¡laborador.</string>
<string name="upgrade_screen_why_title">Beneficis de la millora</string> <string name="upgrade_screen_why_title">Beneficis de la millora</string>
<string name="upgrade_screen_how_title">Com ajudar</string> <string name="upgrade_screen_how_title">Com ajudar</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Podporovatel od %s</string> <string name="upgrade_foss_supporter_since">Podporovatel od %s</string>
<string name="upgrade_foss_supporter_thanks">Děkujeme za podporu vÃŊvoje CAPod!</string> <string name="upgrade_foss_supporter_thanks">Děkujeme za podporu vÃŊvoje CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Otevřít strÃĄnku sponzora</string> <string name="upgrade_foss_sponsor_again_action">Otevřít strÃĄnku sponzora</string>
<string name="settings_upgrade_status_label">Sponzorovat CAPod</string> <string name="upgrade_foss_sponsor_label">Sponzorovat CAPod</string>
<string name="settings_upgrade_status_description">VÃĄÅĄ stav podporovatele.</string> <string name="settings_upgrade_status_description">VÃĄÅĄ stav podporovatele.</string>
<string name="upgrade_screen_why_title">VÃŊhody upgradu</string> <string name="upgrade_screen_why_title">VÃŊhody upgradu</string>
<string name="upgrade_screen_how_title">Jak pomoci</string> <string name="upgrade_screen_how_title">Jak pomoci</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Støtte siden %s</string> <string name="upgrade_foss_supporter_since">Støtte siden %s</string>
<string name="upgrade_foss_supporter_thanks">Tak fordi du støtter udviklingen af CAPod!</string> <string name="upgrade_foss_supporter_thanks">Tak fordi du støtter udviklingen af CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Åbn sponsorside</string> <string name="upgrade_foss_sponsor_again_action">Åbn sponsorside</string>
<string name="settings_upgrade_status_label">Sponsor CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsor CAPod</string>
<string name="settings_upgrade_status_description">Din supporterstatus.</string> <string name="settings_upgrade_status_description">Din supporterstatus.</string>
<string name="upgrade_screen_why_title">Opgraderingens fordele</string> <string name="upgrade_screen_why_title">Opgraderingens fordele</string>
<string name="upgrade_screen_how_title">SÃĨdan hjÃĻlper du</string> <string name="upgrade_screen_how_title">SÃĨdan hjÃĻlper du</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">UnterstÃŧtzer seit %s</string> <string name="upgrade_foss_supporter_since">UnterstÃŧtzer seit %s</string>
<string name="upgrade_foss_supporter_thanks">Vielen Dank, dass du die Entwicklung von CAPod unterstÃŧtzt!</string> <string name="upgrade_foss_supporter_thanks">Vielen Dank, dass du die Entwicklung von CAPod unterstÃŧtzt!</string>
<string name="upgrade_foss_sponsor_again_action">Sponsoring-Seite Ãļffnen</string> <string name="upgrade_foss_sponsor_again_action">Sponsoring-Seite Ãļffnen</string>
<string name="settings_upgrade_status_label">CAPod unterstÃŧtzen</string> <string name="upgrade_foss_sponsor_label">CAPod unterstÃŧtzen</string>
<string name="settings_upgrade_status_description">Dein UnterstÃŧtzerstatus.</string> <string name="settings_upgrade_status_description">Dein UnterstÃŧtzerstatus.</string>
<string name="upgrade_screen_why_title">Vorteile des Upgrades</string> <string name="upgrade_screen_why_title">Vorteile des Upgrades</string>
<string name="upgrade_screen_how_title">Wie man hilft</string> <string name="upgrade_screen_how_title">Wie man hilft</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ÎĨĪ€ÎŋĪƒĪ„ÎˇĪÎšÎēĪ„ÎŽĪ‚ ÎąĪ€ĪŒ %s</string> <string name="upgrade_foss_supporter_since">ÎĨĪ€ÎŋĪƒĪ„ÎˇĪÎšÎēĪ„ÎŽĪ‚ ÎąĪ€ĪŒ %s</string>
<string name="upgrade_foss_supporter_thanks">ÎŖÎąĪ‚ ÎĩĪ…Ī‡ÎąĪÎšĪƒĪ„ÎŋĪÎŧÎĩ Ī€ÎŋĪ… Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎąÎŊÎŦĪ€Ī„Ī…ÎžÎˇ Ī„ÎŋĪ… CAPod!</string> <string name="upgrade_foss_supporter_thanks">ÎŖÎąĪ‚ ÎĩĪ…Ī‡ÎąĪÎšĪƒĪ„ÎŋĪÎŧÎĩ Ī€ÎŋĪ… Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎąÎŊÎŦĪ€Ī„Ī…ÎžÎˇ Ī„ÎŋĪ… CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">ΆÎŊÎŋÎšÎŗÎŧÎą ΃ÎĩÎģÎ¯Î´ÎąĪ‚ ·ÎŋĪÎˇÎŗÎ¯ÎąĪ‚</string> <string name="upgrade_foss_sponsor_again_action">ΆÎŊÎŋÎšÎŗÎŧÎą ΃ÎĩÎģÎ¯Î´ÎąĪ‚ ·ÎŋĪÎˇÎŗÎ¯ÎąĪ‚</string>
<string name="settings_upgrade_status_label">ΧÎŋĪÎˇÎŗÎŽĪƒĪ„Îĩ Ī„Îŋ CAPod</string> <string name="upgrade_foss_sponsor_label">ΧÎŋĪÎˇÎŗÎŽĪƒĪ„Îĩ Ī„Îŋ CAPod</string>
<string name="settings_upgrade_status_description">Η ÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎŽ ĪƒÎąĪ‚ Ή΂ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎšÎēĪ„ÎŽ.</string> <string name="settings_upgrade_status_description">Η ÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎŽ ĪƒÎąĪ‚ Ή΂ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎšÎēĪ„ÎŽ.</string>
<string name="upgrade_screen_why_title">ΠÎģÎĩÎŋÎŊÎĩÎēĪ„ÎŽÎŧÎąĪ„Îą ÎąÎŊιβÎŦθÎŧÎšĪƒÎˇĪ‚</string> <string name="upgrade_screen_why_title">ΠÎģÎĩÎŋÎŊÎĩÎēĪ„ÎŽÎŧÎąĪ„Îą ÎąÎŊιβÎŦθÎŧÎšĪƒÎˇĪ‚</string>
<string name="upgrade_screen_how_title">Î ĪŽĪ‚ ÎŊÎą βÎŋÎˇÎ¸ÎŽĪƒÎĩĪ„Îĩ</string> <string name="upgrade_screen_how_title">Î ĪŽĪ‚ ÎŊÎą βÎŋÎˇÎ¸ÎŽĪƒÎĩĪ„Îĩ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Colaborador desde %s</string> <string name="upgrade_foss_supporter_since">Colaborador desde %s</string>
<string name="upgrade_foss_supporter_thanks">ÂĄGracias por apoyar el desarrollo de CAPod!</string> <string name="upgrade_foss_supporter_thanks">ÂĄGracias por apoyar el desarrollo de CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocinio</string> <string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocinio</string>
<string name="settings_upgrade_status_label">ApoyÃĄ CAPod</string> <string name="upgrade_foss_sponsor_label">ApoyÃĄ CAPod</string>
<string name="settings_upgrade_status_description">Tu estado de patrocinador.</string> <string name="settings_upgrade_status_description">Tu estado de patrocinador.</string>
<string name="upgrade_screen_why_title">Beneficios de la mejora</string> <string name="upgrade_screen_why_title">Beneficios de la mejora</string>
<string name="upgrade_screen_how_title">Como ayudar</string> <string name="upgrade_screen_how_title">Como ayudar</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Colaborador desde %s</string> <string name="upgrade_foss_supporter_since">Colaborador desde %s</string>
<string name="upgrade_foss_supporter_thanks">ÂĄGracias por apoyar el desarrollo de CAPod!</string> <string name="upgrade_foss_supporter_thanks">ÂĄGracias por apoyar el desarrollo de CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocinio</string> <string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocinio</string>
<string name="settings_upgrade_status_label">Patrocina CAPod</string> <string name="upgrade_foss_sponsor_label">Patrocina CAPod</string>
<string name="settings_upgrade_status_description">Tu estado de patrocinador.</string> <string name="settings_upgrade_status_description">Tu estado de patrocinador.</string>
<string name="upgrade_screen_why_title">Beneficios de la actualizaciÃŗn</string> <string name="upgrade_screen_why_title">Beneficios de la actualizaciÃŗn</string>
<string name="upgrade_screen_how_title">CÃŗmo ayudar</string> <string name="upgrade_screen_how_title">CÃŗmo ayudar</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Colaborador desde %s</string> <string name="upgrade_foss_supporter_since">Colaborador desde %s</string>
<string name="upgrade_foss_supporter_thanks">ÂĄGracias por apoyar el desarrollo de CAPod!</string> <string name="upgrade_foss_supporter_thanks">ÂĄGracias por apoyar el desarrollo de CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocinio</string> <string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocinio</string>
<string name="settings_upgrade_status_label">Patrocinar CAPod</string> <string name="upgrade_foss_sponsor_label">Patrocinar CAPod</string>
<string name="settings_upgrade_status_description">Tu estado como patrocinador.</string> <string name="settings_upgrade_status_description">Tu estado como patrocinador.</string>
<string name="upgrade_screen_why_title">Beneficios de la actualizaciÃŗn</string> <string name="upgrade_screen_why_title">Beneficios de la actualizaciÃŗn</string>
<string name="upgrade_screen_how_title">Como ayudar</string> <string name="upgrade_screen_how_title">Como ayudar</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Toetaja alates %s</string> <string name="upgrade_foss_supporter_since">Toetaja alates %s</string>
<string name="upgrade_foss_supporter_thanks">Täname, et toetad CAPodi arendust!</string> <string name="upgrade_foss_supporter_thanks">Täname, et toetad CAPodi arendust!</string>
<string name="upgrade_foss_sponsor_again_action">Ava sponsorlehekÃŧlg</string> <string name="upgrade_foss_sponsor_again_action">Ava sponsorlehekÃŧlg</string>
<string name="settings_upgrade_status_label">Rahasta CAPodi</string> <string name="upgrade_foss_sponsor_label">Rahasta CAPodi</string>
<string name="settings_upgrade_status_description">Sinu toetaja staatus.</string> <string name="settings_upgrade_status_description">Sinu toetaja staatus.</string>
<string name="upgrade_screen_why_title">Uuendamise eelised</string> <string name="upgrade_screen_why_title">Uuendamise eelised</string>
<string name="upgrade_screen_how_title">Kuidas aidata?</string> <string name="upgrade_screen_how_title">Kuidas aidata?</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Laguntzaile %s(e)tik aurrera</string> <string name="upgrade_foss_supporter_since">Laguntzaile %s(e)tik aurrera</string>
<string name="upgrade_foss_supporter_thanks">Eskerrik asko CAPod-en garapena babesten duzulako!</string> <string name="upgrade_foss_supporter_thanks">Eskerrik asko CAPod-en garapena babesten duzulako!</string>
<string name="upgrade_foss_sponsor_again_action">Ireki babesle-orria</string> <string name="upgrade_foss_sponsor_again_action">Ireki babesle-orria</string>
<string name="settings_upgrade_status_label">CAPod babeslatu</string> <string name="upgrade_foss_sponsor_label">CAPod babeslatu</string>
<string name="settings_upgrade_status_description">Zure babesle egoera</string> <string name="settings_upgrade_status_description">Zure babesle egoera</string>
<string name="upgrade_screen_why_title">Hobekuntza-onurak</string> <string name="upgrade_screen_why_title">Hobekuntza-onurak</string>
<string name="upgrade_screen_how_title">Nola lagundu</string> <string name="upgrade_screen_how_title">Nola lagundu</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Ø­Ø§Ų…ÛŒ Ø§Ø˛ %s</string> <string name="upgrade_foss_supporter_since">Ø­Ø§Ų…ÛŒ Ø§Ø˛ %s</string>
<string name="upgrade_foss_supporter_thanks">Ø§Ø˛ Ø­Ų…Ø§ÛŒØĒ Ø´Ų…Ø§ Ø§Ø˛ ØĒŲˆØŗØšŲ‡ CAPod ØŗŲžØ§ØŗÚ¯Ø˛Ø§ØąÛŒŲ…!</string> <string name="upgrade_foss_supporter_thanks">Ø§Ø˛ Ø­Ų…Ø§ÛŒØĒ Ø´Ų…Ø§ Ø§Ø˛ ØĒŲˆØŗØšŲ‡ CAPod ØŗŲžØ§ØŗÚ¯Ø˛Ø§ØąÛŒŲ…!</string>
<string name="upgrade_foss_sponsor_again_action">Ø¨Ø§Ø˛ ÚŠØąØ¯Ų† ØĩŲØ­Ų‡ Ø­Ų…Ø§ÛŒØĒ Ų…Ø§Ų„ÛŒ</string> <string name="upgrade_foss_sponsor_again_action">Ø¨Ø§Ø˛ ÚŠØąØ¯Ų† ØĩŲØ­Ų‡ Ø­Ų…Ø§ÛŒØĒ Ų…Ø§Ų„ÛŒ</string>
<string name="settings_upgrade_status_label">Ø­Ų…Ø§ÛŒØĒ Ø§Ø˛ CAPod</string> <string name="upgrade_foss_sponsor_label">Ø­Ų…Ø§ÛŒØĒ Ø§Ø˛ CAPod</string>
<string name="settings_upgrade_status_description">؈ØļØšÛŒØĒ Ø­Ų…Ø§ÛŒØĒی Ø´Ų…Ø§.</string> <string name="settings_upgrade_status_description">؈ØļØšÛŒØĒ Ø­Ų…Ø§ÛŒØĒی Ø´Ų…Ø§.</string>
<string name="upgrade_screen_why_title">Ų…Ø˛Ø§ÛŒØ§ÛŒ Ø§ØąØĒŲ‚Ø§</string> <string name="upgrade_screen_why_title">Ų…Ø˛Ø§ÛŒØ§ÛŒ Ø§ØąØĒŲ‚Ø§</string>
<string name="upgrade_screen_how_title">Ú†Ú¯ŲˆŲ†Ų‡ ÚŠŲ…ÚŠ ÚŠŲ†ÛŒŲ…</string> <string name="upgrade_screen_how_title">Ú†Ú¯ŲˆŲ†Ų‡ ÚŠŲ…ÚŠ ÚŠŲ†ÛŒŲ…</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Tukija %s lähtien</string> <string name="upgrade_foss_supporter_since">Tukija %s lähtien</string>
<string name="upgrade_foss_supporter_thanks">Kiitos, että tuet CAPodin kehitystä!</string> <string name="upgrade_foss_supporter_thanks">Kiitos, että tuet CAPodin kehitystä!</string>
<string name="upgrade_foss_sponsor_again_action">Avaa sponsorisivu</string> <string name="upgrade_foss_sponsor_again_action">Avaa sponsorisivu</string>
<string name="settings_upgrade_status_label">Tue CAPodia</string> <string name="upgrade_foss_sponsor_label">Tue CAPodia</string>
<string name="settings_upgrade_status_description">Kannattajantila</string> <string name="settings_upgrade_status_description">Kannattajantila</string>
<string name="upgrade_screen_why_title">Päivityksen edut</string> <string name="upgrade_screen_why_title">Päivityksen edut</string>
<string name="upgrade_screen_how_title">Kuinka auttaa</string> <string name="upgrade_screen_how_title">Kuinka auttaa</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Tagasuporta simula %s</string> <string name="upgrade_foss_supporter_since">Tagasuporta simula %s</string>
<string name="upgrade_foss_supporter_thanks">Salamat sa pagsuporta sa development ng CAPod!</string> <string name="upgrade_foss_supporter_thanks">Salamat sa pagsuporta sa development ng CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Buksan ang sponsor page</string> <string name="upgrade_foss_sponsor_again_action">Buksan ang sponsor page</string>
<string name="settings_upgrade_status_label">Suportahan ang CAPod</string> <string name="upgrade_foss_sponsor_label">Suportahan ang CAPod</string>
<string name="settings_upgrade_status_description">Ang iyong status bilang supporter.</string> <string name="settings_upgrade_status_description">Ang iyong status bilang supporter.</string>
<string name="upgrade_screen_why_title">Mga benepisyo ng upgrade</string> <string name="upgrade_screen_why_title">Mga benepisyo ng upgrade</string>
<string name="upgrade_screen_how_title">Paano tumulong</string> <string name="upgrade_screen_how_title">Paano tumulong</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Soutien depuis %s</string> <string name="upgrade_foss_supporter_since">Soutien depuis %s</string>
<string name="upgrade_foss_supporter_thanks">Merci de soutenir le dÊveloppement de CAPod !</string> <string name="upgrade_foss_supporter_thanks">Merci de soutenir le dÊveloppement de CAPod !</string>
<string name="upgrade_foss_sponsor_again_action">Ouvrir la page de parrainage</string> <string name="upgrade_foss_sponsor_again_action">Ouvrir la page de parrainage</string>
<string name="settings_upgrade_status_label">Soutenir CAPod</string> <string name="upgrade_foss_sponsor_label">Soutenir CAPod</string>
<string name="settings_upgrade_status_description">Votre statut de supporter.</string> <string name="settings_upgrade_status_description">Votre statut de supporter.</string>
<string name="upgrade_screen_why_title">Avantages de la mise à niveau</string> <string name="upgrade_screen_why_title">Avantages de la mise à niveau</string>
<string name="upgrade_screen_how_title">Comment aider</string> <string name="upgrade_screen_how_title">Comment aider</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Colaborador desde %s</string> <string name="upgrade_foss_supporter_since">Colaborador desde %s</string>
<string name="upgrade_foss_supporter_thanks">Grazas por apoiar o desenvolvemento de CAPod!</string> <string name="upgrade_foss_supporter_thanks">Grazas por apoiar o desenvolvemento de CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Abrir a pÃĄxina de patrocinio</string> <string name="upgrade_foss_sponsor_again_action">Abrir a pÃĄxina de patrocinio</string>
<string name="settings_upgrade_status_label">Apoia CAPod</string> <string name="upgrade_foss_sponsor_label">Apoia CAPod</string>
<string name="settings_upgrade_status_description">O teu estado de apoiador.</string> <string name="settings_upgrade_status_description">O teu estado de apoiador.</string>
<string name="upgrade_screen_why_title">Vantaxes da actualizaciÃŗn</string> <string name="upgrade_screen_why_title">Vantaxes da actualizaciÃŗn</string>
<string name="upgrade_screen_how_title">Como axudar</string> <string name="upgrade_screen_how_title">Como axudar</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s ⤏āĨ‡ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕</string> <string name="upgrade_foss_supporter_since">%s ⤏āĨ‡ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕</string>
<string name="upgrade_foss_supporter_thanks">CAPod ⤕āĨ‡ ā¤ĩā¤ŋā¤•ā¤žā¤¸ ā¤•ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩ⤍ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤧⤍āĨā¤¯ā¤ĩā¤žā¤Ļ!</string> <string name="upgrade_foss_supporter_thanks">CAPod ⤕āĨ‡ ā¤ĩā¤ŋā¤•ā¤žā¤¸ ā¤•ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩ⤍ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤧⤍āĨā¤¯ā¤ĩā¤žā¤Ļ!</string>
<string name="upgrade_foss_sponsor_again_action">⤏āĨā¤ĒāĨ‰ā¤¨āĨā¤¸ā¤° ā¤ĒāĨ‡ā¤œ ⤖āĨ‹ā¤˛āĨ‡ā¤‚</string> <string name="upgrade_foss_sponsor_again_action">⤏āĨā¤ĒāĨ‰ā¤¨āĨā¤¸ā¤° ā¤ĒāĨ‡ā¤œ ⤖āĨ‹ā¤˛āĨ‡ā¤‚</string>
<string name="settings_upgrade_status_label">CAPod ⤕āĨ‹ ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚</string> <string name="upgrade_foss_sponsor_label">CAPod ⤕āĨ‹ ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚</string>
<string name="settings_upgrade_status_description">⤆ā¤Ē⤕āĨ€ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕ ⤏āĨā¤Ĩā¤ŋ⤤ā¤ŋāĨ¤</string> <string name="settings_upgrade_status_description">⤆ā¤Ē⤕āĨ€ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕ ⤏āĨā¤Ĩā¤ŋ⤤ā¤ŋāĨ¤</string>
<string name="upgrade_screen_why_title">⤅ā¤Ē⤗āĨā¤°āĨ‡ā¤Ą ⤕āĨ‡ ā¤˛ā¤žā¤­</string> <string name="upgrade_screen_why_title">⤅ā¤Ē⤗āĨā¤°āĨ‡ā¤Ą ⤕āĨ‡ ā¤˛ā¤žā¤­</string>
<string name="upgrade_screen_how_title">⤕āĨˆā¤¸āĨ‡ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ⤕⤰āĨ‡ā¤‚</string> <string name="upgrade_screen_how_title">⤕āĨˆā¤¸āĨ‡ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ⤕⤰āĨ‡ā¤‚</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">PodrÅžavatelj od %s</string> <string name="upgrade_foss_supporter_since">PodrÅžavatelj od %s</string>
<string name="upgrade_foss_supporter_thanks">Hvala vam ÅĄto podrÅžavate razvoj CAPoda!</string> <string name="upgrade_foss_supporter_thanks">Hvala vam ÅĄto podrÅžavate razvoj CAPoda!</string>
<string name="upgrade_foss_sponsor_again_action">Otvori stranicu za sponzoriranje</string> <string name="upgrade_foss_sponsor_again_action">Otvori stranicu za sponzoriranje</string>
<string name="settings_upgrade_status_label">Sponzorirajte CAPod</string> <string name="upgrade_foss_sponsor_label">Sponzorirajte CAPod</string>
<string name="settings_upgrade_status_description">VaÅĄ status sponzora</string> <string name="settings_upgrade_status_description">VaÅĄ status sponzora</string>
<string name="upgrade_screen_why_title">Prednosti nadogradnje</string> <string name="upgrade_screen_why_title">Prednosti nadogradnje</string>
<string name="upgrade_screen_how_title">Kako pomoći</string> <string name="upgrade_screen_how_title">Kako pomoći</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">TÃĄmogatÃŗ %s Ãŗta</string> <string name="upgrade_foss_supporter_since">TÃĄmogatÃŗ %s Ãŗta</string>
<string name="upgrade_foss_supporter_thanks">KÃļszÃļnjÃŧk, hogy tÃĄmogatod a CAPod fejlesztÊsÊt!</string> <string name="upgrade_foss_supporter_thanks">KÃļszÃļnjÃŧk, hogy tÃĄmogatod a CAPod fejlesztÊsÊt!</string>
<string name="upgrade_foss_sponsor_again_action">TÃĄmogatÃŗi oldal megnyitÃĄsa</string> <string name="upgrade_foss_sponsor_again_action">TÃĄmogatÃŗi oldal megnyitÃĄsa</string>
<string name="settings_upgrade_status_label">TÃĄmogasson CAPod-ot</string> <string name="upgrade_foss_sponsor_label">TÃĄmogasson CAPod-ot</string>
<string name="settings_upgrade_status_description">Az Ön tÃĄmogatÃŗ stÃĄtusza.</string> <string name="settings_upgrade_status_description">Az Ön tÃĄmogatÃŗ stÃĄtusza.</string>
<string name="upgrade_screen_why_title">FrissítÊsi előnyÃļk</string> <string name="upgrade_screen_why_title">FrissítÊsi előnyÃļk</string>
<string name="upgrade_screen_how_title">Hogyan lehet segíteni</string> <string name="upgrade_screen_how_title">Hogyan lehet segíteni</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Õ€Õ¸ÕžÕĄÕļÕĄÕžÕ¸Ö€ Õ§ %s-ÕĢց</string> <string name="upgrade_foss_supporter_since">Õ€Õ¸ÕžÕĄÕļÕĄÕžÕ¸Ö€ Õ§ %s-ÕĢց</string>
<string name="upgrade_foss_supporter_thanks">ՇÕļÕ¸Ö€Õ°ÕĄÕ¯ÕĄÕŦÕ¸Ö‚ÕŠÕĩուÕļ CAPod-ÕĢ ÕĻÕĄÖ€ÕŖÕĄÖÕ¸Ö‚Õ´Õļ ÕĄÕģÕĄÕ¯ÖÕĨÕŦու Õ°ÕĄÕ´ÕĄÖ€!</string> <string name="upgrade_foss_supporter_thanks">ՇÕļÕ¸Ö€Õ°ÕĄÕ¯ÕĄÕŦÕ¸Ö‚ÕŠÕĩուÕļ CAPod-ÕĢ ÕĻÕĄÖ€ÕŖÕĄÖÕ¸Ö‚Õ´Õļ ÕĄÕģÕĄÕ¯ÖÕĨÕŦու Õ°ÕĄÕ´ÕĄÖ€!</string>
<string name="upgrade_foss_sponsor_again_action">Ô˛ÕĄÖÕĨÕŦ Õ°Õ¸ÕžÕĄÕļÕĄÕžÕ¸Ö€Õ¸Ö‚ÕŠÕĩÕĄÕļ Õ§ÕģÕ¨</string> <string name="upgrade_foss_sponsor_again_action">Ô˛ÕĄÖÕĨÕŦ Õ°Õ¸ÕžÕĄÕļÕĄÕžÕ¸Ö€Õ¸Ö‚ÕŠÕĩÕĄÕļ Õ§ÕģÕ¨</string>
<string name="settings_upgrade_status_label">ÔąÕģÕĄÕ¯ÕĨք CAPod-ÕĢÕļ</string> <string name="upgrade_foss_sponsor_label">ÔąÕģÕĄÕ¯ÕĨք CAPod-ÕĢÕļ</string>
<string name="settings_upgrade_status_description">ՁÕĨր ÕĄÕģÕĄÕ¯ÖÕ¸Õ˛ÕĢ ÕžÕĢÕŗÕĄÕ¯Õ¨:</string> <string name="settings_upgrade_status_description">ՁÕĨր ÕĄÕģÕĄÕ¯ÖÕ¸Õ˛ÕĢ ÕžÕĢÕŗÕĄÕ¯Õ¨:</string>
<string name="upgrade_screen_why_title">ÔšÕĄÖ€Õ´ÕĄÖÕ´ÕĄÕļ ÕĄÕŧÕĄÕžÕĨÕŦÕ¸Ö‚ÕŠÕĩուÕļÕļÕĨրը</string> <string name="upgrade_screen_why_title">ÔšÕĄÖ€Õ´ÕĄÖÕ´ÕĄÕļ ÕĄÕŧÕĄÕžÕĨÕŦÕ¸Ö‚ÕŠÕĩուÕļÕļÕĨրը</string>
<string name="upgrade_screen_how_title">ÔģÕļÕšÕēÕĨÕŊ Ö…ÕŖÕļÕĨÕŦ</string> <string name="upgrade_screen_how_title">ÔģÕļÕšÕēÕĨÕŊ Ö…ÕŖÕļÕĨÕŦ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Pendukung sejak %s</string> <string name="upgrade_foss_supporter_since">Pendukung sejak %s</string>
<string name="upgrade_foss_supporter_thanks">Terima kasih karena telah mendukung pengembangan CAPod!</string> <string name="upgrade_foss_supporter_thanks">Terima kasih karena telah mendukung pengembangan CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Buka halaman sponsor</string> <string name="upgrade_foss_sponsor_again_action">Buka halaman sponsor</string>
<string name="settings_upgrade_status_label">Sponsori CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsori CAPod</string>
<string name="settings_upgrade_status_description">Status pendukung Anda.</string> <string name="settings_upgrade_status_description">Status pendukung Anda.</string>
<string name="upgrade_screen_why_title">Manfaat upgrade</string> <string name="upgrade_screen_why_title">Manfaat upgrade</string>
<string name="upgrade_screen_how_title">Cara membantu</string> <string name="upgrade_screen_how_title">Cara membantu</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Styrktaraðili síðan %s</string> <string name="upgrade_foss_supporter_since">Styrktaraðili síðan %s</string>
<string name="upgrade_foss_supporter_thanks">Takk fyrir að styðja ÞrÃŗun CAPod!</string> <string name="upgrade_foss_supporter_thanks">Takk fyrir að styðja ÞrÃŗun CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Opna styrktarsíðu</string> <string name="upgrade_foss_sponsor_again_action">Opna styrktarsíðu</string>
<string name="settings_upgrade_status_label">Styrktu CAPod</string> <string name="upgrade_foss_sponsor_label">Styrktu CAPod</string>
<string name="settings_upgrade_status_description">Staða Þín sem stuðningsmaður</string> <string name="settings_upgrade_status_description">Staða Þín sem stuðningsmaður</string>
<string name="upgrade_screen_why_title">UppfÃĻrslukostir</string> <string name="upgrade_screen_why_title">UppfÃĻrslukostir</string>
<string name="upgrade_screen_how_title">Hvernig ÃĄ að hjÃĄlpa</string> <string name="upgrade_screen_how_title">Hvernig ÃĄ að hjÃĄlpa</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Sostenitore dal %s</string> <string name="upgrade_foss_supporter_since">Sostenitore dal %s</string>
<string name="upgrade_foss_supporter_thanks">Grazie per supportare lo sviluppo di CAPod!</string> <string name="upgrade_foss_supporter_thanks">Grazie per supportare lo sviluppo di CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Apri la pagina sponsor</string> <string name="upgrade_foss_sponsor_again_action">Apri la pagina sponsor</string>
<string name="settings_upgrade_status_label">Sponsorizza CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsorizza CAPod</string>
<string name="settings_upgrade_status_description">Il tuo status di sostenitore.</string> <string name="settings_upgrade_status_description">Il tuo status di sostenitore.</string>
<string name="upgrade_screen_why_title">Vantaggi dell\'aggiornamento</string> <string name="upgrade_screen_why_title">Vantaggi dell\'aggiornamento</string>
<string name="upgrade_screen_how_title">Come aiutare</string> <string name="upgrade_screen_how_title">Come aiutare</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">×Ēומך מאז %s</string> <string name="upgrade_foss_supporter_since">×Ēומך מאז %s</string>
<string name="upgrade_foss_supporter_thanks">×Ēודה ׊א×Ēה ×Ēומך בפי×Ēוח של CAPod!</string> <string name="upgrade_foss_supporter_thanks">×Ēודה ׊א×Ēה ×Ēומך בפי×Ēוח של CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">פ×Ēח א×Ē ×“×Ŗ ה×Ēמיכה</string> <string name="upgrade_foss_sponsor_again_action">פ×Ēח א×Ē ×“×Ŗ ה×Ēמיכה</string>
<string name="settings_upgrade_status_label">×Ēמוך ב-CAPod</string> <string name="upgrade_foss_sponsor_label">×Ēמוך ב-CAPod</string>
<string name="settings_upgrade_status_description">סטטוס ה×Ēומך שלך.</string> <string name="settings_upgrade_status_description">סטטוס ה×Ēומך שלך.</string>
<string name="upgrade_screen_why_title">י×Ēרונו×Ē ×”×Š×“×¨×•×’</string> <string name="upgrade_screen_why_title">י×Ēרונו×Ē ×”×Š×“×¨×•×’</string>
<string name="upgrade_screen_how_title">איך ל×ĸזור</string> <string name="upgrade_screen_how_title">איך ל×ĸזור</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%sからぎã‚ĩポãƒŧã‚ŋãƒŧ</string> <string name="upgrade_foss_supporter_since">%sからぎã‚ĩポãƒŧã‚ŋãƒŧ</string>
<string name="upgrade_foss_supporter_thanks">CAPodぎ開į™ēを支援しãĻいただきありがとうございぞす!</string> <string name="upgrade_foss_supporter_thanks">CAPodぎ開į™ēを支援しãĻいただきありがとうございぞす!</string>
<string name="upgrade_foss_sponsor_again_action">ã‚šãƒãƒŗã‚ĩãƒŧペãƒŧジを開く</string> <string name="upgrade_foss_sponsor_again_action">ã‚šãƒãƒŗã‚ĩãƒŧペãƒŧジを開く</string>
<string name="settings_upgrade_status_label">CAPod ã‚’ã‚šãƒãƒŗã‚ĩãƒŧする</string> <string name="upgrade_foss_sponsor_label">CAPod ã‚’ã‚šãƒãƒŗã‚ĩãƒŧする</string>
<string name="settings_upgrade_status_description">ã‚ĩポãƒŧã‚ŋãƒŧ゚テãƒŧã‚ŋ゚。</string> <string name="settings_upgrade_status_description">ã‚ĩポãƒŧã‚ŋãƒŧ゚テãƒŧã‚ŋ゚。</string>
<string name="upgrade_screen_why_title">ã‚ĸップグãƒŦãƒŧãƒ‰ãŽį‰šå…¸</string> <string name="upgrade_screen_why_title">ã‚ĸップグãƒŦãƒŧãƒ‰ãŽį‰šå…¸</string>
<string name="upgrade_screen_how_title">協力するãĢは</string> <string name="upgrade_screen_how_title">協力するãĢは</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">მხარდამჭერი %s-დან</string> <string name="upgrade_foss_supporter_since">მხარდამჭერი %s-დან</string>
<string name="upgrade_foss_supporter_thanks">მადლობა CAPod-ის განვითარების მხარდაჭერისთვის!</string> <string name="upgrade_foss_supporter_thanks">მადლობა CAPod-ის განვითარების მხარდაჭერისთვის!</string>
<string name="upgrade_foss_sponsor_again_action">სპონსორის გვერდის გახსნა</string> <string name="upgrade_foss_sponsor_again_action">სპონსორის გვერდის გახსნა</string>
<string name="settings_upgrade_status_label">მხარი áƒ“áƒáƒŖáƒ­áƒ˜áƒ áƒáƒ— CAPod-ქ</string> <string name="upgrade_foss_sponsor_label">მხარი áƒ“áƒáƒŖáƒ­áƒ˜áƒ áƒáƒ— CAPod-ქ</string>
<string name="settings_upgrade_status_description">თáƒĨვენი მხარდამჭერის მდგომარეობა.</string> <string name="settings_upgrade_status_description">თáƒĨვენი მხარდამჭერის მდგომარეობა.</string>
<string name="upgrade_screen_why_title">განახლების áƒŖáƒžáƒ˜áƒ áƒáƒĸესობები</string> <string name="upgrade_screen_why_title">განახლების áƒŖáƒžáƒ˜áƒ áƒáƒĸესობები</string>
<string name="upgrade_screen_how_title">როგორ დაგეხმაროთ</string> <string name="upgrade_screen_how_title">როგორ დაგეხმაროთ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ážĸ្នកគážļំទ្រតážļំងពី %s</string> <string name="upgrade_foss_supporter_since">ážĸ្នកគážļំទ្រតážļំងពី %s</string>
<string name="upgrade_foss_supporter_thanks">សážŧមážĸរគážģណសម្រážļប់កážļរគážļំទ្រកážļរážĸភិវឌ្ឍន៍ CAPod!</string> <string name="upgrade_foss_supporter_thanks">សážŧមážĸរគážģណសម្រážļប់កážļរគážļំទ្រកážļរážĸភិវឌ្ឍន៍ CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">បើកទំព័រឧបត្ថម្ភ</string> <string name="upgrade_foss_sponsor_again_action">បើកទំព័រឧបត្ថម្ភ</string>
<string name="settings_upgrade_status_label">ឧបត្ថម្ភ CAPod</string> <string name="upgrade_foss_sponsor_label">ឧបត្ថម្ភ CAPod</string>
<string name="settings_upgrade_status_description">ស្ថážļនភážļពážĸ្នកគážļំទ្ររបស់ážĸ្នក។</string> <string name="settings_upgrade_status_description">ស្ថážļនភážļពážĸ្នកគážļំទ្ររបស់ážĸ្នក។</string>
<string name="upgrade_screen_why_title">ážĸត្ថប្រយោជន៍លើកកម្ពស់</string> <string name="upgrade_screen_why_title">ážĸត្ថប្រយោជន៍លើកកម្ពស់</string>
<string name="upgrade_screen_how_title">របៀបជážŊយ</string> <string name="upgrade_screen_how_title">របៀបជážŊយ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Piştgir ji %s ve</string> <string name="upgrade_foss_supporter_since">Piştgir ji %s ve</string>
<string name="upgrade_foss_supporter_thanks">Spas ji bo piştgiriya te ya pÃĒşxistina CAPod!</string> <string name="upgrade_foss_supporter_thanks">Spas ji bo piştgiriya te ya pÃĒşxistina CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">RÃģpela piştgiriyÃĒ veke</string> <string name="upgrade_foss_sponsor_again_action">RÃģpela piştgiriyÃĒ veke</string>
<string name="settings_upgrade_status_label">CAPod-ÃĒ piştgirÃŽ bike</string> <string name="upgrade_foss_sponsor_label">CAPod-ÃĒ piştgirÃŽ bike</string>
<string name="settings_upgrade_status_description">Rewşa piştgiriya te.</string> <string name="settings_upgrade_status_description">Rewşa piştgiriya te.</string>
<string name="upgrade_screen_why_title">FeydeyÃĒn BardiyÃĒ</string> <string name="upgrade_screen_why_title">FeydeyÃĒn BardiyÃĒ</string>
<string name="upgrade_screen_how_title">Çawa AlÃŽkarÃŽ Bike</string> <string name="upgrade_screen_how_title">Çawa AlÃŽkarÃŽ Bike</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s ➰ā˛ŋ➂ā˛Ļ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➗</string> <string name="upgrade_foss_supporter_since">%s ➰ā˛ŋ➂ā˛Ļ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➗</string>
<string name="upgrade_foss_supporter_thanks">CAPod ➅➭ā˛ŋā˛ĩ⺃ā˛Ļāŗā˛§ā˛ŋ➗⺆ ā˛Ŧ⺆➂ā˛Ŧ➞ ā˛¨āŗ€ā˛Ąā˛ŋā˛Ļāŗā˛Ļā˛•āŗā˛•ā˛žā˛—ā˛ŋ ā˛§ā˛¨āŗā˛¯ā˛ĩā˛žā˛Ļ➗➺⺁!</string> <string name="upgrade_foss_supporter_thanks">CAPod ➅➭ā˛ŋā˛ĩ⺃ā˛Ļāŗā˛§ā˛ŋ➗⺆ ā˛Ŧ⺆➂ā˛Ŧ➞ ā˛¨āŗ€ā˛Ąā˛ŋā˛Ļāŗā˛Ļā˛•āŗā˛•ā˛žā˛—ā˛ŋ ā˛§ā˛¨āŗā˛¯ā˛ĩā˛žā˛Ļ➗➺⺁!</string>
<string name="upgrade_foss_sponsor_again_action">ā˛Ēāŗā˛°ā˛žā˛¯āŗ‹ā˛œā˛• ā˛Ē⺁➟ ➤⺆➰⺆➝ā˛ŋ➰ā˛ŋ</string> <string name="upgrade_foss_sponsor_again_action">ā˛Ēāŗā˛°ā˛žā˛¯āŗ‹ā˛œā˛• ā˛Ē⺁➟ ➤⺆➰⺆➝ā˛ŋ➰ā˛ŋ</string>
<string name="settings_upgrade_status_label">CAPod ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏ā˛ŋ</string> <string name="upgrade_foss_sponsor_label">CAPod ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏ā˛ŋ</string>
<string name="settings_upgrade_status_description">➍ā˛ŋā˛Žāŗā˛Ž ā˛Ŧ⺆➂ā˛Ŧā˛˛ā˛•ā˛žā˛° ā˛¸āŗā˛Ĩā˛ŋ➤ā˛ŋ.</string> <string name="settings_upgrade_status_description">➍ā˛ŋā˛Žāŗā˛Ž ā˛Ŧ⺆➂ā˛Ŧā˛˛ā˛•ā˛žā˛° ā˛¸āŗā˛Ĩā˛ŋ➤ā˛ŋ.</string>
<string name="upgrade_screen_why_title">➍ā˛ĩ⺀➕➰➪ ā˛Ēāŗā˛°ā˛¯āŗ‹ā˛œā˛¨ā˛—ā˛ŗāŗ</string> <string name="upgrade_screen_why_title">➍ā˛ĩ⺀➕➰➪ ā˛Ēāŗā˛°ā˛¯āŗ‹ā˛œā˛¨ā˛—ā˛ŗāŗ</string>
<string name="upgrade_screen_how_title">ā˛¸ā˛šā˛žā˛¯ ā˛Žā˛žā˛Ąāŗā˛ĩ⺁ā˛Ļ⺁ ā˛šāŗ‡ā˛—āŗ†</string> <string name="upgrade_screen_how_title">ā˛¸ā˛šā˛žā˛¯ ā˛Žā˛žā˛Ąāŗā˛ĩ⺁ā˛Ļ⺁ ā˛šāŗ‡ā˛—āŗ†</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%sëļ€í„° í›„ė›ėž</string> <string name="upgrade_foss_supporter_since">%sëļ€í„° í›„ė›ėž</string>
<string name="upgrade_foss_supporter_thanks">CAPod ę°œë°œė„ í›„ė›í•´ ėŖŧė…”ė„œ 감ė‚Ŧ합니다!</string> <string name="upgrade_foss_supporter_thanks">CAPod ę°œë°œė„ í›„ė›í•´ ėŖŧė…”ė„œ 감ė‚Ŧ합니다!</string>
<string name="upgrade_foss_sponsor_again_action">í›„ė› íŽ˜ė´ė§€ 뗴揰</string> <string name="upgrade_foss_sponsor_again_action">í›„ė› íŽ˜ė´ė§€ 뗴揰</string>
<string name="settings_upgrade_status_label">CAPod í›„ė›í•˜ę¸°</string> <string name="upgrade_foss_sponsor_label">CAPod í›„ė›í•˜ę¸°</string>
<string name="settings_upgrade_status_description">í›„ė›ėž ėƒíƒœ</string> <string name="settings_upgrade_status_description">í›„ė›ėž ėƒíƒœ</string>
<string name="upgrade_screen_why_title">ė—…ęˇ¸ë ˆė´ë“œ 혜택</string> <string name="upgrade_screen_why_title">ė—…ęˇ¸ë ˆė´ë“œ 혜택</string>
<string name="upgrade_screen_how_title">ë„ė›€ ėŖŧ기</string> <string name="upgrade_screen_how_title">ë„ė›€ ėŖŧ기</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s\'даĐŊ ĐąĐĩŅ€Đ¸ ĐēĐžĐģĐ´ĐžĐžŅ‡Ņƒ</string> <string name="upgrade_foss_supporter_since">%s\'даĐŊ ĐąĐĩŅ€Đ¸ ĐēĐžĐģĐ´ĐžĐžŅ‡Ņƒ</string>
<string name="upgrade_foss_supporter_thanks">CAPod\'Đ´ŅƒĐŊ ĶŠĐŊŌ¯ĐŗŌ¯ŅˆŌ¯ĐŊ ĐēĐžĐģĐ´ĐžĐŗĐžĐŊŅƒŌŖŅƒĐˇ ԝ҇ԝĐŊ Ņ€Đ°Ņ…ĐŧĐ°Ņ‚!</string> <string name="upgrade_foss_supporter_thanks">CAPod\'Đ´ŅƒĐŊ ĶŠĐŊŌ¯ĐŗŌ¯ŅˆŌ¯ĐŊ ĐēĐžĐģĐ´ĐžĐŗĐžĐŊŅƒŌŖŅƒĐˇ ԝ҇ԝĐŊ Ņ€Đ°Ņ…ĐŧĐ°Ņ‚!</string>
<string name="upgrade_foss_sponsor_again_action">ДĐĩĐŧĶŠĶŠŅ€Ņ‡Ō¯ĐģŌ¯Đē ĐąĐ°Ņ€Đ°ĐēŅ‡Đ°ŅŅ‹ĐŊ Đ°Ņ‡ŅƒŅƒ</string> <string name="upgrade_foss_sponsor_again_action">ДĐĩĐŧĶŠĶŠŅ€Ņ‡Ō¯ĐģŌ¯Đē ĐąĐ°Ņ€Đ°ĐēŅ‡Đ°ŅŅ‹ĐŊ Đ°Ņ‡ŅƒŅƒ</string>
<string name="settings_upgrade_status_label">CAPod-Đ´Ņ‹ ҁĐŋĐžĐŊŅĐžŅ€ĐģОО</string> <string name="upgrade_foss_sponsor_label">CAPod-Đ´Ņ‹ ҁĐŋĐžĐŊŅĐžŅ€ĐģОО</string>
<string name="settings_upgrade_status_description">КоĐģĐ´ĐžĐžŅ‡Ņƒ айаĐģŅ‹</string> <string name="settings_upgrade_status_description">КоĐģĐ´ĐžĐžŅ‡Ņƒ айаĐģŅ‹</string>
<string name="upgrade_screen_why_title">Đ–ĐžĐŗĐžŅ€ŅƒĐģООĐŊ҃ĐŊ ĐŋаКдаĐģĐ°Ņ€Ņ‹</string> <string name="upgrade_screen_why_title">Đ–ĐžĐŗĐžŅ€ŅƒĐģООĐŊ҃ĐŊ ĐŋаКдаĐģĐ°Ņ€Ņ‹</string>
<string name="upgrade_screen_how_title">Đ–Đ°Ņ€Đ´Đ°Đŧ ĐąĐĩŅ€ĐŗŌ¯Ō¯ĐŊŌ¯ĐŊ ĐļĐžĐģ҃</string> <string name="upgrade_screen_how_title">Đ–Đ°Ņ€Đ´Đ°Đŧ ĐąĐĩŅ€ĐŗŌ¯Ō¯ĐŊŌ¯ĐŊ ĐļĐžĐģ҃</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">āēœāēšāģ‰āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™āē•āēąāģ‰āē‡āģāē•āģˆ %s</string> <string name="upgrade_foss_supporter_since">āēœāēšāģ‰āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™āē•āēąāģ‰āē‡āģāē•āģˆ %s</string>
<string name="upgrade_foss_supporter_thanks">āē‚āē­āēšāēŠāēšāģˆāēĒāēŗāēĨāēąāēšāēāē˛āē™āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™āēāē˛āē™āēžāēąāē”āē—āē°āē™āē˛āē‚āē­āē‡ CAPod!</string> <string name="upgrade_foss_supporter_thanks">āē‚āē­āēšāēŠāēšāģˆāēĒāēŗāēĨāēąāēšāēāē˛āē™āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™āēāē˛āē™āēžāēąāē”āē—āē°āē™āē˛āē‚āē­āē‡ CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">āģ€āē›āē´āē”āģāģ‰āē˛āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™</string> <string name="upgrade_foss_sponsor_again_action">āģ€āē›āē´āē”āģāģ‰āē˛āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™</string>
<string name="settings_upgrade_status_label">āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™ CAPod</string> <string name="upgrade_foss_sponsor_label">āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™ CAPod</string>
<string name="settings_upgrade_status_description">āēĒāē°āē–āē˛āē™āē°āēœāēšāģ‰āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™āē‚āē­āē‡āē—āģˆāē˛āē™</string> <string name="settings_upgrade_status_description">āēĒāē°āē–āē˛āē™āē°āēœāēšāģ‰āēĒāē°āģœāēąāēšāēĒāē°āģœāēšāē™āē‚āē­āē‡āē—āģˆāē˛āē™</string>
<string name="upgrade_screen_why_title">āē›āē°āģ‚āēĢāēāē”āē‚āē­āē‡āēāē˛āē™āē­āēąāēšāģ€āēāēŖāē”</string> <string name="upgrade_screen_why_title">āē›āē°āģ‚āēĢāēāē”āē‚āē­āē‡āēāē˛āē™āē­āēąāēšāģ€āēāēŖāē”</string>
<string name="upgrade_screen_how_title">āē§āē´āē—āēĩāēāē˛āē™āēŠāģˆāē§āēāģ€āēĢāēŧāēˇāē­</string> <string name="upgrade_screen_how_title">āē§āē´āē—āēĩāēāē˛āē™āēŠāģˆāē§āēāģ€āēĢāēŧāēˇāē­</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Rėmėjas nuo %s</string> <string name="upgrade_foss_supporter_since">Rėmėjas nuo %s</string>
<string name="upgrade_foss_supporter_thanks">AčiÅĢ, kad remiate CAPod kÅĢrimą!</string> <string name="upgrade_foss_supporter_thanks">AčiÅĢ, kad remiate CAPod kÅĢrimą!</string>
<string name="upgrade_foss_sponsor_again_action">Atidaryti rėmėjo puslapį</string> <string name="upgrade_foss_sponsor_again_action">Atidaryti rėmėjo puslapį</string>
<string name="settings_upgrade_status_label">Remti CAPod</string> <string name="upgrade_foss_sponsor_label">Remti CAPod</string>
<string name="settings_upgrade_status_description">JÅĢsÅŗ rėmėjo statusas.</string> <string name="settings_upgrade_status_description">JÅĢsÅŗ rėmėjo statusas.</string>
<string name="upgrade_screen_why_title">Atnaujinimo privalumai</string> <string name="upgrade_screen_why_title">Atnaujinimo privalumai</string>
<string name="upgrade_screen_how_title">Kaip padėti</string> <string name="upgrade_screen_how_title">Kaip padėti</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">AtbalstÄĢtājs kopÅĄ %s</string> <string name="upgrade_foss_supporter_since">AtbalstÄĢtājs kopÅĄ %s</string>
<string name="upgrade_foss_supporter_thanks">Paldies, ka atbalsti CAPod izstrādi!</string> <string name="upgrade_foss_supporter_thanks">Paldies, ka atbalsti CAPod izstrādi!</string>
<string name="upgrade_foss_sponsor_again_action">Atvērt sponsorÄ“ÅĄanas lapu</string> <string name="upgrade_foss_sponsor_again_action">Atvērt sponsorÄ“ÅĄanas lapu</string>
<string name="settings_upgrade_status_label">AtbalstÄĢt CAPod</string> <string name="upgrade_foss_sponsor_label">AtbalstÄĢt CAPod</string>
<string name="settings_upgrade_status_description">JÅĢsu atbalstÄĢtāja statuss.</string> <string name="settings_upgrade_status_description">JÅĢsu atbalstÄĢtāja statuss.</string>
<string name="upgrade_screen_why_title">JauninÄÅĄanas priekÅĄrocÄĢbas</string> <string name="upgrade_screen_why_title">JauninÄÅĄanas priekÅĄrocÄĢbas</string>
<string name="upgrade_screen_how_title">Kā palÄĢdzēt</string> <string name="upgrade_screen_how_title">Kā palÄĢdzēt</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ĐŸĐžĐ´Đ´Ņ€ĐļŅƒĐ˛Đ°Ņ‡ Од %s</string> <string name="upgrade_foss_supporter_since">ĐŸĐžĐ´Đ´Ņ€ĐļŅƒĐ˛Đ°Ņ‡ Од %s</string>
<string name="upgrade_foss_supporter_thanks">Đĸи ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€Đ¸ĐŧĐĩ ŅˆŅ‚Đž ĐŗĐž ĐŋĐžĐ´Đ´Ņ€ĐļŅƒĐ˛Đ°Ņˆ Ņ€Đ°ĐˇĐ˛ĐžŅ˜ĐžŅ‚ ĐŊа CAPod!</string> <string name="upgrade_foss_supporter_thanks">Đĸи ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€Đ¸ĐŧĐĩ ŅˆŅ‚Đž ĐŗĐž ĐŋĐžĐ´Đ´Ņ€ĐļŅƒĐ˛Đ°Ņˆ Ņ€Đ°ĐˇĐ˛ĐžŅ˜ĐžŅ‚ ĐŊа CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">ĐžŅ‚Đ˛ĐžŅ€Đ¸ Ņ˜Đ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° Са ҁĐŋĐžĐŊĐˇĐžŅ€ŅŅ‚Đ˛Đž</string> <string name="upgrade_foss_sponsor_again_action">ĐžŅ‚Đ˛ĐžŅ€Đ¸ Ņ˜Đ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° Са ҁĐŋĐžĐŊĐˇĐžŅ€ŅŅ‚Đ˛Đž</string>
<string name="settings_upgrade_status_label">ĐŸĐžĐ´Đ´Ņ€Đļи CAPod</string> <string name="upgrade_foss_sponsor_label">ĐŸĐžĐ´Đ´Ņ€Đļи CAPod</string>
<string name="settings_upgrade_status_description">ĐĸĐ˛ĐžŅ˜ĐžŅ‚ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŊа ĐŋĐžĐ´Đ´Ņ€ĐļŅƒĐ˛Đ°Ņ‡.</string> <string name="settings_upgrade_status_description">ĐĸĐ˛ĐžŅ˜ĐžŅ‚ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŊа ĐŋĐžĐ´Đ´Ņ€ĐļŅƒĐ˛Đ°Ņ‡.</string>
<string name="upgrade_screen_why_title">ĐŸŅ€ĐĩĐ´ĐŊĐžŅŅ‚Đ¸ ĐŊа ĐŊĐ°Đ´ĐŗŅ€Đ°Đ´ŅƒĐ˛Đ°ŅšĐĩ</string> <string name="upgrade_screen_why_title">ĐŸŅ€ĐĩĐ´ĐŊĐžŅŅ‚Đ¸ ĐŊа ĐŊĐ°Đ´ĐŗŅ€Đ°Đ´ŅƒĐ˛Đ°ŅšĐĩ</string>
<string name="upgrade_screen_how_title">КаĐēĐž да ĐŋĐžĐŧĐžĐŗĐŊĐĩŅ‚Đĩ</string> <string name="upgrade_screen_how_title">КаĐēĐž да ĐŋĐžĐŧĐžĐŗĐŊĐĩŅ‚Đĩ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s ā´Žāĩā´¤āĩŊ ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´•āĩā´•ā´žāĩģ</string> <string name="upgrade_foss_supporter_since">%s ā´Žāĩā´¤āĩŊ ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´•āĩā´•ā´žāĩģ</string>
<string name="upgrade_foss_supporter_thanks">CAPod-ā´¨āĩā´ąāĩ† ā´ĩā´ŋⴕⴏⴍⴤāĩā´¤āĩ† ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´šāĩā´šā´¤ā´ŋā´¨āĩ ⴍⴍāĩā´Ļā´ŋ!</string> <string name="upgrade_foss_supporter_thanks">CAPod-ā´¨āĩā´ąāĩ† ā´ĩā´ŋⴕⴏⴍⴤāĩā´¤āĩ† ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´šāĩā´šā´¤ā´ŋā´¨āĩ ⴍⴍāĩā´Ļā´ŋ!</string>
<string name="upgrade_foss_sponsor_again_action">ā´¸āĩā´Ēāĩ‹āĩēā´¸āĩŧ ā´Ēāĩ‡ā´œāĩ ā´¤āĩā´ąā´•āĩā´•āĩā´•</string> <string name="upgrade_foss_sponsor_again_action">ā´¸āĩā´Ēāĩ‹āĩēā´¸āĩŧ ā´Ēāĩ‡ā´œāĩ ā´¤āĩā´ąā´•āĩā´•āĩā´•</string>
<string name="settings_upgrade_status_label">CAPod ā´¨āĩ† ā´¸āĩā´Ēāĩ‹āĩēā´¸āĩŧ ⴚāĩ†ā´¯āĩā´¯āĩā´•</string> <string name="upgrade_foss_sponsor_label">CAPod ā´¨āĩ† ā´¸āĩā´Ēāĩ‹āĩēā´¸āĩŧ ⴚāĩ†ā´¯āĩā´¯āĩā´•</string>
<string name="settings_upgrade_status_description">ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´¯ ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ.</string> <string name="settings_upgrade_status_description">ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´¯ ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ.</string>
<string name="upgrade_screen_why_title">ā´…ā´Ēāĩâ€Œā´—āĩā´°āĩ‡ā´Ąāĩ ā´¨āĩ‡ā´Ÿāĩā´Ÿā´™āĩā´™āĩž</string> <string name="upgrade_screen_why_title">ā´…ā´Ēāĩâ€Œā´—āĩā´°āĩ‡ā´Ąāĩ ā´¨āĩ‡ā´Ÿāĩā´Ÿā´™āĩā´™āĩž</string>
<string name="upgrade_screen_how_title">ā´Žā´™āĩā´™ā´¨āĩ† ā´¸ā´šā´žā´¯ā´ŋā´•āĩā´•ā´žā´‚</string> <string name="upgrade_screen_how_title">ā´Žā´™āĩā´™ā´¨āĩ† ā´¸ā´šā´žā´¯ā´ŋā´•āĩā´•ā´žā´‚</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s-ҁ Ņ…ĐžĐšŅˆ Đ´ŅĐŧĐļĐ¸ĐŗŅ‡</string> <string name="upgrade_foss_supporter_since">%s-ҁ Ņ…ĐžĐšŅˆ Đ´ŅĐŧĐļĐ¸ĐŗŅ‡</string>
<string name="upgrade_foss_supporter_thanks">CAPod-Ņ‹ĐŊ Ņ…ĶŠĐŗĐļĐģĐ¸ĐšĐŗ Đ´ŅĐŧĐļŅŅĐŊĐ´ ĐąĐ°ŅŅ€ĐģаĐģаа!</string> <string name="upgrade_foss_supporter_thanks">CAPod-Ņ‹ĐŊ Ņ…ĶŠĐŗĐļĐģĐ¸ĐšĐŗ Đ´ŅĐŧĐļŅŅĐŊĐ´ ĐąĐ°ŅŅ€ĐģаĐģаа!</string>
<string name="upgrade_foss_sponsor_again_action">Đ”ŅĐŧĐļĐ¸ĐŗŅ‡Đ¸ĐšĐŊ Ņ…ŅƒŅƒĐ´ŅŅ‹Đŗ ĐŊŅŅŅ…</string> <string name="upgrade_foss_sponsor_again_action">Đ”ŅĐŧĐļĐ¸ĐŗŅ‡Đ¸ĐšĐŊ Ņ…ŅƒŅƒĐ´ŅŅ‹Đŗ ĐŊŅŅŅ…</string>
<string name="settings_upgrade_status_label">CAPod-Ņ‹Đŗ ҁĐŋĐžĐŊŅĐžŅ€ĐģĐžŅ…</string> <string name="upgrade_foss_sponsor_label">CAPod-Ņ‹Đŗ ҁĐŋĐžĐŊŅĐžŅ€ĐģĐžŅ…</string>
<string name="settings_upgrade_status_description">ĐĸаĐŊŅ‹ Đ´ŅĐŧĐļĐ¸ĐŗŅ‡ ŅŅ‚Đ°Ņ‚ŅƒŅ.</string> <string name="settings_upgrade_status_description">ĐĸаĐŊŅ‹ Đ´ŅĐŧĐļĐ¸ĐŗŅ‡ ŅŅ‚Đ°Ņ‚ŅƒŅ.</string>
<string name="upgrade_screen_why_title">Đ”Đ°Đ˛ŅƒŅƒ Ņ‚Đ°ĐģŅƒŅƒĐ´</string> <string name="upgrade_screen_why_title">Đ”Đ°Đ˛ŅƒŅƒ Ņ‚Đ°ĐģŅƒŅƒĐ´</string>
<string name="upgrade_screen_how_title">ĐĨŅŅ€Ņ…ŅĐŊ Ņ‚ŅƒŅĐģаĐŧĐļ Ō¯ĐˇŌ¯Ō¯ĐģŅŅ…</string> <string name="upgrade_screen_how_title">ĐĨŅŅ€Ņ…ŅĐŊ Ņ‚ŅƒŅĐģаĐŧĐļ Ō¯ĐˇŌ¯Ō¯ĐģŅŅ…</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s ā¤Ēā¤žā¤¸āĨ‚⤍ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕</string> <string name="upgrade_foss_supporter_since">%s ā¤Ēā¤žā¤¸āĨ‚⤍ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕</string>
<string name="upgrade_foss_supporter_thanks">CAPod ⤚āĨā¤¯ā¤ž ā¤ĩā¤ŋā¤•ā¤žā¤¸ā¤žā¤˛ā¤ž ā¤Ēā¤žā¤ ā¤ŋ⤂ā¤Ŧā¤ž ā¤Ļā¤ŋ⤞āĨā¤¯ā¤žā¤Ŧā¤ĻāĨā¤Ļ⤞ ⤧⤍āĨā¤¯ā¤ĩā¤žā¤Ļ!</string> <string name="upgrade_foss_supporter_thanks">CAPod ⤚āĨā¤¯ā¤ž ā¤ĩā¤ŋā¤•ā¤žā¤¸ā¤žā¤˛ā¤ž ā¤Ēā¤žā¤ ā¤ŋ⤂ā¤Ŧā¤ž ā¤Ļā¤ŋ⤞āĨā¤¯ā¤žā¤Ŧā¤ĻāĨā¤Ļ⤞ ⤧⤍āĨā¤¯ā¤ĩā¤žā¤Ļ!</string>
<string name="upgrade_foss_sponsor_again_action">ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ā¤‰ā¤˜ā¤Ąā¤ž</string> <string name="upgrade_foss_sponsor_again_action">ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ā¤‰ā¤˜ā¤Ąā¤ž</string>
<string name="settings_upgrade_status_label">CAPod ā¤˛ā¤ž ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ā¤•ā¤°ā¤ž</string> <string name="upgrade_foss_sponsor_label">CAPod ā¤˛ā¤ž ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ā¤•ā¤°ā¤ž</string>
<string name="settings_upgrade_status_description">⤆ā¤Ē⤞āĨā¤¯ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕ ⤏āĨā¤Ĩā¤ŋ⤤āĨ€.</string> <string name="settings_upgrade_status_description">⤆ā¤Ē⤞āĨā¤¯ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕ ⤏āĨā¤Ĩā¤ŋ⤤āĨ€.</string>
<string name="upgrade_screen_why_title">⤅ā¤Ē⤗āĨā¤°āĨ‡ā¤Ą ā¤˛ā¤žā¤­</string> <string name="upgrade_screen_why_title">⤅ā¤Ē⤗āĨā¤°āĨ‡ā¤Ą ā¤˛ā¤žā¤­</string>
<string name="upgrade_screen_how_title">ā¤Žā¤Ļ⤤ ⤕⤏āĨ‡ ā¤•ā¤°ā¤žā¤¯ā¤šāĨ€</string> <string name="upgrade_screen_how_title">ā¤Žā¤Ļ⤤ ⤕⤏āĨ‡ ā¤•ā¤°ā¤žā¤¯ā¤šāĨ€</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Penyokong sejak %s</string> <string name="upgrade_foss_supporter_since">Penyokong sejak %s</string>
<string name="upgrade_foss_supporter_thanks">Terima kasih kerana menyokong pembangunan CAPod!</string> <string name="upgrade_foss_supporter_thanks">Terima kasih kerana menyokong pembangunan CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Buka halaman penaja</string> <string name="upgrade_foss_sponsor_again_action">Buka halaman penaja</string>
<string name="settings_upgrade_status_label">Menajakan CAPod</string> <string name="upgrade_foss_sponsor_label">Menajakan CAPod</string>
<string name="settings_upgrade_status_description">Status penyokong anda.</string> <string name="settings_upgrade_status_description">Status penyokong anda.</string>
<string name="upgrade_screen_why_title">Manfaat peningkatan</string> <string name="upgrade_screen_why_title">Manfaat peningkatan</string>
<string name="upgrade_screen_how_title">Bagaimana untuk membantu</string> <string name="upgrade_screen_how_title">Bagaimana untuk membantu</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s မှစ၍ ပá€ļá€ˇá€•á€­á€¯á€¸á€žá€°</string> <string name="upgrade_foss_supporter_since">%s မှစ၍ ပá€ļá€ˇá€•á€­á€¯á€¸á€žá€°</string>
<string name="upgrade_foss_supporter_thanks">CAPod ၏ ဖá€Ŋá€ļ့ဖá€ŧိုးတိုးတကá€ēမသုကို ပá€ļá€ˇá€•á€­á€¯á€¸á€•á€ąá€¸á€žá€Šá€ˇá€ēအတá€Ŋကá€ē ကá€ģေးဇူးတငá€ēပá€Ģသညá€ē!</string> <string name="upgrade_foss_supporter_thanks">CAPod ၏ ဖá€Ŋá€ļ့ဖá€ŧိုးတိုးတကá€ēမသုကို ပá€ļá€ˇá€•á€­á€¯á€¸á€•á€ąá€¸á€žá€Šá€ˇá€ēအတá€Ŋကá€ē ကá€ģေးဇူးတငá€ēပá€Ģသညá€ē!</string>
<string name="upgrade_foss_sponsor_again_action">ပá€ļá€ˇá€•á€­á€¯á€¸á€žá€°á€…á€Ŧမá€ģကá€ēနှá€Ŧကို ဖá€Ŋင့á€ēပá€Ģ</string> <string name="upgrade_foss_sponsor_again_action">ပá€ļá€ˇá€•á€­á€¯á€¸á€žá€°á€…á€Ŧမá€ģကá€ēနှá€Ŧကို ဖá€Ŋင့á€ēပá€Ģ</string>
<string name="settings_upgrade_status_label">CAPod ကို ပá€ļá€ˇá€•á€­á€¯á€¸á€•á€Ģ</string> <string name="upgrade_foss_sponsor_label">CAPod ကို ပá€ļá€ˇá€•á€­á€¯á€¸á€•á€Ģ</string>
<string name="settings_upgrade_status_description">သငá€ē၏ ပá€ļá€ˇá€•á€­á€¯á€¸á€žá€° အခá€ŧေအနေ။</string> <string name="settings_upgrade_status_description">သငá€ē၏ ပá€ļá€ˇá€•á€­á€¯á€¸á€žá€° အခá€ŧေအနေ။</string>
<string name="upgrade_screen_why_title">အဆင့á€ēမá€ŧှင့á€ēတငá€ēမသု အကá€ģá€­á€¯á€¸á€Ąá€€á€ģေးမမá€ģá€Ŧး</string> <string name="upgrade_screen_why_title">အဆင့á€ēမá€ŧှင့á€ēတငá€ēမသု အကá€ģá€­á€¯á€¸á€Ąá€€á€ģေးမမá€ģá€Ŧး</string>
<string name="upgrade_screen_how_title">ကူညီနညá€ēးလမá€ēး</string> <string name="upgrade_screen_how_title">ကူညီနညá€ēးလမá€ēး</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Støttespiller siden %s</string> <string name="upgrade_foss_supporter_since">Støttespiller siden %s</string>
<string name="upgrade_foss_supporter_thanks">Takk for at du støtter utviklingen av CAPod!</string> <string name="upgrade_foss_supporter_thanks">Takk for at du støtter utviklingen av CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Åpne sponsorside</string> <string name="upgrade_foss_sponsor_again_action">Åpne sponsorside</string>
<string name="settings_upgrade_status_label">Støtt CAPod</string> <string name="upgrade_foss_sponsor_label">Støtt CAPod</string>
<string name="settings_upgrade_status_description">Din status som støtter.</string> <string name="settings_upgrade_status_description">Din status som støtter.</string>
<string name="upgrade_screen_why_title">Oppgraderingsfordeler</string> <string name="upgrade_screen_why_title">Oppgraderingsfordeler</string>
<string name="upgrade_screen_how_title">Hvordan hjelpe</string> <string name="upgrade_screen_how_title">Hvordan hjelpe</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s ā¤ĻāĨ‡ā¤–ā¤ŋ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕</string> <string name="upgrade_foss_supporter_since">%s ā¤ĻāĨ‡ā¤–ā¤ŋ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕</string>
<string name="upgrade_foss_supporter_thanks">CAPod ⤕āĨ‹ ā¤ĩā¤ŋā¤•ā¤žā¤¸ā¤˛ā¤žā¤ˆ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤍ ⤗⤰āĨā¤¨āĨā¤­ā¤ā¤•āĨ‹ā¤Žā¤ž ⤧⤍āĨā¤¯ā¤ĩā¤žā¤Ļ!</string> <string name="upgrade_foss_supporter_thanks">CAPod ⤕āĨ‹ ā¤ĩā¤ŋā¤•ā¤žā¤¸ā¤˛ā¤žā¤ˆ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤍ ⤗⤰āĨā¤¨āĨā¤­ā¤ā¤•āĨ‹ā¤Žā¤ž ⤧⤍āĨā¤¯ā¤ĩā¤žā¤Ļ!</string>
<string name="upgrade_foss_sponsor_again_action">ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ⤖āĨ‹ā¤˛āĨā¤¨āĨā¤šāĨ‹ā¤¸āĨ</string> <string name="upgrade_foss_sponsor_again_action">ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ⤖āĨ‹ā¤˛āĨā¤¨āĨā¤šāĨ‹ā¤¸āĨ</string>
<string name="settings_upgrade_status_label">CAPod ⤕āĨ‹ ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤¨ ⤗⤰āĨā¤¨āĨā¤šāĨ‹ā¤¸āĨ</string> <string name="upgrade_foss_sponsor_label">CAPod ⤕āĨ‹ ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤œā¤¨ ⤗⤰āĨā¤¨āĨā¤šāĨ‹ā¤¸āĨ</string>
<string name="settings_upgrade_status_description">⤆ā¤ĢāĨā¤¨āĨ‹ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕ ⤏āĨā¤Ĩā¤ŋ⤤ā¤ŋāĨ¤</string> <string name="settings_upgrade_status_description">⤆ā¤ĢāĨā¤¨āĨ‹ ā¤¸ā¤Žā¤°āĨā¤Ĩ⤕ ⤏āĨā¤Ĩā¤ŋ⤤ā¤ŋāĨ¤</string>
<string name="upgrade_screen_why_title">⤅ā¤Ē⤗āĨā¤°āĨ‡ā¤Ą ā¤˛ā¤žā¤­ā¤šā¤°āĨ</string> <string name="upgrade_screen_why_title">⤅ā¤Ē⤗āĨā¤°āĨ‡ā¤Ą ā¤˛ā¤žā¤­ā¤šā¤°āĨ</string>
<string name="upgrade_screen_how_title">⤕⤏⤰āĨ€ ā¤Žā¤ĻāĨā¤Ļ⤤ ⤗⤰āĨā¤¨āĨ‡</string> <string name="upgrade_screen_how_title">⤕⤏⤰āĨ€ ā¤Žā¤ĻāĨā¤Ļ⤤ ⤗⤰āĨā¤¨āĨ‡</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Supporter sinds %s</string> <string name="upgrade_foss_supporter_since">Supporter sinds %s</string>
<string name="upgrade_foss_supporter_thanks">Bedankt voor je steun aan de ontwikkeling van CAPod!</string> <string name="upgrade_foss_supporter_thanks">Bedankt voor je steun aan de ontwikkeling van CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Open de sponsorpagina</string> <string name="upgrade_foss_sponsor_again_action">Open de sponsorpagina</string>
<string name="settings_upgrade_status_label">Sponsor CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsor CAPod</string>
<string name="settings_upgrade_status_description">Je ondersteunersstatus.</string> <string name="settings_upgrade_status_description">Je ondersteunersstatus.</string>
<string name="upgrade_screen_why_title">Voordelen van de upgrade</string> <string name="upgrade_screen_why_title">Voordelen van de upgrade</string>
<string name="upgrade_screen_how_title">Hoe kun je helpen</string> <string name="upgrade_screen_how_title">Hoe kun je helpen</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Wspierający od %s</string> <string name="upgrade_foss_supporter_since">Wspierający od %s</string>
<string name="upgrade_foss_supporter_thanks">Dziękuję za wsparcie rozwoju CAPod!</string> <string name="upgrade_foss_supporter_thanks">Dziękuję za wsparcie rozwoju CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">OtwÃŗrz stronę wspierającego</string> <string name="upgrade_foss_sponsor_again_action">OtwÃŗrz stronę wspierającego</string>
<string name="settings_upgrade_status_label">Sponsoruj CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsoruj CAPod</string>
<string name="settings_upgrade_status_description">Status twojego wsparcia.</string> <string name="settings_upgrade_status_description">Status twojego wsparcia.</string>
<string name="upgrade_screen_why_title">Korzyści z uaktualnienia</string> <string name="upgrade_screen_why_title">Korzyści z uaktualnienia</string>
<string name="upgrade_screen_how_title">Jak pomÃŗc</string> <string name="upgrade_screen_how_title">Jak pomÃŗc</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Apoiador desde %s</string> <string name="upgrade_foss_supporter_since">Apoiador desde %s</string>
<string name="upgrade_foss_supporter_thanks">Obrigado por apoiar o desenvolvimento do CAPod!</string> <string name="upgrade_foss_supporter_thanks">Obrigado por apoiar o desenvolvimento do CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocínio</string> <string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocínio</string>
<string name="settings_upgrade_status_label">Patrocine o CAPod</string> <string name="upgrade_foss_sponsor_label">Patrocine o CAPod</string>
<string name="settings_upgrade_status_description">Seu status de apoiador.</string> <string name="settings_upgrade_status_description">Seu status de apoiador.</string>
<string name="upgrade_screen_why_title">Benefícios da atualizaÃ§ÃŖo</string> <string name="upgrade_screen_why_title">Benefícios da atualizaÃ§ÃŖo</string>
<string name="upgrade_screen_how_title">Como ajudar</string> <string name="upgrade_screen_how_title">Como ajudar</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Apoiante desde %s</string> <string name="upgrade_foss_supporter_since">Apoiante desde %s</string>
<string name="upgrade_foss_supporter_thanks">Obrigado por apoiares o desenvolvimento do CAPod!</string> <string name="upgrade_foss_supporter_thanks">Obrigado por apoiares o desenvolvimento do CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocínio</string> <string name="upgrade_foss_sponsor_again_action">Abrir pÃĄgina de patrocínio</string>
<string name="settings_upgrade_status_label">Apoie o CAPod</string> <string name="upgrade_foss_sponsor_label">Apoie o CAPod</string>
<string name="settings_upgrade_status_description">O seu estado de apoiante.</string> <string name="settings_upgrade_status_description">O seu estado de apoiante.</string>
<string name="upgrade_screen_why_title">Benefícios da atualizaÃ§ÃŖo</string> <string name="upgrade_screen_why_title">Benefícios da atualizaÃ§ÃŖo</string>
<string name="upgrade_screen_how_title">Como ajudar</string> <string name="upgrade_screen_how_title">Como ajudar</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Sustegnider dapi %s</string> <string name="upgrade_foss_supporter_since">Sustegnider dapi %s</string>
<string name="upgrade_foss_supporter_thanks">Grazia per sustegnair il svilup da CAPod!</string> <string name="upgrade_foss_supporter_thanks">Grazia per sustegnair il svilup da CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Avrir la pagina da sponsurisaziun</string> <string name="upgrade_foss_sponsor_again_action">Avrir la pagina da sponsurisaziun</string>
<string name="settings_upgrade_status_label">Sponsurar CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsurar CAPod</string>
<string name="settings_upgrade_status_description">Tes status da supporter.</string> <string name="settings_upgrade_status_description">Tes status da supporter.</string>
<string name="upgrade_screen_why_title">Bials da l\'upgrade</string> <string name="upgrade_screen_why_title">Bials da l\'upgrade</string>
<string name="upgrade_screen_how_title">Sco gidar</string> <string name="upgrade_screen_how_title">Sco gidar</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Susținător din %s</string> <string name="upgrade_foss_supporter_since">Susținător din %s</string>
<string name="upgrade_foss_supporter_thanks">Mulțumim că sprijini dezvoltarea CAPod!</string> <string name="upgrade_foss_supporter_thanks">Mulțumim că sprijini dezvoltarea CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Deschide pagina de sponsorizare</string> <string name="upgrade_foss_sponsor_again_action">Deschide pagina de sponsorizare</string>
<string name="settings_upgrade_status_label">Sponsorizează CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsorizează CAPod</string>
<string name="settings_upgrade_status_description">Statusul tău de susținător.</string> <string name="settings_upgrade_status_description">Statusul tău de susținător.</string>
<string name="upgrade_screen_why_title">Beneficiile upgrade-ului</string> <string name="upgrade_screen_why_title">Beneficiile upgrade-ului</string>
<string name="upgrade_screen_how_title">Cum să ajuți</string> <string name="upgrade_screen_how_title">Cum să ajuți</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ĐĄĐŋĐžĐŊŅĐžŅ€ ҁ %s</string> <string name="upgrade_foss_supporter_since">ĐĄĐŋĐžĐŊŅĐžŅ€ ҁ %s</string>
<string name="upgrade_foss_supporter_thanks">ĐĄĐŋĐ°ŅĐ¸ĐąĐž Са ĐŋОддĐĩŅ€ĐļĐē҃ Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Đēи CAPod!</string> <string name="upgrade_foss_supporter_thanks">ĐĄĐŋĐ°ŅĐ¸ĐąĐž Са ĐŋОддĐĩŅ€ĐļĐē҃ Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Đēи CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ ҁĐŋĐžĐŊŅĐžŅ€ŅŅ‚Đ˛Đ°</string> <string name="upgrade_foss_sponsor_again_action">ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ ҁĐŋĐžĐŊŅĐžŅ€ŅŅ‚Đ˛Đ°</string>
<string name="settings_upgrade_status_label">ПоддĐĩŅ€ĐļĐ°Ņ‚ŅŒ CAPod</string> <string name="upgrade_foss_sponsor_label">ПоддĐĩŅ€ĐļĐ°Ņ‚ŅŒ CAPod</string>
<string name="settings_upgrade_status_description">ĐĄŅ‚Đ°Ņ‚ŅƒŅ Đ’Đ°ŅˆĐĩĐš ĐŋОддĐĩŅ€ĐļĐēи.</string> <string name="settings_upgrade_status_description">ĐĄŅ‚Đ°Ņ‚ŅƒŅ Đ’Đ°ŅˆĐĩĐš ĐŋОддĐĩŅ€ĐļĐēи.</string>
<string name="upgrade_screen_why_title">ĐŸŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đ° ОйĐŊОвĐģĐĩĐŊĐ¸Ņ</string> <string name="upgrade_screen_why_title">ĐŸŅ€ĐĩиĐŧŅƒŅ‰ĐĩŅŅ‚Đ˛Đ° ОйĐŊОвĐģĐĩĐŊĐ¸Ņ</string>
<string name="upgrade_screen_how_title">КаĐē ĐŋĐžĐŧĐžŅ‡ŅŒ</string> <string name="upgrade_screen_how_title">КаĐē ĐŋĐžĐŧĐžŅ‡ŅŒ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Sustentadore dae su %s</string> <string name="upgrade_foss_supporter_since">Sustentadore dae su %s</string>
<string name="upgrade_foss_supporter_thanks">Gràtzias pro sustènnere s\'isvilupu de CAPod!</string> <string name="upgrade_foss_supporter_thanks">Gràtzias pro sustènnere s\'isvilupu de CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Aberi sa pàgina de sponsorizatzione</string> <string name="upgrade_foss_sponsor_again_action">Aberi sa pàgina de sponsorizatzione</string>
<string name="settings_upgrade_status_label">Sostene CAPod</string> <string name="upgrade_foss_sponsor_label">Sostene CAPod</string>
<string name="settings_upgrade_status_description">S\'istadu tuo de sustentadore.</string> <string name="settings_upgrade_status_description">S\'istadu tuo de sustentadore.</string>
<string name="upgrade_screen_why_title">Benefitzios de s\'agiornamentu</string> <string name="upgrade_screen_why_title">Benefitzios de s\'agiornamentu</string>
<string name="upgrade_screen_how_title">Comente agiudare</string> <string name="upgrade_screen_how_title">Comente agiudare</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s āˇƒāˇ’āļ§ āļ…āļąāˇ”āļœāˇŠâ€āļģāˇāˇ„āļšāļē⎙āļšāˇ’</string> <string name="upgrade_foss_supporter_since">%s āˇƒāˇ’āļ§ āļ…āļąāˇ”āļœāˇŠâ€āļģāˇāˇ„āļšāļē⎙āļšāˇ’</string>
<string name="upgrade_foss_supporter_thanks">CAPod ⎄⎒ ⎃āļ‚⎀āļģ⎊āļ°āļąāļēāļ§ āˇƒāˇ„āˇāļē āļ¯āˇāļšāˇŠāˇ€āˇ– āļ”āļļāļ§ āˇƒāˇŠāļ­āˇ–āļ­āˇ’āļē⎒!</string> <string name="upgrade_foss_supporter_thanks">CAPod ⎄⎒ ⎃āļ‚⎀āļģ⎊āļ°āļąāļēāļ§ āˇƒāˇ„āˇāļē āļ¯āˇāļšāˇŠāˇ€āˇ– āļ”āļļāļ§ āˇƒāˇŠāļ­āˇ–āļ­āˇ’āļē⎒!</string>
<string name="upgrade_foss_sponsor_again_action">āļ…āļąāˇ”āļœāˇŠâ€āļģāˇāˇ„āļš āļ´āˇ’āļ§āˇ”⎀ āˇ€āˇ’āˇ€āˇ˜āļ­ āļšāļģāļąāˇŠāļą</string> <string name="upgrade_foss_sponsor_again_action">āļ…āļąāˇ”āļœāˇŠâ€āļģāˇāˇ„āļš āļ´āˇ’āļ§āˇ”⎀ āˇ€āˇ’āˇ€āˇ˜āļ­ āļšāļģāļąāˇŠāļą</string>
<string name="settings_upgrade_status_label">CAPod ⎃āļŗāˇ„āˇ āļ…āļąāˇ”āļœāˇŠâ€āļģ⎄āļšāˇŠ</string> <string name="upgrade_foss_sponsor_label">CAPod ⎃āļŗāˇ„āˇ āļ…āļąāˇ”āļœāˇŠâ€āļģ⎄āļšāˇŠ</string>
<string name="settings_upgrade_status_description">āļ”āļļ⎚ āˇƒāˇ„āļēāˇāļœāˇ’āļ­āˇ āļ­āļ­āˇŠâ€āˇ€āļē.</string> <string name="settings_upgrade_status_description">āļ”āļļ⎚ āˇƒāˇ„āļēāˇāļœāˇ’āļ­āˇ āļ­āļ­āˇŠâ€āˇ€āļē.</string>
<string name="upgrade_screen_why_title">āļ‹āļŠāˇŠāļœāˇŠâ€āļģ⎚āļŠāˇŠ āļ´āˇŠâ€āļģāļ­āˇ’āļŊāˇāļˇ</string> <string name="upgrade_screen_why_title">āļ‹āļŠāˇŠāļœāˇŠâ€āļģ⎚āļŠāˇŠ āļ´āˇŠâ€āļģāļ­āˇ’āļŊāˇāļˇ</string>
<string name="upgrade_screen_how_title">āļ‹āļ¯āˇ€āˇŠ āļšāļģāļąāˇŠāļąāˇš āļšāˇ™āˇƒāˇšāļ¯</string> <string name="upgrade_screen_how_title">āļ‹āļ¯āˇ€āˇŠ āļšāļģāļąāˇŠāļąāˇš āļšāˇ™āˇƒāˇšāļ¯</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">PodporovateÄž od %s</string> <string name="upgrade_foss_supporter_since">PodporovateÄž od %s</string>
<string name="upgrade_foss_supporter_thanks">Ďakujeme, Åže podporujete vÃŊvoj CAPod!</string> <string name="upgrade_foss_supporter_thanks">Ďakujeme, Åže podporujete vÃŊvoj CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">OtvoriÅĨ strÃĄnku sponzorstva</string> <string name="upgrade_foss_sponsor_again_action">OtvoriÅĨ strÃĄnku sponzorstva</string>
<string name="settings_upgrade_status_label">PodporiÅĨ CAPod</string> <string name="upgrade_foss_sponsor_label">PodporiÅĨ CAPod</string>
<string name="settings_upgrade_status_description">VÃĄÅĄ status podporovateÄža.</string> <string name="settings_upgrade_status_description">VÃĄÅĄ status podporovateÄža.</string>
<string name="upgrade_screen_why_title">VÃŊhody upgradu</string> <string name="upgrade_screen_why_title">VÃŊhody upgradu</string>
<string name="upgrade_screen_how_title">Ako pomôcÅĨ</string> <string name="upgrade_screen_how_title">Ako pomôcÅĨ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Podpornik od %s</string> <string name="upgrade_foss_supporter_since">Podpornik od %s</string>
<string name="upgrade_foss_supporter_thanks">Hvala, ker podpirate razvoj CAPod-a!</string> <string name="upgrade_foss_supporter_thanks">Hvala, ker podpirate razvoj CAPod-a!</string>
<string name="upgrade_foss_sponsor_again_action">Odpri stran za sponzorstvo</string> <string name="upgrade_foss_sponsor_again_action">Odpri stran za sponzorstvo</string>
<string name="settings_upgrade_status_label">Podpri CAPod</string> <string name="upgrade_foss_sponsor_label">Podpri CAPod</string>
<string name="settings_upgrade_status_description">Tvoj status podpornika.</string> <string name="settings_upgrade_status_description">Tvoj status podpornika.</string>
<string name="upgrade_screen_why_title">Prednosti nadgradnje</string> <string name="upgrade_screen_why_title">Prednosti nadgradnje</string>
<string name="upgrade_screen_how_title">Kako pomagati.</string> <string name="upgrade_screen_how_title">Kako pomagati.</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">MbÃĢshtetÃĢs qÃĢ nga %s</string> <string name="upgrade_foss_supporter_since">MbÃĢshtetÃĢs qÃĢ nga %s</string>
<string name="upgrade_foss_supporter_thanks">Faleminderit pÃĢr mbÃĢshtetjen e zhvillimit tÃĢ CAPod-it!</string> <string name="upgrade_foss_supporter_thanks">Faleminderit pÃĢr mbÃĢshtetjen e zhvillimit tÃĢ CAPod-it!</string>
<string name="upgrade_foss_sponsor_again_action">Hap faqen e sponsorizimit</string> <string name="upgrade_foss_sponsor_again_action">Hap faqen e sponsorizimit</string>
<string name="settings_upgrade_status_label">MbÃĢshtesni CAPod</string> <string name="upgrade_foss_sponsor_label">MbÃĢshtesni CAPod</string>
<string name="settings_upgrade_status_description">Statusi juaj si mbÃĢshtetÃĢs.</string> <string name="settings_upgrade_status_description">Statusi juaj si mbÃĢshtetÃĢs.</string>
<string name="upgrade_screen_why_title">PÃĢrfitime tÃĢ pÃĢrmirÃĢsimit</string> <string name="upgrade_screen_why_title">PÃĢrfitime tÃĢ pÃĢrmirÃĢsimit</string>
<string name="upgrade_screen_how_title">Si tÃĢ ndihmoj</string> <string name="upgrade_screen_how_title">Si tÃĢ ndihmoj</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ĐŸĐžĐ´Ņ€ĐļаваĐģĐ°Ņ† Од %s</string> <string name="upgrade_foss_supporter_since">ĐŸĐžĐ´Ņ€ĐļаваĐģĐ°Ņ† Од %s</string>
<string name="upgrade_foss_supporter_thanks">ĐĨваĐģа ваĐŧ ŅˆŅ‚Đž ĐŋĐžĐ´Ņ€ĐļĐ°Đ˛Đ°Ņ‚Đĩ Ņ€Đ°ĐˇĐ˛ĐžŅ˜ CAPod-а!</string> <string name="upgrade_foss_supporter_thanks">ĐĨваĐģа ваĐŧ ŅˆŅ‚Đž ĐŋĐžĐ´Ņ€ĐļĐ°Đ˛Đ°Ņ‚Đĩ Ņ€Đ°ĐˇĐ˛ĐžŅ˜ CAPod-а!</string>
<string name="upgrade_foss_sponsor_again_action">ĐžŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ Са ҁĐŋĐžĐŊĐˇĐžŅ€ŅŅ‚Đ˛Đž</string> <string name="upgrade_foss_sponsor_again_action">ĐžŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ Са ҁĐŋĐžĐŊĐˇĐžŅ€ŅŅ‚Đ˛Đž</string>
<string name="settings_upgrade_status_label">ĐŸĐžĐ´Ņ€ĐļĐ¸Ņ‚Đĩ CAPod</string> <string name="upgrade_foss_sponsor_label">ĐŸĐžĐ´Ņ€ĐļĐ¸Ņ‚Đĩ CAPod</string>
<string name="settings_upgrade_status_description">ĐĄŅ‚Đ°Ņ‚ŅƒŅ Đ˛Đ°ŅˆĐĩĐŗ ĐŋĐžĐ´Ņ€ĐļĐ°Đ˛Đ°ŅšĐ°.</string> <string name="settings_upgrade_status_description">ĐĄŅ‚Đ°Ņ‚ŅƒŅ Đ˛Đ°ŅˆĐĩĐŗ ĐŋĐžĐ´Ņ€ĐļĐ°Đ˛Đ°ŅšĐ°.</string>
<string name="upgrade_screen_why_title">ĐŸŅ€ĐĩĐ´ĐŊĐžŅŅ‚Đ¸ ĐŊĐ°Đ´ĐŗŅ€Đ°Đ´ŅšĐĩ</string> <string name="upgrade_screen_why_title">ĐŸŅ€ĐĩĐ´ĐŊĐžŅŅ‚Đ¸ ĐŊĐ°Đ´ĐŗŅ€Đ°Đ´ŅšĐĩ</string>
<string name="upgrade_screen_how_title">КаĐēĐž ĐŋĐžĐŧĐžŅ›Đ¸</string> <string name="upgrade_screen_how_title">КаĐēĐž ĐŋĐžĐŧĐžŅ›Đ¸</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Supporter sedan %s</string> <string name="upgrade_foss_supporter_since">Supporter sedan %s</string>
<string name="upgrade_foss_supporter_thanks">Tack fÃļr att du stÃļdjer utvecklingen av CAPod!</string> <string name="upgrade_foss_supporter_thanks">Tack fÃļr att du stÃļdjer utvecklingen av CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Öppna sponsorsidan</string> <string name="upgrade_foss_sponsor_again_action">Öppna sponsorsidan</string>
<string name="settings_upgrade_status_label">Sponsra CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsra CAPod</string>
<string name="settings_upgrade_status_description">Din supporterstatus.</string> <string name="settings_upgrade_status_description">Din supporterstatus.</string>
<string name="upgrade_screen_why_title">UppgraderingsfÃļrdelar</string> <string name="upgrade_screen_why_title">UppgraderingsfÃļrdelar</string>
<string name="upgrade_screen_how_title">Hur du kan hjälpa</string> <string name="upgrade_screen_how_title">Hur du kan hjälpa</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Msaidizi tangu %s</string> <string name="upgrade_foss_supporter_since">Msaidizi tangu %s</string>
<string name="upgrade_foss_supporter_thanks">Asante kwa kuunga mkono maendeleo ya CAPod!</string> <string name="upgrade_foss_supporter_thanks">Asante kwa kuunga mkono maendeleo ya CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Fungua ukurasa wa udhamini</string> <string name="upgrade_foss_sponsor_again_action">Fungua ukurasa wa udhamini</string>
<string name="settings_upgrade_status_label">Kuunga mkono CAPod</string> <string name="upgrade_foss_sponsor_label">Kuunga mkono CAPod</string>
<string name="settings_upgrade_status_description">Hali yako ya kuunga mkono.</string> <string name="settings_upgrade_status_description">Hali yako ya kuunga mkono.</string>
<string name="upgrade_screen_why_title">Faida za kuboreshwa</string> <string name="upgrade_screen_why_title">Faida za kuboreshwa</string>
<string name="upgrade_screen_how_title">Jinsi ya kusaidia</string> <string name="upgrade_screen_how_title">Jinsi ya kusaidia</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s āŽŽā¯āŽ¤āŽ˛ā¯ āŽ†āŽ¤āŽ°āŽĩāŽžāŽŗāŽ°ā¯</string> <string name="upgrade_foss_supporter_since">%s āŽŽā¯āŽ¤āŽ˛ā¯ āŽ†āŽ¤āŽ°āŽĩāŽžāŽŗāŽ°ā¯</string>
<string name="upgrade_foss_supporter_thanks">CAPod-āŽ‡āŽŠā¯ āŽŽā¯‡āŽŽā¯āŽĒāŽžāŽŸā¯āŽŸā¯ˆ āŽ†āŽ¤āŽ°āŽŋāŽ¤ā¯āŽ¤āŽ¤āŽąā¯āŽ•ā¯ āŽ¨āŽŠā¯āŽąāŽŋ!</string> <string name="upgrade_foss_supporter_thanks">CAPod-āŽ‡āŽŠā¯ āŽŽā¯‡āŽŽā¯āŽĒāŽžāŽŸā¯āŽŸā¯ˆ āŽ†āŽ¤āŽ°āŽŋāŽ¤ā¯āŽ¤āŽ¤āŽąā¯āŽ•ā¯ āŽ¨āŽŠā¯āŽąāŽŋ!</string>
<string name="upgrade_foss_sponsor_again_action">āŽ¸ā¯āŽĒāŽžāŽŠā¯āŽšāŽ°ā¯ āŽĒāŽ•ā¯āŽ•āŽ¤ā¯āŽ¤ā¯ˆāŽ¤ā¯ āŽ¤āŽŋāŽą</string> <string name="upgrade_foss_sponsor_again_action">āŽ¸ā¯āŽĒāŽžāŽŠā¯āŽšāŽ°ā¯ āŽĒāŽ•ā¯āŽ•āŽ¤ā¯āŽ¤ā¯ˆāŽ¤ā¯ āŽ¤āŽŋāŽą</string>
<string name="settings_upgrade_status_label">CAPod āŽ āŽ†āŽ¤āŽ°āŽŋāŽ•ā¯āŽ•āŽĩā¯āŽŽā¯</string> <string name="upgrade_foss_sponsor_label">CAPod āŽ āŽ†āŽ¤āŽ°āŽŋāŽ•ā¯āŽ•āŽĩā¯āŽŽā¯</string>
<string name="settings_upgrade_status_description">āŽ‰āŽ™ā¯āŽ•āŽŗā¯ āŽ†āŽ¤āŽ°āŽĩāŽžāŽŗāŽ°ā¯ āŽ¨āŽŋāŽ˛ā¯ˆ.</string> <string name="settings_upgrade_status_description">āŽ‰āŽ™ā¯āŽ•āŽŗā¯ āŽ†āŽ¤āŽ°āŽĩāŽžāŽŗāŽ°ā¯ āŽ¨āŽŋāŽ˛ā¯ˆ.</string>
<string name="upgrade_screen_why_title">āŽŽā¯‡āŽŽā¯āŽĒāŽŸā¯āŽ¤ā¯āŽ¤āŽ˛ā¯ āŽ¨āŽŠā¯āŽŽā¯ˆāŽ•āŽŗā¯</string> <string name="upgrade_screen_why_title">āŽŽā¯‡āŽŽā¯āŽĒāŽŸā¯āŽ¤ā¯āŽ¤āŽ˛ā¯ āŽ¨āŽŠā¯āŽŽā¯ˆāŽ•āŽŗā¯</string>
<string name="upgrade_screen_how_title">āŽŽāŽĒā¯āŽĒāŽŸāŽŋ āŽ‰āŽ¤āŽĩ❁āŽĩāŽ¤ā¯</string> <string name="upgrade_screen_how_title">āŽŽāŽĒā¯āŽĒāŽŸāŽŋ āŽ‰āŽ¤āŽĩ❁āŽĩāŽ¤ā¯</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s ā°¨āąā°‚ā°Ąā°ŋ ā°¸ā°Ēāą‹ā°°āąā°Ÿā°°āą</string> <string name="upgrade_foss_supporter_since">%s ā°¨āąā°‚ā°Ąā°ŋ ā°¸ā°Ēāą‹ā°°āąā°Ÿā°°āą</string>
<string name="upgrade_foss_supporter_thanks">CAPod ā°…ā°­ā°ŋā°ĩāąƒā°Ļāąā°§ā°ŋā°•ā°ŋ ā°Žā°Ļāąā°Ļā°¤āą ā°‡ā°šāąā°šā°ŋⰍⰂā°Ļāąā°•āą ā°§ā°¨āąā°¯ā°ĩā°žā°Ļā°žā°˛āą!</string> <string name="upgrade_foss_supporter_thanks">CAPod ā°…ā°­ā°ŋā°ĩāąƒā°Ļāąā°§ā°ŋā°•ā°ŋ ā°Žā°Ļāąā°Ļā°¤āą ā°‡ā°šāąā°šā°ŋⰍⰂā°Ļāąā°•āą ā°§ā°¨āąā°¯ā°ĩā°žā°Ļā°žā°˛āą!</string>
<string name="upgrade_foss_sponsor_again_action">ā°¸āąā°Ēā°žā°¨āąā°¸ā°°āą ā°Ēāą‡ā°œāą€ā°¨ā°ŋ ā°¤āą†ā°°ā°ĩā°‚ā°Ąā°ŋ</string> <string name="upgrade_foss_sponsor_again_action">ā°¸āąā°Ēā°žā°¨āąā°¸ā°°āą ā°Ēāą‡ā°œāą€ā°¨ā°ŋ ā°¤āą†ā°°ā°ĩā°‚ā°Ąā°ŋ</string>
<string name="settings_upgrade_status_label">CAPodā°•āą ā°¸āąā°Ēā°žā°¨āąā°¸ā°°āą ā°šāą‡ā°¯ā°‚ā°Ąā°ŋ</string> <string name="upgrade_foss_sponsor_label">CAPodā°•āą ā°¸āąā°Ēā°žā°¨āąā°¸ā°°āą ā°šāą‡ā°¯ā°‚ā°Ąā°ŋ</string>
<string name="settings_upgrade_status_description">ā°Žāą€ ā°¸ā°Ēāą‹ā°°āąā°Ÿā°°āą ā°¸āąā°Ĩā°ŋā°¤ā°ŋ.</string> <string name="settings_upgrade_status_description">ā°Žāą€ ā°¸ā°Ēāą‹ā°°āąā°Ÿā°°āą ā°¸āąā°Ĩā°ŋā°¤ā°ŋ.</string>
<string name="upgrade_screen_why_title">ā°…ā°Ēāąâ€Œā°—āąā°°āą‡ā°Ąāą ā°Ēāąā°°ā°¯āą‹ā°œā°¨ā°žā°˛āą</string> <string name="upgrade_screen_why_title">ā°…ā°Ēāąâ€Œā°—āąā°°āą‡ā°Ąāą ā°Ēāąā°°ā°¯āą‹ā°œā°¨ā°žā°˛āą</string>
<string name="upgrade_screen_how_title">ā°Žā°˛ā°ž ā°¸ā°šā°žā°¯ā°‚ ā°šāą‡ā°¯ā°žā°˛ā°ŋ</string> <string name="upgrade_screen_how_title">ā°Žā°˛ā°ž ā°¸ā°šā°žā°¯ā°‚ ā°šāą‡ā°¯ā°žā°˛ā°ŋ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ēā¸™ā¸¸ā¸™ā¸•ā¸ąāš‰ā¸‡āšā¸•āšˆ %s</string> <string name="upgrade_foss_supporter_since">ā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ēā¸™ā¸¸ā¸™ā¸•ā¸ąāš‰ā¸‡āšā¸•āšˆ %s</string>
<string name="upgrade_foss_supporter_thanks">ā¸‚ā¸­ā¸šā¸„ā¸¸ā¸“ā¸—ā¸ĩāšˆā¸Ēā¸™ā¸ąā¸šā¸Ēā¸™ā¸¸ā¸™ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ CAPod!</string> <string name="upgrade_foss_supporter_thanks">ā¸‚ā¸­ā¸šā¸„ā¸¸ā¸“ā¸—ā¸ĩāšˆā¸Ēā¸™ā¸ąā¸šā¸Ēā¸™ā¸¸ā¸™ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">āš€ā¸›ā¸´ā¸”ā¸Ģā¸™āš‰ā¸˛ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙</string> <string name="upgrade_foss_sponsor_again_action">āš€ā¸›ā¸´ā¸”ā¸Ģā¸™āš‰ā¸˛ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙</string>
<string name="settings_upgrade_status_label">ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙ CAPod</string> <string name="upgrade_foss_sponsor_label">ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙ CAPod</string>
<string name="settings_upgrade_status_description">ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙⏂⏭⏇⏄⏏⏓</string> <string name="settings_upgrade_status_description">ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸œā¸šāš‰ā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙⏂⏭⏇⏄⏏⏓</string>
<string name="upgrade_screen_why_title">ā¸›ā¸Ŗā¸°āš‚ā¸ĸā¸Šā¸™āšŒā¸‚ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸ā¸Ŗā¸”</string> <string name="upgrade_screen_why_title">ā¸›ā¸Ŗā¸°āš‚ā¸ĸā¸Šā¸™āšŒā¸‚ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸ā¸Ŗā¸”</string>
<string name="upgrade_screen_how_title">⏧⏴⏘ā¸ĩā¸ā¸˛ā¸Ŗā¸Šāšˆā¸§ā¸ĸāš€ā¸Ģā¸Ĩ⏎⏭</string> <string name="upgrade_screen_how_title">⏧⏴⏘ā¸ĩā¸ā¸˛ā¸Ŗā¸Šāšˆā¸§ā¸ĸāš€ā¸Ģā¸Ĩ⏎⏭</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s tarihinden beri destekçi</string> <string name="upgrade_foss_supporter_since">%s tarihinden beri destekçi</string>
<string name="upgrade_foss_supporter_thanks">CAPod\'un geliştirilmesini desteklediğin için teşekkÃŧrler!</string> <string name="upgrade_foss_supporter_thanks">CAPod\'un geliştirilmesini desteklediğin için teşekkÃŧrler!</string>
<string name="upgrade_foss_sponsor_again_action">Sponsor sayfasÄąnÄą aç</string> <string name="upgrade_foss_sponsor_again_action">Sponsor sayfasÄąnÄą aç</string>
<string name="settings_upgrade_status_label">CAPod\'u destekle</string> <string name="upgrade_foss_sponsor_label">CAPod\'u destekle</string>
<string name="settings_upgrade_status_description">Destekçi durumun.</string> <string name="settings_upgrade_status_description">Destekçi durumun.</string>
<string name="upgrade_screen_why_title">YÃŧkseltme AvantajlarÄą</string> <string name="upgrade_screen_why_title">YÃŧkseltme AvantajlarÄą</string>
<string name="upgrade_screen_how_title">NasÄąl yardÄąm edilir</string> <string name="upgrade_screen_how_title">NasÄąl yardÄąm edilir</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” С %s</string> <string name="upgrade_foss_supporter_since">ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” С %s</string>
<string name="upgrade_foss_supporter_thanks">Đ”ŅĐēŅƒŅ”ĐŧĐž Са ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ Ņ€ĐžĐˇŅ€ĐžĐąĐēи CAPod!</string> <string name="upgrade_foss_supporter_thanks">Đ”ŅĐēŅƒŅ”ĐŧĐž Са ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ Ņ€ĐžĐˇŅ€ĐžĐąĐēи CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ ҁĐŋĐžĐŊŅĐžŅ€ŅŅ‚Đ˛Đ°</string> <string name="upgrade_foss_sponsor_again_action">Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ ҁĐŋĐžĐŊŅĐžŅ€ŅŅ‚Đ˛Đ°</string>
<string name="settings_upgrade_status_label">ĐĄĐŋĐžĐŊŅĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ CAPod</string> <string name="upgrade_foss_sponsor_label">ĐĄĐŋĐžĐŊŅĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ CAPod</string>
<string name="settings_upgrade_status_description">Đ’Đ°Ņˆ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŋŅ€Đ¸Ņ…Đ¸ĐģҌĐŊиĐēа.</string> <string name="settings_upgrade_status_description">Đ’Đ°Ņˆ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŋŅ€Đ¸Ņ…Đ¸ĐģҌĐŊиĐēа.</string>
<string name="upgrade_screen_why_title">ПĐĩŅ€ĐĩĐ˛Đ°ĐŗĐ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ</string> <string name="upgrade_screen_why_title">ПĐĩŅ€ĐĩĐ˛Đ°ĐŗĐ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ</string>
<string name="upgrade_screen_how_title">Đ¯Đē Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸</string> <string name="upgrade_screen_how_title">Đ¯Đē Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s ØŗÛ’ ØŗŲžŲˆØąŲšØą</string> <string name="upgrade_foss_supporter_since">%s ØŗÛ’ ØŗŲžŲˆØąŲšØą</string>
<string name="upgrade_foss_supporter_thanks">CAPod ÚŠÛŒ ØĒØąŲ‚ÛŒ ÚŠÛŒ Ø­Ų…Ø§ÛŒØĒ ÚŠØąŲ†Û’ ڊا Ø´ÚŠØąÛŒÛ!</string> <string name="upgrade_foss_supporter_thanks">CAPod ÚŠÛŒ ØĒØąŲ‚ÛŒ ÚŠÛŒ Ø­Ų…Ø§ÛŒØĒ ÚŠØąŲ†Û’ ڊا Ø´ÚŠØąÛŒÛ!</string>
<string name="upgrade_foss_sponsor_again_action">ØŗŲžØ§Ų†ØŗØą ŲžÛŒØŦ ÚŠÚžŲˆŲ„ÛŒÚē</string> <string name="upgrade_foss_sponsor_again_action">ØŗŲžØ§Ų†ØŗØą ŲžÛŒØŦ ÚŠÚžŲˆŲ„ÛŒÚē</string>
<string name="settings_upgrade_status_label">CAPod ÚŠÛŒ ØŗØąŲžØąØŗØĒی ÚŠØąÛŒÚē</string> <string name="upgrade_foss_sponsor_label">CAPod ÚŠÛŒ ØŗØąŲžØąØŗØĒی ÚŠØąÛŒÚē</string>
<string name="settings_upgrade_status_description">ØĸŲž ÚŠÛŒ Ø­Ø§Ų…ÛŒ Ø­Ø§Ų„ØĒ۔</string> <string name="settings_upgrade_status_description">ØĸŲž ÚŠÛŒ Ø­Ø§Ų…ÛŒ Ø­Ø§Ų„ØĒ۔</string>
<string name="upgrade_screen_why_title">Ø§Ųž Ú¯ØąÛŒÚˆ ÚŠÛ’ ŲŲˆØ§ØĻد</string> <string name="upgrade_screen_why_title">Ø§Ųž Ú¯ØąÛŒÚˆ ÚŠÛ’ ŲŲˆØ§ØĻد</string>
<string name="upgrade_screen_how_title">ÚŠÛŒØŗÛ’ Ų…Ø¯Ø¯ ÚŠØąÛŒÚē</string> <string name="upgrade_screen_how_title">ÚŠÛŒØŗÛ’ Ų…Ø¯Ø¯ ÚŠØąÛŒÚē</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">%s dan beri homiy</string> <string name="upgrade_foss_supporter_since">%s dan beri homiy</string>
<string name="upgrade_foss_supporter_thanks">CAPod rivojlanishini qo\'llab-quvvatlaganingiz uchun rahmat!</string> <string name="upgrade_foss_supporter_thanks">CAPod rivojlanishini qo\'llab-quvvatlaganingiz uchun rahmat!</string>
<string name="upgrade_foss_sponsor_again_action">Homiylik sahifasini ochish</string> <string name="upgrade_foss_sponsor_again_action">Homiylik sahifasini ochish</string>
<string name="settings_upgrade_status_label">CAPod ni homiylik qiling</string> <string name="upgrade_foss_sponsor_label">CAPod ni homiylik qiling</string>
<string name="settings_upgrade_status_description">Sizning homiy holati.</string> <string name="settings_upgrade_status_description">Sizning homiy holati.</string>
<string name="upgrade_screen_why_title">Yangilashning afzalliklari</string> <string name="upgrade_screen_why_title">Yangilashning afzalliklari</string>
<string name="upgrade_screen_how_title">Qanday yordam berish</string> <string name="upgrade_screen_how_title">Qanday yordam berish</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Ngưáģi áģ§ng háģ™ táģĢ %s</string> <string name="upgrade_foss_supporter_since">Ngưáģi áģ§ng háģ™ táģĢ %s</string>
<string name="upgrade_foss_supporter_thanks">CáēŖm ÆĄn báēĄn Ä‘ÃŖ áģ§ng háģ™ sáģą phÃĄt triáģƒn cáģ§a CAPod!</string> <string name="upgrade_foss_supporter_thanks">CáēŖm ÆĄn báēĄn Ä‘ÃŖ áģ§ng háģ™ sáģą phÃĄt triáģƒn cáģ§a CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">MáģŸ trang tài tráģŖ</string> <string name="upgrade_foss_sponsor_again_action">MáģŸ trang tài tráģŖ</string>
<string name="settings_upgrade_status_label">Tài tráģŖ cho CAPod</string> <string name="upgrade_foss_sponsor_label">Tài tráģŖ cho CAPod</string>
<string name="settings_upgrade_status_description">TráēĄng thÃĄi nhà tài tráģŖ cáģ§a báēĄn.</string> <string name="settings_upgrade_status_description">TráēĄng thÃĄi nhà tài tráģŖ cáģ§a báēĄn.</string>
<string name="upgrade_screen_why_title">LáģŖi ích nÃĸng cáēĨp</string> <string name="upgrade_screen_why_title">LáģŖi ích nÃĸng cáēĨp</string>
<string name="upgrade_screen_how_title">Làm tháēŋ nào đáģƒ giÃēp đáģĄ</string> <string name="upgrade_screen_how_title">Làm tháēŋ nào đáģƒ giÃēp đáģĄ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">č‡Ē %s čĩˇæˆä¸ēæ”¯æŒč€…</string> <string name="upgrade_foss_supporter_since">č‡Ē %s čĩˇæˆä¸ēæ”¯æŒč€…</string>
<string name="upgrade_foss_supporter_thanks">感č°ĸ您支持 CAPod įš„åŧ€å‘!</string> <string name="upgrade_foss_supporter_thanks">感č°ĸ您支持 CAPod įš„åŧ€å‘!</string>
<string name="upgrade_foss_sponsor_again_action">打åŧ€čĩžåŠŠéĄĩéĸ</string> <string name="upgrade_foss_sponsor_again_action">打åŧ€čĩžåŠŠéĄĩéĸ</string>
<string name="settings_upgrade_status_label">čĩžåŠŠ CAPod</string> <string name="upgrade_foss_sponsor_label">čĩžåŠŠ CAPod</string>
<string name="settings_upgrade_status_description">æ‚¨įš„čĩžåŠŠč€…čēĢäģŊ。</string> <string name="settings_upgrade_status_description">æ‚¨įš„čĩžåŠŠč€…čēĢäģŊ。</string>
<string name="upgrade_screen_why_title">升įē§äŧ˜åŠŋ</string> <string name="upgrade_screen_why_title">升įē§äŧ˜åŠŋ</string>
<string name="upgrade_screen_how_title">åĻ‚äŊ•帎劊我äģŦ</string> <string name="upgrade_screen_how_title">åĻ‚äŊ•帎劊我äģŦ</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">č‡Ē %s čĩˇæˆį‚ēč´ŠåŠŠč€…</string> <string name="upgrade_foss_supporter_since">č‡Ē %s čĩˇæˆį‚ēč´ŠåŠŠč€…</string>
<string name="upgrade_foss_supporter_thanks">感čŦäŊ æ”¯æŒ CAPod įš„é–‹į™ŧīŧ</string> <string name="upgrade_foss_supporter_thanks">感čŦäŊ æ”¯æŒ CAPod įš„é–‹į™ŧīŧ</string>
<string name="upgrade_foss_sponsor_again_action">é–‹å•Ÿč´ŠåŠŠé éĸ</string> <string name="upgrade_foss_sponsor_again_action">é–‹å•Ÿč´ŠåŠŠé éĸ</string>
<string name="settings_upgrade_status_label">č´ŠåŠŠ CAPod</string> <string name="upgrade_foss_sponsor_label">č´ŠåŠŠ CAPod</string>
<string name="settings_upgrade_status_description">æ‚¨įš„č´ŠåŠŠč€…čēĢäģŊ。</string> <string name="settings_upgrade_status_description">æ‚¨įš„č´ŠåŠŠč€…čēĢäģŊ。</string>
<string name="upgrade_screen_why_title">å‡į´šå„Ēå‹ĸ</string> <string name="upgrade_screen_why_title">å‡į´šå„Ēå‹ĸ</string>
<string name="upgrade_screen_how_title">åĻ‚äŊ•協劊</string> <string name="upgrade_screen_how_title">åĻ‚äŊ•協劊</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">č‡Ē %s čĩˇæˆį‚ēč´ŠåŠŠč€…</string> <string name="upgrade_foss_supporter_since">č‡Ē %s čĩˇæˆį‚ēč´ŠåŠŠč€…</string>
<string name="upgrade_foss_supporter_thanks">感čŦæ‚¨æ”¯æŒ CAPod įš„é–‹į™ŧīŧ</string> <string name="upgrade_foss_supporter_thanks">感čŦæ‚¨æ”¯æŒ CAPod įš„é–‹į™ŧīŧ</string>
<string name="upgrade_foss_sponsor_again_action">é–‹å•Ÿč´ŠåŠŠé éĸ</string> <string name="upgrade_foss_sponsor_again_action">é–‹å•Ÿč´ŠåŠŠé éĸ</string>
<string name="settings_upgrade_status_label">č´ŠåŠŠ CAPod</string> <string name="upgrade_foss_sponsor_label">č´ŠåŠŠ CAPod</string>
<string name="settings_upgrade_status_description">æ‚¨įš„č´ŠåŠŠį‹€æ…‹ã€‚</string> <string name="settings_upgrade_status_description">æ‚¨įš„č´ŠåŠŠį‹€æ…‹ã€‚</string>
<string name="upgrade_screen_why_title">å‡į´šå„Ēå‹ĸ</string> <string name="upgrade_screen_why_title">å‡į´šå„Ēå‹ĸ</string>
<string name="upgrade_screen_how_title">åĻ‚äŊ•協劊</string> <string name="upgrade_screen_how_title">åĻ‚äŊ•協劊</string>
+1 -1
View File
@@ -10,7 +10,7 @@
<string name="upgrade_foss_supporter_since">Umsekeli kusukela ngo-%s</string> <string name="upgrade_foss_supporter_since">Umsekeli kusukela ngo-%s</string>
<string name="upgrade_foss_supporter_thanks">Ngiyabonga ngokusekela ukuthuthukiswa kwe-CAPod!</string> <string name="upgrade_foss_supporter_thanks">Ngiyabonga ngokusekela ukuthuthukiswa kwe-CAPod!</string>
<string name="upgrade_foss_sponsor_again_action">Vula ikhasi lomxhasi</string> <string name="upgrade_foss_sponsor_again_action">Vula ikhasi lomxhasi</string>
<string name="settings_upgrade_status_label">Uxhasa i-CAPod</string> <string name="upgrade_foss_sponsor_label">Uxhasa i-CAPod</string>
<string name="settings_upgrade_status_description">Isimo sakho sokusekela.</string> <string name="settings_upgrade_status_description">Isimo sakho sokusekela.</string>
<string name="upgrade_screen_why_title">Imikhulu yokuphucula</string> <string name="upgrade_screen_why_title">Imikhulu yokuphucula</string>
<string name="upgrade_screen_how_title">Indlela yokusiza</string> <string name="upgrade_screen_how_title">Indlela yokusiza</string>
+1 -1
View File
@@ -11,7 +11,7 @@
<string name="upgrade_foss_supporter_since">Supporter since %s</string> <string name="upgrade_foss_supporter_since">Supporter since %s</string>
<string name="upgrade_foss_supporter_thanks">Thank you for supporting CAPod\'s development!</string> <string name="upgrade_foss_supporter_thanks">Thank you for supporting CAPod\'s development!</string>
<string name="upgrade_foss_sponsor_again_action">Open sponsor page</string> <string name="upgrade_foss_sponsor_again_action">Open sponsor page</string>
<string name="settings_upgrade_status_label">Sponsor CAPod</string> <string name="upgrade_foss_sponsor_label">Sponsor CAPod</string>
<string name="settings_upgrade_status_description">Your supporter status.</string> <string name="settings_upgrade_status_description">Your supporter status.</string>
<string name="upgrade_screen_why_title">Upgrade benefits</string> <string name="upgrade_screen_why_title">Upgrade benefits</string>
<string name="upgrade_screen_how_title">How to help</string> <string name="upgrade_screen_how_title">How to help</string>
@@ -2,7 +2,6 @@ package eu.darken.capod.common.upgrade.core
import android.app.Activity import android.app.Activity
import com.android.billingclient.api.BillingClient.BillingResponseCode import com.android.billingclient.api.BillingClient.BillingResponseCode
import com.android.billingclient.api.Purchase
import eu.darken.capod.common.coroutine.AppScope import eu.darken.capod.common.coroutine.AppScope
import eu.darken.capod.common.datastore.value import eu.darken.capod.common.datastore.value
import eu.darken.capod.common.debug.logging.Logging.Priority.ERROR import eu.darken.capod.common.debug.logging.Logging.Priority.ERROR
@@ -18,6 +17,7 @@ import eu.darken.capod.common.upgrade.core.billing.BillingData
import eu.darken.capod.common.upgrade.core.billing.BillingManager import eu.darken.capod.common.upgrade.core.billing.BillingManager
import eu.darken.capod.common.upgrade.core.billing.GplayServiceUnavailableException import eu.darken.capod.common.upgrade.core.billing.GplayServiceUnavailableException
import eu.darken.capod.common.upgrade.core.billing.ItemAlreadyOwnedBillingException import eu.darken.capod.common.upgrade.core.billing.ItemAlreadyOwnedBillingException
import eu.darken.capod.common.upgrade.core.billing.PendingPurchaseBillingException
import eu.darken.capod.common.upgrade.core.billing.PurchasedSku import eu.darken.capod.common.upgrade.core.billing.PurchasedSku
import eu.darken.capod.common.upgrade.core.billing.Sku import eu.darken.capod.common.upgrade.core.billing.Sku
import eu.darken.capod.common.upgrade.core.billing.SkuDetails import eu.darken.capod.common.upgrade.core.billing.SkuDetails
@@ -284,9 +284,18 @@ class UpgradeRepoGplay @Inject constructor(
// Reconciled only if the restore actually returned the SKU Play claims is // Reconciled only if the restore actually returned the SKU Play claims is
// owned — a grace-only isPro doesn't count, the entitlement is still missing. // owned — a grace-only isPro doesn't count, the entitlement is still missing.
if (restored?.upgrades?.any { it.sku == sku } != true) { if (restored?.upgrades?.any { it.sku == sku } != true) {
// Couldn't reconcile the entitlement (pending purchase, account mismatch, if (restored?.pendingSkus?.isNotEmpty() == true) {
// Play quirk) — fall back to the already-owned dialog with restore tips. // Play blocks re-purchasing a product whose payment it is still
onError(e) // processing. "Already owned" is technically what Play said, but the
// dialog's restore tips are the wrong advice: nothing to restore, and
// the entitlement lands by itself once the payment clears.
log(TAG, INFO) { "Already-owned recovery found a pending payment" }
onError(PendingPurchaseBillingException(e))
} else {
// Couldn't reconcile the entitlement (account mismatch, Play quirk) —
// fall back to the already-owned dialog with restore tips.
onError(e)
}
} }
} }
@@ -329,12 +338,15 @@ class UpgradeRepoGplay @Inject constructor(
suspend fun querySkus(vararg skus: Sku): Collection<SkuDetails> = billingManager.querySkus(*skus) suspend fun querySkus(vararg skus: Sku): Collection<SkuDetails> = billingManager.querySkus(*skus)
// Strict subscription lookup for the pre-purchase gate: fresh SUBS-only query with explicit // Strict purchase-state lookup for the pre-purchase gates: a fresh COMPLETE round-trip with
// failure. No grace substitution and no cross-product-type tolerance (unlike refresh() and // explicit failure. No grace substitution and no partial tolerance (unlike refresh() and
// restorePurchaseNow()) — callers must treat any error as "couldn't verify" and fail closed. // restorePurchaseNow()) — callers must treat any error as "couldn't verify" and fail closed.
suspend fun queryCurrentSubscriptions(): Collection<Purchase> { // Covers both product types and pending payments, because both can make a purchase wrong: a
log(TAG) { "queryCurrentSubscriptions()" } // renewing subscription (double billing) and a payment Play is still processing (Play rejects
return billingManager.querySubscriptions() // the re-purchase).
suspend fun verifyPurchaseStateNow(): Info {
log(TAG) { "verifyPurchaseStateNow()" }
return Info(billingData = billingManager.refreshStrict(), isSettled = true)
} }
override suspend fun refresh() { override suspend fun refresh() {
@@ -496,8 +508,8 @@ class UpgradeRepoGplay @Inject constructor(
// Shared Pro/grace mapping used by both the reactive upgradeInfo flow and restorePurchaseNow(). // Shared Pro/grace mapping used by both the reactive upgradeInfo flow and restorePurchaseNow().
// Only relinquishes Pro if we haven't had it for a while (grace period). READ-ONLY: this runs on // Only relinquishes Pro if we haven't had it for a while (grace period). READ-ONLY: this runs on
// replayed shared-flow data too, so it must never stamp the grace cache — see recordProState(). // replayed shared-flow data too, so it must never stamp the grace cache — see recordProState().
// settled comes from the caller, never from billingData nullness: the grace branch returns an // settled comes from the caller, never from billingData nullness: a null-data Info can be
// Info with billingData = null that may well be settled (built from a real empty snapshot). // perfectly settled (a real empty snapshot), and the grace branch carries data through anyway.
private suspend fun BillingData?.toUpgradeInfo(settled: Boolean): Info { private suspend fun BillingData?.toUpgradeInfo(settled: Boolean): Info {
// Branch on MAPPED upgrades, not raw purchases: a purchase list containing only products // Branch on MAPPED upgrades, not raw purchases: a purchase list containing only products
// this app doesn't know maps to zero upgrades and must fall through to the grace check — // this app doesn't know maps to zero upgrades and must fall through to the grace check —
@@ -513,7 +525,11 @@ class UpgradeRepoGplay @Inject constructor(
return when { return when {
(now - lastProStateAt) < graceWindowMs() -> { (now - lastProStateAt) < graceWindowMs() -> {
log(TAG, VERBOSE) { "We are not pro, but were recently, did GPlay try annoy us again?" } log(TAG, VERBOSE) { "We are not pro, but were recently, did GPlay try annoy us again?" }
Info(gracePeriod = true, billingData = null, isSettled = settled) // billingData is carried through, not dropped: this branch is only reached when the
// mapped upgrades are empty, so entitlement stays empty either way — but a pending
// payment must stay visible, and a grace user waiting on one is exactly who needs
// the explanation.
Info(gracePeriod = true, billingData = this, isSettled = settled)
} }
else -> mapped else -> mapped
@@ -558,6 +574,34 @@ class UpgradeRepoGplay @Inject constructor(
?.flatten() ?.flatten()
?: emptySet() ?: emptySet()
// Products with a payment Play is still processing. Deliberately NOT part of [isPro] or
// [upgrades]: a pending payment grants nothing. It exists so the UI can explain the wait
// and lock the purchase buttons — buying the alternative product now would double-charge.
val pendingSkus: Collection<Sku> = billingData?.pendingPurchases
?.map { purchase ->
purchase.products.mapNotNull { productId ->
val sku = OurSku.PRO_SKUS.singleOrNull { it.id == productId }
if (sku == null) {
log(TAG, WARN) { "Unknown pending product: $productId (${purchase.redacted()})" }
return@mapNotNull null
}
sku
}
}
?.flatten()
?: emptySet()
// Any owned purchase Play still bills on a schedule. Deliberately computed from the RAW
// PURCHASED purchases instead of [upgrades]: the mapping drops products this app doesn't
// know, and the pre-purchase gate must keep blocking on a renewing subscription with an
// unknown or legacy product ID — being wrong there means billing the user twice for Pro.
// Both product types are scanned; a one-time purchase reports isAutoRenewing = false, so
// the broader input cannot produce a false positive.
// Computed on access, not in the initializer: an Info is built for every mapping pass, and
// only the purchase gate needs this.
val hasAutoRenewingSubscription: Boolean
get() = billingData?.purchases?.any { it.isAutoRenewing } == true
override val isPro: Boolean = upgrades.isNotEmpty() || gracePeriod override val isPro: Boolean = upgrades.isNotEmpty() || gracePeriod
override val upgradedAt: Instant? = upgrades override val upgradedAt: Instant? = upgrades
@@ -1,7 +1,28 @@
package eu.darken.capod.common.upgrade.core.billing package eu.darken.capod.common.upgrade.core.billing
import com.android.billingclient.api.Purchase import com.android.billingclient.api.Purchase
import eu.darken.capod.common.upgrade.core.billing.client.isPurchased
import eu.darken.capod.common.upgrade.core.billing.client.isRelevant
/**
* Play's purchase state, split by what it may be used for. [purchases] is the entitlement carrier
* and PURCHASED-only by construction, so no consumer can grant Pro (or stamp the grace cache) from
* a payment Play is still processing; [pendingPurchases] keeps that payment visible to the UI.
*/
data class BillingData( data class BillingData(
val purchases: Collection<Purchase> val purchases: Collection<Purchase>,
) val pendingPurchases: Collection<Purchase> = emptyList(),
) {
companion object {
// The one place raw Play data becomes a BillingData: splitting here (instead of at each
// consumer) is what keeps "pending never grants Pro" a property of the type. Anything
// that is neither PURCHASED nor PENDING is dropped — it is not an entitlement and not a
// payment in progress.
fun from(raw: Collection<Purchase>): BillingData {
val relevant = raw.filter { it.isRelevant }
val (purchased, pending) = relevant.partition { it.isPurchased }
return BillingData(purchases = purchased, pendingPurchases = pending)
}
}
}
@@ -14,6 +14,7 @@ import eu.darken.capod.common.flow.setupCommonEventHandlers
import eu.darken.capod.common.upgrade.core.billing.client.BillingClientException import eu.darken.capod.common.upgrade.core.billing.client.BillingClientException
import eu.darken.capod.common.upgrade.core.billing.client.BillingConnection import eu.darken.capod.common.upgrade.core.billing.client.BillingConnection
import eu.darken.capod.common.upgrade.core.billing.client.BillingConnectionProvider import eu.darken.capod.common.upgrade.core.billing.client.BillingConnectionProvider
import eu.darken.capod.common.upgrade.core.billing.client.isPurchased
import eu.darken.capod.common.upgrade.core.billing.client.redacted import eu.darken.capod.common.upgrade.core.billing.client.redacted
import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -73,13 +74,13 @@ class BillingManager @Inject constructor(
private val failedOnce = MutableStateFlow(false) private val failedOnce = MutableStateFlow(false)
val isFailureSettled: Flow<Boolean> = failedOnce val isFailureSettled: Flow<Boolean> = failedOnce
// Fires once per failed connect-loop iteration: connection setup failure, the mandatory initial // Fires once per reconciliation that couldn't confirm Pro: a failed connect-loop iteration
// refreshPurchases erroring or timing out, an established connection dropping, an action-level // (connection setup failure, the mandatory initial refreshPurchases erroring or timing out, an
// invalidation (SERVICE_DISCONNECTED/SERVICE_TIMEOUT from any useConnection call), or an // established connection dropping, an action-level invalidation, an unexpected provider
// unexpected provider completion. Every one is a fresh reconciliation that couldn't confirm Pro. // completion) — and, via processReconciliation, a refresh that COMPLETED but only partially,
// The connect loop retries these internally and downstream flows just go quiet, so without this // without a confirmed Pro purchase. The connect loop retries its failures internally and
// explicit signal the grace episode clock (UpgradeRepoGplay.proUnconfirmedSince) would only // downstream flows just go quiet, so without this explicit signal the grace episode clock
// advance on an explicit ON_RESUME refresh(). // (UpgradeRepoGplay.proUnconfirmedSince) would only advance on an explicit ON_RESUME refresh().
// //
// Each value is the failure's OCCURRENCE time (epoch millis). It has to be, not a bare Unit: the // Each value is the failure's OCCURRENCE time (epoch millis). It has to be, not a bare Unit: the
// channel buffers, and this feed and freshBillingData are separate flows with no cross-stream // channel buffers, and this feed and freshBillingData are separate flows with no cross-stream
@@ -121,13 +122,18 @@ class BillingManager @Inject constructor(
// isFailureSettled forever with no retry. withTimeoutOrNull, NOT // isFailureSettled forever with no retry. withTimeoutOrNull, NOT
// withTimeout: TimeoutCancellationException is a // withTimeout: TimeoutCancellationException is a
// CancellationException and would kill this loop. // CancellationException and would kill this loop.
withTimeoutOrNull(INITIAL_REFRESH_TIMEOUT_MS) { val initialRefresh = withTimeoutOrNull(INITIAL_REFRESH_TIMEOUT_MS) {
connection.refreshPurchases() connection.refreshPurchases()
} ?: throw BillingException("Initial purchase refresh timed out") } ?: throw BillingException("Initial purchase refresh timed out")
failStreak = 0 failStreak = 0
connectionHolder.value = connection connectionHolder.value = connection
log(TAG, INFO) { "Billing connection established" } log(TAG, INFO) { "Billing connection established" }
// AFTER publishing: a partial refresh is still a usable connection
// (a pending-only cold start must not starve billingData), but its
// bookkeeping — episode clock, dead-binder teardown — has to run,
// and an invalidation may only tear down an INSTALLED connection.
processReconciliation(initialRefresh)
} }
// The provider flow stays open for the connection's lifetime; a normal // The provider flow stays open for the connection's lifetime; a normal
// completion means the connection is gone without an error — treat it // completion means the connection is gone without an error — treat it
@@ -214,7 +220,7 @@ class BillingManager @Inject constructor(
.shareIn(scope, WhileSubscribed(3000L, 0L), replay = 1) .shareIn(scope, WhileSubscribed(3000L, 0L), replay = 1)
val billingData: Flow<BillingData> = purchases val billingData: Flow<BillingData> = purchases
.map { BillingData(purchases = it) } .map { BillingData.from(it) }
.shareIn(scope, WhileSubscribed(3000L, 0L), replay = 1) .shareIn(scope, WhileSubscribed(3000L, 0L), replay = 1)
val purchaseFailures: Flow<BillingResult> = connectionHolder val purchaseFailures: Flow<BillingResult> = connectionHolder
@@ -235,7 +241,10 @@ class BillingManager @Inject constructor(
// every emission here is a real Play round-trip the grace bookkeeping needs. // every emission here is a real Play round-trip the grace bookkeeping needs.
.resubscribeOnFailure("freshBillingData") .resubscribeOnFailure("freshBillingData")
} }
.map { FreshData(data = BillingData(purchases = it.purchases), isFullSnapshot = it.isFullSnapshot, occurredAt = it.occurredAt) } // Through from() like every other exit, although the connection only ever puts PURCHASED
// purchases on this stream: if that invariant ever broke, splitting keeps the grace
// bookkeeping from stamping a pending payment as a confirmation.
.map { FreshData(data = BillingData.from(it.purchases), isFullSnapshot = it.isFullSnapshot, occurredAt = it.occurredAt) }
.setupCommonEventHandlers(TAG) { "freshBillingData" } .setupCommonEventHandlers(TAG) { "freshBillingData" }
// Same belt as `purchases`: an Eagerly shared flow that dies stays dead, and this one feeds // Same belt as `purchases`: an Eagerly shared flow that dies stays dead, and this one feeds
// both the grace bookkeeping and the ack collector's re-drive signal. // both the grace bookkeeping and the ack collector's re-drive signal.
@@ -292,6 +301,14 @@ class BillingManager @Inject constructor(
// -data signals. // -data signals.
private suspend fun runAckPass(purchases: Collection<Purchase>) { private suspend fun runAckPass(purchases: Collection<Purchase>) {
val needAck = purchases.filter { val needAck = purchases.filter {
// The canonical list carries pending payments too. Play rejects acknowledging one
// PERMANENTLY, so an unfiltered pass would fire a bug report for every pending purchase,
// every pass — and there is nothing to acknowledge until the payment completes anyway.
if (!it.isPurchased) {
log(TAG) { "Not acknowledgeable yet: ${it.redacted()}" }
return@filter false
}
val needsAck = !it.isAcknowledged val needsAck = !it.isAcknowledged
if (needsAck) log(TAG) { "Needs ACK: ${it.redacted()}" } if (needsAck) log(TAG) { "Needs ACK: ${it.redacted()}" }
@@ -401,6 +418,39 @@ class BillingManager @Inject constructor(
} }
} }
// A partial refresh no longer reaches useConnection's dead-binder detection (it returns instead
// of throwing), so the teardown that used to ride the throw path happens here. Cause chain, not
// the exception itself: the failure arrives user-friendly-mapped. Deliberately no holder CAS:
// the failing connection may already have been replaced, and the accepted cost of that rare
// race is one extra failed action while the loop reconnects.
private fun invalidateOnDeadConnection(refresh: BillingConnection.PurchaseRefresh) {
val clientError = refresh.partialError?.let {
(it as? BillingClientException) ?: (it.cause as? BillingClientException)
}
if (clientError != null && clientError.result.responseCode in INVALIDATING_CODES) {
log(TAG, WARN) { "Refresh reported the connection dead (${clientError.result.responseCode}), invalidating." }
invalidations.trySend(Unit)
}
}
// Everything a COMPLETED refresh owes the rest of the app, in one place: both the connect loop's
// initial refresh and manual refresh() calls run through it, so a Restore tap during an outage
// feeds the same bookkeeping the connect loop does. Only reached when refreshPurchases returned
// (it still throws when it found nothing AND a query failed — that path is the connect loop's /
// useConnection's).
private fun processReconciliation(refresh: BillingConnection.PurchaseRefresh) {
invalidateOnDeadConnection(refresh)
if (!refresh.isComplete && !refresh.hasConfirmedProPurchase) {
// A reconciliation that couldn't confirm Pro. Stamped with the refresh's COMMIT time,
// never now-at-send: a confirmation that committed between this refresh and the send
// (e.g. a pending payment completing) must stay NEWER than this failure, or the grace
// episode it closed would be reopened.
log(TAG, WARN) { "Partial refresh without a confirmed Pro purchase at ${refresh.occurredAt}" }
connectionFailuresChannel.trySend(refresh.occurredAt)
}
}
private suspend fun <T> useConnection(action: suspend BillingConnection.() -> T): T { private suspend fun <T> useConnection(action: suspend BillingConnection.() -> T): T {
// Every caller here is active demand (opening the upgrade screen, restore/buy taps, // Every caller here is active demand (opening the upgrade screen, restore/buy taps,
// purchase acks) — cut a pending reconnect backoff short. A no-op while healthy. // purchase acks) — cut a pending reconnect backoff short. A no-op while healthy.
@@ -479,18 +529,29 @@ class BillingManager @Inject constructor(
// shared upgradeInfo replay cache. The freshBillingData emission happens inside the // shared upgradeInfo replay cache. The freshBillingData emission happens inside the
// reducer's commit, in commit order — not here. // reducer's commit, in commit order — not here.
val fresh = useConnection { refreshPurchases() } val fresh = useConnection { refreshPurchases() }
return BillingData(purchases = fresh.purchases) processReconciliation(fresh)
return BillingData.from(fresh.purchases)
} }
// Strict SUBS-only query for the pre-purchase subscription gate: unlike refresh(), a failure // Strict variant for the pre-purchase gates: unlike refresh(), anything short of a COMPLETE
// here propagates (user-friendly-mapped) instead of being masked by the other product type. // reconciliation throws (user-friendly-mapped) instead of returning what it happened to find —
suspend fun querySubscriptions(): Collection<Purchase> = try { // a gate must be able to tell "not owned" apart from "couldn't verify" and fail closed.
useConnection { querySubscriptions() } suspend fun refreshStrict(): BillingData {
} catch (e: CancellationException) { log(TAG) { "refreshStrict()" }
throw e val fresh = useConnection { refreshPurchases() }
} catch (e: Exception) { // A gate that hit a dying connection must still trigger the reconnect (the throw below
log(TAG, WARN) { "querySubscriptions() failed: ${e.asLog()}" } // bypasses useConnection's detection, which already returned), or every later purchase
throw e.tryMapUserFriendly() // check keeps reusing the corpse. No-op on a complete refresh. The episode clock stays out
// of this path: an aborted gate is not a reconciliation outcome.
invalidateOnDeadConnection(fresh)
if (!fresh.isComplete) {
// partialError is set for every incomplete refresh; the fallback only exists so a
// future incompleteness without a captured cause still fails closed instead of passing.
val error = fresh.partialError ?: BillingException("Purchase refresh was incomplete")
log(TAG, WARN) { "refreshStrict() incomplete: ${error.asLog()}" }
throw error.tryMapUserFriendly()
}
return BillingData.from(fresh.purchases)
} }
companion object { companion object {
@@ -0,0 +1,11 @@
package eu.darken.capod.common.upgrade.core.billing
/**
* A purchase can't proceed because the account already has a payment Play is still processing.
*
* Typed so the UI can answer with the informational pending dialog instead of the already-owned
* error and its restore tips: restoring cannot help — Play refuses to re-sell a product with a
* pending payment, and the entitlement arrives on its own once the payment clears.
*/
class PendingPurchaseBillingException(cause: Throwable? = null) :
BillingException("A purchase with a pending payment already exists.", cause)
@@ -8,6 +8,21 @@ import com.android.billingclient.api.Purchase
internal val BillingResult.isSuccess: Boolean internal val BillingResult.isSuccess: Boolean
get() = responseCode == BillingClient.BillingResponseCode.OK get() = responseCode == BillingClient.BillingResponseCode.OK
/**
* Owned right now. The ONLY state that may grant an entitlement, stamp the Pro grace cache or be
* acknowledged — a PENDING purchase is a payment Play is still processing, and acknowledging one is
* rejected permanently.
*/
internal val Purchase.isPurchased: Boolean
get() = purchaseState == Purchase.PurchaseState.PURCHASED
/**
* Worth carrying in our state at all: owned, or a payment in progress the user should see. Anything
* else (UNSPECIFIED_STATE) is dropped at ingestion — it is neither.
*/
internal val Purchase.isRelevant: Boolean
get() = isPurchased || purchaseState == Purchase.PurchaseState.PENDING
/** /**
* Log-safe rendering of a [Purchase]. * Log-safe rendering of a [Purchase].
* *
@@ -7,7 +7,6 @@ import com.android.billingclient.api.BillingClient.BillingResponseCode
import com.android.billingclient.api.BillingFlowParams import com.android.billingclient.api.BillingFlowParams
import com.android.billingclient.api.BillingResult import com.android.billingclient.api.BillingResult
import com.android.billingclient.api.Purchase import com.android.billingclient.api.Purchase
import com.android.billingclient.api.Purchase.PurchaseState
import com.android.billingclient.api.QueryProductDetailsParams import com.android.billingclient.api.QueryProductDetailsParams
import com.android.billingclient.api.QueryProductDetailsResult import com.android.billingclient.api.QueryProductDetailsResult
import com.android.billingclient.api.QueryPurchasesParams import com.android.billingclient.api.QueryPurchasesParams
@@ -41,11 +40,11 @@ class BillingConnection(
private val skuTypeOf: (String) -> Sku.Type? = DEFAULT_SKU_TYPE_RESOLVER, private val skuTypeOf: (String) -> Sku.Type? = DEFAULT_SKU_TYPE_RESOLVER,
) { ) {
// A purchase proven by an onPurchasesUpdated success event. Additive only: events prove // A purchase (owned or with a pending payment) proven by an onPurchasesUpdated success event.
// ownership, never absence. `gen` orders it against queries (a query that STARTED before this // Additive only: events prove existence, never absence. `gen` orders it against queries (a
// event must not clear it); `type` is resolved at ingestion so a later per-type query that // query that STARTED before this event must not clear it); `type` is resolved at ingestion so a
// confirms absence can supersede it (null = product unknown to this app, only a complete // later per-type query that confirms absence can supersede it (null = product unknown to this
// refresh may clear it). // app, only a complete refresh may clear it).
data class OverlayEntry( data class OverlayEntry(
val purchase: Purchase, val purchase: Purchase,
val gen: Long, val gen: Long,
@@ -64,11 +63,11 @@ class BillingConnection(
) { ) {
internal fun withEvent( internal fun withEvent(
purchased: Collection<Purchase>, relevant: Collection<Purchase>,
typeOf: (String) -> Sku.Type?, typeOf: (String) -> Sku.Type?,
): ReducerState { ): ReducerState {
val gen = eventGen + 1 val gen = eventGen + 1
val entries = purchased.map { purchase -> val entries = relevant.map { purchase ->
OverlayEntry( OverlayEntry(
purchase = purchase, purchase = purchase,
gen = gen, gen = gen,
@@ -169,10 +168,13 @@ class BillingConnection(
"onPurchasesUpdated(code=${result.responseCode}, message=${result.debugMessage}, " + "onPurchasesUpdated(code=${result.responseCode}, message=${result.debugMessage}, " +
"purchases=${purchases?.redacted()})" "purchases=${purchases?.redacted()})"
} }
// PENDING purchases must never surface as owned (or stamp the Pro grace cache). // The reducer carries PENDING purchases too (the UI must be able to show a payment in
val purchased = purchases.orEmpty().filter { it.purchaseState == PurchaseState.PURCHASED } // progress), but the fresh stream stays PURCHASED-only: it feeds the entitlement and
// grace bookkeeping, which must never see a payment Play hasn't completed.
val relevant = purchases.orEmpty().filter { it.isRelevant }
val purchased = relevant.filter { it.isPurchased }
synchronized(reducerLock) { synchronized(reducerLock) {
state.value = state.value.withEvent(purchased, skuTypeOf) state.value = state.value.withEvent(relevant, skuTypeOf)
if (purchased.isNotEmpty()) { if (purchased.isNotEmpty()) {
freshUpdatesChannel.trySend(FreshUpdate(purchased, isFullSnapshot = false)) freshUpdatesChannel.trySend(FreshUpdate(purchased, isFullSnapshot = false))
} }
@@ -193,12 +195,29 @@ class BillingConnection(
failureChannel.close() failureChannel.close()
} }
// The purchases of a refresh plus whether it covered both product types: a partial result (one // The full outcome of a refresh: what it committed, what it actually CONFIRMED, and how far it
// query failed) is still authoritative for what it FOUND, but must not be treated as proof of // got. A partial result (one query failed) is still authoritative for what it found, but must
// absence for the type that couldn't be checked. // not be treated as proof of absence for the type that couldn't be checked — so callers that
// need to fail closed, or to feed the grace episode clock, get the provenance instead of having
// to infer it from the merged view.
data class PurchaseRefresh( data class PurchaseRefresh(
// The committed reducer state (queries merged with retained snapshots and surviving
// events) — the same view the reactive purchases flow emits.
val purchases: Collection<Purchase>, val purchases: Collection<Purchase>,
// ONLY what these queries returned: never retained state of a failed type, so a consumer
// can tell "Play said so just now" from "we still remember this".
val confirmed: Collection<Purchase> = emptyList(),
// A confirmed PURCHASED purchase of a product this app knows. Fail-safe default: "we
// couldn't confirm Pro" is the direction that keeps the grace bookkeeping honest.
val hasConfirmedProPurchase: Boolean = false,
val isComplete: Boolean, val isComplete: Boolean,
// Commit time under reducerLock — the same instant stamped on this refresh's FreshUpdate,
// so a confirmation and a later failure signal are ordered by when they HAPPENED.
val occurredAt: Long = System.currentTimeMillis(),
// Why the refresh is incomplete (the failed type's already user-friendly-mapped
// exception), null when complete. Carried rather than thrown: a partial refresh that found
// something is still useful, only the caller can decide whether partial is good enough.
val partialError: Throwable? = null,
) )
// Serializes concurrent refreshes (manual, background, auto-restore): an older query that got // Serializes concurrent refreshes (manual, background, auto-restore): an older query that got
@@ -214,8 +233,8 @@ class BillingConnection(
coroutineScope { coroutineScope {
log(TAG) { "refreshPurchases()" } log(TAG) { "refreshPurchases()" }
val genAtQueryStart = state.value.eventGen val genAtQueryStart = state.value.eventGen
val iapJob = async { queryPurchasedProducts(BillingClient.ProductType.INAPP) } val iapJob = async { queryRelevantProducts(BillingClient.ProductType.INAPP) }
val subJob = async { queryPurchasedProducts(BillingClient.ProductType.SUBS) } val subJob = async { queryRelevantProducts(BillingClient.ProductType.SUBS) }
val iap = iapJob.await() val iap = iapJob.await()
val sub = subJob.await() val sub = subJob.await()
log(TAG) { "Refreshed IAPs=${iap.getOrNull()?.redacted()}, SUBs=${sub.getOrNull()?.redacted()}" } log(TAG) { "Refreshed IAPs=${iap.getOrNull()?.redacted()}, SUBs=${sub.getOrNull()?.redacted()}" }
@@ -224,6 +243,12 @@ class BillingConnection(
// authoritative even when its sibling failed — verified absence (e.g. a refunded IAP) // authoritative even when its sibling failed — verified absence (e.g. a refunded IAP)
// must not be discarded just because the SUB query errored. // must not be discarded just because the SUB query errored.
val isComplete = iap.isSuccess && sub.isSuccess val isComplete = iap.isSuccess && sub.isSuccess
// Only what the queries CONFIRMED as owned — retained stale data of a failed type, and
// pending payments, stay out (both would keep re-stamping the grace window).
val confirmed = (iap.getOrNull().orEmpty() + sub.getOrNull().orEmpty())
.filter { it.isPurchased }
.sortedByDescending { it.purchaseTime }
var committedAt = 0L
val committed = synchronized(reducerLock) { val committed = synchronized(reducerLock) {
val next = state.value.withQueryResults( val next = state.value.withQueryResults(
iap = iap.getOrNull(), iap = iap.getOrNull(),
@@ -231,17 +256,18 @@ class BillingConnection(
genAtQueryStart = genAtQueryStart, genAtQueryStart = genAtQueryStart,
) )
state.value = next state.value = next
committedAt = System.currentTimeMillis()
if (iap.isSuccess || sub.isSuccess) { if (iap.isSuccess || sub.isSuccess) {
// Only what the queries CONFIRMED — retained stale data of a failed type stays // A surviving OWNED overlay entry (purchase event newer than the query start,
// out of the fresh stream (it would keep re-stamping the grace window). // or of a failed type) means this result does NOT prove total absence: it must
val confirmed = (iap.getOrNull().orEmpty() + sub.getOrNull().orEmpty()) // not count as a full snapshot, or an empty query racing a fresh purchase event
.sortedByDescending { it.purchaseTime } // would start a false unconfirmed-grace episode. A surviving PENDING entry
// A surviving overlay entry (purchase event newer than the query start, or of // proves nothing about ownership, so it must not suppress the bookkeeping
// a failed type) means this result does NOT prove total absence: it must not // either — a payment in progress would otherwise freeze the episode clock.
// count as a full snapshot, or an empty query racing a fresh purchase event val provesAbsence = isComplete && next.overlay.none { it.purchase.isPurchased }
// would start a false unconfirmed-grace episode. freshUpdatesChannel.trySend(
val provesAbsence = isComplete && next.overlay.isEmpty() FreshUpdate(confirmed, isFullSnapshot = provesAbsence, occurredAt = committedAt)
freshUpdatesChannel.trySend(FreshUpdate(confirmed, isFullSnapshot = provesAbsence)) )
} }
next next
} }
@@ -249,31 +275,42 @@ class BillingConnection(
// Support-log anchor, at INFO because purchase complaints arrive as debug recordings. // Support-log anchor, at INFO because purchase complaints arrive as debug recordings.
// Logs what these queries CONFIRMED, kept distinct from the committed view: merged() // Logs what these queries CONFIRMED, kept distinct from the committed view: merged()
// retains a failed type's previous purchases, so reporting it as "what Play returned" // retains a failed type's previous purchases, so reporting it as "what Play returned"
// would be the same false-certainty trap the copy elsewhere had to fix. Product IDs // would be the same false-certainty trap the copy elsewhere had to fix. Pending ids are
// only -- never the Purchase, which carries order and token data. // listed separately — "bought it, still not Pro" reports are exactly this state.
// Product IDs only -- never the Purchase, which carries order and token data.
log(TAG, INFO) { log(TAG, INFO) {
val confirmedIds = (iap.getOrNull().orEmpty() + sub.getOrNull().orEmpty()).flatMap { it.products } val returned = iap.getOrNull().orEmpty() + sub.getOrNull().orEmpty()
"refreshPurchases(): confirmed=$confirmedIds, isComplete=$isComplete, " + val confirmedIds = returned.filter { it.isPurchased }.flatMap { it.products }
val pendingIds = returned.filterNot { it.isPurchased }.flatMap { it.products }
"refreshPurchases(): confirmed=$confirmedIds, pending=$pendingIds, isComplete=$isComplete, " +
"iapOk=${iap.isSuccess}, subOk=${sub.isSuccess}, merged=${committed.merged().size}" "iapOk=${iap.isSuccess}, subOk=${sub.isSuccess}, merged=${committed.merged().size}"
} }
// Throws when nothing was found and a query failed, so the caller can tell "not // Throws when nothing was found and a query failed, so the caller can tell "not
// owned" apart from "couldn't verify". // owned" apart from "couldn't verify".
combinePurchaseResults(iap, sub) combinePurchaseResults(iap, sub, skuTypeOf)
PurchaseRefresh( PurchaseRefresh(
purchases = committed.merged(), purchases = committed.merged(),
confirmed = confirmed,
hasConfirmedProPurchase = confirmed.any { purchase ->
purchase.products.any { skuTypeOf(it) != null }
},
isComplete = isComplete, isComplete = isComplete,
occurredAt = committedAt,
partialError = iap.exceptionOrNull() ?: sub.exceptionOrNull(),
) )
} }
} }
// Never throws except on cancellation, so a single failing product-type query doesn't cancel // Never throws except on cancellation, so a single failing product-type query doesn't cancel
// the sibling query (or the coroutineScope). The exception is already user-friendly-mapped. // the sibling query (or the coroutineScope). The exception is already user-friendly-mapped.
private suspend fun queryPurchasedProducts( // Returns owned AND pending purchases; the split by state happens where it matters (fresh
// stream, entitlement mapping), so a pending payment stays visible instead of vanishing here.
private suspend fun queryRelevantProducts(
@BillingClient.ProductType type: String, @BillingClient.ProductType type: String,
): Result<Collection<Purchase>> = try { ): Result<Collection<Purchase>> = try {
Result.success(queryPurchases(type).filter { it.purchaseState == PurchaseState.PURCHASED }) Result.success(queryPurchases(type).filter { it.isRelevant })
} catch (e: CancellationException) { } catch (e: CancellationException) {
throw e throw e
} catch (e: Exception) { } catch (e: Exception) {
@@ -307,37 +344,6 @@ class BillingConnection(
return purchaseData return purchaseData
} }
// Strict SUBS-only query for the pre-purchase subscription gate: unlike refreshPurchases(),
// a failure propagates (no cross-type tolerance) — callers must be able to fail closed on
// "couldn't verify". Commits through the reducer like any query, so the reactive purchases
// flow picks up the fresh renewal state, and emits a partial fresh update: it proves what the
// SUBS query found, never the absence of anything it didn't cover.
suspend fun querySubscriptions(): Collection<Purchase> = refreshMutex.withLock {
log(TAG) { "querySubscriptions()" }
val genAtQueryStart = state.value.eventGen
val subs = queryPurchases(BillingClient.ProductType.SUBS)
.filter { it.purchaseState == PurchaseState.PURCHASED }
val committed = synchronized(reducerLock) {
val next = state.value.withQueryResults(
iap = null,
sub = subs,
genAtQueryStart = genAtQueryStart,
)
state.value = next
freshUpdatesChannel.trySend(FreshUpdate(subs, isFullSnapshot = false))
next
}
// The COMMITTED view, not the raw response: a purchase event that arrived after the query
// started survives the commit as a newer overlay and must reach the gate too — otherwise a
// just-purchased renewing sub could slip past the fail-closed double-billing check.
// Non-IAP overlays only; untyped (unknown product) entries stay in on the safe side.
val byToken = LinkedHashMap<String, Purchase>()
subs.forEach { byToken[it.purchaseToken] = it }
committed.overlay
.filter { it.type != Sku.Type.IAP }
.forEach { byToken[it.purchase.purchaseToken] = it.purchase }
byToken.values.sortedByDescending { it.purchaseTime }
}
suspend fun acknowledgePurchase(purchase: Purchase): BillingResult { suspend fun acknowledgePurchase(purchase: Purchase): BillingResult {
val ack = AcknowledgePurchaseParams.newBuilder().apply { val ack = AcknowledgePurchaseParams.newBuilder().apply {
setPurchaseToken(purchase.purchaseToken) setPurchaseToken(purchase.purchaseToken)
@@ -529,16 +535,22 @@ class BillingConnection(
OurSku.PRO_SKUS.singleOrNull { it.id == productId }?.type OurSku.PRO_SKUS.singleOrNull { it.id == productId }?.type
} }
// Combines the two product-type query results: a purchase found by either type is // Combines the two product-type query results: an error is only propagated when the refresh
// authoritative; an error is only propagated when nothing was found, so callers can tell // learned nothing usable, so callers can tell "not owned" apart from "couldn't verify one
// "not owned" apart from "couldn't verify one product type". Treating any found purchase // product type". A PURCHASED result of ANY product suppresses the error — every product
// as authoritative is safe because every product this app sells is a Pro SKU (see // this app sells is a Pro SKU (see OurSku.PRO_SKUS), so it is by construction relevant. A
// OurSku.PRO_SKUS). Pure and unit-tested. // PENDING result only counts when it maps to a KNOWN Pro SKU: it grants nothing, and an
// unknown pending product says nothing about the type whose query failed, so treating it
// as a find would swallow a real "couldn't verify". Pure and unit-tested.
internal fun combinePurchaseResults( internal fun combinePurchaseResults(
iap: Result<Collection<Purchase>>, iap: Result<Collection<Purchase>>,
sub: Result<Collection<Purchase>>, sub: Result<Collection<Purchase>>,
typeOf: (String) -> Sku.Type? = DEFAULT_SKU_TYPE_RESOLVER,
): Collection<Purchase> { ): Collection<Purchase> {
val found = iap.getOrNull().orEmpty() + sub.getOrNull().orEmpty() val returned = iap.getOrNull().orEmpty() + sub.getOrNull().orEmpty()
val found = returned.filter { purchase ->
purchase.isPurchased || purchase.products.any { typeOf(it) != null }
}
return when { return when {
found.isNotEmpty() -> found.sortedByDescending { it.purchaseTime } found.isNotEmpty() -> found.sortedByDescending { it.purchaseTime }
else -> { else -> {
@@ -13,5 +13,14 @@ sealed class UpgradeEvents {
*/ */
data object RestoreInconclusive : UpgradeEvents() data object RestoreInconclusive : UpgradeEvents()
data object SubscriptionStillRenewing : UpgradeEvents() data object SubscriptionStillRenewing : UpgradeEvents()
data object SubscriptionCheckFailed : UpgradeEvents()
/**
* Play answered, no completed purchase exists, but a payment is still being processed. Purely
* informational: nothing to fix, nothing to restore — Pro unlocks by itself once Play clears
* the payment, and a new purchase would be rejected (or double-charge) in the meantime.
*/
data object PurchasePending : UpgradeEvents()
/** The pre-purchase check with Play didn't finish, so the purchase was not started. */
data object PurchaseCheckFailed : UpgradeEvents()
} }
@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.twotone.Autorenew import androidx.compose.material.icons.twotone.Autorenew
import androidx.compose.material.icons.twotone.HourglassTop
import androidx.compose.material.icons.twotone.Verified import androidx.compose.material.icons.twotone.Verified
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.CardDefaults import androidx.compose.material3.CardDefaults
@@ -101,8 +102,10 @@ internal fun UpgradeOwnershipContent(
Button( Button(
onClick = onIap, onClick = onIap,
// Not gated on iapEnabled: prices may have failed to load while the purchase // Not gated on iapEnabled: prices may have failed to load while the purchase
// itself would work (the billing flow re-queries details on launch). // itself would work (the billing flow re-queries details on launch). A pending
enabled = switchUnlocked && uiState.busy == null, // payment does lock it — Play would reject the purchase, and the pending card
// above carries the explanation.
enabled = switchUnlocked && uiState.busy == null && !uiState.hasPendingPurchase,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.testTag(UpgradeScreenTags.GPLAY_IAP), .testTag(UpgradeScreenTags.GPLAY_IAP),
@@ -239,6 +242,38 @@ internal fun UpgradeGraceCard(
} }
} }
// Shown to EVERY audience while Google Play is still processing a payment: an acquisition user who
// just bought, an owner buying the other product, and a grace user whose Pro is running out — all
// three have purchase actions locked and need the same explanation. Calm reassurance styling like
// the grace card: nothing is wrong, the payment just isn't done.
@Composable
internal fun PendingPurchaseCard(
modifier: Modifier = Modifier,
) {
UpgradeSectionCard(
title = stringResource(R.string.upgrade_screen_pending_card_title),
icon = Icons.TwoTone.HourglassTop,
modifier = modifier.testTag(UpgradeScreenTags.GPLAY_PENDING),
colors = CardDefaults.elevatedCardColors(
containerColor = MaterialTheme.colorScheme.secondaryContainer,
contentColor = MaterialTheme.colorScheme.onSecondaryContainer,
),
) {
Text(
text = stringResource(R.string.upgrade_screen_pending_card_body),
style = MaterialTheme.typography.bodyMedium,
)
}
}
@Preview2
@Composable
private fun PendingPurchaseCardPreview() {
PreviewWrapper {
PendingPurchaseCard()
}
}
private fun previewLoadedState(ownership: Ownership) = GplayUpgradeUiState.Loaded( private fun previewLoadedState(ownership: Ownership) = GplayUpgradeUiState.Loaded(
subscriptionAction = SubscriptionAction.UNAVAILABLE, subscriptionAction = SubscriptionAction.UNAVAILABLE,
subscriptionEnabled = false, subscriptionEnabled = false,
@@ -42,6 +42,12 @@ import eu.darken.capod.common.error.ErrorEventHandler
import eu.darken.capod.common.navigation.NavigationEventHandler import eu.darken.capod.common.navigation.NavigationEventHandler
import eu.darken.capod.common.navigation.Nav import eu.darken.capod.common.navigation.Nav
// The Settings row reads this so it can't name the tier differently than this screen's own
// composed title does. FOSS's counterpart in its own UpgradeScreen.kt stays a support ask instead
// of the composed brand title; each flavor implementation lives only in its own source set.
@Composable
internal fun settingsUpgradeStatusTitle(): String = brandTitleText(includeQualifier = true)
@Composable @Composable
fun UpgradeScreenHost( fun UpgradeScreenHost(
route: Nav.Main.Upgrade = Nav.Main.Upgrade(), route: Nav.Main.Upgrade = Nav.Main.Upgrade(),
@@ -64,6 +70,7 @@ fun UpgradeScreenHost(
var showRestoreInconclusive by rememberSaveable { mutableStateOf(false) } var showRestoreInconclusive by rememberSaveable { mutableStateOf(false) }
var showStillRenewing by rememberSaveable { mutableStateOf(false) } var showStillRenewing by rememberSaveable { mutableStateOf(false) }
var showCheckFailed by rememberSaveable { mutableStateOf(false) } var showCheckFailed by rememberSaveable { mutableStateOf(false) }
var showPurchasePending by rememberSaveable { mutableStateOf(false) }
LaunchedEffect(vm) { LaunchedEffect(vm) {
vm.events.collect { event -> vm.events.collect { event ->
@@ -77,7 +84,8 @@ fun UpgradeScreenHost(
UpgradeEvents.RestoreFailed -> showRestoreFailed = true UpgradeEvents.RestoreFailed -> showRestoreFailed = true
UpgradeEvents.RestoreInconclusive -> showRestoreInconclusive = true UpgradeEvents.RestoreInconclusive -> showRestoreInconclusive = true
UpgradeEvents.SubscriptionStillRenewing -> showStillRenewing = true UpgradeEvents.SubscriptionStillRenewing -> showStillRenewing = true
UpgradeEvents.SubscriptionCheckFailed -> showCheckFailed = true UpgradeEvents.PurchaseCheckFailed -> showCheckFailed = true
UpgradeEvents.PurchasePending -> showPurchasePending = true
} }
} }
} }
@@ -128,7 +136,7 @@ fun UpgradeScreenHost(
if (showCheckFailed) { if (showCheckFailed) {
AlertDialog( AlertDialog(
onDismissRequest = { showCheckFailed = false }, onDismissRequest = { showCheckFailed = false },
text = { Text(text = stringResource(R.string.upgrade_screen_sub_check_failed_message)) }, text = { Text(text = stringResource(R.string.upgrade_screen_purchase_check_failed_message)) },
confirmButton = { confirmButton = {
TextButton(onClick = { showCheckFailed = false }) { TextButton(onClick = { showCheckFailed = false }) {
Text(text = stringResource(R.string.general_close_action)) Text(text = stringResource(R.string.general_close_action))
@@ -137,6 +145,10 @@ fun UpgradeScreenHost(
) )
} }
if (showPurchasePending) {
PurchasePendingDialog(onDismiss = { showPurchasePending = false })
}
val uiState by vm.state.collectAsStateWithLifecycle() val uiState by vm.state.collectAsStateWithLifecycle()
UpgradeScreen( UpgradeScreen(
@@ -181,6 +193,34 @@ internal fun RestoreFailedDialog(
) )
} }
/**
* Shown when Play is still processing a payment. Purely informational: there is nothing to fix, no
* purchase to restore and no support case — the entitlement arrives on its own once the payment
* clears, so the dialog offers only a dismiss.
*/
@Composable
internal fun PurchasePendingDialog(
onDismiss: () -> Unit = {},
) {
AlertDialog(
onDismissRequest = onDismiss,
text = { Text(text = stringResource(R.string.upgrade_screen_pending_dialog_message)) },
confirmButton = {
TextButton(onClick = onDismiss) {
Text(text = stringResource(R.string.general_close_action))
}
},
)
}
@Preview2
@Composable
private fun PurchasePendingDialogPreview() {
PreviewWrapper {
PurchasePendingDialog()
}
}
/** /**
* Shown when the restore never got an answer (timeout, or a Play error absorbed by grace). Carries * Shown when the restore never got an answer (timeout, or a Play error absorbed by grace). Carries
* no multi-account hint and no contact-support action: nothing was established, so both would be * no multi-account hint and no contact-support action: nothing was established, so both would be
@@ -275,6 +315,12 @@ internal fun UpgradeScreen(
} }
} }
// Above the ownership/acquisition split, because a pending payment cuts across it: the
// buyer waiting for their first Pro purchase, the owner switching products and the
// grace user (whose offers box is hidden entirely) all need it, and it is the reason
// their purchase buttons are locked.
if (loaded?.hasPendingPurchase == true) PendingPurchaseCard()
if (ownedState != null) { if (ownedState != null) {
UpgradeOwnershipContent( UpgradeOwnershipContent(
uiState = ownedState, uiState = ownedState,
@@ -480,6 +526,24 @@ private fun UpgradeScreenReturningBuyerPreview() {
} }
} }
// The acquisition variant of the pending state: card above the offers, both buy buttons locked.
@Preview2
@Composable
private fun UpgradeScreenPendingPreview() {
PreviewWrapper {
UpgradeScreen(
uiState = GplayUpgradeUiState.Loaded(
subscriptionAction = SubscriptionAction.STANDARD,
subscriptionEnabled = false,
subscriptionPrice = "$12.99",
iapEnabled = false,
iapPrice = "$24.99",
hasPendingPurchase = true,
),
)
}
}
@Preview2 @Preview2
@Composable @Composable
private fun UpgradeScreenUnavailablePreview() { private fun UpgradeScreenUnavailablePreview() {
@@ -23,6 +23,9 @@ internal sealed interface GplayUpgradeUiState {
val ownership: Ownership = Ownership(), val ownership: Ownership = Ownership(),
val grace: GraceHint? = null, val grace: GraceHint? = null,
val wasPreviouslyPro: Boolean = false, val wasPreviouslyPro: Boolean = false,
// A payment Google Play is still processing. SKU-agnostic on purpose: the card explains the
// wait and both purchase actions lock, regardless of which product is pending.
val hasPendingPurchase: Boolean = false,
val busy: BusyOp? = null, val busy: BusyOp? = null,
) : GplayUpgradeUiState ) : GplayUpgradeUiState
} }
@@ -73,12 +76,18 @@ internal fun UpgradeRepoGplay.Info.toOwnership() = Ownership(
?.let { subs -> SubscriptionOwnership(isAutoRenewing = subs.any { it.purchase.isAutoRenewing }) }, ?.let { subs -> SubscriptionOwnership(isAutoRenewing = subs.any { it.purchase.isAutoRenewing }) },
) )
// Any Pro payment Play is still processing. No per-product flag: the one-time purchase and the
// subscription are alternatives, so a pending payment for either one must lock both — completing
// both would charge the user twice for the same thing.
internal fun UpgradeRepoGplay.Info.toPendingFlag(): Boolean = pendingSkus.isNotEmpty()
internal fun toLoadedState( internal fun toLoadedState(
iap: SkuDetails?, iap: SkuDetails?,
sub: SkuDetails?, sub: SkuDetails?,
ownership: Ownership, ownership: Ownership,
grace: GraceHint? = null, grace: GraceHint? = null,
wasPreviouslyPro: Boolean = false, wasPreviouslyPro: Boolean = false,
hasPendingPurchase: Boolean = false,
busy: BusyOp? = null, busy: BusyOp? = null,
): GplayUpgradeUiState.Loaded { ): GplayUpgradeUiState.Loaded {
val iapOffer = iap?.details?.oneTimePurchaseOfferDetails val iapOffer = iap?.details?.oneTimePurchaseOfferDetails
@@ -97,15 +106,18 @@ internal fun toLoadedState(
}, },
// Any running entitlement operation (restore, manual or the invisible already-owned // Any running entitlement operation (restore, manual or the invisible already-owned
// recovery, and purchases) pauses the buy actions too — starting a purchase while an // recovery, and purchases) pauses the buy actions too — starting a purchase while an
// entitlement is being reconciled just races Play into ITEM_ALREADY_OWNED. // entitlement is being reconciled just races Play into ITEM_ALREADY_OWNED. A pending
// payment locks BOTH offers for the same reason the card explains: Play refuses the
// re-purchase, and the alternative product would double-charge for the same features.
subscriptionEnabled = (subOffer != null || subOfferTrial != null) && subscriptionEnabled = (subOffer != null || subOfferTrial != null) &&
ownership.subscription == null && busy == null, ownership.subscription == null && busy == null && !hasPendingPurchase,
subscriptionPrice = subOffer?.pricingPhases?.pricingPhaseList?.lastOrNull()?.formattedPrice, subscriptionPrice = subOffer?.pricingPhases?.pricingPhaseList?.lastOrNull()?.formattedPrice,
iapEnabled = iapOffer != null && !ownership.hasIap && busy == null, iapEnabled = iapOffer != null && !ownership.hasIap && busy == null && !hasPendingPurchase,
iapPrice = iapOffer?.formattedPrice, iapPrice = iapOffer?.formattedPrice,
ownership = ownership, ownership = ownership,
grace = grace, grace = grace,
wasPreviouslyPro = wasPreviouslyPro, wasPreviouslyPro = wasPreviouslyPro,
hasPendingPurchase = hasPendingPurchase,
busy = busy, busy = busy,
) )
} }
@@ -19,6 +19,7 @@ import eu.darken.capod.common.upgrade.core.OurSku
import eu.darken.capod.common.upgrade.core.UpgradeRepoGplay import eu.darken.capod.common.upgrade.core.UpgradeRepoGplay
import eu.darken.capod.common.upgrade.core.billing.GplayServiceUnavailableException import eu.darken.capod.common.upgrade.core.billing.GplayServiceUnavailableException
import eu.darken.capod.common.upgrade.core.billing.OfferUnavailableBillingException import eu.darken.capod.common.upgrade.core.billing.OfferUnavailableBillingException
import eu.darken.capod.common.upgrade.core.billing.PendingPurchaseBillingException
import eu.darken.capod.common.upgrade.core.billing.Sku import eu.darken.capod.common.upgrade.core.billing.Sku
import eu.darken.capod.common.upgrade.core.billing.SkuDetails import eu.darken.capod.common.upgrade.core.billing.SkuDetails
import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CancellationException
@@ -161,8 +162,10 @@ class UpgradeViewModel @Inject constructor(
null null
} }
// Owners and grace users don't depend on offer prices: their status and management // Owners and grace users don't depend on offer prices: their status and management
// actions render immediately and price problems are not their problem. // actions render immediately and price problems are not their problem. A user waiting on a
val priceIndependent = ownership.ownsAnything || grace != null // pending payment is in the same position — the card is their answer, and both offers are
// locked anyway, so a price failure must not replace it with an error screen.
val priceIndependent = ownership.ownsAnything || grace != null || current.pendingSkus.isNotEmpty()
val done = queries as? SkuQueries.Done val done = queries as? SkuQueries.Done
if (done == null) { if (done == null) {
@@ -258,6 +261,7 @@ class UpgradeViewModel @Inject constructor(
ownership = ownership, ownership = ownership,
grace = grace, grace = grace,
wasPreviouslyPro = wasEverPro && !current.isPro, wasPreviouslyPro = wasEverPro && !current.isPro,
hasPendingPurchase = current.toPendingFlag(),
// This ViewModel's own action wins; otherwise a launch started elsewhere (previous VM // This ViewModel's own action wins; otherwise a launch started elsewhere (previous VM
// instance, e.g. across a rotation — the launch lives on AppScope) or the repo's // instance, e.g. across a rotation — the launch lives on AppScope) or the repo's
// invisible already-owned auto-restore still pauses the entitlement actions here. // invisible already-owned auto-restore still pauses the entitlement actions here.
@@ -303,44 +307,78 @@ class UpgradeViewModel @Inject constructor(
return true return true
} }
// Outcome of the pre-purchase check with Play. Both purchase paths share it: they buy
// alternatives of the same entitlement from the same account, so a check only one of them runs
// is exactly how a double charge slips through. [Blocked] means the user was already told why.
private sealed interface PurchaseGate {
data class Clear(val info: UpgradeRepoGplay.Info) : PurchaseGate
data object Blocked : PurchaseGate
}
// Fails closed: no fresh, complete answer from Play (error, timeout) means no purchase. Bounded,
// because the repo waits for a healthy connection indefinitely and a tap must not park the
// single-flight guard through an outage.
private suspend fun runPurchaseGate(): PurchaseGate {
val info = try {
withTimeoutOrNull(VERIFY_TIMEOUT_MS) { upgradeRepo.verifyPurchaseStateNow() }
} catch (e: CancellationException) {
throw e
} catch (e: Exception) {
log(TAG, WARN) { "Purchase verification errored: ${e.asLog()}" }
errorEvents.tryEmit(e)
return PurchaseGate.Blocked
}
if (info == null) {
log(TAG, WARN) { "Purchase verification timed out" }
events.tryEmit(UpgradeEvents.PurchaseCheckFailed)
return PurchaseGate.Blocked
}
if (info.pendingSkus.isNotEmpty()) {
// Play rejects a purchase while it is still processing a payment for this account, and
// the alternative product would charge twice for the same features.
log(TAG, INFO) { "Purchase blocked: a payment is still pending" }
events.tryEmit(UpgradeEvents.PurchasePending)
return PurchaseGate.Blocked
}
return PurchaseGate.Clear(info)
}
// A launch that failed on a pending payment is not an error the user can act on: it gets the
// informational dialog instead of the already-owned copy and its restore tips.
private fun onLaunchError(error: Throwable) {
if (error is PendingPurchaseBillingException) {
events.tryEmit(UpgradeEvents.PurchasePending)
} else {
errorEvents.tryEmit(error)
}
}
fun onGoIap(activity: Activity) { fun onGoIap(activity: Activity) {
log(TAG) { "onGoIap($activity)" } log(TAG) { "onGoIap($activity)" }
launch { launch {
// Single-flight: repeated taps must not stack verifications or billing launches. // Single-flight: repeated taps must not stack verifications or billing launches.
if (!acquireOp(BusyOp.IAP)) return@launch if (!acquireOp(BusyOp.IAP)) return@launch
try { try {
// Hard gate against double-billing: verify against a FRESH SUBS-only query — the val gate = runPurchaseGate()
// replayed upgradeInfo can be stale or built from partial results. Fails closed: if (gate !is PurchaseGate.Clear) return@launch
// no verified "not set to renew" (or no sub at all), no one-time purchase. // Hard gate against double-billing, against the FRESH result — the replayed
val subscriptions = try { // upgradeInfo can be stale or built from partial results. Asked of the RAW
withTimeoutOrNull(VERIFY_TIMEOUT_MS) { upgradeRepo.queryCurrentSubscriptions() } // purchases (see Info.hasAutoRenewingSubscription), never of the mapped upgrades:
} catch (e: CancellationException) { // a renewing subscription with an unknown or legacy product ID must block the
throw e // one-time purchase too, or the user pays for Pro twice.
} catch (e: Exception) { if (gate.info.hasAutoRenewingSubscription) {
log(TAG, WARN) { "Subscription verification errored: ${e.asLog()}" } log(TAG, INFO) { "IAP purchase blocked: subscription is still set to renew" }
errorEvents.tryEmit(e) events.tryEmit(UpgradeEvents.SubscriptionStillRenewing)
return@launch return@launch
} }
when { // Suspends until the Play sheet launch resolved, so the single-flight guard covers
subscriptions == null -> { // the whole tap-to-sheet window, not just the verification.
log(TAG, WARN) { "Subscription verification timed out" } upgradeRepo.launchBillingFlowNow(
events.tryEmit(UpgradeEvents.SubscriptionCheckFailed) activity,
} OurSku.Iap.PRO_UPGRADE,
null,
subscriptions.any { it.isAutoRenewing } -> { onError = ::onLaunchError,
log(TAG, INFO) { "IAP purchase blocked: subscription is still set to renew" } )
events.tryEmit(UpgradeEvents.SubscriptionStillRenewing)
}
// Suspends until the Play sheet launch resolved, so the single-flight guard
// covers the whole tap-to-sheet window, not just the verification.
else -> upgradeRepo.launchBillingFlowNow(
activity,
OurSku.Iap.PRO_UPGRADE,
null,
onError = errorEvents::tryEmit,
)
}
} finally { } finally {
activeOp.value = null activeOp.value = null
} }
@@ -361,6 +399,32 @@ class UpgradeViewModel @Inject constructor(
launch { launch {
if (!acquireOp(BusyOp.SUBSCRIPTION)) return@launch if (!acquireOp(BusyOp.SUBSCRIPTION)) return@launch
try { try {
// Same fresh check as the one-time path: a pending payment (for either product)
// must block this launch too — Play would reject it, or bill it on top.
val gate = runPurchaseGate()
if (gate !is PurchaseGate.Clear) return@launch
// The reactive UI can be stale (the purchase was made on another device), and Play
// happily sells the subscription alongside an owned one-time purchase — the user
// would pay for Pro twice. The strict refresh already committed into the shared
// billing data, so the screen re-renders to the ownership state, and the
// restore-success toast explains why nothing launched. Deliberately the MAPPED
// upgrades, not isPro: grace users (mapped upgrades empty) may legitimately
// re-purchase.
if (gate.info.upgrades.isNotEmpty()) {
log(TAG, INFO) { "Subscription purchase blocked: fresh check found an owned upgrade" }
events.tryEmit(UpgradeEvents.RestoreSucceeded)
return@launch
}
// Same breadth as the one-time path's renewal guard: an auto-renewing subscription
// with an unknown or legacy product ID (which maps to zero upgrades, so the block
// above passed) must still block a new subscription — two renewing subscriptions
// for the same features is the same double-billing. Reuses the existing
// manage-subscription dialog.
if (gate.info.hasAutoRenewingSubscription) {
log(TAG, INFO) { "Subscription purchase blocked: another subscription is still set to renew" }
events.tryEmit(UpgradeEvents.SubscriptionStillRenewing)
return@launch
}
// launchBillingFlowNow suspends until the launch resolved, so the guard covers the // launchBillingFlowNow suspends until the launch resolved, so the guard covers the
// whole tap-to-sheet window. The flow itself still runs on AppScope, so closing the // whole tap-to-sheet window. The flow itself still runs on AppScope, so closing the
// screen mid-launch doesn't abort the purchase. // screen mid-launch doesn't abort the purchase.
@@ -368,7 +432,7 @@ class UpgradeViewModel @Inject constructor(
activity, activity,
OurSku.Sub.PRO_UPGRADE, OurSku.Sub.PRO_UPGRADE,
offer, offer,
onError = errorEvents::tryEmit, onError = ::onLaunchError,
) )
} finally { } finally {
activeOp.value = null activeOp.value = null
@@ -432,6 +496,14 @@ class UpgradeViewModel @Inject constructor(
events.tryEmit(UpgradeEvents.RestoreSucceeded) events.tryEmit(UpgradeEvents.RestoreSucceeded)
} }
restored.info.pendingSkus.isNotEmpty() -> {
// Play answered and found the purchase — it just hasn't been paid for yet.
// RestoreFailed would send this user chasing account and support advice for
// something that resolves itself.
log(TAG, INFO) { "Restore found a purchase with a pending payment" }
events.tryEmit(UpgradeEvents.PurchasePending)
}
else -> { else -> {
// Play answered and had nothing. Includes a grace-only result from a successful // Play answered and had nothing. Includes a grace-only result from a successful
// EMPTY query: Pro may still be active, but the check really did complete, so // EMPTY query: Pro may still be active, but the check really did complete, so
@@ -46,8 +46,6 @@
<string name="upgrade_screen_owned_iap_purchase_note">Dit is \'n aparte aankoop — dit kanselleer of vergoed nie jou intekening nie. Gebruik dieselfde Google-rekening.</string> <string name="upgrade_screen_owned_iap_purchase_note">Dit is \'n aparte aankoop — dit kanselleer of vergoed nie jou intekening nie. Gebruik dieselfde Google-rekening.</string>
<string name="upgrade_screen_sub_still_renewing_title">Intekening steeds aktief</string> <string name="upgrade_screen_sub_still_renewing_title">Intekening steeds aktief</string>
<string name="upgrade_screen_sub_still_renewing_message">Jou intekening is steeds gestel om te hernu. Kanselleer dit eers in Google Play, en wissel dan na die eenmalige aankoop. Pas gekanselleer? Gee Google Play \'n oomblik en probeer weer.</string> <string name="upgrade_screen_sub_still_renewing_message">Jou intekening is steeds gestel om te hernu. Kanselleer dit eers in Google Play, en wissel dan na die eenmalige aankoop. Pas gekanselleer? Gee Google Play \'n oomblik en probeer weer.</string>
<string name="upgrade_screen_sub_check_failed_title">Intekeningkontrole het misluk</string>
<string name="upgrade_screen_sub_check_failed_message">Kon nie jou intekeningstatus by Google Play nagaan nie. Probeer binnekort weer om \'n dubbele aankoop te vermy.</string>
<string name="upgrade_screen_grace_title">Jou aankoop word bevestig</string> <string name="upgrade_screen_grace_title">Jou aankoop word bevestig</string>
<string name="upgrade_screen_grace_body_short">Google Play het jou aankoop nog nie bevestig nie. Pro is steeds aktief — geen aksie nodig nie.</string> <string name="upgrade_screen_grace_body_short">Google Play het jou aankoop nog nie bevestig nie. Pro is steeds aktief — geen aksie nodig nie.</string>
<string name="upgrade_screen_grace_body">Google Play het jou aankoop al \'n rukkie nie bevestig nie. Pro is steeds aktief. Maak seker jy is aanlyn en aangemeld met die Google-rekening wat vir die aankoop gebruik is, en probeer dan herstel.</string> <string name="upgrade_screen_grace_body">Google Play het jou aankoop al \'n rukkie nie bevestig nie. Pro is steeds aktief. Maak seker jy is aanlyn en aangemeld met die Google-rekening wat vir die aankoop gebruik is, en probeer dan herstel.</string>
@@ -66,7 +64,6 @@
<string name="upgrade_screen_restore_checked_message">CAPod het Google Play nou-nou gekontroleer, maar geen Pro-aankoop kon bevestig word vir die rekening wat Google Play vir hierdie app gebruik nie.</string> <string name="upgrade_screen_restore_checked_message">CAPod het Google Play nou-nou gekontroleer, maar geen Pro-aankoop kon bevestig word vir die rekening wat Google Play vir hierdie app gebruik nie.</string>
<string name="upgrade_screen_restore_contact_hint">Nog steeds vas? Neem kontak op met ondersteuning van die e-posadres wat die aankoop gemaak het en voeg jou Google Play-ordernommer by.</string> <string name="upgrade_screen_restore_contact_hint">Nog steeds vas? Neem kontak op met ondersteuning van die e-posadres wat die aankoop gemaak het en voeg jou Google Play-ordernommer by.</string>
<string name="upgrade_screen_contact_support_action">Neem kontak op met ondersteuning</string> <string name="upgrade_screen_contact_support_action">Neem kontak op met ondersteuning</string>
<string name="settings_upgrade_status_label">CAPod Pro</string>
<string name="settings_upgrade_status_description">Jou upgrade- en aankoopstatus.</string> <string name="settings_upgrade_status_description">Jou upgrade- en aankoopstatus.</string>
<string name="upgrades_gplay_unavailable_error_description">CAPod kan nie aan Google Play koppel nie. Is Google Play geïnstalleer en opgedateer? Is jou Google-rekening aangemeld? Probeer om die kas van die Google Play-toepassing skoon te maak en jou toestel herlaai.</string> <string name="upgrades_gplay_unavailable_error_description">CAPod kan nie aan Google Play koppel nie. Is Google Play geïnstalleer en opgedateer? Is jou Google-rekening aangemeld? Probeer om die kas van die Google Play-toepassing skoon te maak en jou toestel herlaai.</string>
<!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. --> <!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. -->
-3
View File
@@ -46,8 +46,6 @@
<string name="upgrade_screen_owned_iap_purchase_note">ይህ የተለየ ግá‹ĸ ነው — áˆá‹áŒˆá‰Ŗá‹áŠ• አይሰርዝም ወይም አይመልáˆĩምáĸ á‰°áˆ˜áˆŗáˆŗá‹­ የGoogle መለá‹Ģ ይጠቀሙáĸ</string> <string name="upgrade_screen_owned_iap_purchase_note">ይህ የተለየ ግá‹ĸ ነው — áˆá‹áŒˆá‰Ŗá‹áŠ• አይሰርዝም ወይም አይመልáˆĩምáĸ á‰°áˆ˜áˆŗáˆŗá‹­ የGoogle መለá‹Ģ ይጠቀሙáĸ</string>
<string name="upgrade_screen_sub_still_renewing_title">áˆá‹áŒˆá‰Ŗ አሁነም ንቁ ነው</string> <string name="upgrade_screen_sub_still_renewing_title">áˆá‹áŒˆá‰Ŗ አሁነም ንቁ ነው</string>
<string name="upgrade_screen_sub_still_renewing_message">áˆá‹áŒˆá‰Ŗá‹Ž አሁንም ለማደáˆĩ ተዘጋጅቷልáĸ መጀመáˆĒá‹Ģ በGoogle Play ውáˆĩáŒĨ ይሰርዙá‰ĩáŖ ከዚá‹Ģ ወደ አንá‹ĩ ጊዜ ግá‹ĸ ይቀይሩáĸ አሁን ገና áˆ°áˆ­á‹˜á‹á‰ŗáˆ? ለGoogle Play á‰ĩንáˆŊ ጊዜ ይáˆĩጡ áŠĨና áŠĨንደገና ይሞክሩáĸ</string> <string name="upgrade_screen_sub_still_renewing_message">áˆá‹áŒˆá‰Ŗá‹Ž አሁንም ለማደáˆĩ ተዘጋጅቷልáĸ መጀመáˆĒá‹Ģ በGoogle Play ውáˆĩáŒĨ ይሰርዙá‰ĩáŖ ከዚá‹Ģ ወደ አንá‹ĩ ጊዜ ግá‹ĸ ይቀይሩáĸ አሁን ገና áˆ°áˆ­á‹˜á‹á‰ŗáˆ? ለGoogle Play á‰ĩንáˆŊ ጊዜ ይáˆĩጡ áŠĨና áŠĨንደገና ይሞክሩáĸ</string>
<string name="upgrade_screen_sub_check_failed_title">á‹¨áˆá‹áŒˆá‰Ŗ ማረጋገáŒĢ áŠ áˆá‰°áˆŗáŠĢም</string>
<string name="upgrade_screen_sub_check_failed_message">á‹¨áˆá‹áŒˆá‰Ŗ áˆáŠ”á‰ŗá‹ŽáŠ• ከGoogle Play ጋር ማረጋገáŒĨ አልተá‰ģለምáĸ á‹ĩርá‰Ĩ ግá‹ĸን ለማáˆĩቀረá‰ĩáŖ á‰ĩንáˆŊ ቆይተው áŠĨንደገና ይሞክሩáĸ</string>
<string name="upgrade_screen_grace_title">ግá‹ĸዎን በማረጋገáŒĨ ላይ</string> <string name="upgrade_screen_grace_title">ግá‹ĸዎን በማረጋገáŒĨ ላይ</string>
<string name="upgrade_screen_grace_body_short">Google Play ግá‹ĸዎን áŠĨáˆĩáŠĢሁን አላረጋገጠምáĸ Pro አሁንም ንቁ ነው — ምንም áŠĨርምጃ አá‹Ģáˆĩፈልግምáĸ</string> <string name="upgrade_screen_grace_body_short">Google Play ግá‹ĸዎን áŠĨáˆĩáŠĢሁን አላረጋገጠምáĸ Pro አሁንም ንቁ ነው — ምንም áŠĨርምጃ አá‹Ģáˆĩፈልግምáĸ</string>
<string name="upgrade_screen_grace_body">Google Play ለተወሰነ ጊዜ ግá‹ĸዎን አላረጋገጠምáĸ Pro አሁንም ንቁ ነውáĸ መáˆĩመር ላይ መሆንዎን áŠĨና ለግá‹ĸው áŒĨቅም ላይ በዋለው የGoogle መለá‹Ģ áˆ˜áŒá‰Ŗá‰ĩዎን á‹Ģáˆ¨áŒ‹áŒáŒĄáŖ ከዚá‹Ģ ወደነበረበá‰ĩ ለመመለáˆĩ ይሞክሩáĸ</string> <string name="upgrade_screen_grace_body">Google Play ለተወሰነ ጊዜ ግá‹ĸዎን አላረጋገጠምáĸ Pro አሁንም ንቁ ነውáĸ መáˆĩመር ላይ መሆንዎን áŠĨና ለግá‹ĸው áŒĨቅም ላይ በዋለው የGoogle መለá‹Ģ áˆ˜áŒá‰Ŗá‰ĩዎን á‹Ģáˆ¨áŒ‹áŒáŒĄáŖ ከዚá‹Ģ ወደነበረበá‰ĩ ለመመለáˆĩ ይሞክሩáĸ</string>
@@ -66,7 +64,6 @@
<string name="upgrade_screen_restore_checked_message">CAPod አሁን Google Play áŠ áˆ¨áŒ‹áŒˆáŒ áŖ ነገር ግን Google Play ለዚህ መተግበáˆĒá‹Ģ áŒĨቅም ላይ áˆĩለሚውለው መለá‹Ģ Pro ግá‹ĸ ማረጋገáŒĨ አልተá‰ģለምáĸ</string> <string name="upgrade_screen_restore_checked_message">CAPod አሁን Google Play áŠ áˆ¨áŒ‹áŒˆáŒ áŖ ነገር ግን Google Play ለዚህ መተግበáˆĒá‹Ģ áŒĨቅም ላይ áˆĩለሚውለው መለá‹Ģ Pro ግá‹ĸ ማረጋገáŒĨ አልተá‰ģለምáĸ</string>
<string name="upgrade_screen_restore_contact_hint">አሁንም á‰Ŋግር áŠĢጋጠመዎá‰ĩ? ግá‹ĸውን á‹Ģደረገው áŠĸሜይል በመጠቀም á‹ĩጋፍ á‹Ģግኙ áŠĨና Google Play á‰ĩዕዛዝ ቁáŒĨርዎን á‹ĢáŠĢá‰ĩቱáĸ</string> <string name="upgrade_screen_restore_contact_hint">አሁንም á‰Ŋግር áŠĢጋጠመዎá‰ĩ? ግá‹ĸውን á‹Ģደረገው áŠĸሜይል በመጠቀም á‹ĩጋፍ á‹Ģግኙ áŠĨና Google Play á‰ĩዕዛዝ ቁáŒĨርዎን á‹ĢáŠĢá‰ĩቱáĸ</string>
<string name="upgrade_screen_contact_support_action">á‹ĩጋፍ ለማነጋገር</string> <string name="upgrade_screen_contact_support_action">á‹ĩጋፍ ለማነጋገር</string>
<string name="settings_upgrade_status_label">CAPod Pro</string>
<string name="settings_upgrade_status_description">የáŠĨርáˆĩዎ ማáˆģáˆģá‹Ģ áŠĨና ግá‹ĸ áˆáŠ”á‰ŗáĸ</string> <string name="settings_upgrade_status_description">የáŠĨርáˆĩዎ ማáˆģáˆģá‹Ģ áŠĨና ግá‹ĸ áˆáŠ”á‰ŗáĸ</string>
<string name="upgrades_gplay_unavailable_error_description">CAPod ከGoogle Play ጋር መገናኘá‰ĩ አይá‰Ŋልምáĸ Google Play ተጭኖ áŠĨና á‹ˆá‰…á‰ŗá‹Š ነው? የGoogle መለá‹Ģዎ ገá‰Ĩቷል? የGoogle Play መተግበáˆĒá‹Ģ መሸጎáŒĢ ማáŒĨáˆĢá‰ĩ áŠĨና áˆ˜áˆŗáˆĒá‹Ģዎን áŠĨንደገና ማáˆĩጀመር ይሞክሩáĸ</string> <string name="upgrades_gplay_unavailable_error_description">CAPod ከGoogle Play ጋር መገናኘá‰ĩ አይá‰Ŋልምáĸ Google Play ተጭኖ áŠĨና á‹ˆá‰…á‰ŗá‹Š ነው? የGoogle መለá‹Ģዎ ገá‰Ĩቷል? የGoogle Play መተግበáˆĒá‹Ģ መሸጎáŒĢ ማáŒĨáˆĢá‰ĩ áŠĨና áˆ˜áˆŗáˆĒá‹Ģዎን áŠĨንደገና ማáˆĩጀመር ይሞክሩáĸ</string>
<!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. --> <!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. -->
-3
View File
@@ -46,8 +46,6 @@
<string name="upgrade_screen_owned_iap_purchase_note">Ų‡Ø°Ø§ Ø´ØąØ§ØĄ ؅؆؁ØĩŲ„ — Ų„Ø§ ŲŠØ¤Ø¯ŲŠ ØĨŲ„Ų‰ ØĨŲ„ØēØ§ØĄ اشØĒØąØ§ŲƒŲƒ ØŖŲˆ Ø§ØŗØĒØąØ¯Ø§Ø¯ Ų‚ŲŠŲ…ØĒŲ‡. Ø§ØŗØĒØŽØ¯Ų… Ų†ŲØŗ Ø­ØŗØ§Ø¨ Google.</string> <string name="upgrade_screen_owned_iap_purchase_note">Ų‡Ø°Ø§ Ø´ØąØ§ØĄ ؅؆؁ØĩŲ„ — Ų„Ø§ ŲŠØ¤Ø¯ŲŠ ØĨŲ„Ų‰ ØĨŲ„ØēØ§ØĄ اشØĒØąØ§ŲƒŲƒ ØŖŲˆ Ø§ØŗØĒØąØ¯Ø§Ø¯ Ų‚ŲŠŲ…ØĒŲ‡. Ø§ØŗØĒØŽØ¯Ų… Ų†ŲØŗ Ø­ØŗØ§Ø¨ Google.</string>
<string name="upgrade_screen_sub_still_renewing_title">Ø§Ų„Ø§Ø´ØĒØąØ§Ųƒ Ų„Ø§ ŲŠØ˛Ø§Ų„ Ų†Ø´ØˇŲ‹Ø§</string> <string name="upgrade_screen_sub_still_renewing_title">Ø§Ų„Ø§Ø´ØĒØąØ§Ųƒ Ų„Ø§ ŲŠØ˛Ø§Ų„ Ų†Ø´ØˇŲ‹Ø§</string>
<string name="upgrade_screen_sub_still_renewing_message">اشØĒØąØ§ŲƒŲƒ Ų„Ø§ ŲŠØ˛Ø§Ų„ Ų…ØļØ¨ŲˆØˇŲ‹Ø§ ØšŲ„Ų‰ Ø§Ų„ØĒØŦØ¯ŲŠØ¯. ØŖŲ„ØēŲ‡ ؁؊ Google Play ØŖŲˆŲ„Ų‹Ø§ØŒ ØĢŲ… Ø¨Ø¯Ų‘Ų„ ØĨŲ„Ų‰ Ø§Ų„Ø´ØąØ§ØĄ Ų„Ų…ØąØŠ ŲˆØ§Ø­Ø¯ØŠ. Ų‡Ų„ ØŖŲ„Øē؊ØĒŲ‡ Ų„Ų„ØĒŲˆØŸ Ø§Ų…Ų†Ø­ Google Play بؚØļ Ø§Ų„ŲˆŲ‚ØĒ ŲˆØ­Ø§ŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰.</string> <string name="upgrade_screen_sub_still_renewing_message">اشØĒØąØ§ŲƒŲƒ Ų„Ø§ ŲŠØ˛Ø§Ų„ Ų…ØļØ¨ŲˆØˇŲ‹Ø§ ØšŲ„Ų‰ Ø§Ų„ØĒØŦØ¯ŲŠØ¯. ØŖŲ„ØēŲ‡ ؁؊ Google Play ØŖŲˆŲ„Ų‹Ø§ØŒ ØĢŲ… Ø¨Ø¯Ų‘Ų„ ØĨŲ„Ų‰ Ø§Ų„Ø´ØąØ§ØĄ Ų„Ų…ØąØŠ ŲˆØ§Ø­Ø¯ØŠ. Ų‡Ų„ ØŖŲ„Øē؊ØĒŲ‡ Ų„Ų„ØĒŲˆØŸ Ø§Ų…Ų†Ø­ Google Play بؚØļ Ø§Ų„ŲˆŲ‚ØĒ ŲˆØ­Ø§ŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰.</string>
<string name="upgrade_screen_sub_check_failed_title">ŲØ´Ų„ Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† Ø§Ų„Ø§Ø´ØĒØąØ§Ųƒ</string>
<string name="upgrade_screen_sub_check_failed_message">ØĒØšØ°Ų‘Øą Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† Ø­Ø§Ų„ØŠ اشØĒØąØ§ŲƒŲƒ Ų„Ø¯Ų‰ Google Play. Ų„ØĒØŦŲ†Ø¨ Ø§Ų„Ø´ØąØ§ØĄ Ø§Ų„Ų…Ø˛Ø¯ŲˆØŦ، Ø­Ø§ŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰ بؚد Ų‚Ų„ŲŠŲ„.</string>
<string name="upgrade_screen_grace_title">ØŦØ§ØąŲ ØĒØŖŲƒŲŠØ¯ ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄ</string> <string name="upgrade_screen_grace_title">ØŦØ§ØąŲ ØĒØŖŲƒŲŠØ¯ ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄ</string>
<string name="upgrade_screen_grace_body_short">Ų„Ų… ŲŠØ¤ŲƒŲ‘Ø¯ Google Play ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ بؚد. Ų„Ø§ ŲŠØ˛Ø§Ų„ Pro Ų†Ø´ØˇŲ‹Ø§ — Ų„Ø§ حاØŦØŠ Ų„Ø§ØĒ؎اذ ØŖŲŠ ØĨØŦØąØ§ØĄ.</string> <string name="upgrade_screen_grace_body_short">Ų„Ų… ŲŠØ¤ŲƒŲ‘Ø¯ Google Play ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ بؚد. Ų„Ø§ ŲŠØ˛Ø§Ų„ Pro Ų†Ø´ØˇŲ‹Ø§ — Ų„Ø§ حاØŦØŠ Ų„Ø§ØĒ؎اذ ØŖŲŠ ØĨØŦØąØ§ØĄ.</string>
<string name="upgrade_screen_grace_body">Ų„Ų… ŲŠØ¤ŲƒŲ‘Ø¯ Google Play ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ Ų…Ų†Ø° ؁ØĒØąØŠ. Ų„Ø§ ŲŠØ˛Ø§Ų„ Pro Ų†Ø´ØˇŲ‹Ø§. ØĒØŖŲƒØ¯ Ų…Ų† اØĒØĩØ§Ų„Ųƒ Ø¨Ø§Ų„ØĨŲ†ØĒØąŲ†ØĒ ؈ØĒØŗØŦŲŠŲ„ Ø¯ØŽŲˆŲ„Ųƒ Ø¨Ø­ØŗØ§Ø¨ Google Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… ؁؊ ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄØŒ ØĢŲ… Ø­Ø§ŲˆŲ„ Ø§ØŗØĒؚاد؊ Ø§Ų„Ø´ØąØ§ØĄ.</string> <string name="upgrade_screen_grace_body">Ų„Ų… ŲŠØ¤ŲƒŲ‘Ø¯ Google Play ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ Ų…Ų†Ø° ؁ØĒØąØŠ. Ų„Ø§ ŲŠØ˛Ø§Ų„ Pro Ų†Ø´ØˇŲ‹Ø§. ØĒØŖŲƒØ¯ Ų…Ų† اØĒØĩØ§Ų„Ųƒ Ø¨Ø§Ų„ØĨŲ†ØĒØąŲ†ØĒ ؈ØĒØŗØŦŲŠŲ„ Ø¯ØŽŲˆŲ„Ųƒ Ø¨Ø­ØŗØ§Ø¨ Google Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… ؁؊ ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄØŒ ØĢŲ… Ø­Ø§ŲˆŲ„ Ø§ØŗØĒؚاد؊ Ø§Ų„Ø´ØąØ§ØĄ.</string>
@@ -66,7 +64,6 @@
<string name="upgrade_screen_restore_checked_message">ØĒØ­Ų‚Ų‘ŲŽŲ‚ ŲƒØ§Ø¨ŲˆØ¯ Ų…Ų† ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠØŒ ŲˆŲ„ŲƒŲ† Ų„Ų… ؊ØĒŲ…Ų‘ ØĒØŖŲƒŲŠØ¯ ØŖŲŠŲ‘ ØšŲ…Ų„ŲŠØŠ اشØĒØąØ§ØĄ Ų„Ų„Ų†ØŗØŽØŠ Ø§Ų„Ø§Ø­ØĒØąØ§ŲŲŠØŠ Ų„Ų„Ø­ØŗØ§Ø¨ Ø§Ų„Ø°ŲŠ ŲŠØŗØĒØŽØ¯Ų…Ų‡ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ Ų„Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚.</string> <string name="upgrade_screen_restore_checked_message">ØĒØ­Ų‚Ų‘ŲŽŲ‚ ŲƒØ§Ø¨ŲˆØ¯ Ų…Ų† ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠØŒ ŲˆŲ„ŲƒŲ† Ų„Ų… ؊ØĒŲ…Ų‘ ØĒØŖŲƒŲŠØ¯ ØŖŲŠŲ‘ ØšŲ…Ų„ŲŠØŠ اشØĒØąØ§ØĄ Ų„Ų„Ų†ØŗØŽØŠ Ø§Ų„Ø§Ø­ØĒØąØ§ŲŲŠØŠ Ų„Ų„Ø­ØŗØ§Ø¨ Ø§Ų„Ø°ŲŠ ŲŠØŗØĒØŽØ¯Ų…Ų‡ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ Ų„Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚.</string>
<string name="upgrade_screen_restore_contact_hint">Ų‡Ų„ Ų…Ø§ Ø˛Ų„ØĒ ØĒŲˆØ§ØŦŲ‡ Ų…Ø´ŲƒŲ„ØŠØŸ ØĒŲˆØ§ØĩŲ„ Ų…Øš Ø§Ų„Ø¯ØšŲ… Ų…Ų† ØŽŲ„Ø§Ų„ Ø§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ Ø§Ų„Ø°ŲŠ Ø§ØŗØĒØŽØ¯Ų…ØĒŲ‡ Ų„ØĨØĒŲ…Ø§Ų… ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄØŒ ؈ØļŲ…Ų‘Ų† ØąŲ‚Ų… ØˇŲ„Ø¨Ųƒ Ų…Ų† ØŗŲˆŲ‚ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ.</string> <string name="upgrade_screen_restore_contact_hint">Ų‡Ų„ Ų…Ø§ Ø˛Ų„ØĒ ØĒŲˆØ§ØŦŲ‡ Ų…Ø´ŲƒŲ„ØŠØŸ ØĒŲˆØ§ØĩŲ„ Ų…Øš Ø§Ų„Ø¯ØšŲ… Ų…Ų† ØŽŲ„Ø§Ų„ Ø§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ Ø§Ų„Ø°ŲŠ Ø§ØŗØĒØŽØ¯Ų…ØĒŲ‡ Ų„ØĨØĒŲ…Ø§Ų… ØšŲ…Ų„ŲŠØŠ Ø§Ų„Ø´ØąØ§ØĄØŒ ؈ØļŲ…Ų‘Ų† ØąŲ‚Ų… ØˇŲ„Ø¨Ųƒ Ų…Ų† ØŗŲˆŲ‚ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ.</string>
<string name="upgrade_screen_contact_support_action">Ø§Ų„ØĒŲˆØ§ØĩŲŲ„ Ų…Øš Ø§Ų„Ø¯ØšŲ…</string> <string name="upgrade_screen_contact_support_action">Ø§Ų„ØĒŲˆØ§ØĩŲŲ„ Ų…Øš Ø§Ų„Ø¯ØšŲ…</string>
<string name="settings_upgrade_status_label">Ø§Ų„Ų†ØŗØŽØŠ Ø§Ų„Ø§Ø­ØĒØąØ§ŲŲŠØŠ Ų…Ų† ŲƒØ§Ø¨ŲˆØ¯</string>
<string name="settings_upgrade_status_description">Ø­Ø§Ų„ØŠ Ø§Ų„ØĒØąŲ‚ŲŠØŠ ŲˆØ§Ų„Ø§Ø´ØĒØąØ§ØĄ Ø§Ų„ØŽØ§ØĩŲ‘ØŠ Ø¨Ųƒ.</string> <string name="settings_upgrade_status_description">Ø­Ø§Ų„ØŠ Ø§Ų„ØĒØąŲ‚ŲŠØŠ ŲˆØ§Ų„Ø§Ø´ØĒØąØ§ØĄ Ø§Ų„ØŽØ§ØĩŲ‘ØŠ Ø¨Ųƒ.</string>
<string name="upgrades_gplay_unavailable_error_description">Ų„Ø§ ŲŠŲ…ŲƒŲ† Ų„ŲƒØ§Ø¨ŲˆØ¯ Ø§Ų„Ø§ØĒŲ‘ØĩØ§Ų„ Ø¨ØŗŲˆŲ‚ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ. Ų‡Ų„ ØŗŲˆŲ‚ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ Ų…ŲØĢØ¨Ų‘ŲŽØĒØŠ ŲˆŲ…ŲØ­Ø¯Ų‘ŲŽØĢ؊؟ Ų‡Ų„ Ø­ØŗØ§Ø¨ ØŦ؈ØŦŲ„ Ø§Ų„ØŽØ§ØĩŲ‘ Ø¨Ųƒ Ų…ŲØŗØŦŲ‘ŲŽŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ØŸ Ø­Ø§ŲˆŲ„ Ų…ØŗØ­ Ø°Ø§ŲƒØąØŠ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚Ų‘ØĒ Ų„ØĒØˇØ¨ŲŠŲ‚ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ ؈ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ ØŦŲ‡Ø§Ø˛Ųƒ.</string> <string name="upgrades_gplay_unavailable_error_description">Ų„Ø§ ŲŠŲ…ŲƒŲ† Ų„ŲƒØ§Ø¨ŲˆØ¯ Ø§Ų„Ø§ØĒŲ‘ØĩØ§Ų„ Ø¨ØŗŲˆŲ‚ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ. Ų‡Ų„ ØŗŲˆŲ‚ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ Ų…ŲØĢØ¨Ų‘ŲŽØĒØŠ ŲˆŲ…ŲØ­Ø¯Ų‘ŲŽØĢ؊؟ Ų‡Ų„ Ø­ØŗØ§Ø¨ ØŦ؈ØŦŲ„ Ø§Ų„ØŽØ§ØĩŲ‘ Ø¨Ųƒ Ų…ŲØŗØŦŲ‘ŲŽŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ØŸ Ø­Ø§ŲˆŲ„ Ų…ØŗØ­ Ø°Ø§ŲƒØąØŠ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚Ų‘ØĒ Ų„ØĒØˇØ¨ŲŠŲ‚ ØŦ؈ØŦŲ„ Ø¨Ų„Ø§ŲŠ ؈ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ ØŦŲ‡Ø§Ø˛Ųƒ.</string>
<!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. --> <!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. -->
-3
View File
@@ -46,8 +46,6 @@
<string name="upgrade_screen_owned_iap_purchase_note">Bu ayrÄą bir satÄąnalmadÄąr — abunəliyinizi ləğv etmir və ya geri Ãļdəmir. Eyni Google hesabÄąndan istifadə edin.</string> <string name="upgrade_screen_owned_iap_purchase_note">Bu ayrÄą bir satÄąnalmadÄąr — abunəliyinizi ləğv etmir və ya geri Ãļdəmir. Eyni Google hesabÄąndan istifadə edin.</string>
<string name="upgrade_screen_sub_still_renewing_title">Abunəlik hələ də aktivdir</string> <string name="upgrade_screen_sub_still_renewing_title">Abunəlik hələ də aktivdir</string>
<string name="upgrade_screen_sub_still_renewing_message">Abunəliyiniz hələ də yenilənməyə təyin edilib. Əvvəlcə onu Google Play-də ləğv edin, sonra birdəfəlik satÄąnalmaya keçin. Bu yaxÄąnlarda ləğv etmisiniz? Google Play-ə bir az vaxt verin və yenidən cəhd edin.</string> <string name="upgrade_screen_sub_still_renewing_message">Abunəliyiniz hələ də yenilənməyə təyin edilib. Əvvəlcə onu Google Play-də ləğv edin, sonra birdəfəlik satÄąnalmaya keçin. Bu yaxÄąnlarda ləğv etmisiniz? Google Play-ə bir az vaxt verin və yenidən cəhd edin.</string>
<string name="upgrade_screen_sub_check_failed_title">Abunəlik yoxlaması uğursuz oldu</string>
<string name="upgrade_screen_sub_check_failed_message">Abunəlik statusunuz Google Play ilə yoxlanÄąla bilmədi. İkiqat satÄąnalmanÄąn qarÅŸÄąsÄąnÄą almaq ÃŧçÃŧn bir az sonra yenidən cəhd edin.</string>
<string name="upgrade_screen_grace_title">Satınalmanız təsdiqlənir</string> <string name="upgrade_screen_grace_title">Satınalmanız təsdiqlənir</string>
<string name="upgrade_screen_grace_body_short">Google Play hələ satÄąnalmanÄązÄą təsdiqləməyib. Pro hələ də aktivdir — heç bir əməliyyat lazÄąm deyil.</string> <string name="upgrade_screen_grace_body_short">Google Play hələ satÄąnalmanÄązÄą təsdiqləməyib. Pro hələ də aktivdir — heç bir əməliyyat lazÄąm deyil.</string>
<string name="upgrade_screen_grace_body">Google Play bir mÃŧddətdir satÄąnalmanÄązÄą təsdiqləməyib. Pro hələ də aktivdir. Onlayn olduğunuzdan və satÄąnalma ÃŧçÃŧn istifadə edilən Google hesabÄą ilə daxil olduğunuzdan əmin olun, sonra bərpa etməyi sÄąnayÄąn.</string> <string name="upgrade_screen_grace_body">Google Play bir mÃŧddətdir satÄąnalmanÄązÄą təsdiqləməyib. Pro hələ də aktivdir. Onlayn olduğunuzdan və satÄąnalma ÃŧçÃŧn istifadə edilən Google hesabÄą ilə daxil olduğunuzdan əmin olun, sonra bərpa etməyi sÄąnayÄąn.</string>
@@ -66,7 +64,6 @@
<string name="upgrade_screen_restore_checked_message">CAPod yeni Google Play-i yoxladÄą, lakin bu tətbiq ÃŧçÃŧn Google Play istifadə etdiyi hesab ÃŧçÃŧn heç bir Pro alÄąÅŸÄą təsdiq edilə bilmədi.</string> <string name="upgrade_screen_restore_checked_message">CAPod yeni Google Play-i yoxladÄą, lakin bu tətbiq ÃŧçÃŧn Google Play istifadə etdiyi hesab ÃŧçÃŧn heç bir Pro alÄąÅŸÄą təsdiq edilə bilmədi.</string>
<string name="upgrade_screen_restore_contact_hint">Hələ də sÄąkÄąÅŸmÄąsÄąnÄąz? AlÄąÅŸÄą edən e-poçtdan dəstək xidmətinə mÃŧraciət edin və Google Play sifariş nÃļmrənizi daxil edin.</string> <string name="upgrade_screen_restore_contact_hint">Hələ də sÄąkÄąÅŸmÄąsÄąnÄąz? AlÄąÅŸÄą edən e-poçtdan dəstək xidmətinə mÃŧraciət edin və Google Play sifariş nÃļmrənizi daxil edin.</string>
<string name="upgrade_screen_contact_support_action">Dəstək xidmətinə mÃŧraciət edin</string> <string name="upgrade_screen_contact_support_action">Dəstək xidmətinə mÃŧraciət edin</string>
<string name="settings_upgrade_status_label">CAPod Pro</string>
<string name="settings_upgrade_status_description">Sizin yÃŧksəltmə və alÄąÅŸ statusu.</string> <string name="settings_upgrade_status_description">Sizin yÃŧksəltmə və alÄąÅŸ statusu.</string>
<string name="upgrades_gplay_unavailable_error_description">CAPod Google Play-ə qoşula bilmir. Google Play quraşdÄąrÄąlÄąb və yenilənib? Google hesabÄąnÄąz daxil olub? Google Play tətbiqinin keşini təmizləməyi və cihazÄąnÄązÄą yenidən başlatmağı sÄąnayÄąn.</string> <string name="upgrades_gplay_unavailable_error_description">CAPod Google Play-ə qoşula bilmir. Google Play quraşdÄąrÄąlÄąb və yenilənib? Google hesabÄąnÄąz daxil olub? Google Play tətbiqinin keşini təmizləməyi və cihazÄąnÄązÄą yenidən başlatmağı sÄąnayÄąn.</string>
<!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. --> <!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. -->
-3
View File
@@ -46,8 +46,6 @@
<string name="upgrade_screen_owned_iap_purchase_note">Đ“ŅŅ‚Đ° Đ°ŅĐžĐąĐŊĐ°Ņ ĐŋаĐē҃ĐŋĐēа — ŅĐŊа ĐŊĐĩ ҁĐēĐ°ŅĐžŅžĐ˛Đ°Đĩ ĐŋадĐŋҖҁĐē҃ Ņ– ĐŊĐĩ Đ˛ŅŅ€Ņ‚Đ°Đĩ Са ŅĐĩ ĐŗŅ€ĐžŅˆŅ‹. Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐšŅ†Đĩ Ņ‚ĐžĐš Đļа аĐēĐ°ŅƒĐŊŅ‚ Google.</string> <string name="upgrade_screen_owned_iap_purchase_note">Đ“ŅŅ‚Đ° Đ°ŅĐžĐąĐŊĐ°Ņ ĐŋаĐē҃ĐŋĐēа — ŅĐŊа ĐŊĐĩ ҁĐēĐ°ŅĐžŅžĐ˛Đ°Đĩ ĐŋадĐŋҖҁĐē҃ Ņ– ĐŊĐĩ Đ˛ŅŅ€Ņ‚Đ°Đĩ Са ŅĐĩ ĐŗŅ€ĐžŅˆŅ‹. Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐšŅ†Đĩ Ņ‚ĐžĐš Đļа аĐēĐ°ŅƒĐŊŅ‚ Google.</string>
<string name="upgrade_screen_sub_still_renewing_title">ПадĐŋҖҁĐēа ŅžŅŅ‘ ŅŅˆŅ‡Ņ аĐēŅ‚Ņ‹ŅžĐŊĐ°Ņ</string> <string name="upgrade_screen_sub_still_renewing_title">ПадĐŋҖҁĐēа ŅžŅŅ‘ ŅŅˆŅ‡Ņ аĐēŅ‚Ņ‹ŅžĐŊĐ°Ņ</string>
<string name="upgrade_screen_sub_still_renewing_message">Đ’Đ°ŅˆĐ° ĐŋадĐŋҖҁĐēа ŅžŅŅ‘ ŅŅˆŅ‡Ņ ĐąŅƒĐ´ĐˇĐĩ Đ°ŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊа ĐŋŅ€Đ°Đ´ĐžŅžĐļаĐŊа. ĐĄĐŋĐ°Ņ‡Đ°Ņ‚Đē҃ ҁĐēĐ°ŅŅƒĐšŅ†Đĩ ŅĐĩ Ņž Google Play, а ĐŋĐžŅ‚Ņ‹Đŧ ĐŋĐĩŅ€Đ°ĐēĐģŅŽŅ‡Đ°Ņ†ĐĩŅŅ ĐŊа адĐŊĐ°Ņ€Đ°ĐˇĐžĐ˛ŅƒŅŽ ĐŋаĐē҃ĐŋĐē҃. ĐĸĐžĐģҌĐēŅ– ŅˆŅ‚Đž ҁĐēĐ°ŅĐ°Đ˛Đ°ĐģŅ–? Đ”Đ°ĐšŅ†Đĩ Google Play ĐēŅ€Ņ‹Ņ…Ņƒ Ņ‡Đ°ŅŅƒ Ņ– ĐŋĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ СĐŊĐžŅž.</string> <string name="upgrade_screen_sub_still_renewing_message">Đ’Đ°ŅˆĐ° ĐŋадĐŋҖҁĐēа ŅžŅŅ‘ ŅŅˆŅ‡Ņ ĐąŅƒĐ´ĐˇĐĩ Đ°ŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊа ĐŋŅ€Đ°Đ´ĐžŅžĐļаĐŊа. ĐĄĐŋĐ°Ņ‡Đ°Ņ‚Đē҃ ҁĐēĐ°ŅŅƒĐšŅ†Đĩ ŅĐĩ Ņž Google Play, а ĐŋĐžŅ‚Ņ‹Đŧ ĐŋĐĩŅ€Đ°ĐēĐģŅŽŅ‡Đ°Ņ†ĐĩŅŅ ĐŊа адĐŊĐ°Ņ€Đ°ĐˇĐžĐ˛ŅƒŅŽ ĐŋаĐē҃ĐŋĐē҃. ĐĸĐžĐģҌĐēŅ– ŅˆŅ‚Đž ҁĐēĐ°ŅĐ°Đ˛Đ°ĐģŅ–? Đ”Đ°ĐšŅ†Đĩ Google Play ĐēŅ€Ņ‹Ņ…Ņƒ Ņ‡Đ°ŅŅƒ Ņ– ĐŋĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ СĐŊĐžŅž.</string>
<string name="upgrade_screen_sub_check_failed_title">НĐĩ ŅžĐ´Đ°ĐģĐžŅŅ ĐŋŅ€Đ°Đ˛ĐĩŅ€Ņ‹Ņ†ŅŒ ĐŋадĐŋҖҁĐē҃</string>
<string name="upgrade_screen_sub_check_failed_message">НĐĩ ŅžĐ´Đ°ĐģĐžŅŅ ĐŋŅ€Đ°Đ˛ĐĩŅ€Ņ‹Ņ†ŅŒ ŅŅ‚Đ°Ņ‚ŅƒŅ Đ˛Đ°ŅˆĐ°Đš ĐŋадĐŋҖҁĐēŅ– Ņž Google Play. Каб ĐŋаСйĐĩĐŗĐŊŅƒŅ†ŅŒ ĐŋадвОКĐŊаК ĐŋаĐē҃ĐŋĐēŅ–, ĐŋĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ СĐŊĐžŅž ĐŋŅ€Đ°Đˇ Ņ…Đ˛Ņ–ĐģŅ–ĐŊ҃.</string>
<string name="upgrade_screen_grace_title">ĐŸĐ°Ņ†Đ˛ŅŅ€Đ´ĐļŅĐŊĐŊĐĩ Đ˛Đ°ŅˆĐ°Đš ĐŋаĐē҃ĐŋĐēŅ–</string> <string name="upgrade_screen_grace_title">ĐŸĐ°Ņ†Đ˛ŅŅ€Đ´ĐļŅĐŊĐŊĐĩ Đ˛Đ°ŅˆĐ°Đš ĐŋаĐē҃ĐŋĐēŅ–</string>
<string name="upgrade_screen_grace_body_short">Google Play ŅŅˆŅ‡Ņ ĐŊĐĩ ĐŋĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐˇŅ–Ņž Đ˛Đ°ŅˆŅƒ ĐŋаĐē҃ĐŋĐē҃. Pro Đŋа-Ņ€Đ°ĐŊĐĩĐšŅˆĐ°Đŧ҃ аĐēŅ‚Ņ‹ŅžĐŊŅ‹ — дСĐĩŅĐŊĐŊŅ– ĐŊĐĩ ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒŅŽŅ†Ņ†Đ°.</string> <string name="upgrade_screen_grace_body_short">Google Play ŅŅˆŅ‡Ņ ĐŊĐĩ ĐŋĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐˇŅ–Ņž Đ˛Đ°ŅˆŅƒ ĐŋаĐē҃ĐŋĐē҃. Pro Đŋа-Ņ€Đ°ĐŊĐĩĐšŅˆĐ°Đŧ҃ аĐēŅ‚Ņ‹ŅžĐŊŅ‹ — дСĐĩŅĐŊĐŊŅ– ĐŊĐĩ ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒŅŽŅ†Ņ†Đ°.</string>
<string name="upgrade_screen_grace_body">Google Play ҃ĐļĐž ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹ Ņ‡Đ°Ņ ĐŊĐĩ ĐŋĐ°Ņ†Đ˛ŅŅ€Đ´ĐļаĐĩ Đ˛Đ°ŅˆŅƒ ĐŋаĐē҃ĐŋĐē҃. Pro Đŋа-Ņ€Đ°ĐŊĐĩĐšŅˆĐ°Đŧ҃ аĐēŅ‚Ņ‹ŅžĐŊŅ‹. ПĐĩŅ€Đ°ĐēаĐŊĐ°ĐšŅ†ĐĩŅŅ, ŅˆŅ‚Đž Đ˛Ņ‹ ĐŋадĐēĐģŅŽŅ‡Đ°ĐŊŅ‹ да Ņ–ĐŊŅ‚ŅŅ€ĐŊŅŅ‚Ņƒ Ņ– ŅžĐ˛Đ°ĐšŅˆĐģŅ– Ņž аĐēĐ°ŅƒĐŊŅ‚ Google, ŅĐēŅ– Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅžŅŅ Đ´ĐģŅ ĐŋаĐē҃ĐŋĐēŅ–, а ĐŋĐžŅ‚Ņ‹Đŧ ĐŋĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ адĐŊĐ°Đ˛Ņ–Ņ†ŅŒ ĐŋаĐē҃ĐŋĐē҃.</string> <string name="upgrade_screen_grace_body">Google Play ҃ĐļĐž ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹ Ņ‡Đ°Ņ ĐŊĐĩ ĐŋĐ°Ņ†Đ˛ŅŅ€Đ´ĐļаĐĩ Đ˛Đ°ŅˆŅƒ ĐŋаĐē҃ĐŋĐē҃. Pro Đŋа-Ņ€Đ°ĐŊĐĩĐšŅˆĐ°Đŧ҃ аĐēŅ‚Ņ‹ŅžĐŊŅ‹. ПĐĩŅ€Đ°ĐēаĐŊĐ°ĐšŅ†ĐĩŅŅ, ŅˆŅ‚Đž Đ˛Ņ‹ ĐŋадĐēĐģŅŽŅ‡Đ°ĐŊŅ‹ да Ņ–ĐŊŅ‚ŅŅ€ĐŊŅŅ‚Ņƒ Ņ– ŅžĐ˛Đ°ĐšŅˆĐģŅ– Ņž аĐēĐ°ŅƒĐŊŅ‚ Google, ŅĐēŅ– Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅžŅŅ Đ´ĐģŅ ĐŋаĐē҃ĐŋĐēŅ–, а ĐŋĐžŅ‚Ņ‹Đŧ ĐŋĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ адĐŊĐ°Đ˛Ņ–Ņ†ŅŒ ĐŋаĐē҃ĐŋĐē҃.</string>
@@ -66,7 +64,6 @@
<string name="upgrade_screen_restore_checked_message">CAPod Ņ‚ĐžĐģҌĐēŅ– ŅˆŅ‚Đž ĐŋŅ€Đ°Đ˛ĐĩŅ€Ņ‹Ņž Google Play, аĐģĐĩ Pro-ĐŋаĐē҃ĐŋĐēа ĐŊĐĩ ĐąŅ‹Đģа ĐŋĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐļаĐŊа Đ´ĐģŅ аĐēĐ°ŅžĐŊŅ‚Đ°, ŅĐēŅ– Google Play Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Đĩ Đ´ĐģŅ ĐŗŅŅ‚Đ°Đš ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧŅ‹.</string> <string name="upgrade_screen_restore_checked_message">CAPod Ņ‚ĐžĐģҌĐēŅ– ŅˆŅ‚Đž ĐŋŅ€Đ°Đ˛ĐĩŅ€Ņ‹Ņž Google Play, аĐģĐĩ Pro-ĐŋаĐē҃ĐŋĐēа ĐŊĐĩ ĐąŅ‹Đģа ĐŋĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐļаĐŊа Đ´ĐģŅ аĐēĐ°ŅžĐŊŅ‚Đ°, ŅĐēŅ– Google Play Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Đĩ Đ´ĐģŅ ĐŗŅŅ‚Đ°Đš ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧŅ‹.</string>
<string name="upgrade_screen_restore_contact_hint">ĐŖŅŅ‘ ŅŅˆŅ‡Ņ Ņ‘ŅŅ†ŅŒ ĐŋŅ€Đ°ĐąĐģĐĩĐŧŅ‹? Đ—Đ˛ŅĐļҋ҆ĐĩŅŅ С ĐŋĐ°Đ´Ņ‚Ņ€Ņ‹ĐŧĐēаК С Đ°Đ´Ņ€Đ°ŅŅƒ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹, С ŅĐēОК ĐąŅ‹Đģа ĐˇŅ€ĐžĐąĐģĐĩĐŊа ĐŋаĐē҃ĐŋĐēа, Ņ– ŅžĐēаĐļҋ҆Đĩ ĐŊ҃ĐŧĐ°Ņ€ СаĐēĐ°ĐˇŅƒ Google Play.</string> <string name="upgrade_screen_restore_contact_hint">ĐŖŅŅ‘ ŅŅˆŅ‡Ņ Ņ‘ŅŅ†ŅŒ ĐŋŅ€Đ°ĐąĐģĐĩĐŧŅ‹? Đ—Đ˛ŅĐļҋ҆ĐĩŅŅ С ĐŋĐ°Đ´Ņ‚Ņ€Ņ‹ĐŧĐēаК С Đ°Đ´Ņ€Đ°ŅŅƒ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹, С ŅĐēОК ĐąŅ‹Đģа ĐˇŅ€ĐžĐąĐģĐĩĐŊа ĐŋаĐē҃ĐŋĐēа, Ņ– ŅžĐēаĐļҋ҆Đĩ ĐŊ҃ĐŧĐ°Ņ€ СаĐēĐ°ĐˇŅƒ Google Play.</string>
<string name="upgrade_screen_contact_support_action">Đ—Đ˛ŅĐˇĐ°Ņ†Ņ†Đ° С ĐŋĐ°Đ´Ņ‚Ņ€Ņ‹ĐŧĐēаК</string> <string name="upgrade_screen_contact_support_action">Đ—Đ˛ŅĐˇĐ°Ņ†Ņ†Đ° С ĐŋĐ°Đ´Ņ‚Ņ€Ņ‹ĐŧĐēаК</string>
<string name="settings_upgrade_status_label">CAPod Pro</string>
<string name="settings_upgrade_status_description">Đ’Đ°Ņˆ ŅŅ‚Đ°Ņ‚ŅƒŅ айĐŊĐ°ŅžĐģĐĩĐŊĐŊŅ Ņ– ĐŋаĐē҃ĐŋĐēŅ–.</string> <string name="settings_upgrade_status_description">Đ’Đ°Ņˆ ŅŅ‚Đ°Ņ‚ŅƒŅ айĐŊĐ°ŅžĐģĐĩĐŊĐŊŅ Ņ– ĐŋаĐē҃ĐŋĐēŅ–.</string>
<string name="upgrades_gplay_unavailable_error_description">CAPod ĐŊĐĩ ĐŧĐžĐļа ĐŋадĐēĐģŅŽŅ‡Ņ‹Ņ†Ņ†Đ° да Google Play. ĐĻŅ– ŅžŅŅ‚Đ°ĐģŅĐ˛Đ°ĐŊŅ‹ Ņ– айĐŊĐžŅžĐģĐĩĐŊŅ‹ Google Play? Đ’Ņ‹ ŅžĐ˛Đ°ĐšŅˆĐģŅ– Ņž ŅĐ˛ĐžĐš ҃ĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ Google? ĐŸĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ Đ°Ņ‡Ņ‹ŅŅ†Ņ–Ņ†ŅŒ ĐēŅŅˆ ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧŅ‹ Google Play Ņ– ĐŋĐĩŅ€Đ°ĐˇĐ°ĐŗŅ€ŅƒĐˇŅ–Ņ†ŅŒ ĐŋҀҋĐģĐ°Đ´Ņƒ.</string> <string name="upgrades_gplay_unavailable_error_description">CAPod ĐŊĐĩ ĐŧĐžĐļа ĐŋадĐēĐģŅŽŅ‡Ņ‹Ņ†Ņ†Đ° да Google Play. ĐĻŅ– ŅžŅŅ‚Đ°ĐģŅĐ˛Đ°ĐŊŅ‹ Ņ– айĐŊĐžŅžĐģĐĩĐŊŅ‹ Google Play? Đ’Ņ‹ ŅžĐ˛Đ°ĐšŅˆĐģŅ– Ņž ŅĐ˛ĐžĐš ҃ĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ Google? ĐŸĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ Đ°Ņ‡Ņ‹ŅŅ†Ņ–Ņ†ŅŒ ĐēŅŅˆ ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧŅ‹ Google Play Ņ– ĐŋĐĩŅ€Đ°ĐˇĐ°ĐŗŅ€ŅƒĐˇŅ–Ņ†ŅŒ ĐŋҀҋĐģĐ°Đ´Ņƒ.</string>
<!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. --> <!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. -->
-3
View File
@@ -46,8 +46,6 @@
<string name="upgrade_screen_owned_iap_purchase_note">ĐĸОва Đĩ ĐžŅ‚Đ´ĐĩĐģĐŊа ĐŋĐžĐē҃ĐŋĐēа — Ņ‚Ņ ĐŊĐĩ ĐžŅ‚ĐŧĐĩĐŊŅ и ĐŊĐĩ Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ° ҁҀĐĩĐ´ŅŅ‚Đ˛Đ° ĐŋĐž айОĐŊаĐŧĐĩĐŊŅ‚Đ° ви. ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ŅŅŠŅ‰Đ¸Ņ аĐēĐ°ŅƒĐŊŅ‚ в Google.</string> <string name="upgrade_screen_owned_iap_purchase_note">ĐĸОва Đĩ ĐžŅ‚Đ´ĐĩĐģĐŊа ĐŋĐžĐē҃ĐŋĐēа — Ņ‚Ņ ĐŊĐĩ ĐžŅ‚ĐŧĐĩĐŊŅ и ĐŊĐĩ Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ° ҁҀĐĩĐ´ŅŅ‚Đ˛Đ° ĐŋĐž айОĐŊаĐŧĐĩĐŊŅ‚Đ° ви. ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ŅŅŠŅ‰Đ¸Ņ аĐēĐ°ŅƒĐŊŅ‚ в Google.</string>
<string name="upgrade_screen_sub_still_renewing_title">АйОĐŊаĐŧĐĩĐŊŅ‚ŅŠŅ‚ Đ˛ŅĐĩ ĐžŅ‰Đĩ Đĩ аĐēŅ‚Đ¸Đ˛ĐĩĐŊ</string> <string name="upgrade_screen_sub_still_renewing_title">АйОĐŊаĐŧĐĩĐŊŅ‚ŅŠŅ‚ Đ˛ŅĐĩ ĐžŅ‰Đĩ Đĩ аĐēŅ‚Đ¸Đ˛ĐĩĐŊ</string>
<string name="upgrade_screen_sub_still_renewing_message">АйОĐŊаĐŧĐĩĐŊŅ‚ŅŠŅ‚ ви Đ˛ŅĐĩ ĐžŅ‰Đĩ Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐŊ да ҁĐĩ ĐŋОдĐŊĐžĐ˛ŅĐ˛Đ°. ĐŸŅŠŅ€Đ˛Đž ĐŗĐž ĐžŅ‚ĐŧĐĩĐŊĐĩŅ‚Đĩ в Google Play, а ҁĐģĐĩĐ´ Ņ‚ĐžĐ˛Đ° ĐŋŅ€ĐĩĐŧиĐŊĐĩŅ‚Đĩ ĐēҊĐŧ ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊĐ°Ņ‚Đ° ĐŋĐžĐē҃ĐŋĐēа. ĐĸĐžĐē҃-Ņ‰Đž ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ…Ņ‚Đĩ? Đ˜ĐˇŅ‡Đ°ĐēĐ°ĐšŅ‚Đĩ ĐŧаĐģĐēĐž Google Play и ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО.</string> <string name="upgrade_screen_sub_still_renewing_message">АйОĐŊаĐŧĐĩĐŊŅ‚ŅŠŅ‚ ви Đ˛ŅĐĩ ĐžŅ‰Đĩ Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐŊ да ҁĐĩ ĐŋОдĐŊĐžĐ˛ŅĐ˛Đ°. ĐŸŅŠŅ€Đ˛Đž ĐŗĐž ĐžŅ‚ĐŧĐĩĐŊĐĩŅ‚Đĩ в Google Play, а ҁĐģĐĩĐ´ Ņ‚ĐžĐ˛Đ° ĐŋŅ€ĐĩĐŧиĐŊĐĩŅ‚Đĩ ĐēҊĐŧ ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊĐ°Ņ‚Đ° ĐŋĐžĐē҃ĐŋĐēа. ĐĸĐžĐē҃-Ņ‰Đž ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ…Ņ‚Đĩ? Đ˜ĐˇŅ‡Đ°ĐēĐ°ĐšŅ‚Đĩ ĐŧаĐģĐēĐž Google Play и ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО.</string>
<string name="upgrade_screen_sub_check_failed_title">ĐŸŅ€ĐžĐ˛ĐĩŅ€ĐēĐ°Ņ‚Đ° ĐŊа айОĐŊаĐŧĐĩĐŊŅ‚Đ° ҁĐĩ ĐŋŅ€ĐžĐ˛Đ°Đģи</string>
<string name="upgrade_screen_sub_check_failed_message">НĐĩ ĐŧĐžĐļа да ҁĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸ ŅŅ‚Đ°Ņ‚ŅƒŅŅŠŅ‚ ĐŊа айОĐŊаĐŧĐĩĐŊŅ‚Đ° ви ҁ Google Play. За да иСйĐĩĐŗĐŊĐĩŅ‚Đĩ двОКĐŊа ĐŋĐžĐē҃ĐŋĐēа, ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО ҁĐģĐĩĐ´ ĐŧаĐģĐēĐž.</string>
<string name="upgrade_screen_grace_title">ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ° ви</string> <string name="upgrade_screen_grace_title">ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ° ви</string>
<string name="upgrade_screen_grace_body_short">Google Play Đ˛ŅĐĩ ĐžŅ‰Đĩ ĐŊĐĩ Đĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´Đ¸Đģ ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ° ви. Pro Đ˛ŅĐĩ ĐžŅ‰Đĩ Đĩ аĐēŅ‚Đ¸Đ˛ĐĩĐŊ — ĐŊĐĩ ŅĐ° ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧи Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ.</string> <string name="upgrade_screen_grace_body_short">Google Play Đ˛ŅĐĩ ĐžŅ‰Đĩ ĐŊĐĩ Đĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´Đ¸Đģ ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ° ви. Pro Đ˛ŅĐĩ ĐžŅ‰Đĩ Đĩ аĐēŅ‚Đ¸Đ˛ĐĩĐŊ — ĐŊĐĩ ŅĐ° ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧи Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ.</string>
<string name="upgrade_screen_grace_body">Google Play ĐŊĐĩ Đĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´Đ¸Đģ ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ° ви ĐžŅ‚ иСвĐĩҁ҂ĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩ. Pro Đ˛ŅĐĩ ĐžŅ‰Đĩ Đĩ аĐēŅ‚Đ¸Đ˛ĐĩĐŊ. ĐŖĐ˛ĐĩŅ€ĐĩŅ‚Đĩ ҁĐĩ, ҇Đĩ ҁ҂Đĩ ĐžĐŊĐģаКĐŊ и вĐģĐĩСĐģи ҁ аĐēĐ°ŅƒĐŊŅ‚Đ° в Google, иСĐŋĐžĐģСваĐŊ Са ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ°, ҁĐģĐĩĐ´ ĐēĐžĐĩŅ‚Đž ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ.</string> <string name="upgrade_screen_grace_body">Google Play ĐŊĐĩ Đĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´Đ¸Đģ ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ° ви ĐžŅ‚ иСвĐĩҁ҂ĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩ. Pro Đ˛ŅĐĩ ĐžŅ‰Đĩ Đĩ аĐēŅ‚Đ¸Đ˛ĐĩĐŊ. ĐŖĐ˛ĐĩŅ€ĐĩŅ‚Đĩ ҁĐĩ, ҇Đĩ ҁ҂Đĩ ĐžĐŊĐģаКĐŊ и вĐģĐĩСĐģи ҁ аĐēĐ°ŅƒĐŊŅ‚Đ° в Google, иСĐŋĐžĐģСваĐŊ Са ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ°, ҁĐģĐĩĐ´ ĐēĐžĐĩŅ‚Đž ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ.</string>
@@ -66,7 +64,6 @@
<string name="upgrade_screen_restore_checked_message">CAPod Ņ‚ĐžĐē҃-Ņ‰Đž ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸ Google Play, ĐŊĐž ĐŊĐĩ ĐŧĐžĐļа да ĐąŅŠĐ´Đĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´ĐĩĐŊа Pro ĐŋĐžĐē҃ĐŋĐēа Са аĐēĐ°ŅƒĐŊŅ‚Đ°, ĐēĐžĐšŅ‚Đž Google Play иСĐŋĐžĐģСва Са Ņ‚ĐžĐ˛Đ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ.</string> <string name="upgrade_screen_restore_checked_message">CAPod Ņ‚ĐžĐē҃-Ņ‰Đž ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸ Google Play, ĐŊĐž ĐŊĐĩ ĐŧĐžĐļа да ĐąŅŠĐ´Đĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´ĐĩĐŊа Pro ĐŋĐžĐē҃ĐŋĐēа Са аĐēĐ°ŅƒĐŊŅ‚Đ°, ĐēĐžĐšŅ‚Đž Google Play иСĐŋĐžĐģСва Са Ņ‚ĐžĐ˛Đ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ.</string>
<string name="upgrade_screen_restore_contact_hint">Đ’ŅĐĩ ĐžŅ‰Đĩ иĐŧĐ°Ņ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧ? ĐĄĐ˛ŅŠŅ€ĐļĐĩŅ‚Đĩ ҁĐĩ ҁ ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐēĐ°Ņ‚Đ° ĐžŅ‚ иĐŧĐĩĐšĐģа, ҁ ĐēĐžĐšŅ‚Đž ҁ҂Đĩ ĐŊаĐŋŅ€Đ°Đ˛Đ¸Đģи ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ°, и вĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ĐŋĐžŅ€ŅŠŅ‡ĐēĐ°Ņ‚Đ° ŅĐ¸ в Google Play.</string> <string name="upgrade_screen_restore_contact_hint">Đ’ŅĐĩ ĐžŅ‰Đĩ иĐŧĐ°Ņ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧ? ĐĄĐ˛ŅŠŅ€ĐļĐĩŅ‚Đĩ ҁĐĩ ҁ ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐēĐ°Ņ‚Đ° ĐžŅ‚ иĐŧĐĩĐšĐģа, ҁ ĐēĐžĐšŅ‚Đž ҁ҂Đĩ ĐŊаĐŋŅ€Đ°Đ˛Đ¸Đģи ĐŋĐžĐē҃ĐŋĐēĐ°Ņ‚Đ°, и вĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ĐŋĐžŅ€ŅŠŅ‡ĐēĐ°Ņ‚Đ° ŅĐ¸ в Google Play.</string>
<string name="upgrade_screen_contact_support_action">ĐĄĐ˛ŅŠŅ€ĐļĐĩŅ‚Đĩ ҁĐĩ ҁ ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐēĐ°Ņ‚Đ°</string> <string name="upgrade_screen_contact_support_action">ĐĄĐ˛ŅŠŅ€ĐļĐĩŅ‚Đĩ ҁĐĩ ҁ ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐēĐ°Ņ‚Đ°</string>
<string name="settings_upgrade_status_label">CAPod Pro</string>
<string name="settings_upgrade_status_description">Đ’Đ°ŅˆĐ¸ŅŅ‚ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŊа ĐŊĐ°Đ´ĐŗŅ€Đ°ĐļдаĐŊĐĩ и СаĐē҃ĐŋŅƒĐ˛Đ°ĐŊĐĩ.</string> <string name="settings_upgrade_status_description">Đ’Đ°ŅˆĐ¸ŅŅ‚ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŊа ĐŊĐ°Đ´ĐŗŅ€Đ°ĐļдаĐŊĐĩ и СаĐē҃ĐŋŅƒĐ˛Đ°ĐŊĐĩ.</string>
<string name="upgrades_gplay_unavailable_error_description">CAPod ĐŊĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ŅĐ˛ŅŠŅ€ĐļĐĩ ҁ Google Play. ИĐŊŅŅ‚Đ°ĐģĐ¸Ņ€Đ°ĐŊ Đģи Đĩ Google Play и аĐēŅ‚ŅƒĐ°ĐģĐĩĐŊ Đģи Đĩ? ВĐģŅĐˇŅŠĐģ Đģи Đĩ Đ˛Đ°ŅˆĐ¸ŅŅ‚ Google аĐēĐ°ŅƒĐŊŅ‚? ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да Đ¸ĐˇŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐēĐĩŅˆĐ° ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž Google Play и да Ņ€ĐĩŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°Ņ‚Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž ŅĐ¸.</string> <string name="upgrades_gplay_unavailable_error_description">CAPod ĐŊĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ŅĐ˛ŅŠŅ€ĐļĐĩ ҁ Google Play. ИĐŊŅŅ‚Đ°ĐģĐ¸Ņ€Đ°ĐŊ Đģи Đĩ Google Play и аĐēŅ‚ŅƒĐ°ĐģĐĩĐŊ Đģи Đĩ? ВĐģŅĐˇŅŠĐģ Đģи Đĩ Đ˛Đ°ŅˆĐ¸ŅŅ‚ Google аĐēĐ°ŅƒĐŊŅ‚? ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да Đ¸ĐˇŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐēĐĩŅˆĐ° ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž Google Play и да Ņ€ĐĩŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°Ņ‚Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž ŅĐ¸.</string>
<!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. --> <!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. -->
@@ -46,8 +46,6 @@
<string name="upgrade_screen_owned_iap_purchase_note">āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āφāϞāĻžāĻĻāĻž āĻ•ā§āϰāϝāĻŧ — āĻāϟāĻŋ āφāĻĒāύāĻžāϰ āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻŦāĻžāϤāĻŋāϞ āĻŦāĻž āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ āύāĻžāĨ¤ āĻāĻ•āχ Google āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤</string> <string name="upgrade_screen_owned_iap_purchase_note">āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āφāϞāĻžāĻĻāĻž āĻ•ā§āϰāϝāĻŧ — āĻāϟāĻŋ āφāĻĒāύāĻžāϰ āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻŦāĻžāϤāĻŋāϞ āĻŦāĻž āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ āύāĻžāĨ¤ āĻāĻ•āχ Google āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤</string>
<string name="upgrade_screen_sub_still_renewing_title">āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻāĻ–āύāĻ“ āϏāĻ•ā§āϰāĻŋāϝāĻŧ</string> <string name="upgrade_screen_sub_still_renewing_title">āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻāĻ–āύāĻ“ āϏāĻ•ā§āϰāĻŋāϝāĻŧ</string>
<string name="upgrade_screen_sub_still_renewing_message">āφāĻĒāύāĻžāϰ āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻāĻ–āύāĻ“ āύāĻŦāĻžāϝāĻŧāύ āĻšāĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧇āϟ āĻ•āϰāĻž āφāϛ⧇āĨ¤ āĻĒā§āϰāĻĨāĻŽā§‡ Google Play-āϤ⧇ āĻāϟāĻŋ āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āĻāĻ•āĻ•āĻžāϞ⧀āύ āĻ•ā§āϰāϝāĻŧ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύāĨ¤ āĻāχāĻŽāĻžāĻ¤ā§āϰ āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧇āϛ⧇āύ? Google Play-āϕ⧇ āĻ•āĻŋāϛ⧁āϟāĻž āϏāĻŽāϝāĻŧ āĻĻāĻŋāύ āĻāĻŦāĻ‚ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤</string> <string name="upgrade_screen_sub_still_renewing_message">āφāĻĒāύāĻžāϰ āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻāĻ–āύāĻ“ āύāĻŦāĻžāϝāĻŧāύ āĻšāĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧇āϟ āĻ•āϰāĻž āφāϛ⧇āĨ¤ āĻĒā§āϰāĻĨāĻŽā§‡ Google Play-āϤ⧇ āĻāϟāĻŋ āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āĻāĻ•āĻ•āĻžāϞ⧀āύ āĻ•ā§āϰāϝāĻŧ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύāĨ¤ āĻāχāĻŽāĻžāĻ¤ā§āϰ āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧇āϛ⧇āύ? Google Play-āϕ⧇ āĻ•āĻŋāϛ⧁āϟāĻž āϏāĻŽāϝāĻŧ āĻĻāĻŋāύ āĻāĻŦāĻ‚ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤</string>
<string name="upgrade_screen_sub_check_failed_title">āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āϝāĻžāϚāĻžāχ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ⧇āϛ⧇</string>
<string name="upgrade_screen_sub_check_failed_message">Google Play-āĻāϰ āϏāĻžāĻĨ⧇ āφāĻĒāύāĻžāϰ āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ⧇āϰ āĻ¸ā§āĻĨāĻŋāϤāĻŋ āϝāĻžāϚāĻžāχ āĻ•āϰāĻž āϝāĻžāϝāĻŧāύāĻŋāĨ¤ āĻĻā§āĻŦāĻŋāϗ⧁āĻŖ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž āĻā§œāĻžāϤ⧇, āĻāĻ•āϟ⧁ āĻĒāϰ⧇ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤</string>
<string name="upgrade_screen_grace_title">āφāĻĒāύāĻžāϰ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇</string> <string name="upgrade_screen_grace_title">āφāĻĒāύāĻžāϰ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇</string>
<string name="upgrade_screen_grace_body_short">Google Play āĻāĻ–āύāĻ“ āφāĻĒāύāĻžāϰ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇āύāĻŋāĨ¤ Pro āĻāĻ–āύāĻ“ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āφāϛ⧇ — āϕ⧋āύ⧋ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχāĨ¤</string> <string name="upgrade_screen_grace_body_short">Google Play āĻāĻ–āύāĻ“ āφāĻĒāύāĻžāϰ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇āύāĻŋāĨ¤ Pro āĻāĻ–āύāĻ“ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āφāϛ⧇ — āϕ⧋āύ⧋ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχāĨ¤</string>
<string name="upgrade_screen_grace_body">Google Play āĻ…āύ⧇āĻ•āĻ•ā§āώāĻŖ āϧāϰ⧇ āφāĻĒāύāĻžāϰ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇āύāĻŋāĨ¤ Pro āĻāĻ–āύāĻ“ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āφāϛ⧇āĨ¤ āφāĻĒāύāĻŋ āĻ…āύāϞāĻžāχāύ⧇ āφāϛ⧇āύ āĻāĻŦāĻ‚ āϕ⧇āύāĻžāĻ•āĻžāϟāĻžāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ Google āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāĻž āφāϛ⧇āύ āĻ•āĻŋāύāĻž āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤</string> <string name="upgrade_screen_grace_body">Google Play āĻ…āύ⧇āĻ•āĻ•ā§āώāĻŖ āϧāϰ⧇ āφāĻĒāύāĻžāϰ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇āύāĻŋāĨ¤ Pro āĻāĻ–āύāĻ“ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āφāϛ⧇āĨ¤ āφāĻĒāύāĻŋ āĻ…āύāϞāĻžāχāύ⧇ āφāϛ⧇āύ āĻāĻŦāĻ‚ āϕ⧇āύāĻžāĻ•āĻžāϟāĻžāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ Google āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāĻž āφāϛ⧇āύ āĻ•āĻŋāύāĻž āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤</string>
@@ -66,7 +64,6 @@
<string name="upgrade_screen_restore_checked_message">CAPod āϏāĻŦ⧇āĻŽāĻžāĻ¤ā§āϰ āϗ⧁āĻ—āϞ āĻĒā§āϞ⧇ āĻšā§‡āĻ• āĻ•āϰ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāχ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āϗ⧁āĻ—āϞ āĻĒā§āϞ⧇ āϝ⧇ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇ āϤāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧋āύ⧋ āĻĒā§āϰ⧋ āĻ•ā§āϰāϝāĻŧ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āϝāĻžāϝāĻŧāύāĻŋāĨ¤</string> <string name="upgrade_screen_restore_checked_message">CAPod āϏāĻŦ⧇āĻŽāĻžāĻ¤ā§āϰ āϗ⧁āĻ—āϞ āĻĒā§āϞ⧇ āĻšā§‡āĻ• āĻ•āϰ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāχ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āϗ⧁āĻ—āϞ āĻĒā§āϞ⧇ āϝ⧇ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇ āϤāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧋āύ⧋ āĻĒā§āϰ⧋ āĻ•ā§āϰāϝāĻŧ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āϝāĻžāϝāĻŧāύāĻŋāĨ¤</string>
<string name="upgrade_screen_restore_contact_hint">āĻāĻ–āύāĻ“ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāĻšā§āϛ⧇? āϝ⧇ āχāĻŽā§‡āϞ āĻĨ⧇āϕ⧇ āĻ•ā§āϰāϝāĻŧ āĻ•āϰ⧇āϛ⧇āύ āϏ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇ āϏāĻšāĻžāϝāĻŧāϤāĻžāϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āϗ⧁āĻ—āϞ āĻĒā§āϞ⧇ āĻ…āĻ°ā§āĻĄāĻžāϰ āύāĻŽā§āĻŦāϰ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤</string> <string name="upgrade_screen_restore_contact_hint">āĻāĻ–āύāĻ“ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāĻšā§āϛ⧇? āϝ⧇ āχāĻŽā§‡āϞ āĻĨ⧇āϕ⧇ āĻ•ā§āϰāϝāĻŧ āĻ•āϰ⧇āϛ⧇āύ āϏ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇ āϏāĻšāĻžāϝāĻŧāϤāĻžāϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āϗ⧁āĻ—āϞ āĻĒā§āϞ⧇ āĻ…āĻ°ā§āĻĄāĻžāϰ āύāĻŽā§āĻŦāϰ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤</string>
<string name="upgrade_screen_contact_support_action">āϏāĻšāĻžāϝāĻŧāϤāĻžāϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧁āύ</string> <string name="upgrade_screen_contact_support_action">āϏāĻšāĻžāϝāĻŧāϤāĻžāϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧁āύ</string>
<string name="settings_upgrade_status_label">CAPod Pro</string>
<string name="settings_upgrade_status_description">āφāĻĒāύāĻžāϰ āφāĻĒāĻ—ā§āϰ⧇āĻĄ āĻāĻŦāĻ‚ āĻ•ā§āϰāϝāĻŧ āĻ¸ā§āĻĨāĻŋāϤāĻŋāĨ¤</string> <string name="settings_upgrade_status_description">āφāĻĒāύāĻžāϰ āφāĻĒāĻ—ā§āϰ⧇āĻĄ āĻāĻŦāĻ‚ āĻ•ā§āϰāϝāĻŧ āĻ¸ā§āĻĨāĻŋāϤāĻŋāĨ¤</string>
<string name="upgrades_gplay_unavailable_error_description">CAPod Google Play āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāϛ⧇ āύāĻžāĨ¤ Google Play āĻ•āĻŋ āχāύāĻ¸ā§āϟāϞ āĻāĻŦāĻ‚ āφāĻĒ āϟ⧁ āĻĄā§‡āϟ? āφāĻĒāύāĻžāϰ Google āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϞāĻ— āχāύ āφāϛ⧇? Google Play āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻ•ā§āϝāĻžāĻļ āϏāĻžāĻĢ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻĄāĻŋāĻ­āĻžāχāϏ āϰāĻŋāĻŦ⧁āϟ āĻ•āϰ⧇ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤</string> <string name="upgrades_gplay_unavailable_error_description">CAPod Google Play āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāϛ⧇ āύāĻžāĨ¤ Google Play āĻ•āĻŋ āχāύāĻ¸ā§āϟāϞ āĻāĻŦāĻ‚ āφāĻĒ āϟ⧁ āĻĄā§‡āϟ? āφāĻĒāύāĻžāϰ Google āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϞāĻ— āχāύ āφāϛ⧇? Google Play āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻ•ā§āϝāĻžāĻļ āϏāĻžāĻĢ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻĄāĻŋāĻ­āĻžāχāϏ āϰāĻŋāĻŦ⧁āϟ āĻ•āϰ⧇ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤</string>
<!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. --> <!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. -->
-3
View File
@@ -46,8 +46,6 @@
<string name="upgrade_screen_owned_iap_purchase_note">Aquesta Ês una compra separada: no cancel¡la ni reemborsa la vostra subscripciÃŗ. Feu servir el mateix compte de Google.</string> <string name="upgrade_screen_owned_iap_purchase_note">Aquesta Ês una compra separada: no cancel¡la ni reemborsa la vostra subscripciÃŗ. Feu servir el mateix compte de Google.</string>
<string name="upgrade_screen_sub_still_renewing_title">La subscripciÃŗ encara està activa</string> <string name="upgrade_screen_sub_still_renewing_title">La subscripciÃŗ encara està activa</string>
<string name="upgrade_screen_sub_still_renewing_message">La vostra subscripciÃŗ encara està configurada per renovar-se. Cancel¡leu-la primer al Google Play i desprÊs canvieu a la compra Ãēnica. Acabeu de cancel¡lar-la? Doneu un moment al Google Play i torneu-ho a provar.</string> <string name="upgrade_screen_sub_still_renewing_message">La vostra subscripciÃŗ encara està configurada per renovar-se. Cancel¡leu-la primer al Google Play i desprÊs canvieu a la compra Ãēnica. Acabeu de cancel¡lar-la? Doneu un moment al Google Play i torneu-ho a provar.</string>
<string name="upgrade_screen_sub_check_failed_title">Ha fallat la comprovaciÃŗ de la subscripciÃŗ</string>
<string name="upgrade_screen_sub_check_failed_message">No s\'ha pogut comprovar l\'estat de la vostra subscripciÃŗ amb el Google Play. Per evitar una compra duplicada, torneu-ho a provar d\'aquí a una estona.</string>
<string name="upgrade_screen_grace_title">S\'està confirmant la vostra compra</string> <string name="upgrade_screen_grace_title">S\'està confirmant la vostra compra</string>
<string name="upgrade_screen_grace_body_short">El Google Play encara no ha confirmat la vostra compra. El Pro segueix actiu, no cal fer res.</string> <string name="upgrade_screen_grace_body_short">El Google Play encara no ha confirmat la vostra compra. El Pro segueix actiu, no cal fer res.</string>
<string name="upgrade_screen_grace_body">Fa temps que el Google Play no confirma la vostra compra. El Pro segueix actiu. Assegureu-vos que teniu connexiÃŗ i heu iniciat sessiÃŗ amb el compte de Google que vau fer servir per a la compra, i desprÊs proveu de restaurar-la.</string> <string name="upgrade_screen_grace_body">Fa temps que el Google Play no confirma la vostra compra. El Pro segueix actiu. Assegureu-vos que teniu connexiÃŗ i heu iniciat sessiÃŗ amb el compte de Google que vau fer servir per a la compra, i desprÊs proveu de restaurar-la.</string>
@@ -66,7 +64,6 @@
<string name="upgrade_screen_restore_checked_message">El CAPod acaba de comprovar el Google Play, perÃ˛ no s\'ha pogut confirmar cap compra Pro per al compte que Google Play utilitza per a aquesta aplicaciÃŗ.</string> <string name="upgrade_screen_restore_checked_message">El CAPod acaba de comprovar el Google Play, perÃ˛ no s\'ha pogut confirmar cap compra Pro per al compte que Google Play utilitza per a aquesta aplicaciÃŗ.</string>
<string name="upgrade_screen_restore_contact_hint">Encara teniu problemes? Contacteu amb l\'assistència des del correu amb què heu fet la compra i incloeu el nÃēmero de comanda del Google Play.</string> <string name="upgrade_screen_restore_contact_hint">Encara teniu problemes? Contacteu amb l\'assistència des del correu amb què heu fet la compra i incloeu el nÃēmero de comanda del Google Play.</string>
<string name="upgrade_screen_contact_support_action">Contacta amb el suport</string> <string name="upgrade_screen_contact_support_action">Contacta amb el suport</string>
<string name="settings_upgrade_status_label">CAPod Pro</string>
<string name="settings_upgrade_status_description">Estat de la vostra actualitzaciÃŗ i compra.</string> <string name="settings_upgrade_status_description">Estat de la vostra actualitzaciÃŗ i compra.</string>
<string name="upgrades_gplay_unavailable_error_description">CAPod no es pot connectar al Google Play. El Google Play està instal¡lat i actualitzat? Heu iniciat sessiÃŗ amb el vostre compte de Google? Proveu d\'esborrar la memÃ˛ria cau de l\'aplicaciÃŗ Google Play i reinicieu el dispositiu.</string> <string name="upgrades_gplay_unavailable_error_description">CAPod no es pot connectar al Google Play. El Google Play està instal¡lat i actualitzat? Heu iniciat sessiÃŗ amb el vostre compte de Google? Proveu d\'esborrar la memÃ˛ria cau de l\'aplicaciÃŗ Google Play i reinicieu el dispositiu.</string>
<!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. --> <!-- Toast shown when the "Google Play" button of an error dialog can't open Google Play's app info, e.g. Google Play is missing or blocked on this device. "Google Play" is a brand name, keep it untranslated. -->

Some files were not shown because too many files have changed in this diff Show More