mirror of
https://github.com/d4rken-org/capod.git
synced 2026-09-14 18:26:11 -04:00
Compare commits
14
Commits
v5.2.2-rc0
...
v5.2.3-rc0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3af1af872e | ||
|
|
1f00925cd8 | ||
|
|
50079e2b7a | ||
|
|
02ec76980c | ||
|
|
52ad90f77e | ||
|
|
563c6e71f7 | ||
|
|
a357d77b00 | ||
|
|
abc82b0f09 | ||
|
|
3e6541deec | ||
|
|
33a972001e | ||
|
|
fe67ce0365 | ||
|
|
511944c21c | ||
|
|
007282d3f5 | ||
|
|
5ffdf66b9d |
@@ -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
|
||||||
|
|||||||
Vendored
+3
-1
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
+11
@@ -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)
|
||||||
+15
@@ -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].
|
||||||
*
|
*
|
||||||
|
|||||||
+82
-70
@@ -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. -->
|
||||||
|
|||||||
@@ -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. -->
|
||||||
|
|||||||
@@ -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. -->
|
||||||
|
|||||||
@@ -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. -->
|
||||||
|
|||||||
@@ -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 ŅĐžĐēŅ-ŅĐž ĐŋŅОвĐĩŅи 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. -->
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user