New purchase dialog

pull/1208/head
Alex Baker 5 years ago
parent afd5469d72
commit e10d78c712

@ -48,6 +48,6 @@ class Purchase(private val purchase: Purchase) {
} }
companion object { companion object {
private val PATTERN = Pattern.compile("^(annual|monthly)_([0-1][0-9]|499)$") private val PATTERN = Pattern.compile("^(annual|monthly)_([0-3][0-9]|499)$")
} }
} }

@ -532,10 +532,6 @@
android:uiOptions="splitActionBarWhenNarrow" android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="adjustResize"/> android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".billing.PurchaseActivity"
android:theme="@style/Tasks" />
<activity-alias <activity-alias
android:enabled="true" android:enabled="true"
android:exported="true" android:exported="true"

@ -1,204 +0,0 @@
package org.tasks.billing
import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import androidx.appcompat.widget.Toolbar
import butterknife.ButterKnife
import butterknife.OnClick
import com.google.android.material.button.MaterialButtonToggleGroup
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.databinding.ActivityPurchaseBinding
import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.IconLayoutManager
import org.tasks.injection.ThemedInjectingAppCompatActivity
import org.tasks.locale.Locale
import timber.log.Timber
import javax.inject.Inject
private const val EXTRA_MONTHLY = "extra_monthly"
private const val EXTRA_PRICE = "extra_price"
@AndroidEntryPoint
class PurchaseActivity : ThemedInjectingAppCompatActivity(), OnPurchasesUpdated, Toolbar.OnMenuItemClickListener {
@Inject lateinit var inventory: Inventory
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var billingClient: BillingClient
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var locale: Locale
private lateinit var binding: ActivityPurchaseBinding
private lateinit var adapter: PurchaseAdapter
private var currentSubscription: Purchase? = null
private val purchaseReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
setup()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityPurchaseBinding.inflate(layoutInflater)
setContentView(binding.root)
ButterKnife.bind(this)
adapter = PurchaseAdapter(this, tasksTheme, locale, ::onPriceChanged)
if (savedInstanceState != null) {
binding.buttons.check(
if (savedInstanceState.getBoolean(EXTRA_MONTHLY)) R.id.button_monthly else R.id.button_annually)
adapter.selected = savedInstanceState.getInt(EXTRA_PRICE)
}
binding.buttons.addOnButtonCheckedListener { group: MaterialButtonToggleGroup?, id: Int, checked: Boolean -> this.onButtonChecked(group!!, id, checked) }
val toolbar = binding.toolbar.toolbar
toolbar.setNavigationIcon(R.drawable.ic_outline_arrow_back_24px)
toolbar.setNavigationContentDescription(R.string.back)
toolbar.setNavigationOnClickListener { finish() }
toolbar.setTitle(R.string.upgrade_to_pro)
toolbar.inflateMenu(R.menu.menu_purchase_activity)
toolbar.setOnMenuItemClickListener(this)
themeColor.apply(toolbar)
setWaitScreen(true)
}
@SuppressLint("DefaultLocale")
@OnClick(R.id.subscribe)
fun subscribe() {
if (currentSubscriptionSelected() && currentSubscription?.isCanceled == true) {
billingClient.initiatePurchaseFlow(
this, currentSubscription!!.sku, BillingClientImpl.TYPE_SUBS, null)
} else {
billingClient.initiatePurchaseFlow(this, String.format("%s_%02d", if (isMonthly()) "monthly" else "annual", adapter.selected),
BillingClientImpl.TYPE_SUBS,
currentSubscription?.sku)
}
billingClient.addPurchaseCallback(this)
}
private fun onButtonChecked(group: MaterialButtonToggleGroup, id: Int, checked: Boolean) {
if (id == R.id.button_monthly) {
if (!checked && group.checkedButtonId != R.id.button_annually) {
group.check(R.id.button_monthly)
}
} else {
if (!checked && group.checkedButtonId != R.id.button_monthly) {
group.check(R.id.button_annually)
}
}
updateSubscribeButton()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(EXTRA_MONTHLY, isMonthly())
outState.putInt(EXTRA_PRICE, adapter.selected)
}
private fun isMonthly() = binding.buttons.checkedButtonId == R.id.button_monthly
private fun setWaitScreen(isWaitScreen: Boolean) {
Timber.d("setWaitScreen(%s)", isWaitScreen)
binding.recyclerView.visibility = if (isWaitScreen) View.GONE else View.VISIBLE
binding.buttons.visibility = if (isWaitScreen) View.GONE else View.VISIBLE
binding.subscribe.visibility = if (isWaitScreen) View.GONE else View.VISIBLE
binding.screenWait.visibility = if (isWaitScreen) View.VISIBLE else View.GONE
}
override fun onStart() {
super.onStart()
localBroadcastManager.registerPurchaseReceiver(purchaseReceiver)
billingClient.queryPurchases()
}
override fun onStop() {
super.onStop()
localBroadcastManager.unregisterReceiver(purchaseReceiver)
}
private fun setup() {
currentSubscription = inventory.subscription
if (adapter.selected == 0) {
adapter.selected = currentSubscription?.subscriptionPrice ?: 3
if (currentSubscription != null) {
binding.buttons.check(if (currentSubscription?.isMonthly == true) R.id.button_monthly else R.id.button_annually)
}
}
binding.unsubscribe.visibility = if (currentSubscription == null || currentSubscription?.isCanceled == true) View.GONE else View.VISIBLE
updateSubscribeButton()
setWaitScreen(false)
adapter.submitList((1..15).toList())
binding.recyclerView.layoutManager = IconLayoutManager(this)
binding.recyclerView.adapter = adapter
}
private fun updateSubscribeButton() {
binding.subscribe.isEnabled = true
if (currentSubscription == null) {
binding.subscribe.setText(R.string.button_subscribe)
} else if (currentSubscriptionSelected()) {
if (currentSubscription!!.isCanceled) {
binding.subscribe.setText(R.string.button_restore_subscription)
} else {
binding.subscribe.setText(R.string.button_current_subscription)
binding.subscribe.isEnabled = false
}
} else {
binding.subscribe.setText(if (isUpgrade()) R.string.button_upgrade else R.string.button_downgrade)
}
}
private fun currentSubscriptionSelected() =
currentSubscription != null
&& isMonthly() == currentSubscription!!.isMonthly
&& adapter.selected == currentSubscription!!.subscriptionPrice
private fun isUpgrade() = if (isMonthly() == currentSubscription!!.isMonthly) {
currentSubscription!!.subscriptionPrice!! < adapter.selected
} else {
isMonthly()
}
private fun onPriceChanged(price: Int) {
adapter.selected = price
updateSubscribeButton()
}
@OnClick(R.id.unsubscribe)
fun manageSubscription() {
startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse(getString(R.string.manage_subscription_url, currentSubscription!!.sku))))
}
override fun onPurchasesUpdated(success: Boolean) {
if (success) {
finish()
}
}
override fun onMenuItemClick(item: MenuItem?): Boolean {
return if (item?.itemId == R.id.menu_more_info) {
startActivity(
Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.subscription_help_url))))
true
} else {
false
}
}
}

@ -1,66 +0,0 @@
package org.tasks.billing;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil.ItemCallback;
import androidx.recyclerview.widget.ListAdapter;
import org.tasks.Callback;
import org.tasks.R;
import org.tasks.locale.Locale;
import org.tasks.themes.Theme;
public class PurchaseAdapter extends ListAdapter<Integer, PurchaseHolder> {
private final Context context;
private final Theme theme;
private final Locale locale;
private final Callback<Integer> onPriceChanged;
private int selected;
PurchaseAdapter(Context context, Theme theme, Locale locale, Callback<Integer> onPriceChanged) {
super(new DiffCallback());
this.context = context;
this.theme = theme;
this.locale = locale;
this.onPriceChanged = onPriceChanged;
}
public int getSelected() {
return selected;
}
public void setSelected(int price) {
int previous = selected;
this.selected = price;
notifyItemChanged(previous - 1, null);
notifyItemChanged(price - 1, null);
}
@NonNull
@Override
public PurchaseHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view =
theme.getLayoutInflater(context).inflate(R.layout.dialog_purchase_cell, parent, false);
return new PurchaseHolder(view, onPriceChanged, locale);
}
@Override
public void onBindViewHolder(@NonNull PurchaseHolder holder, int position) {
int price = position + 1;
holder.bind(price, price == selected);
}
private static class DiffCallback extends ItemCallback<Integer> {
@Override
public boolean areItemsTheSame(@NonNull Integer oldItem, @NonNull Integer newItem) {
return oldItem.equals(newItem);
}
@Override
public boolean areContentsTheSame(@NonNull Integer oldItem, @NonNull Integer newItem) {
return true;
}
}
}

@ -0,0 +1,250 @@
package org.tasks.billing
import android.app.Activity.RESULT_OK
import android.app.Dialog
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.method.LinkMovementMethod
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import butterknife.ButterKnife
import butterknife.OnClick
import com.google.android.material.slider.Slider
import dagger.hilt.android.AndroidEntryPoint
import io.noties.markwon.Markwon
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.databinding.ActivityPurchaseBinding
import org.tasks.dialogs.DialogBuilder
import org.tasks.locale.Locale
import org.tasks.themes.Theme
import timber.log.Timber
import javax.inject.Inject
@AndroidEntryPoint
class PurchaseDialog : DialogFragment(), OnPurchasesUpdated {
private val purchaseReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
setup()
}
}
@Inject lateinit var tasksTheme: Theme
@Inject lateinit var inventory: Inventory
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var billingClient: BillingClient
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var locale: Locale
private lateinit var binding: ActivityPurchaseBinding
private lateinit var markwon: Markwon
private var currentSubscription: Purchase? = null
private var priceChanged = false
private var nameYourPrice = false
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
binding = ActivityPurchaseBinding.inflate(layoutInflater)
ButterKnife.bind(this, binding.root)
if (savedInstanceState != null) {
binding.slider.value = savedInstanceState.getFloat(EXTRA_PRICE)
priceChanged = savedInstanceState.getBoolean(EXTRA_PRICE_CHANGED)
nameYourPrice = savedInstanceState.getBoolean(EXTRA_NAME_YOUR_PRICE)
}
binding.slider.addOnChangeListener(this::onPriceChanged)
binding.slider.setLabelFormatter {
"$${it - .01}"
}
binding.text.movementMethod = LinkMovementMethod.getInstance()
markwon = Markwon.builder(requireContext())
.usePlugin(StrikethroughPlugin.create())
.build()
setWaitScreen(true)
return dialogBuilder.newDialog()
.setView(binding.root)
.show()
}
private fun updateText() {
var benefits = "### ${getString(R.string.upgrade_header)}"
if (nameYourPrice) {
benefits += """
---
#### ~~${getString(R.string.upgrade_sync_with_tasks)}~~
"""
} else {
benefits += """
---
#### [${getString(R.string.upgrade_sync_with_tasks)} (BETA)](https://tasks.org/sync)
* **${getString(R.string.upgrade_no_platform_lock_in)}** ${getString(R.string.upgrade_open_internet_standards)}
* **${getString(R.string.upgrade_customer)}** ${getString(R.string.upgrade_privacy)}
* ${getString(R.string.upgrade_coming_soon)}
"""
}
benefits += """
---
#### ${getString(R.string.upgrade_synchronization)}
* [${getString(R.string.davx5)}](https://tasks.org/docs/davx5.html)
* [${getString(R.string.caldav)}](https://tasks.org/docs/caldav_intro.html)
* [${getString(R.string.upgrade_etesync)}](https://tasks.org/docs/etesync_intro.html)
* ${getString(R.string.upgrade_google_tasks)}
---
#### ${getString(R.string.upgrade_additional_features)}
* ${getString(R.string.upgrade_themes)}
* ${getString(R.string.upgrade_google_places)}
* [${getString(R.string.upgrade_tasker)}](https://tasks.org/docs/tasker.html)
---
* ${getString(R.string.upgrade_free_trial)}
* **${getString(R.string.upgrade_downgrade)}** ${getString(R.string.upgrade_balance)}
* **${getString(R.string.upgrade_cancel)}** ${getString(R.string.upgrade_benefits_retained)}
"""
binding.text.text = markwon.toMarkdown(benefits)
}
@OnClick(R.id.pay_annually)
fun subscribeAnnually() {
initiatePurchase(false, 30)
}
@OnClick(R.id.pay_monthly)
fun subscribeMonthly() {
initiatePurchase(true, 3)
}
private fun initiatePurchase(isMonthly: Boolean, price: Int) {
val newSku = String.format("%s_%02d", if (isMonthly) "monthly" else "annual", price)
billingClient.initiatePurchaseFlow(
requireActivity(),
newSku,
BillingClientImpl.TYPE_SUBS,
currentSubscription?.sku?.takeIf { it != newSku })
billingClient.addPurchaseCallback(this)
}
@OnClick(R.id.pay_other)
fun nameYourPrice() {
nameYourPrice = !nameYourPrice
setWaitScreen(false)
binding.scroll.scrollTo(0, 0)
updateSubscribeButton()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putFloat(EXTRA_PRICE, binding.slider.value)
outState.putBoolean(EXTRA_PRICE_CHANGED, priceChanged)
outState.putBoolean(EXTRA_NAME_YOUR_PRICE, nameYourPrice)
}
private fun setWaitScreen(isWaitScreen: Boolean) {
Timber.d("setWaitScreen(%s)", isWaitScreen)
binding.slider.isVisible = !isWaitScreen && nameYourPrice
binding.payOther.isVisible = !isWaitScreen
binding.payOther.setText(if (nameYourPrice) R.string.back else R.string.more_options)
binding.tasksOrgButtonPanel.isVisible = !isWaitScreen
binding.screenWait.isVisible = isWaitScreen
updateText()
}
override fun onStart() {
super.onStart()
localBroadcastManager.registerPurchaseReceiver(purchaseReceiver)
billingClient.queryPurchases()
}
override fun onStop() {
super.onStop()
localBroadcastManager.unregisterReceiver(purchaseReceiver)
}
private fun setup() {
currentSubscription = inventory.subscription
if (!priceChanged) {
binding.slider.value =
currentSubscription
?.subscriptionPrice
?.coerceAtMost(25)
?.toFloat() ?: 10f
}
updateSubscribeButton()
setWaitScreen(false)
}
private fun updateSubscribeButton() {
val sliderValue = binding.slider.value.toInt()
val annualPrice = if (nameYourPrice) sliderValue else 30
val monthlyPrice = if (nameYourPrice) sliderValue else 3
val constrained = resources.getBoolean(R.bool.width_constrained)
binding.payAnnually.let {
it.isEnabled = true
it.text = getString(
if (constrained) R.string.price_per_year_abbreviated else R.string.price_per_year,
annualPrice - .01
)
it.setOnClickListener {
initiatePurchase(false, if (nameYourPrice) sliderValue else 30)
}
}
binding.payMonthly.let {
it.isEnabled = true
it.text = getString(
if (constrained) R.string.price_per_month_abbreviated else R.string.price_per_month,
monthlyPrice - .01
)
it.setOnClickListener {
initiatePurchase(true, if (nameYourPrice) sliderValue else 3)
}
it.isVisible = !nameYourPrice || sliderValue < 3
}
currentSubscription?.let {
binding.payMonthly.isEnabled =
it.isCanceled || !it.isMonthly || monthlyPrice != it.subscriptionPrice
binding.payAnnually.isEnabled =
it.isCanceled || it.isMonthly || annualPrice != it.subscriptionPrice
}
}
private fun onPriceChanged(slider: Slider, value: Float, fromUser: Boolean) {
if (fromUser) {
priceChanged = true
}
updateSubscribeButton()
}
override fun onPurchasesUpdated(success: Boolean) {
if (success) {
dismiss()
targetFragment?.onActivityResult(targetRequestCode, RESULT_OK, null)
}
}
companion object {
private const val EXTRA_PRICE = "extra_price"
private const val EXTRA_PRICE_CHANGED = "extra_price_changed"
private const val EXTRA_NAME_YOUR_PRICE = "extra_name_your_price"
@JvmStatic
val FRAG_TAG_PURCHASE_DIALOG = "frag_tag_purchase_dialog"
@JvmStatic
fun newPurchaseDialog(): PurchaseDialog {
return PurchaseDialog()
}
fun newPurchaseDialog(target: Fragment, rc: Int): PurchaseDialog {
val dialog = PurchaseDialog()
dialog.setTargetFragment(target, rc)
return dialog
}
}
}

@ -1,43 +0,0 @@
package org.tasks.billing;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.google.android.material.button.MaterialButton;
import org.tasks.Callback;
import org.tasks.R;
import org.tasks.locale.Locale;
public class PurchaseHolder extends RecyclerView.ViewHolder {
private final Callback<Integer> onClick;
private final Locale locale;
@BindView(R.id.price)
MaterialButton button;
private int price;
PurchaseHolder(@NonNull View view, Callback<Integer> onClick, Locale locale) {
super(view);
this.locale = locale;
ButterKnife.bind(this, view);
this.onClick = onClick;
}
@OnClick(R.id.price)
void onClick() {
onClick.call(price);
}
public void bind(int price, boolean selected) {
this.price = price;
button.setText(String.format("$%s", locale.formatNumber(price)));
button.setChecked(selected);
}
}

@ -25,7 +25,8 @@ import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG
import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.databinding.ActivityCaldavAccountSettingsBinding import org.tasks.databinding.ActivityCaldavAccountSettingsBinding
@ -97,7 +98,7 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
newSnackbar(getString(R.string.this_feature_requires_a_subscription)) newSnackbar(getString(R.string.this_feature_requires_a_subscription))
.setDuration(BaseTransientBottomBar.LENGTH_INDEFINITE) .setDuration(BaseTransientBottomBar.LENGTH_INDEFINITE)
.setAction(R.string.button_subscribe) { .setAction(R.string.button_subscribe) {
startActivity(Intent(this, PurchaseActivity::class.java)) newPurchaseDialog().show(supportFragmentManager, FRAG_TAG_PURCHASE_DIALOG)
} }
.show() .show()
} }

@ -16,7 +16,8 @@ import butterknife.ButterKnife
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG
import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog
import org.tasks.dialogs.ColorPickerAdapter.Palette import org.tasks.dialogs.ColorPickerAdapter.Palette
import org.tasks.dialogs.ColorWheelPicker.Companion.newColorWheel import org.tasks.dialogs.ColorWheelPicker.Companion.newColorWheel
import org.tasks.themes.ColorProvider import org.tasks.themes.ColorProvider
@ -107,7 +108,7 @@ class ColorPalettePicker : DialogFragment() {
builder.setNegativeButton(R.string.cancel, null) builder.setNegativeButton(R.string.cancel, null)
} else { } else {
builder.setPositiveButton(R.string.button_subscribe) { _: DialogInterface?, _: Int -> builder.setPositiveButton(R.string.button_subscribe) { _: DialogInterface?, _: Int ->
context?.startActivity(Intent(requireContext(), PurchaseActivity::class.java)) newPurchaseDialog().show(parentFragmentManager, FRAG_TAG_PURCHASE_DIALOG)
} }
} }
return builder.show() return builder.show()

@ -15,17 +15,16 @@ import com.flask.colorpicker.builder.ColorPickerDialogBuilder
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG
import org.tasks.ui.NavigationDrawerFragment.Companion.REQUEST_PURCHASE import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog
import javax.inject.Inject import javax.inject.Inject
private const val REQUEST_PURCHASE = 10010
@AndroidEntryPoint @AndroidEntryPoint
class ColorWheelPicker : DialogFragment() { class ColorWheelPicker : DialogFragment() {
companion object { companion object {
const val EXTRA_SELECTED = "extra_selected" const val EXTRA_SELECTED = "extra_selected"
private const val REQUEST_PURCHASE = 10010
fun newColorWheel(target: Fragment?, rc: Int, selected: Int): ColorWheelPicker { fun newColorWheel(target: Fragment?, rc: Int, selected: Int): ColorWheelPicker {
val args = Bundle() val args = Bundle()
@ -66,7 +65,8 @@ class ColorWheelPicker : DialogFragment() {
if (inventory.purchasedThemes()) { if (inventory.purchasedThemes()) {
deliverSelection() deliverSelection()
} else { } else {
startActivityForResult(Intent(activity, PurchaseActivity::class.java), REQUEST_PURCHASE) newPurchaseDialog(this, REQUEST_PURCHASE)
.show(parentFragmentManager, FRAG_TAG_PURCHASE_DIALOG)
} }
} }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
@ -86,7 +86,7 @@ class ColorWheelPicker : DialogFragment() {
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == org.tasks.dialogs.REQUEST_PURCHASE) { if (requestCode == REQUEST_PURCHASE) {
if (inventory.hasPro) { if (inventory.hasPro) {
deliverSelection() deliverSelection()
} else { } else {

@ -1,9 +1,10 @@
package org.tasks.dialogs; package org.tasks.dialogs;
import static org.tasks.billing.PurchaseDialog.newPurchaseDialog;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -17,7 +18,7 @@ import dagger.hilt.android.AndroidEntryPoint;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.R; import org.tasks.R;
import org.tasks.billing.Inventory; import org.tasks.billing.Inventory;
import org.tasks.billing.PurchaseActivity; import org.tasks.billing.PurchaseDialog;
import org.tasks.themes.CustomIcons; import org.tasks.themes.CustomIcons;
@AndroidEntryPoint @AndroidEntryPoint
@ -64,7 +65,8 @@ public class IconPickerDialog extends DialogFragment {
if (!inventory.getHasPro()) { if (!inventory.getHasPro()) {
builder.setPositiveButton( builder.setPositiveButton(
R.string.button_subscribe, R.string.button_subscribe,
(dialog, which) -> context.startActivity(new Intent(context, PurchaseActivity.class))); (dialog, which) -> newPurchaseDialog()
.show(getParentFragmentManager(), PurchaseDialog.getFRAG_TAG_PURCHASE_DIALOG()));
} }
return builder.show(); return builder.show();
} }

@ -18,7 +18,8 @@ import org.tasks.BuildConfig
import org.tasks.R import org.tasks.R
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG
import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import javax.inject.Inject import javax.inject.Inject
@ -88,7 +89,7 @@ class WhatsNewDialog : DialogFragment() {
private fun onSubscribeClick() { private fun onSubscribeClick() {
logClick(true) logClick(true)
dismiss() dismiss()
startActivity(Intent(context, PurchaseActivity::class.java)) newPurchaseDialog().show(parentFragmentManager, FRAG_TAG_PURCHASE_DIALOG)
} }
private fun onRateClick() { private fun onRateClick() {

@ -177,7 +177,7 @@ class FilterProvider @Inject constructor(
} }
.plusIf(!inventory.hasPro) { .plusIf(!inventory.hasPro) {
NavigationDrawerAction( NavigationDrawerAction(
context.getString(R.string.name_your_price), context.getString(R.string.upgrade_to_pro),
R.drawable.ic_outline_attach_money_24px, R.drawable.ic_outline_attach_money_24px,
NavigationDrawerFragment.REQUEST_PURCHASE) NavigationDrawerFragment.REQUEST_PURCHASE)
} }

@ -1,5 +1,7 @@
package org.tasks.locale.ui.activity; package org.tasks.locale.ui.activity;
import static org.tasks.billing.PurchaseDialog.newPurchaseDialog;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
@ -11,7 +13,7 @@ import net.dinglisch.android.tasker.TaskerPlugin;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.R; import org.tasks.R;
import org.tasks.billing.Inventory; import org.tasks.billing.Inventory;
import org.tasks.billing.PurchaseActivity; import org.tasks.billing.PurchaseDialog;
import org.tasks.databinding.ActivityTaskerCreateBinding; import org.tasks.databinding.ActivityTaskerCreateBinding;
import org.tasks.locale.bundle.TaskCreationBundle; import org.tasks.locale.bundle.TaskCreationBundle;
@ -53,7 +55,8 @@ public final class TaskerCreateTaskActivity extends AbstractFragmentPluginAppCom
} }
private void showPurchaseDialog() { private void showPurchaseDialog() {
startActivity(new Intent(this, PurchaseActivity.class)); newPurchaseDialog()
.show(getSupportFragmentManager(), PurchaseDialog.getFRAG_TAG_PURCHASE_DIALOG());
} }
@Override @Override

@ -9,6 +9,8 @@ import org.tasks.BuildConfig
import org.tasks.R import org.tasks.R
import org.tasks.billing.BillingClient import org.tasks.billing.BillingClient
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG
import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog
import org.tasks.dialogs.WhatsNewDialog import org.tasks.dialogs.WhatsNewDialog
import org.tasks.injection.InjectingPreferenceFragment import org.tasks.injection.InjectingPreferenceFragment
import javax.inject.Inject import javax.inject.Inject
@ -60,12 +62,28 @@ class HelpAndFeedback : InjectingPreferenceFragment() {
true true
} }
findPreference(R.string.button_unsubscribe).setOnPreferenceClickListener {
inventory.subscription?.let {
startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse(getString(R.string.manage_subscription_url, it.sku))))
}
false
}
findPreference(R.string.upgrade_to_pro).setOnPreferenceClickListener {
newPurchaseDialog().show(parentFragmentManager, FRAG_TAG_PURCHASE_DIALOG)
false
}
@Suppress("ConstantConditionIf") @Suppress("ConstantConditionIf")
if (BuildConfig.FLAVOR == "generic") { if (BuildConfig.FLAVOR == "generic") {
remove( remove(
R.string.p_collect_statistics, R.string.p_collect_statistics,
R.string.rate_tasks, R.string.rate_tasks,
R.string.upgrade_to_pro, R.string.upgrade_to_pro,
R.string.button_unsubscribe,
R.string.refresh_purchases R.string.refresh_purchases
) )
} }
@ -75,11 +93,12 @@ class HelpAndFeedback : InjectingPreferenceFragment() {
super.onResume() super.onResume()
if (BuildConfig.FLAVOR != "generic") { if (BuildConfig.FLAVOR != "generic") {
val findPreference = findPreference(R.string.upgrade_to_pro) findPreference(R.string.upgrade_to_pro).title = getString(if (inventory.hasPro) {
if (inventory.hasPro) { R.string.manage_subscription
findPreference.title = getString(R.string.manage_subscription) } else {
findPreference.summary = getString(R.string.manage_subscription_summary) R.string.upgrade_to_pro
} })
findPreference(R.string.button_unsubscribe).isEnabled = inventory.subscription != null
} }
} }

@ -21,7 +21,8 @@ import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.activities.FilterSelectionActivity import org.tasks.activities.FilterSelectionActivity
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG
import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog
import org.tasks.dialogs.ColorPalettePicker import org.tasks.dialogs.ColorPalettePicker
import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
import org.tasks.dialogs.ColorPickerAdapter import org.tasks.dialogs.ColorPickerAdapter
@ -242,10 +243,8 @@ class LookAndFeel : InjectingPreferenceFragment() {
if (inventory.purchasedThemes() || ThemeBase(index).isFree) { if (inventory.purchasedThemes() || ThemeBase(index).isFree) {
setBaseTheme(index) setBaseTheme(index)
} else { } else {
startActivityForResult( newPurchaseDialog(this, REQUEST_PURCHASE)
Intent(context, PurchaseActivity::class.java), .show(parentFragmentManager, FRAG_TAG_PURCHASE_DIALOG)
REQUEST_PURCHASE
)
} }
} else { } else {
setBaseTheme(index) setBaseTheme(index)

@ -8,7 +8,8 @@ import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.activities.FilterSelectionActivity import org.tasks.activities.FilterSelectionActivity
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG
import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog
import org.tasks.injection.InjectingPreferenceFragment import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.locale.bundle.ListNotificationBundle import org.tasks.locale.bundle.ListNotificationBundle
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
@ -57,10 +58,8 @@ class TaskerListNotification : InjectingPreferenceFragment() {
} }
if (!inventory.purchasedTasker()) { if (!inventory.purchasedTasker()) {
startActivityForResult( newPurchaseDialog(this, REQUEST_SUBSCRIPTION)
Intent(context, PurchaseActivity::class.java), .show(parentFragmentManager, FRAG_TAG_PURCHASE_DIALOG)
REQUEST_SUBSCRIPTION
)
} }
} }

@ -24,7 +24,8 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.billing.PurchaseActivity import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG
import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.dialogs.NewFilterDialog.Companion.newFilterDialog import org.tasks.dialogs.NewFilterDialog.Companion.newFilterDialog
import org.tasks.filters.FilterProvider import org.tasks.filters.FilterProvider
@ -83,7 +84,8 @@ class NavigationDrawerFragment : Fragment() {
activity?.startActivity(TaskIntents.getTaskListIntent(activity, item)) activity?.startActivity(TaskIntents.getTaskListIntent(activity, item))
} else if (item is NavigationDrawerAction) { } else if (item is NavigationDrawerAction) {
when (item.requestCode) { when (item.requestCode) {
REQUEST_PURCHASE -> startActivity(Intent(context, PurchaseActivity::class.java)) REQUEST_PURCHASE ->
newPurchaseDialog().show(parentFragmentManager, FRAG_TAG_PURCHASE_DIALOG)
REQUEST_DONATE -> startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://tasks.org/donate"))) REQUEST_DONATE -> startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://tasks.org/donate")))
REQUEST_NEW_FILTER -> newFilterDialog().show(parentFragmentManager, FRAG_TAG_NEW_FILTER) REQUEST_NEW_FILTER -> newFilterDialog().show(parentFragmentManager, FRAG_TAG_NEW_FILTER)
else -> activity?.startActivityForResult(item.intent, item.requestCode) else -> activity?.startActivityForResult(item.intent, item.requestCode)

@ -1,127 +1,110 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"> android:orientation="vertical">
<ScrollView
android:id="@+id/scroll"
android:layout_above="@id/bottom_panel"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView <TextView
style="@style/TextAppearance.AppCompat.Medium" android:id="@+id/text"
android:layout_width="match_parent" android:scrollbars="none"
android:layout_height="wrap_content"
android:textAlignment="center"
android:text="@string/upgrade_blurb_1"
android:padding="@dimen/keyline_first"
android:layout_gravity="center_horizontal" />
<TextView
style="@style/TextAppearance.AppCompat.Medium"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAlignment="center" android:lineSpacingMultiplier="1.2"
android:text="@string/upgrade_blurb_2" android:textSize="16sp"
android:padding="@dimen/keyline_first" android:padding="@dimen/keyline_second"/>
android:layout_gravity="center_horizontal" /> </ScrollView>
<TextView <View
style="@style/TextAppearance.AppCompat.Medium" android:id="@+id/divider"
android:layout_width="match_parent" android:layout_below="@id/scroll"
android:layout_height="wrap_content" style="@style/task_edit_row_divider"
android:textAlignment="center" />
android:text="@string/upgrade_blurb_3"
android:padding="@dimen/keyline_first"
android:layout_gravity="center_horizontal" />
<TextView <LinearLayout
style="@style/TextAppearance.AppCompat.Medium" android:id="@+id/bottom_panel"
android:layout_alignParentBottom="true"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAlignment="center" android:paddingTop="@dimen/keyline_first"
android:text="@string/upgrade_blurb_4" android:paddingBottom="@dimen/keyline_first"
android:padding="@dimen/keyline_first" android:orientation="vertical">
android:layout_gravity="center_horizontal" />
<ProgressBar <ProgressBar
android:id="@+id/screen_wait" android:id="@+id/screen_wait"
style="?android:attr/progressBarStyle" style="?android:attr/progressBarStyle"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:indeterminate="true" android:indeterminate="true"
android:visibility="gone" /> android:visibility="gone" />
<com.google.android.material.button.MaterialButtonToggleGroup <com.google.android.material.slider.Slider
android:id="@+id/buttons" android:id="@+id/slider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_horizontal" android:valueFrom="1"
android:valueTo="25"
android:value="10"
android:stepSize="1"
app:trackColorActive="?attr/colorSecondary"
app:thumbColor="?attr/colorSecondary"
app:tickColorActive="?attr/colorOnSecondary"
app:tickColorInactive="?attr/colorSecondary"
app:tickColor="@android:color/transparent"
app:trackColorInactive="@color/text_tertiary"
android:visibility="gone" android:visibility="gone"
app:checkedButton="@id/button_monthly" android:layout_marginStart="@dimen/keyline_first"
app:singleSelection="true" android:layout_marginEnd="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_content_inset" tools:visibility="visible"/>
android:paddingEnd="@dimen/keyline_content_inset">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/tasks_org_button_panel"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/button_monthly" android:id="@+id/pay_annually"
style="@style/OutlineButton" style="@style/OutlineButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/monthly" /> tools:text="$2.99/year"
app:layout_constraintEnd_toStartOf="@+id/pay_monthly"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/button_annually" android:id="@+id/pay_monthly"
style="@style/OutlineButton" style="@style/OutlineButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/annually" /> tools:text="$2.99/month"
android:layout_marginStart="@dimen/keyline_first"
</com.google.android.material.button.MaterialButtonToggleGroup> app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/pay_annually"
<androidx.recyclerview.widget.RecyclerView app:layout_constraintTop_toTopOf="parent" />
android:id="@+id/recycler_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingStart="@dimen/keyline_content_inset"
android:paddingEnd="@dimen/keyline_content_inset" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/subscribe" android:id="@+id/pay_other"
style="@style/OutlineButton" style="@style/TextButton"
android:padding="@dimen/keyline_first" android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_margin="@dimen/keyline_first"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:strokeColor="@color/button_accent_stroke" android:text="@string/more_options"
android:text="@string/button_subscribe" /> android:textColor="@color/text_secondary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pay_annually"
tools:text="@string/back"/>
<com.google.android.material.button.MaterialButton </androidx.constraintlayout.widget.ConstraintLayout>
android:id="@+id/unsubscribe"
style="@style/OutlineButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/keyline_first"
android:padding="@dimen/keyline_first"
app:strokeColor="?attr/colorSecondary"
android:text="@string/button_unsubscribe"
android:visibility="gone" />
</LinearLayout> </LinearLayout>
</ScrollView> </RelativeLayout>
</LinearLayout>

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tasks="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_more_info"
android:title="@string/button_more_info"
android:icon="@drawable/ic_outline_help_outline_24px"
android:contentDescription="@string/button_more_info"
tasks:showAsAction="ifRoom" />
</menu>

@ -450,7 +450,6 @@
<string name="about">O aplikaci</string> <string name="about">O aplikaci</string>
<string name="license_summary">Aplikace Tasks je svobodný software s otevřeným zdrojovým kódem licencovaný pod GNU General Public License v3.0</string> <string name="license_summary">Aplikace Tasks je svobodný software s otevřeným zdrojovým kódem licencovaný pod GNU General Public License v3.0</string>
<string name="icon">Ikona</string> <string name="icon">Ikona</string>
<string name="manage_subscription_summary">Zvýšit, snížit nebo zrušit vaše předplatné</string>
<string name="button_current_subscription">Aktuální předplatné</string> <string name="button_current_subscription">Aktuální předplatné</string>
<string name="button_restore_subscription">Obnovit předplatné</string> <string name="button_restore_subscription">Obnovit předplatné</string>
<string name="button_downgrade">Snížit předplatné</string> <string name="button_downgrade">Snížit předplatné</string>
@ -493,7 +492,6 @@
<string name="version_string">Verze %s</string> <string name="version_string">Verze %s</string>
<string name="invalid_backup_file">Neplatný soubor zálohy</string> <string name="invalid_backup_file">Neplatný soubor zálohy</string>
<string name="google_tasks_add_to_top">Nové úkoly na vrchu</string> <string name="google_tasks_add_to_top">Nové úkoly na vrchu</string>
<string name="name_your_price">Zaplať kolik chceš</string>
<string name="monthly">Měsíčně</string> <string name="monthly">Měsíčně</string>
<string name="annually">Ročně</string> <string name="annually">Ročně</string>
<string name="caldav_account_repeating_tasks">Dovolit serveru plánovat opakující se úkoly</string> <string name="caldav_account_repeating_tasks">Dovolit serveru plánovat opakující se úkoly</string>
@ -591,9 +589,6 @@
<string name="on_launch">Při spuštění</string> <string name="on_launch">Při spuštění</string>
<string name="lists">Seznamy</string> <string name="lists">Seznamy</string>
<string name="add_filter">Přidat filtr</string> <string name="add_filter">Přidat filtr</string>
<string name="upgrade_blurb_3">Před zahájení používání bezplatné zkušební verze vyberte níže jakoukoli cenu předplatného. Můžete jej kdykoli zrušit.</string>
<string name="upgrade_blurb_2">Strávil jsem tisíce hodin prací na Tasks a bezplatně zveřejňuji veškerý zdrojový kód online. Za účelem podpory mé práce některé funkce vyžadují předplatné</string>
<string name="upgrade_blurb_1">Ahoj! Jmenuji se Alex. Jsem nezávislý vývojář Tasks</string>
<string name="color_wheel">Více barev</string> <string name="color_wheel">Více barev</string>
<string name="invalid_username_or_password">Neplatné uživatelské jméno nebo heslo</string> <string name="invalid_username_or_password">Neplatné uživatelské jméno nebo heslo</string>
<string name="davx5_selection_description">Synchronizujte své úkoly pomocí aplikace DAVx⁵</string> <string name="davx5_selection_description">Synchronizujte své úkoly pomocí aplikace DAVx⁵</string>

@ -170,9 +170,6 @@
<string name="chip_style">Boble-stil</string> <string name="chip_style">Boble-stil</string>
<string name="back">Tilbage</string> <string name="back">Tilbage</string>
<string name="upgrade_blurb_4">Din støtte betydet meget for mig, tak!</string> <string name="upgrade_blurb_4">Din støtte betydet meget for mig, tak!</string>
<string name="upgrade_blurb_3">Vælg hvilken som helst abonnementspris herunder for at begynde din gratis prøveperiode. Du kan til enhver tid opsige abonnementet</string>
<string name="upgrade_blurb_2">Jeg har brugt tusindvis af arbejdstimer på Tasks, og jeg udgiver hele kildekoden gratis online. For at støtte mit arbejde kræver nogle funktioner et abonnement</string>
<string name="upgrade_blurb_1">Hej! Jeg hedder Alex. Jeg er den selvstændige udvikler bag Tasks</string>
<string name="color_wheel">Farvehjul</string> <string name="color_wheel">Farvehjul</string>
<string name="invalid_username_or_password">Ugyldigt brugernavn eller kodeord</string> <string name="invalid_username_or_password">Ugyldigt brugernavn eller kodeord</string>
<string name="more_notification_settings_summary">Ringetone, vibrér og mere</string> <string name="more_notification_settings_summary">Ringetone, vibrér og mere</string>
@ -205,7 +202,6 @@
<string name="caldav_account_repeating_tasks">Lad serveren planlægge gentagne opgaver</string> <string name="caldav_account_repeating_tasks">Lad serveren planlægge gentagne opgaver</string>
<string name="annually">Årligt</string> <string name="annually">Årligt</string>
<string name="monthly">Månedligt</string> <string name="monthly">Månedligt</string>
<string name="name_your_price">Betal, hvad du vil</string>
<string name="google_tasks_add_to_top">Nye opgaver øverst</string> <string name="google_tasks_add_to_top">Nye opgaver øverst</string>
<string name="invalid_backup_file">Ugyldig sikkerhedskopi-fil</string> <string name="invalid_backup_file">Ugyldig sikkerhedskopi-fil</string>
<string name="version_string">Version %s</string> <string name="version_string">Version %s</string>
@ -413,7 +409,6 @@
<string name="button_downgrade">Nedgrader abonnement</string> <string name="button_downgrade">Nedgrader abonnement</string>
<string name="upgrade_to_pro">Opgrader til pro</string> <string name="upgrade_to_pro">Opgrader til pro</string>
<string name="refresh_purchases">Opdater køb</string> <string name="refresh_purchases">Opdater køb</string>
<string name="manage_subscription_summary">Opgrader, nedgrader eller opsig dit abonnement</string>
<string name="manage_subscription">Administrer abonnement</string> <string name="manage_subscription">Administrer abonnement</string>
<string name="repeat_monthly_on_every_day_of_nth_week">hver %1$s i %2$s</string> <string name="repeat_monthly_on_every_day_of_nth_week">hver %1$s i %2$s</string>
<string name="repeat_monthly_every_day_of_nth_week">hver %1$s i %2$s</string> <string name="repeat_monthly_every_day_of_nth_week">hver %1$s i %2$s</string>

@ -471,13 +471,11 @@
<string name="version_string">Version %s</string> <string name="version_string">Version %s</string>
<string name="error_adding_account">Fehler: %s</string> <string name="error_adding_account">Fehler: %s</string>
<string name="icon">Symbol</string> <string name="icon">Symbol</string>
<string name="manage_subscription_summary">Abonnement hoch-/herabstufen oder kündigen</string>
<string name="button_current_subscription">Aktuelles Abonnement</string> <string name="button_current_subscription">Aktuelles Abonnement</string>
<string name="button_restore_subscription">Abonnement wiederherstellen</string> <string name="button_restore_subscription">Abonnement wiederherstellen</string>
<string name="button_downgrade">Abonnement herabstufen</string> <string name="button_downgrade">Abonnement herabstufen</string>
<string name="button_upgrade">Abonnement hochstufen</string> <string name="button_upgrade">Abonnement hochstufen</string>
<string name="button_unsubscribe">Abonnement kündigen</string> <string name="button_unsubscribe">Abonnement kündigen</string>
<string name="name_your_price">Nennen Sie Ihren Preis</string>
<string name="monthly">monatlich</string> <string name="monthly">monatlich</string>
<string name="annually">jährlich</string> <string name="annually">jährlich</string>
<string name="SSD_sort_my_order">Manuelle Sortierung</string> <string name="SSD_sort_my_order">Manuelle Sortierung</string>
@ -528,9 +526,6 @@
<string name="more_notification_settings_summary">Klingelton, Vibration und mehr</string> <string name="more_notification_settings_summary">Klingelton, Vibration und mehr</string>
<string name="invalid_username_or_password">Ungültiger Benutzername oder Passwort</string> <string name="invalid_username_or_password">Ungültiger Benutzername oder Passwort</string>
<string name="color_wheel">Farbkreis</string> <string name="color_wheel">Farbkreis</string>
<string name="upgrade_blurb_1">Hallo! Mein Name ist Alex. Ich bin der unabhängige Entwickler hinter Tasks</string>
<string name="upgrade_blurb_2">Ich habe Tausende von Stunden mit der Arbeit an Tasks verbracht und veröffentliche den gesamten Quellcode kostenlos online. Um meine Arbeit zu unterstützen, erfordern einige Funktionen ein Abonnement</string>
<string name="upgrade_blurb_3">Wählen Sie unten einen beliebigen Abonnementpreis aus, um Ihre kostenlose Testversion zu starten. Sie können jederzeit kündigen</string>
<string name="upgrade_blurb_4">Ihre Unterstützung bedeutet mir sehr viel, danke!</string> <string name="upgrade_blurb_4">Ihre Unterstützung bedeutet mir sehr viel, danke!</string>
<string name="back">Zurück</string> <string name="back">Zurück</string>
<string name="chip_style">Stil der Marken</string> <string name="chip_style">Stil der Marken</string>

@ -471,13 +471,11 @@
<string name="error_adding_account">Error : %s</string> <string name="error_adding_account">Error : %s</string>
<string name="list_separator_with_space">", "</string> <string name="list_separator_with_space">", "</string>
<string name="icon">Icono</string> <string name="icon">Icono</string>
<string name="manage_subscription_summary">Actualizar, rebajar o cancelar su suscripción</string>
<string name="button_current_subscription">Suscripción actual</string> <string name="button_current_subscription">Suscripción actual</string>
<string name="button_restore_subscription">Restaurar la suscripción</string> <string name="button_restore_subscription">Restaurar la suscripción</string>
<string name="button_downgrade">Suscripción de degradación</string> <string name="button_downgrade">Suscripción de degradación</string>
<string name="button_upgrade">Suscripción de actualización</string> <string name="button_upgrade">Suscripción de actualización</string>
<string name="button_unsubscribe">Cancelar la suscripción</string> <string name="button_unsubscribe">Cancelar la suscripción</string>
<string name="name_your_price">Escoger tu precio</string>
<string name="monthly">Mensualmente</string> <string name="monthly">Mensualmente</string>
<string name="annually">Anualmente</string> <string name="annually">Anualmente</string>
<string name="SSD_sort_my_order">Mi orden</string> <string name="SSD_sort_my_order">Mi orden</string>
@ -527,9 +525,6 @@
<string name="invalid_username_or_password">Nombre de usuario o contraseña inválidos</string> <string name="invalid_username_or_password">Nombre de usuario o contraseña inválidos</string>
<string name="theme_system_default">El sistema por defecto</string> <string name="theme_system_default">El sistema por defecto</string>
<string name="color_wheel">Rueda de colores</string> <string name="color_wheel">Rueda de colores</string>
<string name="upgrade_blurb_1">¡Hola! Me llamo Alex. Soy el desarrollador independiente detrás de Tasks</string>
<string name="upgrade_blurb_2">He pasado miles de horas trabajando en Tareas, y publico todo el código fuente en línea de forma gratuita. Para apoyar mi trabajo, algunas características requieren una suscripción</string>
<string name="upgrade_blurb_3">Elija cualquier precio de suscripción a continuación para iniciar su prueba gratuita. Puede cancelar en cualquier momento</string>
<string name="upgrade_blurb_4">Su apoyo significa mucho para mí, ¡gracias!</string> <string name="upgrade_blurb_4">Su apoyo significa mucho para mí, ¡gracias!</string>
<string name="back">Volver</string> <string name="back">Volver</string>
<string name="chip_style">Estilo de chip</string> <string name="chip_style">Estilo de chip</string>

@ -470,13 +470,11 @@
<string name="invalid_backup_file">Baliogabeko babes-kopia fitxategia</string> <string name="invalid_backup_file">Baliogabeko babes-kopia fitxategia</string>
<string name="google_tasks_add_to_top">Zeregin berriak goialdean</string> <string name="google_tasks_add_to_top">Zeregin berriak goialdean</string>
<string name="icon">Ikonoa</string> <string name="icon">Ikonoa</string>
<string name="manage_subscription_summary">Handiagotu, txikiagotu edo ezeztatu zure harpidetza</string>
<string name="button_current_subscription">Uneko harpidetza</string> <string name="button_current_subscription">Uneko harpidetza</string>
<string name="button_restore_subscription">Berrezarri harpidetza</string> <string name="button_restore_subscription">Berrezarri harpidetza</string>
<string name="button_downgrade">Txikiagotu harpidetza</string> <string name="button_downgrade">Txikiagotu harpidetza</string>
<string name="button_upgrade">Handiagotu harpidetza</string> <string name="button_upgrade">Handiagotu harpidetza</string>
<string name="button_unsubscribe">Ezeztatu harpidetza</string> <string name="button_unsubscribe">Ezeztatu harpidetza</string>
<string name="name_your_price">Jarri zuk prezioa</string>
<string name="monthly">Hilero</string> <string name="monthly">Hilero</string>
<string name="annually">Urtero</string> <string name="annually">Urtero</string>
<string name="error_adding_account">Errorea: %s</string> <string name="error_adding_account">Errorea: %s</string>
@ -527,9 +525,6 @@
<string name="invalid_username_or_password">Erabiltzaile-izen edo pasahitz okerra</string> <string name="invalid_username_or_password">Erabiltzaile-izen edo pasahitz okerra</string>
<string name="theme_system_default">Sisteman lehenetsia</string> <string name="theme_system_default">Sisteman lehenetsia</string>
<string name="color_wheel">Kolore-gurpila</string> <string name="color_wheel">Kolore-gurpila</string>
<string name="upgrade_blurb_1">Kaixo! Nire izana Alex da. Ni naiz Tasks aplikazioaren garatzaile independentea</string>
<string name="upgrade_blurb_2">Milaka ordu eman ditut Tsks aplikazioan lanean, eta kode guztia argitaratzen dut doan. Nire lana babesteko ezaugarri batzuk harpidetza eskatzen dute</string>
<string name="upgrade_blurb_3">Hautatu azpiko harpidetza salneurri bat zure doako proba hasteko. Nahi duzunean eten dezakezu</string>
<string name="upgrade_blurb_4">Zure babesa asko da niretzat, eskerrik asko!</string> <string name="upgrade_blurb_4">Zure babesa asko da niretzat, eskerrik asko!</string>
<string name="back">Atzera</string> <string name="back">Atzera</string>
<string name="chip_style">Txip estiloa</string> <string name="chip_style">Txip estiloa</string>

@ -442,7 +442,6 @@
<string name="caldav_account_repeating_tasks">Anna palvelimen ajoittaa toistuvia tehtäviä</string> <string name="caldav_account_repeating_tasks">Anna palvelimen ajoittaa toistuvia tehtäviä</string>
<string name="annually">Vuosittain</string> <string name="annually">Vuosittain</string>
<string name="monthly">Kuukausittain</string> <string name="monthly">Kuukausittain</string>
<string name="name_your_price">Nimeä hintasi</string>
<string name="google_tasks_add_to_top">Uudet tehtävät huipulla</string> <string name="google_tasks_add_to_top">Uudet tehtävät huipulla</string>
<string name="invalid_backup_file">Epäsopiva varmuuskopiotiedosto</string> <string name="invalid_backup_file">Epäsopiva varmuuskopiotiedosto</string>
<string name="version_string">Versio %s</string> <string name="version_string">Versio %s</string>
@ -545,7 +544,6 @@
<string name="action_new_task">Uusi tehtävä</string> <string name="action_new_task">Uusi tehtävä</string>
<string name="pro_dashclock_extension">Dashclock-laajennus</string> <string name="pro_dashclock_extension">Dashclock-laajennus</string>
<string name="upgrade_to_pro">Päivitä pro versioon</string> <string name="upgrade_to_pro">Päivitä pro versioon</string>
<string name="upgrade_blurb_3">Valitse mikä tahansa alla olevista tilaus vaihtoehdoista aloittaaksesi vapaan kokeilun. Voit keskeyttää milloin haluat</string>
<string name="etesync_account_description">Vaatii tilin Etesync.com :ssa tai itsehallinnoidun serverin</string> <string name="etesync_account_description">Vaatii tilin Etesync.com :ssa tai itsehallinnoidun serverin</string>
<string name="filter_no_priority">Ei tärkeyttä</string> <string name="filter_no_priority">Ei tärkeyttä</string>
<string name="filter_medium_priority">Normaali tärkeys</string> <string name="filter_medium_priority">Normaali tärkeys</string>
@ -580,8 +578,6 @@
<string name="auto_dismiss_datetime_list_summary">Sulje automaattisesti kun valitaan tehtävä listalta</string> <string name="auto_dismiss_datetime_list_summary">Sulje automaattisesti kun valitaan tehtävä listalta</string>
<string name="place_settings">Paikka asetukset</string> <string name="place_settings">Paikka asetukset</string>
<string name="places">Paikat</string> <string name="places">Paikat</string>
<string name="upgrade_blurb_2">Olen käyttänyt tuhansia tunteja työskennellen Task ohjelman parissa, ja julkaisen koko lähdekoodin netissä ilmaiseksi. Työni tueksi joidenkin ohjelman ominaisuuksien käyttö vaatii tilauksen</string>
<string name="upgrade_blurb_1">Moi! Nimeni on Alex. Olen itsenäinen ohjelmistontekijä Task ohjelman takana</string>
<string name="troubleshooting">Ongelmien ratkaisu</string> <string name="troubleshooting">Ongelmien ratkaisu</string>
<string name="wearable_notifications_summary">Näytä ilmoitukset puettavassa laitteessasi</string> <string name="wearable_notifications_summary">Näytä ilmoitukset puettavassa laitteessasi</string>
<string name="wearable_notifications">Puettavan laitteen ilmoitukset</string> <string name="wearable_notifications">Puettavan laitteen ilmoitukset</string>
@ -593,7 +589,6 @@
<string name="logout_warning">Kirjaudu ulos %s\? Kaikki tälle tilille tallennetut tiedot poistetaan laitteeltasi</string> <string name="logout_warning">Kirjaudu ulos %s\? Kaikki tälle tilille tallennetut tiedot poistetaan laitteeltasi</string>
<string name="button_downgrade">Alenna tilaustasi</string> <string name="button_downgrade">Alenna tilaustasi</string>
<string name="refresh_purchases">Päivitä ostoksesi</string> <string name="refresh_purchases">Päivitä ostoksesi</string>
<string name="manage_subscription_summary">Päivitä, alenna tai keskeytä tilauksesi</string>
<string name="background_sync_unmetered_only">Vain rajoittamattomalla yhteydellä</string> <string name="background_sync_unmetered_only">Vain rajoittamattomalla yhteydellä</string>
<string name="widget_due_date_hidden">Piilotettu</string> <string name="widget_due_date_hidden">Piilotettu</string>
<string name="widget_due_date_below_title">Otsikon alle</string> <string name="widget_due_date_below_title">Otsikon alle</string>

@ -465,13 +465,11 @@
<string name="list_separator_with_space">", "</string> <string name="list_separator_with_space">", "</string>
<string name="version_string">Version %s</string> <string name="version_string">Version %s</string>
<string name="icon">Icône</string> <string name="icon">Icône</string>
<string name="manage_subscription_summary">Augmentez, diminuez ou annulez votre abonnement</string>
<string name="button_current_subscription">Abonnement actuel</string> <string name="button_current_subscription">Abonnement actuel</string>
<string name="button_restore_subscription">Restaurer l\'abonnement</string> <string name="button_restore_subscription">Restaurer l\'abonnement</string>
<string name="button_downgrade">Diminuer l\'abonnement</string> <string name="button_downgrade">Diminuer l\'abonnement</string>
<string name="button_upgrade">Augmenter l\'abonnement</string> <string name="button_upgrade">Augmenter l\'abonnement</string>
<string name="button_unsubscribe">Annuler l\'abonnement</string> <string name="button_unsubscribe">Annuler l\'abonnement</string>
<string name="name_your_price">Donnez votre prix</string>
<string name="monthly">Chaque mois</string> <string name="monthly">Chaque mois</string>
<string name="annually">Chaque année</string> <string name="annually">Chaque année</string>
<string name="error_adding_account">Erreur : %s</string> <string name="error_adding_account">Erreur : %s</string>
@ -522,9 +520,6 @@
<string name="invalid_username_or_password">Nom d\'utilisateur ou mot de passe invalide</string> <string name="invalid_username_or_password">Nom d\'utilisateur ou mot de passe invalide</string>
<string name="theme_system_default">Défaut du système</string> <string name="theme_system_default">Défaut du système</string>
<string name="color_wheel">Palette de couleurs</string> <string name="color_wheel">Palette de couleurs</string>
<string name="upgrade_blurb_1">Salut ! Je m\'appelle Alex. Je suis le développeur indépendant à l\'origine de Tasks</string>
<string name="upgrade_blurb_2">J\'ai passé des milliers d\'heures à travailler sur Tasks, et je publie gratuitement tout le code source en ligne. Afin de soutenir mon travail, certaines fonctionnalités nécessitent un abonnement</string>
<string name="upgrade_blurb_3">Choisissez l\'un des prix d\'abonnement ci-dessous pour commencer votre essai gratuit. Vous pouvez annuler à tout moment</string>
<string name="upgrade_blurb_4">Votre soutien est très important pour moi, merci !</string> <string name="upgrade_blurb_4">Votre soutien est très important pour moi, merci !</string>
<string name="back">Retour</string> <string name="back">Retour</string>
<string name="chip_style">Style de puce</string> <string name="chip_style">Style de puce</string>

@ -468,13 +468,11 @@
<string name="location_radius_meters">%s m</string> <string name="location_radius_meters">%s m</string>
<string name="list_separator_with_space">", "</string> <string name="list_separator_with_space">", "</string>
<string name="icon">Ikon</string> <string name="icon">Ikon</string>
<string name="manage_subscription_summary">Előfizetés upgrade-je, downgrade-je vagy lemondása</string>
<string name="button_current_subscription">Jelenlegi előfizetés</string> <string name="button_current_subscription">Jelenlegi előfizetés</string>
<string name="button_restore_subscription">Előfizetés visszaállítása</string> <string name="button_restore_subscription">Előfizetés visszaállítása</string>
<string name="button_downgrade">Előfizetés downgrade-je</string> <string name="button_downgrade">Előfizetés downgrade-je</string>
<string name="button_upgrade">Előfizetés upgrade-je</string> <string name="button_upgrade">Előfizetés upgrade-je</string>
<string name="button_unsubscribe">Előfizetés lemondása</string> <string name="button_unsubscribe">Előfizetés lemondása</string>
<string name="name_your_price">Nevezd meg az árat</string>
<string name="monthly">Havi</string> <string name="monthly">Havi</string>
<string name="annually">Éves</string> <string name="annually">Éves</string>
<string name="SSD_sort_my_order">Egyéni sorrend</string> <string name="SSD_sort_my_order">Egyéni sorrend</string>
@ -525,9 +523,6 @@
<string name="invalid_username_or_password">Hibás felhasználónév vagy jelszó</string> <string name="invalid_username_or_password">Hibás felhasználónév vagy jelszó</string>
<string name="theme_system_default">Alapértelmezett</string> <string name="theme_system_default">Alapértelmezett</string>
<string name="color_wheel">Színkör</string> <string name="color_wheel">Színkör</string>
<string name="upgrade_blurb_1">Szia! Alexnek hívnak. Én vagyok a Tasks mögött álló független fejlesztő</string>
<string name="upgrade_blurb_2">Több ezer órát dolgoztam a Tasks appon, és a teljes forráskódot ingyenesen elérhetővé tettem. A munkám támogatása érdekében néhány funkció eléréséhez előfizetés szükséges</string>
<string name="upgrade_blurb_3">Az ingyenes próbaidőszak megkezdéséhez válassz a lenti előfizetési díjakból. Bármikor lemondhatod az előfizetést</string>
<string name="upgrade_blurb_4">A támogatásod sokat jelent nekem, köszönöm!</string> <string name="upgrade_blurb_4">A támogatásod sokat jelent nekem, köszönöm!</string>
<string name="back">Vissza</string> <string name="back">Vissza</string>
<string name="chip_style">Jelölő stílusa</string> <string name="chip_style">Jelölő stílusa</string>

@ -358,7 +358,6 @@
<string name="background_sync_unmetered_only">Hanya pada koneksi tak terbatas</string> <string name="background_sync_unmetered_only">Hanya pada koneksi tak terbatas</string>
<string name="upgrade_to_pro">Tingkatkan ke pro</string> <string name="upgrade_to_pro">Tingkatkan ke pro</string>
<string name="manage_subscription">Kelola langganan</string> <string name="manage_subscription">Kelola langganan</string>
<string name="manage_subscription_summary">Tingkatkan, turunkan, atau batalkan langganan anda</string>
<string name="refresh_purchases">Segarkan pembelian</string> <string name="refresh_purchases">Segarkan pembelian</string>
<string name="button_subscribe">Langganan</string> <string name="button_subscribe">Langganan</string>
<string name="button_current_subscription">Langganan saat ini</string> <string name="button_current_subscription">Langganan saat ini</string>

@ -491,9 +491,6 @@
<string name="chip_style_outlined">Contornato</string> <string name="chip_style_outlined">Contornato</string>
<string name="back">Indietro</string> <string name="back">Indietro</string>
<string name="upgrade_blurb_4">Il tuo supporto significa molto per me, grazie!</string> <string name="upgrade_blurb_4">Il tuo supporto significa molto per me, grazie!</string>
<string name="upgrade_blurb_3">Scegli, di seguito, un qualunque piano di abbonamento per iniziare la prova gratuita. Puoi annullarla in qualsiasi momento</string>
<string name="upgrade_blurb_2">Ho dedicato a Tasks migliaia di ore di lavoro, pubblicando tutto il codice sorgente online, gratuitamente. Per supportare il mio lavoro alcune funzioni richiedono un abbonamento</string>
<string name="upgrade_blurb_1">Ciao! Mi chiamo Alex. Sono lo sviluppatore, indipendente, di Tasks</string>
<string name="color_wheel">Cerchio cromatico</string> <string name="color_wheel">Cerchio cromatico</string>
<string name="invalid_username_or_password">Nome utente o password non validi</string> <string name="invalid_username_or_password">Nome utente o password non validi</string>
<string name="more_notification_settings_summary">Suoneria, vibrazione ed altro</string> <string name="more_notification_settings_summary">Suoneria, vibrazione ed altro</string>
@ -517,12 +514,10 @@
<string name="enter_tag_name">Inserisci il nome dell\'etichetta</string> <string name="enter_tag_name">Inserisci il nome dell\'etichetta</string>
<string name="enter_title_hint">Inserisci titolo</string> <string name="enter_title_hint">Inserisci titolo</string>
<string name="collapse_subtasks">Comprimi attività secondarie</string> <string name="collapse_subtasks">Comprimi attività secondarie</string>
<string name="name_your_price">Fai tu il prezzo</string>
<string name="third_party_licenses">Licenze di terze parti</string> <string name="third_party_licenses">Licenze di terze parti</string>
<string name="this_feature_requires_a_subscription">Questa funzione richiede un abbonamento</string> <string name="this_feature_requires_a_subscription">Questa funzione richiede un abbonamento</string>
<string name="button_unsubscribe">Annulla abbonamento</string> <string name="button_unsubscribe">Annulla abbonamento</string>
<string name="button_restore_subscription">Ripristina abbonamento</string> <string name="button_restore_subscription">Ripristina abbonamento</string>
<string name="manage_subscription_summary">Passa alla versione premium, a quella base o cancella il tuo abbonamento</string>
<string name="button_current_subscription">Abbonamento attuale</string> <string name="button_current_subscription">Abbonamento attuale</string>
<string name="help_and_feedback">Aiuto &amp; feedback</string> <string name="help_and_feedback">Aiuto &amp; feedback</string>
<string name="url">URL</string> <string name="url">URL</string>

@ -500,13 +500,11 @@
<string name="google_tasks_add_to_top">משימות חדשות בראש הרשימה</string> <string name="google_tasks_add_to_top">משימות חדשות בראש הרשימה</string>
<string name="list_separator_with_space">", "</string> <string name="list_separator_with_space">", "</string>
<string name="icon">סמל</string> <string name="icon">סמל</string>
<string name="manage_subscription_summary">שדרוג, שנמוך או ביטול המינוי</string>
<string name="button_current_subscription">מינוי נוכחי</string> <string name="button_current_subscription">מינוי נוכחי</string>
<string name="button_restore_subscription">שחזור מינוי</string> <string name="button_restore_subscription">שחזור מינוי</string>
<string name="button_downgrade">שנמוך מינוי</string> <string name="button_downgrade">שנמוך מינוי</string>
<string name="button_upgrade">שדרוג מינוי</string> <string name="button_upgrade">שדרוג מינוי</string>
<string name="button_unsubscribe">ביטול מינוי</string> <string name="button_unsubscribe">ביטול מינוי</string>
<string name="name_your_price">מה המחיר שלך</string>
<string name="monthly">חודשי</string> <string name="monthly">חודשי</string>
<string name="annually">שנתי</string> <string name="annually">שנתי</string>
<string name="places">מיקומים</string> <string name="places">מיקומים</string>
@ -614,9 +612,6 @@
<string name="permission_read_tasks">גישה מלאה למסד הנתונים של Tasks</string> <string name="permission_read_tasks">גישה מלאה למסד הנתונים של Tasks</string>
<string name="reset_sort_order">איפוס אופן הסידור</string> <string name="reset_sort_order">איפוס אופן הסידור</string>
<string name="upgrade_blurb_4">התמיכה שלך יקרה ללבי, תודה רבה לך!</string> <string name="upgrade_blurb_4">התמיכה שלך יקרה ללבי, תודה רבה לך!</string>
<string name="upgrade_blurb_3">נא לבחור את מחיר ההרשמה להלן כדי להתחיל בהתנסות חינמית. ניתן לבטל אותה בכל עת</string>
<string name="upgrade_blurb_2">השקעתי אלפי שעות בעבודה על Tasks ואני מפרסם את כל קוד המקור באינטרנט בחינם. כדי לתמוך בעבודה שלי חלק מהתכונות דורשות הרשמה</string>
<string name="upgrade_blurb_1">היי! אני אלכס, המתכנת העצמאי שמאחורי Tasks</string>
<string name="invalid_username_or_password">שם המשתמש או הססמה שגויים</string> <string name="invalid_username_or_password">שם המשתמש או הססמה שגויים</string>
<string name="more_notification_settings_summary">צלצול, סוגי רטט ועוד</string> <string name="more_notification_settings_summary">צלצול, סוגי רטט ועוד</string>
<string name="disable_battery_optimizations">השבתת שיפורי סוללה</string> <string name="disable_battery_optimizations">השבתת שיפורי סוללה</string>

@ -465,13 +465,11 @@
<string name="url">URL</string> <string name="url">URL</string>
<string name="list_separator_with_space">", "</string> <string name="list_separator_with_space">", "</string>
<string name="icon">アイコン</string> <string name="icon">アイコン</string>
<string name="manage_subscription_summary">サブスクリプションのアップグレード、ダウングレード、またはキャンセル</string>
<string name="button_current_subscription">現在のサブスクリプション</string> <string name="button_current_subscription">現在のサブスクリプション</string>
<string name="button_restore_subscription">サブスクリプションの復元</string> <string name="button_restore_subscription">サブスクリプションの復元</string>
<string name="button_downgrade">サブスクリプションのダウングレード</string> <string name="button_downgrade">サブスクリプションのダウングレード</string>
<string name="button_upgrade">サブスクリプションのアップグレード</string> <string name="button_upgrade">サブスクリプションのアップグレード</string>
<string name="button_unsubscribe">サブスクリプションのキャンセル</string> <string name="button_unsubscribe">サブスクリプションのキャンセル</string>
<string name="name_your_price">価格の名前</string>
<string name="monthly">毎月</string> <string name="monthly">毎月</string>
<string name="annually">毎年</string> <string name="annually">毎年</string>
</resources> </resources>

@ -467,13 +467,11 @@
<string name="invalid_backup_file">부적합한 백업 파일</string> <string name="invalid_backup_file">부적합한 백업 파일</string>
<string name="google_tasks_add_to_top">새 할일을 가장 위로</string> <string name="google_tasks_add_to_top">새 할일을 가장 위로</string>
<string name="icon">아이콘</string> <string name="icon">아이콘</string>
<string name="manage_subscription_summary">업그레이드, 다운그레이드, 구독 취소</string>
<string name="button_current_subscription">현재 구독</string> <string name="button_current_subscription">현재 구독</string>
<string name="button_restore_subscription">구독 복원</string> <string name="button_restore_subscription">구독 복원</string>
<string name="button_downgrade">구독 다운그레이드</string> <string name="button_downgrade">구독 다운그레이드</string>
<string name="button_upgrade">구독 업그레이드</string> <string name="button_upgrade">구독 업그레이드</string>
<string name="button_unsubscribe">구독 취소</string> <string name="button_unsubscribe">구독 취소</string>
<string name="name_your_price">구독 금액 정하기</string>
<string name="monthly">매월</string> <string name="monthly">매월</string>
<string name="annually">매년</string> <string name="annually">매년</string>
<string name="SSD_sort_my_order">순서 직접 정렬</string> <string name="SSD_sort_my_order">순서 직접 정렬</string>
@ -519,7 +517,6 @@
<string name="navigation_drawer">네비게이션 서랍</string> <string name="navigation_drawer">네비게이션 서랍</string>
<string name="place_settings">위치 설정</string> <string name="place_settings">위치 설정</string>
<string name="places">위치</string> <string name="places">위치</string>
<string name="upgrade_blurb_1">안녕하세요! Tasks의 1인 개발자 알렉스입니다</string>
<string name="desaturate_colors_summary_on">다크 테마 사용 시 채도를 낮춥니다</string> <string name="desaturate_colors_summary_on">다크 테마 사용 시 채도를 낮춥니다</string>
<string name="desaturate_colors_summary_off">다크 테마 사용 시 채도를 낮추지 않습니다</string> <string name="desaturate_colors_summary_off">다크 테마 사용 시 채도를 낮추지 않습니다</string>
<string name="desaturate_colors">저채도 색상</string> <string name="desaturate_colors">저채도 색상</string>
@ -528,9 +525,7 @@
<string name="chips"></string> <string name="chips"></string>
<string name="chip_style_filled">배경색 채움</string> <string name="chip_style_filled">배경색 채움</string>
<string name="chip_style">칩 스타일</string> <string name="chip_style">칩 스타일</string>
<string name="upgrade_blurb_2">저는 Tasks 개발에 엄청나게 많은 시간을 쏟고 있으며, 모든 소스코드를 웹에 무상으로 공개하고 있습니다. 저의 작업을 후원하기 위해 일부 기능은 구독이 필요합니다</string>
<string name="upgrade_blurb_4">당신의 후원은 저에게 큰 힘이 됩니다. 감사합니다!</string> <string name="upgrade_blurb_4">당신의 후원은 저에게 큰 힘이 됩니다. 감사합니다!</string>
<string name="upgrade_blurb_3">무료 체험을 시작하려면 아래에서 구독 금액을 선택하세요. 언제라도 구독을 취소하실 수 있습니다</string>
<string name="color_wheel">색상환</string> <string name="color_wheel">색상환</string>
<string name="invalid_username_or_password">유효하지 않은 사용자명과 비밀번호</string> <string name="invalid_username_or_password">유효하지 않은 사용자명과 비밀번호</string>
<string name="more_notification_settings_summary">신호음, 진동 등</string> <string name="more_notification_settings_summary">신호음, 진동 등</string>

@ -470,13 +470,11 @@
<string name="invalid_backup_file">Ugyldig sikkerhetskopifil</string> <string name="invalid_backup_file">Ugyldig sikkerhetskopifil</string>
<string name="google_tasks_add_to_top">Nye gjøremål øverst</string> <string name="google_tasks_add_to_top">Nye gjøremål øverst</string>
<string name="icon">Ikon</string> <string name="icon">Ikon</string>
<string name="manage_subscription_summary">Oppgrader, nedgrader eller avbryt ditt abonnement</string>
<string name="button_current_subscription">Nåværende abonnement</string> <string name="button_current_subscription">Nåværende abonnement</string>
<string name="button_restore_subscription">Gjenopprett abonnement</string> <string name="button_restore_subscription">Gjenopprett abonnement</string>
<string name="button_downgrade">Nedgrader abonnement</string> <string name="button_downgrade">Nedgrader abonnement</string>
<string name="button_upgrade">Oppgrader abonnement</string> <string name="button_upgrade">Oppgrader abonnement</string>
<string name="button_unsubscribe">Avbryt abonnement</string> <string name="button_unsubscribe">Avbryt abonnement</string>
<string name="name_your_price">Betal det du vil</string>
<string name="monthly">Månedlig</string> <string name="monthly">Månedlig</string>
<string name="annually">Årlig</string> <string name="annually">Årlig</string>
<string name="error_adding_account">Feil: %s</string> <string name="error_adding_account">Feil: %s</string>
@ -576,11 +574,8 @@
<string name="chips">Flis</string> <string name="chips">Flis</string>
<string name="chip_style_outlined">Omrisset</string> <string name="chip_style_outlined">Omrisset</string>
<string name="chip_style">Flisstil</string> <string name="chip_style">Flisstil</string>
<string name="upgrade_blurb_2">Jeg har brukt tusenvis av timer på å jobbe med Tasks, og jeg offentliggjør all kildekoden på nettet gratis. For å støtte mitt arbeid krever noen funksjoner et abonnement</string>
<string name="upgrade_blurb_1">Hei, jeg heter Alex. Jeg er den uavhengige utvikleren bak Tasks</string>
<string name="caldav_account_description">Krever en konto med en CalDAV-tjenestetilbyder, eller en selvdrevet tjener. Finn en tjenestetilbyder ved å besøke tasks.org/caldav</string> <string name="caldav_account_description">Krever en konto med en CalDAV-tjenestetilbyder, eller en selvdrevet tjener. Finn en tjenestetilbyder ved å besøke tasks.org/caldav</string>
<string name="chip_style_filled">Fylt</string> <string name="chip_style_filled">Fylt</string>
<string name="upgrade_blurb_3">Velg en vilkårlig pris nedenfor for å starte din gratisperiode. Du kan avbryte når som helst.</string>
<string name="wearable_notifications_summary">Vis merknader på din ikledbare</string> <string name="wearable_notifications_summary">Vis merknader på din ikledbare</string>
<string name="wearable_notifications">Ikledbare merknader</string> <string name="wearable_notifications">Ikledbare merknader</string>
<string name="filter_eisenhower_box_4">Boolsk logikkboks 4</string> <string name="filter_eisenhower_box_4">Boolsk logikkboks 4</string>

@ -460,13 +460,11 @@
<string name="filters">Filters</string> <string name="filters">Filters</string>
<string name="filter">Filter</string> <string name="filter">Filter</string>
<string name="accent">Accent</string> <string name="accent">Accent</string>
<string name="manage_subscription_summary">Aanmelden, afmelden of annuleer je aanmelding</string>
<string name="button_current_subscription">Huidige abonnement</string> <string name="button_current_subscription">Huidige abonnement</string>
<string name="button_restore_subscription">Abonnement herstellen</string> <string name="button_restore_subscription">Abonnement herstellen</string>
<string name="button_downgrade">Terugdraaien abonnement</string> <string name="button_downgrade">Terugdraaien abonnement</string>
<string name="button_upgrade">Abonnement upgraden</string> <string name="button_upgrade">Abonnement upgraden</string>
<string name="button_unsubscribe">Abonnement annuleren</string> <string name="button_unsubscribe">Abonnement annuleren</string>
<string name="name_your_price">Bepaal je prijs</string>
<string name="monthly">Maandelijks</string> <string name="monthly">Maandelijks</string>
<string name="annually">Jaarlijks</string> <string name="annually">Jaarlijks</string>
<string name="restart_later">Later</string> <string name="restart_later">Later</string>
@ -522,9 +520,6 @@
<string name="invalid_username_or_password">Ongeldige gebruikersnaam of wachtwoord</string> <string name="invalid_username_or_password">Ongeldige gebruikersnaam of wachtwoord</string>
<string name="theme_system_default">Systeeminstelling</string> <string name="theme_system_default">Systeeminstelling</string>
<string name="color_wheel">Kleurenwiel</string> <string name="color_wheel">Kleurenwiel</string>
<string name="upgrade_blurb_1">Hoi! Mijn naam is Alex. Ik ben de onafhankelijke ontwikkelaar achter Tasks.</string>
<string name="upgrade_blurb_2">Ik heb duizenden uren aan Tasks gewerkt, en ik publiceer de volledige broncode gratis online. Om mijn werk te steunen vereisen sommige functies een abonnement.</string>
<string name="upgrade_blurb_3">Kies hierbeneden een abonnementsprijs om je gratis proefperiode te starten. Je kunt het altijd annuleren.</string>
<string name="upgrade_blurb_4">Je steun betekent veel voor me, bedankt!</string> <string name="upgrade_blurb_4">Je steun betekent veel voor me, bedankt!</string>
<string name="back">Terug</string> <string name="back">Terug</string>
<string name="chip_style">Fiche-stijl</string> <string name="chip_style">Fiche-stijl</string>

@ -481,13 +481,11 @@
<string name="invalid_backup_file">Nieprawidłowy plik kopii zapasowej</string> <string name="invalid_backup_file">Nieprawidłowy plik kopii zapasowej</string>
<string name="google_tasks_add_to_top">Nowe zadania na górze</string> <string name="google_tasks_add_to_top">Nowe zadania na górze</string>
<string name="icon">Ikona</string> <string name="icon">Ikona</string>
<string name="manage_subscription_summary">Podwyższyć, obniżyć poziom albo anulować subskrypcję</string>
<string name="button_current_subscription">Aktualna subskrypcja</string> <string name="button_current_subscription">Aktualna subskrypcja</string>
<string name="button_restore_subscription">Przywróć subskrypcję</string> <string name="button_restore_subscription">Przywróć subskrypcję</string>
<string name="button_downgrade">Obniżyć poziom subskrypcji</string> <string name="button_downgrade">Obniżyć poziom subskrypcji</string>
<string name="button_upgrade">Podwyższyć poziom subskrypcji</string> <string name="button_upgrade">Podwyższyć poziom subskrypcji</string>
<string name="button_unsubscribe">Anuluj subskrypcję</string> <string name="button_unsubscribe">Anuluj subskrypcję</string>
<string name="name_your_price">Nazwij swoją cenę</string>
<string name="monthly">Miesięczne</string> <string name="monthly">Miesięczne</string>
<string name="annually">Rocznie</string> <string name="annually">Rocznie</string>
<string name="SSD_sort_my_order">Ręczne</string> <string name="SSD_sort_my_order">Ręczne</string>
@ -538,9 +536,6 @@
<string name="invalid_username_or_password">Nieprawidłowa nazwa użytkownika lub hasło</string> <string name="invalid_username_or_password">Nieprawidłowa nazwa użytkownika lub hasło</string>
<string name="theme_system_default">Domyślny systemowy</string> <string name="theme_system_default">Domyślny systemowy</string>
<string name="color_wheel">Paleta</string> <string name="color_wheel">Paleta</string>
<string name="upgrade_blurb_1">Cześć! Mam na imię Alex. Jestem niezależnym deweloperem stojącym za Tasks</string>
<string name="upgrade_blurb_2">Spędziłem tysiące godzin pracując nad Tasks i publikuję cały kod źródłowy online za darmo. Aby wesprzeć moją pracę, niektóre funkcję wymagają subskrypcji</string>
<string name="upgrade_blurb_3">Wybierz dowolną cenę subskrypcji poniżej, aby rozpocząć bezpłatny okres próbny. Możesz zrezygnować w każdej chwili</string>
<string name="upgrade_blurb_4">Twoje wsparcie wiele dla mnie znaczy, dziękuję!</string> <string name="upgrade_blurb_4">Twoje wsparcie wiele dla mnie znaczy, dziękuję!</string>
<string name="back">Wstecz</string> <string name="back">Wstecz</string>
<string name="chip_style">Styl chipa</string> <string name="chip_style">Styl chipa</string>

@ -490,9 +490,6 @@
<string name="chip_style">Estilo de notificação</string> <string name="chip_style">Estilo de notificação</string>
<string name="back">Voltar</string> <string name="back">Voltar</string>
<string name="upgrade_blurb_4">Seu suporte significa muito para mim, obrigado!</string> <string name="upgrade_blurb_4">Seu suporte significa muito para mim, obrigado!</string>
<string name="upgrade_blurb_3">Escolha qualquer preço de subscrição abaixo para começar seu teste grátis. Você poderá cancelar a qualquer momento</string>
<string name="upgrade_blurb_2">Eu investi centenas de horas trabalhando no Tasks, e eu publico todo o código fonte online de graça. Para apoiar meu trabalho, algumas funcionalidades precisam de um plano de subscrição</string>
<string name="upgrade_blurb_1">Olá! Meu nome é Alex e eu sou o desenvolvedor independente por trás do Tasks</string>
<string name="color_wheel">Roda de cores</string> <string name="color_wheel">Roda de cores</string>
<string name="invalid_username_or_password">Nome de usuário ou senha inválido</string> <string name="invalid_username_or_password">Nome de usuário ou senha inválido</string>
<string name="more_notification_settings_summary">Toque, vibrações e mais</string> <string name="more_notification_settings_summary">Toque, vibrações e mais</string>
@ -526,7 +523,6 @@
<string name="caldav_account_repeating_tasks">Permita que o servidor agende tarefas recorrentes</string> <string name="caldav_account_repeating_tasks">Permita que o servidor agende tarefas recorrentes</string>
<string name="annually">Anualmente</string> <string name="annually">Anualmente</string>
<string name="monthly">Mensalmente</string> <string name="monthly">Mensalmente</string>
<string name="name_your_price">Dê seu valor</string>
<string name="google_tasks_add_to_top">Novas tarefas ao topo</string> <string name="google_tasks_add_to_top">Novas tarefas ao topo</string>
<string name="invalid_backup_file">Arquivo de restauro inválido</string> <string name="invalid_backup_file">Arquivo de restauro inválido</string>
<string name="version_string">Versão %s</string> <string name="version_string">Versão %s</string>
@ -539,7 +535,6 @@
<string name="button_downgrade">Rebaixar plano</string> <string name="button_downgrade">Rebaixar plano</string>
<string name="button_restore_subscription">Recuperar plano</string> <string name="button_restore_subscription">Recuperar plano</string>
<string name="button_current_subscription">Plano atual</string> <string name="button_current_subscription">Plano atual</string>
<string name="manage_subscription_summary">Atualizar, rebaixar ou cancelar o seu plano</string>
<string name="help_and_feedback">Ajuda e Comentários</string> <string name="help_and_feedback">Ajuda e Comentários</string>
<string name="list_separator_with_space">", "</string> <string name="list_separator_with_space">", "</string>
<string name="error_adding_account">Erro: %s</string> <string name="error_adding_account">Erro: %s</string>

@ -553,9 +553,6 @@
<string name="chip_style">Estilo de notificação</string> <string name="chip_style">Estilo de notificação</string>
<string name="back">Voltar</string> <string name="back">Voltar</string>
<string name="upgrade_blurb_4">Seu suporte significa muito para mim, obrigado!</string> <string name="upgrade_blurb_4">Seu suporte significa muito para mim, obrigado!</string>
<string name="upgrade_blurb_3">Escolha qualquer preço de assinatura abaixo para começar seu teste grátis. Poderá cancelar a qualquer momento</string>
<string name="upgrade_blurb_2">Eu investi centenas de horas a trabalhar no Tasks e publico todo o código-fonte online de graça. Para apoiar meu trabalho, algumas funcionalidades precisam de uma assinatura</string>
<string name="upgrade_blurb_1">Olá! O meu nome é Alex e sou o programador independente por trás do Tasks</string>
<string name="color_wheel">Roda de cores</string> <string name="color_wheel">Roda de cores</string>
<string name="theme_system_default">Predefinição do Sistema</string> <string name="theme_system_default">Predefinição do Sistema</string>
<string name="invalid_username_or_password">Nome de utilizador ou palavra-passe inválido</string> <string name="invalid_username_or_password">Nome de utilizador ou palavra-passe inválido</string>
@ -602,10 +599,8 @@
<string name="EPr_temp_show_completed_tasks">Temporareamente mostrar tarefas quando completas</string> <string name="EPr_temp_show_completed_tasks">Temporareamente mostrar tarefas quando completas</string>
<string name="caldav_account_repeating_tasks">Permita que o servidor agende tarefas recorrentes</string> <string name="caldav_account_repeating_tasks">Permita que o servidor agende tarefas recorrentes</string>
<string name="SSD_sort_my_order">Minha ordem</string> <string name="SSD_sort_my_order">Minha ordem</string>
<string name="name_your_price">Dê o seu valor</string>
<string name="button_upgrade">Atualizar assinatura</string> <string name="button_upgrade">Atualizar assinatura</string>
<string name="button_downgrade">Rebaixar assinatura</string> <string name="button_downgrade">Rebaixar assinatura</string>
<string name="manage_subscription_summary">Atualizar, rebaixar ou cancelar a sua assinatura</string>
<string name="network_error">Não foi possível conectar</string> <string name="network_error">Não foi possível conectar</string>
<string name="location_radius_meters">%s m</string> <string name="location_radius_meters">%s m</string>
<string name="davx5_selection_description">Sincronize a suas tarefas com a app DAVx⁵</string> <string name="davx5_selection_description">Sincronize a suas tarefas com a app DAVx⁵</string>

@ -482,12 +482,10 @@
<string name="button_current_subscription">Текущая подписка</string> <string name="button_current_subscription">Текущая подписка</string>
<string name="button_restore_subscription">Восстановить подписку</string> <string name="button_restore_subscription">Восстановить подписку</string>
<string name="button_unsubscribe">Отменить подписку</string> <string name="button_unsubscribe">Отменить подписку</string>
<string name="name_your_price">Назовите свою цену</string>
<string name="url">URL</string> <string name="url">URL</string>
<string name="error_adding_account">Ошибка: %s</string> <string name="error_adding_account">Ошибка: %s</string>
<string name="list_separator_with_space">", "</string> <string name="list_separator_with_space">", "</string>
<string name="building_notifications">Генерация уведомлений</string> <string name="building_notifications">Генерация уведомлений</string>
<string name="manage_subscription_summary">Повысить, понизить уровень подписки или отменить ее</string>
<string name="button_downgrade">Понизить уровень подписки</string> <string name="button_downgrade">Понизить уровень подписки</string>
<string name="button_upgrade">Повысить уровень подписки</string> <string name="button_upgrade">Повысить уровень подписки</string>
<string name="SSD_sort_my_order">Ручная сортировка</string> <string name="SSD_sort_my_order">Ручная сортировка</string>
@ -543,9 +541,6 @@
<string name="invalid_username_or_password">Неверное имя пользователя или пароль</string> <string name="invalid_username_or_password">Неверное имя пользователя или пароль</string>
<string name="theme_system_default">Системная по умолчанию</string> <string name="theme_system_default">Системная по умолчанию</string>
<string name="color_wheel">Палитра</string> <string name="color_wheel">Палитра</string>
<string name="upgrade_blurb_1">Привет! Меня зовут Алекс. Я - независимый разработчик, стоящий за программой Tasks</string>
<string name="upgrade_blurb_2">Я потратил тысячи часов, работая над Tasks, и я публикую весь исходный код онлайн, бесплатно. Для того, чтобы поддержать мою работу, некоторые функциональности требуют подписки</string>
<string name="upgrade_blurb_3">Выберите любую сумму подписки для того, чтобы начать Ваш бесплатный пробный период. Вы можете отказаться в любой момент</string>
<string name="upgrade_blurb_4">Ваша поддержка много значит для меня, спасибо!</string> <string name="upgrade_blurb_4">Ваша поддержка много значит для меня, спасибо!</string>
<string name="back">Назад</string> <string name="back">Назад</string>
<string name="chip_style">Стиль индикаторов списков</string> <string name="chip_style">Стиль индикаторов списков</string>

@ -465,13 +465,11 @@
<string name="invalid_backup_file">Ogiltig säkerhetskopia</string> <string name="invalid_backup_file">Ogiltig säkerhetskopia</string>
<string name="google_tasks_add_to_top">Nya uppgifter överst</string> <string name="google_tasks_add_to_top">Nya uppgifter överst</string>
<string name="icon">Ikon</string> <string name="icon">Ikon</string>
<string name="manage_subscription_summary">Uppgradera, nedgradera eller Avbryt prenumerationen</string>
<string name="button_current_subscription">Hantera prenumerationer</string> <string name="button_current_subscription">Hantera prenumerationer</string>
<string name="button_restore_subscription">Återställ prenumeration</string> <string name="button_restore_subscription">Återställ prenumeration</string>
<string name="button_downgrade">Nedgradera prenumeration</string> <string name="button_downgrade">Nedgradera prenumeration</string>
<string name="button_upgrade">Uppgradera prenumerationen</string> <string name="button_upgrade">Uppgradera prenumerationen</string>
<string name="button_unsubscribe">Avbryt prenumeration</string> <string name="button_unsubscribe">Avbryt prenumeration</string>
<string name="name_your_price">Namnge ditt pris</string>
<string name="monthly">Månadsvis</string> <string name="monthly">Månadsvis</string>
<string name="annually">Årligen</string> <string name="annually">Årligen</string>
<string name="SSD_sort_my_order">Min ordning</string> <string name="SSD_sort_my_order">Min ordning</string>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="width_constrained">false</bool>
</resources>

@ -243,9 +243,6 @@
<string name="chip_style_outlined">கோடிட்டுக் காட்டப்பட்டுள்ளது</string> <string name="chip_style_outlined">கோடிட்டுக் காட்டப்பட்டுள்ளது</string>
<string name="chip_style">சிப் பாணி</string> <string name="chip_style">சிப் பாணி</string>
<string name="back">மீண்டும்</string> <string name="back">மீண்டும்</string>
<string name="upgrade_blurb_3">உங்கள் இலவச சோதனையைத் தொடங்க கீழே உள்ள எந்த சந்தா விலையையும் தேர்வு செய்யவும். நீங்கள் எந்த நேரத்திலும் ரத்து செய்யலாம்</string>
<string name="upgrade_blurb_2">நான் பணிகளில் ஆயிரக்கணக்கான மணிநேரங்களை செலவிட்டேன், மேலும் மூலக் குறியீடு அனைத்தையும் ஆன்லைனில் இலவசமாக வெளியிடுகிறேன். எனது பணியை ஆதரிக்க சில அம்சங்களுக்கு சந்தா தேவை</string>
<string name="upgrade_blurb_1">வணக்கம்! என் பெயர் அலெக்ஸ். பணிகளுக்குப் பின்னால் உள்ள சுயாதீன டெவலப்பர் நான்</string>
<string name="color_wheel">வண்ண சக்கரம்</string> <string name="color_wheel">வண்ண சக்கரம்</string>
<string name="invalid_username_or_password">தவறான பயனர்பெயர் அல்லது கடவுச்சொல்</string> <string name="invalid_username_or_password">தவறான பயனர்பெயர் அல்லது கடவுச்சொல்</string>
<string name="more_notification_settings_summary">ரிங்டோன், அதிர்வுகள் மற்றும் பல</string> <string name="more_notification_settings_summary">ரிங்டோன், அதிர்வுகள் மற்றும் பல</string>
@ -278,7 +275,6 @@
<string name="caldav_account_repeating_tasks">தொடர்ச்சியான பணிகளை சேவையாக அட்டவணைப்படுத்தட்டும்</string> <string name="caldav_account_repeating_tasks">தொடர்ச்சியான பணிகளை சேவையாக அட்டவணைப்படுத்தட்டும்</string>
<string name="annually">ஆண்டு</string> <string name="annually">ஆண்டு</string>
<string name="monthly">மாதாந்திர</string> <string name="monthly">மாதாந்திர</string>
<string name="name_your_price">உங்கள் விலைக்கு பெயரிடுங்கள்</string>
<string name="google_tasks_add_to_top">மேலே புதிய பணிகள்</string> <string name="google_tasks_add_to_top">மேலே புதிய பணிகள்</string>
<string name="invalid_backup_file">தவறான காப்பு கோப்பு</string> <string name="invalid_backup_file">தவறான காப்பு கோப்பு</string>
<string name="version_string">பதிப்பு %s</string> <string name="version_string">பதிப்பு %s</string>
@ -321,7 +317,6 @@
<string name="button_current_subscription">தற்போதைய சந்தா</string> <string name="button_current_subscription">தற்போதைய சந்தா</string>
<string name="button_subscribe">பதிவு</string> <string name="button_subscribe">பதிவு</string>
<string name="refresh_purchases">வாங்குதல்களைப் புதுப்பிக்கவும்</string> <string name="refresh_purchases">வாங்குதல்களைப் புதுப்பிக்கவும்</string>
<string name="manage_subscription_summary">உங்கள் சந்தாவை மேம்படுத்தவும், தரமிறக்கவும் அல்லது ரத்து செய்யவும்</string>
<string name="manage_subscription">சந்தாவை நிர்வகிக்கவும்</string> <string name="manage_subscription">சந்தாவை நிர்வகிக்கவும்</string>
<string name="upgrade_to_pro">சார்புக்கு மேம்படுத்தவும்</string> <string name="upgrade_to_pro">சார்புக்கு மேம்படுத்தவும்</string>
<string name="background_sync_unmetered_only">அளவிடப்படாத இணைப்புகளில் மட்டுமே</string> <string name="background_sync_unmetered_only">அளவிடப்படாத இணைப்புகளில் மட்டுமே</string>

@ -471,13 +471,11 @@
<string name="error_adding_account">Hata: %s</string> <string name="error_adding_account">Hata: %s</string>
<string name="list_separator_with_space">", "</string> <string name="list_separator_with_space">", "</string>
<string name="icon">Simge</string> <string name="icon">Simge</string>
<string name="manage_subscription_summary">Aboneliğinizi yükseltin, alçaltın veya iptal edin</string>
<string name="button_current_subscription">Geçerli abonelik</string> <string name="button_current_subscription">Geçerli abonelik</string>
<string name="button_restore_subscription">Aboneliği geri getir</string> <string name="button_restore_subscription">Aboneliği geri getir</string>
<string name="button_downgrade">Aboneliği alçalt</string> <string name="button_downgrade">Aboneliği alçalt</string>
<string name="button_upgrade">Aboneliği yükselt</string> <string name="button_upgrade">Aboneliği yükselt</string>
<string name="button_unsubscribe">Aboneliği iptal et</string> <string name="button_unsubscribe">Aboneliği iptal et</string>
<string name="name_your_price">Fiyat belirleyin</string>
<string name="monthly">Aylık</string> <string name="monthly">Aylık</string>
<string name="annually">Yıllık</string> <string name="annually">Yıllık</string>
<string name="SSD_sort_my_order">Düzenim</string> <string name="SSD_sort_my_order">Düzenim</string>
@ -527,9 +525,6 @@
<string name="invalid_username_or_password">Geçersiz kullanıcı adı veya parola</string> <string name="invalid_username_or_password">Geçersiz kullanıcı adı veya parola</string>
<string name="theme_system_default">Sistem öntanımlısı</string> <string name="theme_system_default">Sistem öntanımlısı</string>
<string name="color_wheel">Renk tekeri</string> <string name="color_wheel">Renk tekeri</string>
<string name="upgrade_blurb_1">Hey! Ben Alex. Tasks\'ın arkasındaki bağımsız geliştiriciyim</string>
<string name="upgrade_blurb_2">Binlerce saatimi Tasks\'ta çalışarak geçirdim, kaynak kodun tümünü çevrim içi olarak ücretsiz yayımladım. Çalışmamı desteklemek için bazı özellikler abonelik gerektirir</string>
<string name="upgrade_blurb_3">Ücretsiz denemenizi başlatmak için aşağıdan herhangi abonelik bedelini seçin. İstediğinizde iptal edebilirsiniz</string>
<string name="upgrade_blurb_4">Desteğiniz çok şey ifade ediyor, teşekkürler!</string> <string name="upgrade_blurb_4">Desteğiniz çok şey ifade ediyor, teşekkürler!</string>
<string name="back">Geri</string> <string name="back">Geri</string>
<string name="chip_style">Yonga biçimi</string> <string name="chip_style">Yonga biçimi</string>

@ -508,7 +508,6 @@
<string name="gtasks_GPr_header">Google Tasks</string> <string name="gtasks_GPr_header">Google Tasks</string>
<string name="button_restore_subscription">Відновити підписку</string> <string name="button_restore_subscription">Відновити підписку</string>
<string name="button_current_subscription">Поточна підписка</string> <string name="button_current_subscription">Поточна підписка</string>
<string name="manage_subscription_summary">Змініть або скасуйте підписку</string>
<string name="reenter_encryption_password">Підтвердіть пароль шифрування</string> <string name="reenter_encryption_password">Підтвердіть пароль шифрування</string>
<string name="encryption_password">Пароль шифрування</string> <string name="encryption_password">Пароль шифрування</string>
<string name="encryption_password_required">Потрібний пароль шифрування</string> <string name="encryption_password_required">Потрібний пароль шифрування</string>
@ -532,7 +531,6 @@
<string name="collapse_subtasks">Згорнути підзавдання</string> <string name="collapse_subtasks">Згорнути підзавдання</string>
<string name="expand_subtasks">Розгорнути підзавдання</string> <string name="expand_subtasks">Розгорнути підзавдання</string>
<string name="caldav_account_repeating_tasks">Дозволити серверу встановлювати регулярні завдання</string> <string name="caldav_account_repeating_tasks">Дозволити серверу встановлювати регулярні завдання</string>
<string name="name_your_price">Назвіть свою ціну</string>
<string name="annually">Щорічно</string> <string name="annually">Щорічно</string>
<string name="monthly">Щомісячно</string> <string name="monthly">Щомісячно</string>
<string name="this_feature_requires_a_subscription">Ця функція потребує підписки</string> <string name="this_feature_requires_a_subscription">Ця функція потребує підписки</string>
@ -562,9 +560,6 @@
<string name="chip_style">Стиль індикаторів списків</string> <string name="chip_style">Стиль індикаторів списків</string>
<string name="back">Назад</string> <string name="back">Назад</string>
<string name="upgrade_blurb_4">Ваша підтримка багато означає для мене. Дякую!</string> <string name="upgrade_blurb_4">Ваша підтримка багато означає для мене. Дякую!</string>
<string name="upgrade_blurb_3">Оберіть будь-яку вартість підписки знизу, щоб розпочати безоплатний пробний період. Його можна скасувати будь-коли</string>
<string name="upgrade_blurb_2">Я витратив тисячі годин, працюючи над Tasks, і я публікую весь код онлайн безоплатно. Щоб підтримати мою роботу, деякі функції потребують підписки</string>
<string name="upgrade_blurb_1">Привіт! Моє ім\'я Алекс. Я - незалежний розробник Tasks</string>
<string name="color_wheel">Палітра</string> <string name="color_wheel">Палітра</string>
<string name="invalid_username_or_password">Невірне ім\'я користувача або пароль</string> <string name="invalid_username_or_password">Невірне ім\'я користувача або пароль</string>
<string name="more_notification_settings_summary">Мелодія, вібрація та інше</string> <string name="more_notification_settings_summary">Мелодія, вібрація та інше</string>

@ -460,13 +460,11 @@
<string name="invalid_backup_file">无效的备份文件</string> <string name="invalid_backup_file">无效的备份文件</string>
<string name="google_tasks_add_to_top">新任务显示在顶部</string> <string name="google_tasks_add_to_top">新任务显示在顶部</string>
<string name="icon">图标</string> <string name="icon">图标</string>
<string name="manage_subscription_summary">升级,降级或取消您的订阅</string>
<string name="button_current_subscription">当前订阅</string> <string name="button_current_subscription">当前订阅</string>
<string name="button_restore_subscription">恢复订阅</string> <string name="button_restore_subscription">恢复订阅</string>
<string name="button_downgrade">降级订阅</string> <string name="button_downgrade">降级订阅</string>
<string name="button_upgrade">升级订阅</string> <string name="button_upgrade">升级订阅</string>
<string name="button_unsubscribe">取消订阅</string> <string name="button_unsubscribe">取消订阅</string>
<string name="name_your_price">您愿意支付多少费用</string>
<string name="monthly">每月</string> <string name="monthly">每月</string>
<string name="annually">每年</string> <string name="annually">每年</string>
<string name="list_separator_with_space">" "</string> <string name="list_separator_with_space">" "</string>
@ -518,9 +516,6 @@
<string name="invalid_username_or_password">无效的用户名或密码</string> <string name="invalid_username_or_password">无效的用户名或密码</string>
<string name="theme_system_default">系统默认</string> <string name="theme_system_default">系统默认</string>
<string name="color_wheel">给滚轮着色</string> <string name="color_wheel">给滚轮着色</string>
<string name="upgrade_blurb_1">你好我叫Alex是Tasks背后的独立开发者</string>
<string name="upgrade_blurb_2">我已经花了数千个小时用于开发Tasks并且在网上免费发布了所有源代码。 为了支持我的工作,某些功能需要订阅</string>
<string name="upgrade_blurb_3">选择下方任意订阅价格即可开始免费试用。 你可以随时取消</string>
<string name="upgrade_blurb_4">您的支持对我很重要,谢谢!</string> <string name="upgrade_blurb_4">您的支持对我很重要,谢谢!</string>
<string name="back">返回</string> <string name="back">返回</string>
<string name="chip_style">流式布局样式</string> <string name="chip_style">流式布局样式</string>

@ -4,4 +4,5 @@
<bool name="default_bundle_notifications">false</bool> <bool name="default_bundle_notifications">false</bool>
<bool name="is_dark">false</bool> <bool name="is_dark">false</bool>
<bool name="whats_new_action">false</bool> <bool name="whats_new_action">false</bool>
<bool name="width_constrained">true</bool>
</resources> </resources>

@ -7,6 +7,7 @@
<string name="app_package">org.tasks</string> <string name="app_package">org.tasks</string>
<string name="opentasks_authority" tools:node="replace">org.tasks.opentasks</string> <string name="opentasks_authority" tools:node="replace">org.tasks.opentasks</string>
<string name="backup_api_key">AEdPqrEAAAAI49v5bBusi_bq1bgLBB1LIsepNV0eBrFkQrBZkw</string> <string name="backup_api_key">AEdPqrEAAAAI49v5bBusi_bq1bgLBB1LIsepNV0eBrFkQrBZkw</string>
<string name="google_sign_in" tools:ignore="TypographyDashes">1006257750459-3jt0e32kbqgug7hkluqe26d5mbno92no.apps.googleusercontent.com</string>
<string name="mdtp_ok">@string/ok</string> <string name="mdtp_ok">@string/ok</string>
<string name="mdtp_cancel">@string/cancel</string> <string name="mdtp_cancel">@string/cancel</string>
<string name="FSA_label">Tasks Shortcut</string> <string name="FSA_label">Tasks Shortcut</string>
@ -17,6 +18,27 @@
<string name="etesync_url">https://api.etesync.com</string> <string name="etesync_url">https://api.etesync.com</string>
<string name="help_url_sync">https://tasks.org/sync</string> <string name="help_url_sync">https://tasks.org/sync</string>
<!-- Eventually these should be moved to strings.xml for translation -->
<string name="upgrade_header">Subscribe to unlock additional features and support open source software!</string>
<string name="upgrade_sync_with_tasks">Sync with Tasks.org</string>
<string name="upgrade_no_platform_lock_in">No platform lock-in</string>
<string name="upgrade_open_internet_standards">Tasks.org is based on open internet standards</string>
<string name="upgrade_customer">You are the customer</string>
<string name="upgrade_privacy">Tasks.org does not monetize you or your data</string>
<string name="upgrade_coming_soon">Many new features coming soon!</string>
<string name="upgrade_synchronization">Sync with third-party or self-hosted servers</string>
<string name="upgrade_etesync">End-to-end encryption with EteSync</string>
<string name="upgrade_google_tasks">Multiple Google Task accounts</string>
<string name="upgrade_additional_features">Additional features</string>
<string name="upgrade_themes">Unlock all themes, colors, and icons</string>
<string name="upgrade_google_places">Improved location search with Google Places</string>
<string name="upgrade_tasker">Tasker plugins</string>
<string name="upgrade_free_trial">New subscribers receive a 7-day free trial</string>
<string name="upgrade_downgrade">Upgrade or downgrade at any time</string>
<string name="upgrade_balance">Your remaining balance will apply to your new subscription</string>
<string name="upgrade_cancel">Cancel at any time</string>
<string name="upgrade_benefits_retained">benefits are retained until the end of your billing period</string>
<string name="p_date_shortcut_morning">date_shortcut_morning</string> <string name="p_date_shortcut_morning">date_shortcut_morning</string>
<string name="p_date_shortcut_afternoon">date_shortcut_afternoon</string> <string name="p_date_shortcut_afternoon">date_shortcut_afternoon</string>
<string name="p_date_shortcut_evening">date_shortcut_evening</string> <string name="p_date_shortcut_evening">date_shortcut_evening</string>

@ -489,8 +489,7 @@ File %1$s contained %2$s.\n\n
<string name="network_error">Could not connect</string> <string name="network_error">Could not connect</string>
<string name="background_sync_unmetered_only">Only on unmetered connections</string> <string name="background_sync_unmetered_only">Only on unmetered connections</string>
<string name="upgrade_to_pro">Upgrade to pro</string> <string name="upgrade_to_pro">Upgrade to pro</string>
<string name="manage_subscription">Manage subscription</string> <string name="manage_subscription">Modify subscription</string>
<string name="manage_subscription_summary">Upgrade, downgrade, or cancel your subscription</string>
<string name="refresh_purchases">Refresh purchases</string> <string name="refresh_purchases">Refresh purchases</string>
<string name="button_subscribe">Subscribe</string> <string name="button_subscribe">Subscribe</string>
<string name="button_current_subscription">Current subscription</string> <string name="button_current_subscription">Current subscription</string>
@ -534,7 +533,7 @@ File %1$s contained %2$s.\n\n
<string name="version_string">Version %s</string> <string name="version_string">Version %s</string>
<string name="invalid_backup_file">Invalid backup file</string> <string name="invalid_backup_file">Invalid backup file</string>
<string name="google_tasks_add_to_top">New tasks on top</string> <string name="google_tasks_add_to_top">New tasks on top</string>
<string name="name_your_price">Name your price</string> <string name="more_options">More options</string>
<string name="monthly">Monthly</string> <string name="monthly">Monthly</string>
<string name="annually">Yearly</string> <string name="annually">Yearly</string>
<string name="caldav_account_repeating_tasks">Let server schedule recurring tasks</string> <string name="caldav_account_repeating_tasks">Let server schedule recurring tasks</string>
@ -569,9 +568,6 @@ File %1$s contained %2$s.\n\n
<string name="more_notification_settings_summary">Ringtone, vibrations, and more</string> <string name="more_notification_settings_summary">Ringtone, vibrations, and more</string>
<string name="invalid_username_or_password">Invalid username or password</string> <string name="invalid_username_or_password">Invalid username or password</string>
<string name="color_wheel">Color wheel</string> <string name="color_wheel">Color wheel</string>
<string name="upgrade_blurb_1">Hi! My name is Alex. I am the independent developer behind Tasks</string>
<string name="upgrade_blurb_2">I have spent thousands of hours working on Tasks, and I publish all of the source code online for free. In order to support my work some features require a subscription</string>
<string name="upgrade_blurb_3">Choose any subscription price below to start your free trial. You may cancel at any time</string>
<string name="upgrade_blurb_4">Your support means a lot to me, thank you!</string> <string name="upgrade_blurb_4">Your support means a lot to me, thank you!</string>
<string name="back">Back</string> <string name="back">Back</string>
<string name="chip_style">Chip style</string> <string name="chip_style">Chip style</string>
@ -658,4 +654,8 @@ File %1$s contained %2$s.\n\n
<string name="delete_comment">Delete this comment?</string> <string name="delete_comment">Delete this comment?</string>
<string name="custom_filter_has_subtask">Has subtasks</string> <string name="custom_filter_has_subtask">Has subtasks</string>
<string name="custom_filter_is_subtask">Is subtask</string> <string name="custom_filter_is_subtask">Is subtask</string>
<string name="price_per_year">$%s/year</string>
<string name="price_per_year_abbreviated">$%s/yr</string>
<string name="price_per_month">$%s/month</string>
<string name="price_per_month_abbreviated">$%s/mo</string>
</resources> </resources>

@ -51,11 +51,11 @@
android:key="@string/upgrade_to_pro" android:key="@string/upgrade_to_pro"
android:title="@string/upgrade_to_pro" android:title="@string/upgrade_to_pro"
app:allowDividerAbove="true" app:allowDividerAbove="true"
app:icon="@drawable/ic_outline_attach_money_24px"> app:icon="@drawable/ic_outline_attach_money_24px" />
<intent
android:targetClass="org.tasks.billing.PurchaseActivity" <Preference
android:targetPackage="@string/app_package" /> android:key="@string/button_unsubscribe"
</Preference> android:title="@string/button_unsubscribe"/>
<Preference <Preference
android:key="@string/refresh_purchases" android:key="@string/refresh_purchases"

Loading…
Cancel
Save