summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java9
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java9
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java11
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/view/ShownotesWebView.java2
-rw-r--r--app/src/main/res/menu/feedlist.xml2
-rw-r--r--app/src/main/res/menu/nav_feed_action_speeddial.xml2
-rw-r--r--app/src/main/res/menu/nav_feed_context.xml2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java18
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java71
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java8
-rw-r--r--core/src/main/res/values-v23/styles.xml2
-rw-r--r--core/src/main/res/values/styles.xml3
-rw-r--r--net/sync/gpoddernet/build.gradle2
-rw-r--r--net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/HostnameParser.java16
-rw-r--r--net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java6
-rw-r--r--net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudSyncService.java17
-rw-r--r--net/sync/gpoddernet/src/test/java/de/danoeh/antennapod/net/sync/HostnameParserTest.java43
-rw-r--r--ui/i18n/src/main/res/values-br/strings.xml21
-rw-r--r--ui/i18n/src/main/res/values-ca/strings.xml20
-rw-r--r--ui/i18n/src/main/res/values-da/strings.xml6
-rw-r--r--ui/i18n/src/main/res/values-de/strings.xml8
-rw-r--r--ui/i18n/src/main/res/values-fr/strings.xml4
-rw-r--r--ui/i18n/src/main/res/values-hu/strings.xml23
-rw-r--r--ui/i18n/src/main/res/values-it/strings.xml42
-rw-r--r--ui/i18n/src/main/res/values-ja/strings.xml8
-rw-r--r--ui/i18n/src/main/res/values-lt/strings.xml25
-rw-r--r--ui/i18n/src/main/res/values-nl/strings.xml96
-rw-r--r--ui/i18n/src/main/res/values-pl/strings.xml48
-rw-r--r--ui/i18n/src/main/res/values-pt-rBR/strings.xml19
-rw-r--r--ui/i18n/src/main/res/values-ru/strings.xml4
-rw-r--r--ui/i18n/src/main/res/values-sk/strings.xml44
-rw-r--r--ui/i18n/src/main/res/values-sv/strings.xml20
-rw-r--r--ui/i18n/src/main/res/values/strings.xml2
50 files changed, 526 insertions, 180 deletions
diff --git a/app/build.gradle b/app/build.gradle
index deaa5893d..6a19bebb2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,8 +11,8 @@ android {
// Version code schema:
// "1.2.3-beta4" -> 1020304
// "1.2.3" -> 1020395
- versionCode 2050003
- versionName "2.5.0-beta3"
+ versionCode 2050195
+ versionName "2.5.1"
def commit = ""
try {
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
index 3dfe661d1..7a26759cc 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
@@ -51,7 +51,6 @@ import de.danoeh.antennapod.core.service.download.HttpDownloader;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter;
-import de.danoeh.antennapod.core.util.FileNameGenerator;
import de.danoeh.antennapod.parser.feed.FeedHandler;
import de.danoeh.antennapod.parser.feed.FeedHandlerResult;
import de.danoeh.antennapod.model.download.DownloadError;
@@ -292,12 +291,11 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
Log.d(TAG, "Starting feed download");
url = URLChecker.prepareURL(url);
feed = new Feed(url, null);
- String fileUrl = new File(getExternalCacheDir(),
- FileNameGenerator.generateFileName(feed.getDownload_url())).toString();
- feed.setFile_url(fileUrl);
- final DownloadRequest request = new DownloadRequest(feed.getFile_url(),
- feed.getDownload_url(), "OnlineFeed", 0, Feed.FEEDFILETYPE_FEED, username, password,
- true, null, true);
+ DownloadRequest request = DownloadRequestCreator.create(feed)
+ .withAuthentication(username, password)
+ .withInitiatedByUser(true)
+ .build();
+ feed.setFile_url(request.getDestination());
download = Observable.fromCallable(() -> {
feeds = DBReader.getFeedList();
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java
index 80437abbb..cf0a96e91 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java
@@ -266,7 +266,7 @@ public class CompletedDownloadsFragment extends Fragment implements
speedDialView.setVisibility(View.GONE);
}
- private static class CompletedDownloadsListAdapter extends EpisodeItemListAdapter {
+ private class CompletedDownloadsListAdapter extends EpisodeItemListAdapter {
public CompletedDownloadsListAdapter(MainActivity mainActivity) {
super(mainActivity);
@@ -286,6 +286,7 @@ public class CompletedDownloadsFragment extends Fragment implements
if (!inActionMode()) {
menu.findItem(R.id.multi_select).setVisible(true);
}
+ MenuItemUtils.setOnClickListeners(menu, CompletedDownloadsFragment.this::onContextItemSelected);
}
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
index dd2afeeba..0a402a14b 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
@@ -2,6 +2,7 @@ package de.danoeh.antennapod.fragment;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.view.ContextMenu;
import android.view.KeyEvent;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
@@ -286,7 +287,13 @@ public abstract class EpisodesListFragment extends Fragment {
*/
private void createRecycleAdapter(RecyclerView recyclerView, EmptyViewHandler emptyViewHandler) {
MainActivity mainActivity = (MainActivity) getActivity();
- listAdapter = new EpisodeItemListAdapter(mainActivity);
+ listAdapter = new EpisodeItemListAdapter(mainActivity) {
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ MenuItemUtils.setOnClickListeners(menu, EpisodesListFragment.this::onContextItemSelected);
+ }
+ };
listAdapter.updateItems(episodes);
recyclerView.setAdapter(listAdapter);
emptyViewHandler.updateAdapter(listAdapter);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
index 9784f521d..fbba99663 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
@@ -309,7 +309,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
if (itemId == R.id.rename_item) {
new RenameItemDialog(getActivity(), feed).show();
return true;
- } else if (itemId == R.id.remove_item) {
+ } else if (itemId == R.id.remove_feed) {
((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null);
RemoveFeedDialog.show(getContext(), feed);
return true;
@@ -655,7 +655,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
}
}
- private static class FeedItemListAdapter extends EpisodeItemListAdapter {
+ private class FeedItemListAdapter extends EpisodeItemListAdapter {
public FeedItemListAdapter(MainActivity mainActivity) {
super(mainActivity);
}
@@ -671,6 +671,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
if (!inActionMode()) {
menu.findItem(R.id.multi_select).setVisible(true);
}
+ MenuItemUtils.setOnClickListeners(menu, FeedItemlistFragment.this::onContextItemSelected);
}
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java
index a5cabeb29..bd4f3dd21 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java
@@ -28,6 +28,7 @@ import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.activity.PreferenceActivity;
import de.danoeh.antennapod.adapter.NavListAdapter;
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
+import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
import de.danoeh.antennapod.event.FeedListUpdateEvent;
import de.danoeh.antennapod.event.QueueEvent;
import de.danoeh.antennapod.event.UnreadItemsUpdateEvent;
@@ -132,6 +133,7 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS
} else {
inflater.inflate(R.menu.nav_folder_context, menu);
}
+ MenuItemUtils.setOnClickListeners(menu, this::onContextItemSelected);
}
@Override
@@ -169,7 +171,7 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS
} else if (itemId == R.id.rename_item) {
new RenameItemDialog(getActivity(), feed).show();
return true;
- } else if (itemId == R.id.remove_item) {
+ } else if (itemId == R.id.remove_feed) {
((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null);
RemoveFeedDialog.show(getContext(), feed);
return true;
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
index 54c98c0ce..857b59967 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
@@ -2,6 +2,7 @@ package de.danoeh.antennapod.fragment;
import android.os.Bundle;
import android.util.Log;
+import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MenuItem;
@@ -17,6 +18,7 @@ import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
import de.danoeh.antennapod.core.event.DownloadEvent;
import de.danoeh.antennapod.core.event.DownloaderUpdate;
+import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
import de.danoeh.antennapod.event.FeedItemEvent;
import de.danoeh.antennapod.event.playback.PlaybackHistoryEvent;
import de.danoeh.antennapod.event.playback.PlaybackPositionEvent;
@@ -245,7 +247,7 @@ public class PlaybackHistoryFragment extends Fragment implements Toolbar.OnMenuI
return history;
}
- private static class PlaybackHistoryListAdapter extends EpisodeItemListAdapter {
+ private class PlaybackHistoryListAdapter extends EpisodeItemListAdapter {
public PlaybackHistoryListAdapter(MainActivity mainActivity) {
super(mainActivity);
@@ -258,5 +260,11 @@ public class PlaybackHistoryFragment extends Fragment implements Toolbar.OnMenuI
// it harder to read.
holder.itemView.setAlpha(1.0f);
}
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ MenuItemUtils.setOnClickListeners(menu, PlaybackHistoryFragment.this::onContextItemSelected);
+ }
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
index a79e066e1..2a89519a5 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -7,6 +7,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
+import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MenuItem;
@@ -522,7 +523,13 @@ public class QueueFragment extends Fragment implements Toolbar.OnMenuItemClickLi
if (queue != null) {
if (recyclerAdapter == null) {
MainActivity activity = (MainActivity) getActivity();
- recyclerAdapter = new QueueRecyclerAdapter(activity, swipeActions);
+ recyclerAdapter = new QueueRecyclerAdapter(activity, swipeActions) {
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ MenuItemUtils.setOnClickListeners(menu, QueueFragment.this::onContextItemSelected);
+ }
+ };
recyclerAdapter.setOnSelectModeListener(this);
recyclerView.setAdapter(recyclerAdapter);
emptyView.updateAdapter(recyclerAdapter);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
index 1a3962de2..0142498a8 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
@@ -7,6 +7,7 @@ import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.util.Pair;
+import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@@ -29,6 +30,7 @@ import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
import de.danoeh.antennapod.adapter.FeedSearchResultAdapter;
import de.danoeh.antennapod.core.event.DownloadEvent;
import de.danoeh.antennapod.core.event.DownloaderUpdate;
+import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
import de.danoeh.antennapod.event.FeedItemEvent;
import de.danoeh.antennapod.event.playback.PlaybackPositionEvent;
import de.danoeh.antennapod.event.PlayerStatusEvent;
@@ -129,7 +131,13 @@ public class SearchFragment extends Fragment {
recyclerView = layout.findViewById(R.id.recyclerView);
recyclerView.setRecycledViewPool(((MainActivity) getActivity()).getRecycledViewPool());
- adapter = new EpisodeItemListAdapter((MainActivity) getActivity());
+ adapter = new EpisodeItemListAdapter((MainActivity) getActivity()) {
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ MenuItemUtils.setOnClickListeners(menu, SearchFragment.this::onContextItemSelected);
+ }
+ };
recyclerView.setAdapter(adapter);
RecyclerView recyclerViewFeeds = layout.findViewById(R.id.recyclerViewFeeds);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
index 75d8aea82..ec3240496 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
@@ -8,6 +8,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
+import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@@ -256,7 +257,13 @@ public class SubscriptionFragment extends Fragment
@Override
public void onViewCreated(@NonNull View v, Bundle savedInstanceState) {
super.onViewCreated(v, savedInstanceState);
- subscriptionAdapter = new SubscriptionsRecyclerAdapter((MainActivity) getActivity());
+ subscriptionAdapter = new SubscriptionsRecyclerAdapter((MainActivity) getActivity()) {
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+ MenuItemUtils.setOnClickListeners(menu, SubscriptionFragment.this::onContextItemSelected);
+ }
+ };
subscriptionAdapter.setOnSelectModeListener(this);
subscriptionRecycler.setAdapter(subscriptionAdapter);
setupEmptyView();
@@ -361,7 +368,7 @@ public class SubscriptionFragment extends Fragment
} else if (itemId == R.id.rename_item) {
new RenameItemDialog(getActivity(), feed).show();
return true;
- } else if (itemId == R.id.remove_item) {
+ } else if (itemId == R.id.remove_feed) {
RemoveFeedDialog.show(getContext(), feed);
return true;
} else if (itemId == R.id.multi_select) {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java b/app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java
index 9067b17a7..5cd0f26ab 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java
@@ -34,7 +34,7 @@ public class FeedMultiSelectActionHandler {
}
public void handleAction(int id) {
- if (id == R.id.remove_item) {
+ if (id == R.id.remove_feed) {
RemoveFeedDialog.show(activity, selectedItems);
} else if (id == R.id.keep_updated) {
keepUpdatedPrefHandler();
diff --git a/app/src/main/java/de/danoeh/antennapod/view/ShownotesWebView.java b/app/src/main/java/de/danoeh/antennapod/view/ShownotesWebView.java
index ae6e88c45..22744eee6 100644
--- a/app/src/main/java/de/danoeh/antennapod/view/ShownotesWebView.java
+++ b/app/src/main/java/de/danoeh/antennapod/view/ShownotesWebView.java
@@ -25,6 +25,7 @@ import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
+import de.danoeh.antennapod.core.menuhandler.MenuItemUtils;
import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.NetworkUtils;
@@ -170,6 +171,7 @@ public class ShownotesWebView extends WebView implements View.OnLongClickListene
menu.add(Menu.NONE, R.id.share_url_item, Menu.NONE, R.string.share_url_label);
menu.setHeaderTitle(selectedUrl);
}
+ MenuItemUtils.setOnClickListeners(menu, this::onContextItemSelected);
}
public void setTimecodeSelectedListener(Consumer<Integer> timecodeSelectedListener) {
diff --git a/app/src/main/res/menu/feedlist.xml b/app/src/main/res/menu/feedlist.xml
index 12cbc2e5e..3c66ec4ba 100644
--- a/app/src/main/res/menu/feedlist.xml
+++ b/app/src/main/res/menu/feedlist.xml
@@ -70,7 +70,7 @@
custom:showAsAction="never" />
<item
- android:id="@+id/remove_item"
+ android:id="@+id/remove_feed"
android:icon="@drawable/ic_delete"
android:menuCategory="container"
android:title="@string/remove_feed_label"
diff --git a/app/src/main/res/menu/nav_feed_action_speeddial.xml b/app/src/main/res/menu/nav_feed_action_speeddial.xml
index d08aa645f..15f2511fb 100644
--- a/app/src/main/res/menu/nav_feed_action_speeddial.xml
+++ b/app/src/main/res/menu/nav_feed_action_speeddial.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
- android:id="@+id/remove_item"
+ android:id="@+id/remove_feed"
android:menuCategory="container"
android:title="@string/remove_feed_label"
android:icon="@drawable/ic_delete"/>
diff --git a/app/src/main/res/menu/nav_feed_context.xml b/app/src/main/res/menu/nav_feed_context.xml
index 3f5127f36..445ce91df 100644
--- a/app/src/main/res/menu/nav_feed_context.xml
+++ b/app/src/main/res/menu/nav_feed_context.xml
@@ -17,7 +17,7 @@
android:title="@string/rename_feed_label" />
<item
- android:id="@+id/remove_item"
+ android:id="@+id/remove_feed"
android:menuCategory="container"
android:title="@string/remove_feed_label" />
diff --git a/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java b/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java
index d5181b2b7..cfa35ea29 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java
@@ -35,4 +35,22 @@ public class MenuItemUtils {
public interface UpdateRefreshMenuItemChecker {
boolean isRefreshing();
}
+
+ /**
+ * When pressing a context menu item, Android calls onContextItemSelected
+ * for ALL fragments in arbitrary order, not just for the fragment that the
+ * context menu was created from. This assigns the listener to every menu item,
+ * so that the correct fragment is always called first and can consume the click.
+ * <p />
+ * Note that Android still calls the onContextItemSelected methods of all fragments
+ * when the passed listener returns false.
+ */
+ public static void setOnClickListeners(Menu menu, MenuItem.OnMenuItemClickListener listener) {
+ for (int i = 0; i < menu.size(); i++) {
+ if (menu.getItem(i).getSubMenu() != null) {
+ setOnClickListeners(menu.getItem(i).getSubMenu(), listener);
+ }
+ menu.getItem(i).setOnMenuItemClickListener(listener);
+ }
+ }
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
index f6caa9016..081b7d5f0 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
@@ -9,6 +9,7 @@ import android.util.Log;
import android.view.KeyEvent;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.app.NotificationCompat;
import androidx.preference.PreferenceManager;
@@ -866,51 +867,39 @@ public class UserPreferences {
*
* @param type The name of the folder inside the data folder. May be null
* when accessing the root of the data folder.
- * @return The data folder that has been requested or null if the folder
- * could not be created.
+ * @return The data folder that has been requested or null if the folder could not be created.
*/
- public static File getDataFolder(String type) {
- String strDir = prefs.getString(PREF_DATA_FOLDER, null);
- if (strDir == null) {
- Log.d(TAG, "Using default data folder");
- return context.getExternalFilesDir(type);
- } else {
- File dataDir = new File(strDir);
- if (!dataDir.exists()) {
- if (!dataDir.mkdir()) {
- Log.w(TAG, "Could not create data folder");
- return null;
- }
- }
+ public static File getDataFolder(@Nullable String type) {
+ File dataFolder = getTypeDir(prefs.getString(PREF_DATA_FOLDER, null), type);
+ if (dataFolder == null || !dataFolder.canWrite()) {
+ Log.d(TAG, "User data folder not writable or not set. Trying default.");
+ dataFolder = context.getExternalFilesDir(type);
+ }
+ if (dataFolder == null || !dataFolder.canWrite()) {
+ Log.d(TAG, "Default data folder not available or not writable. Falling back to internal memory.");
+ dataFolder = getTypeDir(context.getFilesDir().getAbsolutePath(), type);
+ }
+ return dataFolder;
+ }
- if (type == null) {
- return dataDir;
- } else {
- // handle path separators
- String[] dirs = type.split("/");
- for (int i = 0; i < dirs.length; i++) {
- if (dirs.length > 0) {
- if (i < dirs.length - 1) {
- dataDir = getDataFolder(dirs[i]);
- if (dataDir == null) {
- return null;
- }
- }
- type = dirs[i];
- }
- }
- File typeDir = new File(dataDir, type);
- if (!typeDir.exists()) {
- if (dataDir.canWrite()) {
- if (!typeDir.mkdir()) {
- Log.e(TAG, "Could not create data folder named " + type);
- return null;
- }
- }
- }
- return typeDir;
+ @Nullable
+ private static File getTypeDir(@Nullable String baseDirPath, @Nullable String type) {
+ if (baseDirPath == null) {
+ return null;
+ }
+ File baseDir = new File(baseDirPath);
+ File typeDir = type == null ? baseDir : new File(baseDir, type);
+ if (!typeDir.exists()) {
+ if (!baseDir.canWrite()) {
+ Log.e(TAG, "Base dir is not writable " + baseDir.getAbsolutePath());
+ return null;
+ }
+ if (!typeDir.mkdirs()) {
+ Log.e(TAG, "Could not create type dir " + typeDir.getAbsolutePath());
+ return null;
}
}
+ return typeDir;
}
public static void setDataFolder(String dir) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java
index 789cde714..fc708ef6a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java
@@ -290,8 +290,9 @@ public class DownloadRequest implements Parcelable {
this.feedfileType = feed.getTypeAsInt();
}
- public void setInitiatedByUser(boolean initiatedByUser) {
+ public Builder withInitiatedByUser(boolean initiatedByUser) {
this.initiatedByUser = initiatedByUser;
+ return this;
}
public void setForce(boolean force) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
index 4869b3faa..1cd456072 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
@@ -508,7 +508,7 @@ public class DownloadService extends Service {
for (Feed feed : feeds) {
if (feed.getPreferences().getKeepUpdated()) {
DownloadRequest.Builder builder = DownloadRequestCreator.create(feed);
- builder.setInitiatedByUser(initiatedByUser);
+ builder.withInitiatedByUser(initiatedByUser);
addNewRequest(builder.build());
}
}
@@ -554,7 +554,7 @@ public class DownloadService extends Service {
*
* @param status the download that is going to be saved
*/
- private void saveDownloadStatus(DownloadStatus status) {
+ private void saveDownloadStatus(@NonNull DownloadStatus status) {
reportQueue.add(status);
DBWriter.addDownloadStatus(status);
}
@@ -664,7 +664,6 @@ public class DownloadService extends Service {
if (notificationUpdater != null) {
notificationUpdater.run();
}
- downloadEnqueueExecutor.shutdown(); // Do not accept new downloads
cancelNotificationUpdater();
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);
stopSelf();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java
index 22981dcda..dc5893b23 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java
@@ -2,6 +2,7 @@ package de.danoeh.antennapod.core.service.download.handler;
import android.text.TextUtils;
import android.util.Log;
+import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedPreferences;
@@ -18,6 +19,7 @@ import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
+import java.util.Date;
import java.util.concurrent.Callable;
public class FeedParserTask implements Callable<FeedHandlerResult> {
@@ -28,6 +30,10 @@ public class FeedParserTask implements Callable<FeedHandlerResult> {
public FeedParserTask(DownloadRequest request) {
this.request = request;
+ downloadStatus = new DownloadStatus(
+ 0, request.getTitle(), 0, request.getFeedfileType(), false,
+ false, true, DownloadError.ERROR_REQUEST_ERROR, new Date(),
+ "Unknown error: Status not set", request.isInitiatedByUser());
}
@Override
@@ -112,6 +118,7 @@ public class FeedParserTask implements Callable<FeedHandlerResult> {
}
}
+ @NonNull
public DownloadStatus getDownloadStatus() {
return downloadStatus;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java
index 042a903d3..5e97c233f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java
@@ -2,6 +2,7 @@ package de.danoeh.antennapod.core.service.download.handler;
import android.content.Context;
+import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.core.service.download.DownloadRequest;
import de.danoeh.antennapod.model.download.DownloadStatus;
@@ -11,19 +12,17 @@ import de.danoeh.antennapod.parser.feed.FeedHandlerResult;
public class FeedSyncTask {
private final DownloadRequest request;
private final Context context;
- private DownloadStatus downloadStatus;
private Feed savedFeed;
+ private final FeedParserTask task;
public FeedSyncTask(Context context, DownloadRequest request) {
this.request = request;
this.context = context;
+ this.task = new FeedParserTask(request);
}
public boolean run() {
- FeedParserTask task = new FeedParserTask(request);
FeedHandlerResult result = task.call();
- downloadStatus = task.getDownloadStatus();
-
if (!task.isSuccessful()) {
return false;
}
@@ -39,8 +38,9 @@ public class FeedSyncTask {
return true;
}
+ @NonNull
public DownloadStatus getDownloadStatus() {
- return downloadStatus;
+ return task.getDownloadStatus();
}
public Feed getSavedFeed() {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java
index 4aa76f453..b30f44eec 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java
@@ -29,20 +29,18 @@ import de.danoeh.antennapod.net.sync.model.EpisodeAction;
public class MediaDownloadedHandler implements Runnable {
private static final String TAG = "MediaDownloadedHandler";
private final DownloadRequest request;
- private final DownloadStatus status;
private final Context context;
private DownloadStatus updatedStatus;
public MediaDownloadedHandler(@NonNull Context context, @NonNull DownloadStatus status,
@NonNull DownloadRequest request) {
- this.status = status;
this.request = request;
this.context = context;
+ this.updatedStatus = status;
}
@Override
public void run() {
- updatedStatus = status;
FeedMedia media = DBReader.getFeedMedia(request.getFeedfileId());
if (media == null) {
Log.e(TAG, "Could not find downloaded media object in database");
@@ -111,6 +109,7 @@ public class MediaDownloadedHandler implements Runnable {
}
}
+ @NonNull
public DownloadStatus getUpdatedStatus() {
return updatedStatus;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java
index f2afa6fd1..52638ca77 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java
@@ -96,7 +96,7 @@ public class AutomaticDownloadAlgorithm {
List<DownloadRequest> requests = new ArrayList<>();
for (FeedItem episode : itemsToDownload) {
DownloadRequest.Builder request = DownloadRequestCreator.create(episode.getMedia());
- request.setInitiatedByUser(false);
+ request.withInitiatedByUser(false);
requests.add(request.build());
}
DownloadService.download(context, false, requests.toArray(new DownloadRequest[0]));
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
index 64cf446aa..528ded708 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
@@ -103,7 +103,10 @@ public final class DBReader {
try (Cursor cursor = adapter.getFeedCursorDownloadUrls()) {
List<String> result = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
- result.add(cursor.getString(1));
+ String url = cursor.getString(1);
+ if (url != null && !url.startsWith(Feed.PREFIX_LOCAL_FOLDER)) {
+ result.add(url);
+ }
}
return result;
} finally {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
index e5310c4ff..6ec27c01e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
@@ -162,7 +162,7 @@ public final class DBTasks {
private static void forceRefreshFeed(Context context, Feed feed, boolean loadAllPages, boolean initiatedByUser) {
DownloadRequest.Builder builder = DownloadRequestCreator.create(feed);
- builder.setInitiatedByUser(initiatedByUser);
+ builder.withInitiatedByUser(initiatedByUser);
builder.setForce(true);
builder.loadAllPages(loadAllPages);
DownloadService.download(context, false, builder.build());
diff --git a/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java b/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java
index 6d6d7bb41..0640f7577 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java
@@ -145,6 +145,10 @@ public class SyncService extends Worker {
Log.d(TAG, "Downloaded subscription changes: " + subscriptionChanges);
for (String downloadUrl : subscriptionChanges.getAdded()) {
+ if (!downloadUrl.startsWith("http")) { // Also matches https
+ Log.d(TAG, "Skipping url: " + downloadUrl);
+ continue;
+ }
if (!URLChecker.containsUrl(localSubscriptions, downloadUrl) && !queuedRemovedFeeds.contains(downloadUrl)) {
Feed feed = new Feed(downloadUrl, null);
DownloadRequest.Builder builder = DownloadRequestCreator.create(feed);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java
index dbad1f63e..674082a13 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java
@@ -123,7 +123,7 @@ public class AutoUpdateManager {
Log.d(TAG, "Run auto update immediately in background.");
if (!NetworkUtils.networkAvailable()) {
Log.d(TAG, "Ignoring: No network connection.");
- } else if (NetworkUtils.isEpisodeDownloadAllowed()) {
+ } else if (NetworkUtils.isFeedRefreshAllowed()) {
startRefreshAllFeeds(context);
} else {
confirmMobileAllFeedsRefresh(context);
@@ -134,8 +134,12 @@ public class AutoUpdateManager {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle(R.string.feed_refresh_title)
.setMessage(R.string.confirm_mobile_feed_refresh_dialog_message)
- .setPositiveButton(R.string.yes,
+ .setPositiveButton(R.string.confirm_mobile_streaming_button_once,
(dialog, which) -> startRefreshAllFeeds(context))
+ .setNeutralButton(R.string.confirm_mobile_streaming_button_always, (dialog, which) -> {
+ UserPreferences.setAllowMobileFeedRefresh(true);
+ startRefreshAllFeeds(context);
+ })
.setNegativeButton(R.string.no, null);
builder.show();
}
diff --git a/core/src/main/res/values-v23/styles.xml b/core/src/main/res/values-v23/styles.xml
index dde8e41ae..33c64ad4a 100644
--- a/core/src/main/res/values-v23/styles.xml
+++ b/core/src/main/res/values-v23/styles.xml
@@ -4,7 +4,7 @@
<item name="android:windowContentTransitions">true</item>
<item name="android:statusBarColor">@color/background_light</item>
<item name="android:windowLightStatusBar">true</item>
- <item name="android:navigationBarColor">@color/background_light</item>
+ <item name="android:navigationBarColor">@color/grey600</item>
</style>
<style name="Theme.AntennaPod.Dark" parent="Theme.Base.AntennaPod.Dark">
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index 8c15d35c0..2fa76eae5 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -109,7 +109,6 @@
<style name="Theme.AntennaPod.Light.Translucent" parent="Theme.AntennaPod.Light.NoTitle">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:background">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowAnimationStyle">@style/AnimationFade</item>
@@ -120,7 +119,6 @@
<style name="Theme.AntennaPod.Dark.Translucent" parent="Theme.AntennaPod.Dark.NoTitle">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:background">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowAnimationStyle">@style/AnimationFade</item>
@@ -131,7 +129,6 @@
<style name="Theme.AntennaPod.TrueBlack.Translucent" parent="Theme.AntennaPod.TrueBlack">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:background">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowAnimationStyle">@style/AnimationFade</item>
diff --git a/net/sync/gpoddernet/build.gradle b/net/sync/gpoddernet/build.gradle
index 7a765e828..bea35d793 100644
--- a/net/sync/gpoddernet/build.gradle
+++ b/net/sync/gpoddernet/build.gradle
@@ -14,4 +14,6 @@ dependencies {
implementation "commons-io:commons-io:$commonsioVersion"
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
+
+ testImplementation "junit:junit:$junitVersion"
}
diff --git a/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/HostnameParser.java b/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/HostnameParser.java
index ebb415248..7094ad241 100644
--- a/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/HostnameParser.java
+++ b/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/HostnameParser.java
@@ -1,5 +1,7 @@
package de.danoeh.antennapod.net.sync;
+import org.apache.commons.lang3.StringUtils;
+
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -7,9 +9,10 @@ public class HostnameParser {
public String scheme;
public int port;
public String host;
+ public String subfolder;
// split into schema, host and port - missing parts are null
- private static final Pattern URLSPLIT_REGEX = Pattern.compile("(?:(https?)://)?([^:]+)(?::(\\d+))?");
+ private static final Pattern URLSPLIT_REGEX = Pattern.compile("(?:(https?)://)?([^:/]+)(?::(\\d+))?(.+)?");
public HostnameParser(String hosturl) {
Matcher m = URLSPLIT_REGEX.matcher(hosturl);
@@ -21,6 +24,11 @@ public class HostnameParser {
} else {
port = Integer.parseInt(m.group(3)); // regex -> can only be digits
}
+ if (m.group(4) == null) {
+ subfolder = "";
+ } else {
+ subfolder = StringUtils.stripEnd(m.group(4), "/");
+ }
} else {
// URL does not match regex: use it anyway -> this will cause an exception on connect
scheme = "https";
@@ -28,8 +36,10 @@ public class HostnameParser {
port = 443;
}
- if (scheme == null) { // assume https
- scheme = "https";
+ if (scheme == null && port == 80) {
+ scheme = "http";
+ } else if (scheme == null) {
+ scheme = "https"; // assume https
}
if (scheme.equals("https") && port == -1) {
diff --git a/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java b/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java
index b66c44402..33e7ba490 100644
--- a/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java
+++ b/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudLoginFlow.java
@@ -46,7 +46,7 @@ public class NextcloudLoginFlow {
public void start() {
startDisposable = Observable.fromCallable(() -> {
URL url = new URI(hostname.scheme, null, hostname.host, hostname.port,
- "/index.php/login/v2", null, null).toURL();
+ hostname.subfolder + "/index.php/login/v2", null, null).toURL();
JSONObject result = doRequest(url, "");
String loginUrl = result.getString("login");
this.token = result.getJSONObject("poll").getString("token");
@@ -93,9 +93,13 @@ public class NextcloudLoginFlow {
Request request = new Request.Builder().url(url).method("POST", requestBody).build();
Response response = httpClient.newCall(request).execute();
if (response.code() != 200) {
+ response.close();
throw new IOException("Return code " + response.code());
}
ResponseBody body = response.body();
+ if (body == null) {
+ throw new IOException("Empty response");
+ }
return new JSONObject(body.string());
}
diff --git a/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudSyncService.java b/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudSyncService.java
index 647a9073c..67b4ddab0 100644
--- a/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudSyncService.java
+++ b/net/sync/gpoddernet/src/main/java/de/danoeh/antennapod/net/sync/nextcloud/NextcloudSyncService.java
@@ -28,9 +28,7 @@ import java.util.List;
public class NextcloudSyncService implements ISyncService {
private static final int UPLOAD_BULK_SIZE = 30;
private final OkHttpClient httpClient;
- private final String baseScheme;
- private final int basePort;
- private final String baseHost;
+ private final HostnameParser hostname;
private final String username;
private final String password;
@@ -39,10 +37,7 @@ public class NextcloudSyncService implements ISyncService {
this.httpClient = httpClient;
this.username = username;
this.password = password;
- HostnameParser hostname = new HostnameParser(baseHosturl);
- this.baseHost = hostname.host;
- this.basePort = hostname.port;
- this.baseScheme = hostname.scheme;
+ this.hostname = new HostnameParser(baseHosturl);
}
@Override
@@ -150,10 +145,10 @@ public class NextcloudSyncService implements ISyncService {
private HttpUrl.Builder makeUrl(String path) {
return new HttpUrl.Builder()
- .scheme(baseScheme)
- .host(baseHost)
- .port(basePort)
- .addPathSegments(path);
+ .scheme(hostname.scheme)
+ .host(hostname.host)
+ .port(hostname.port)
+ .addPathSegments(hostname.subfolder + path);
}
@Override
diff --git a/net/sync/gpoddernet/src/test/java/de/danoeh/antennapod/net/sync/HostnameParserTest.java b/net/sync/gpoddernet/src/test/java/de/danoeh/antennapod/net/sync/HostnameParserTest.java
new file mode 100644
index 000000000..92e5e6430
--- /dev/null
+++ b/net/sync/gpoddernet/src/test/java/de/danoeh/antennapod/net/sync/HostnameParserTest.java
@@ -0,0 +1,43 @@
+package de.danoeh.antennapod.net.sync;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class HostnameParserTest {
+ @Test
+ public void testHostOnly() {
+ assertHostname(new HostnameParser("example.com"), "https", 443, "example.com", "");
+ assertHostname(new HostnameParser("www.example.com"), "https", 443, "www.example.com", "");
+ }
+
+ @Test
+ public void testHostAndPort() {
+ assertHostname(new HostnameParser("example.com:443"), "https", 443, "example.com", "");
+ assertHostname(new HostnameParser("example.com:80"), "http", 80, "example.com", "");
+ assertHostname(new HostnameParser("example.com:123"), "https", 123, "example.com", "");
+ }
+
+ @Test
+ public void testScheme() {
+ assertHostname(new HostnameParser("https://example.com"), "https", 443, "example.com", "");
+ assertHostname(new HostnameParser("https://example.com:80"), "https", 80, "example.com", "");
+ assertHostname(new HostnameParser("http://example.com"), "http", 80, "example.com", "");
+ assertHostname(new HostnameParser("http://example.com:443"), "http", 443, "example.com", "");
+ }
+
+ @Test
+ public void testSubfolder() {
+ assertHostname(new HostnameParser("https://example.com/"), "https", 443, "example.com", "");
+ assertHostname(new HostnameParser("https://example.com/a"), "https", 443, "example.com", "/a");
+ assertHostname(new HostnameParser("https://example.com/a/"), "https", 443, "example.com", "/a");
+ assertHostname(new HostnameParser("https://example.com:42/a"), "https", 42, "example.com", "/a");
+ }
+
+ private void assertHostname(HostnameParser parser, String scheme, int port, String host, String subfolder) {
+ assertEquals(scheme, parser.scheme);
+ assertEquals(port, parser.port);
+ assertEquals(host, parser.host);
+ assertEquals(subfolder, parser.subfolder);
+ }
+}
diff --git a/ui/i18n/src/main/res/values-br/strings.xml b/ui/i18n/src/main/res/values-br/strings.xml
index ef69b8099..6e808b193 100644
--- a/ui/i18n/src/main/res/values-br/strings.xml
+++ b/ui/i18n/src/main/res/values-br/strings.xml
@@ -122,6 +122,13 @@
<item quantity="many">%d a zevezhioù goude vefe echuet </item>
<item quantity="other">%d devezh goude vefe echuet </item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%1$d/%2$d diuzet</item>
+ <item quantity="two">%1$d/%2$d diuzet</item>
+ <item quantity="few">%1$d/%2$d diuzet</item>
+ <item quantity="many">%1$d/%2$d diuzet</item>
+ <item quantity="other">%1$d/%2$d diuzet</item>
+ </plurals>
<plurals name="num_episodes">
<item quantity="one">%d rann</item>
<item quantity="two">%d rann</item>
@@ -202,6 +209,13 @@
<string name="delete_label">Dilemel</string>
<string name="delete_failed">N\'haller ket dilemel ar restr. Gallout a rit klask adloc\'hañ.</string>
<string name="delete_episode_label">Dilemel ar rann</string>
+ <plurals name="deleted_multi_episode_batch_label">
+ <item quantity="one">Dilamet ez eus bet 1 rann bellgarget.</item>
+ <item quantity="two">Dilamet ez eus bet %d rann pellgarget.</item>
+ <item quantity="few">Dilamet ez eus bet %d rann pellgarget.</item>
+ <item quantity="many">Dilamet ez eus bet %d rann pellgarget.</item>
+ <item quantity="other">Dilamet ez eus bet %d rann pellgarget.</item>
+ </plurals>
<string name="remove_new_flag_label">Tennañ ar merk \"nevez\"</string>
<string name="removed_new_flag_label">Tennet eo bet ar merk \"nevez\"</string>
<string name="mark_read_label">Merkañ evel lennet</string>
@@ -357,6 +371,7 @@
<string name="storage_sum">Dilemel emgefreek ar rannoù, Enporzhiañ, Ezporzhiañ</string>
<string name="project_pref">Raktres</string>
<string name="synchronization_pref">Goubredañ</string>
+ <string name="synchronization_sum">Goubredañ gant binvioù all</string>
<string name="automation">Emgefreekañ</string>
<string name="download_pref_details">Munudoù</string>
<string name="import_export_pref">Enporzhiadur / Ezporzhiadur</string>
@@ -450,8 +465,14 @@
<string name="pref_theme_title_dark">Teñval</string>
<string name="pref_theme_title_trueblack">Du (evit ar skrammoù AMOLED)</string>
<string name="pref_episode_cache_unlimited">Divevenn</string>
+ <string name="synchronization_logout">Digennaskañ</string>
+ <string name="pref_synchronization_logout_toast">Digennasket gant berzh</string>
<string name="pref_gpodnet_setlogin_information_title">Kemmañ an titouroù kennaskañ</string>
<string name="pref_gpodnet_setlogin_information_sum">Kemmañ ho titouroù kennaskañ evit ho kont gpodder.net.</string>
+ <string name="synchronization_sync_changes_title">Goubredañ bremañ</string>
+ <string name="synchronization_full_sync_title">Rediañ ur goubredañ klok</string>
+ <string name="synchronization_login_status"><![CDATA[Kennasket evel <i>%1$s</i> war <i>%2$s</i>. <br/><br/>Ho pourchaser a c\'hellot dibab en-dro pa vioc\'h digennasket]]></string>
+ <string name="synchronization_choose_title">Dibab ur pourchaser goubredañ</string>
<string name="pref_playback_speed_sum">Dibab an tizhioù a c\'haller dibab pa vez lennet ar son</string>
<string name="pref_feed_playback_speed_sum">Tizh dre ziouer ar rannoù</string>
<string name="pref_feed_skip">Lamm emgefreek</string>
diff --git a/ui/i18n/src/main/res/values-ca/strings.xml b/ui/i18n/src/main/res/values-ca/strings.xml
index 72cd0f33a..3ec08d06d 100644
--- a/ui/i18n/src/main/res/values-ca/strings.xml
+++ b/ui/i18n/src/main/res/values-ca/strings.xml
@@ -4,7 +4,7 @@
<string name="feed_update_receiver_name">Actualitzar subscripcions</string>
<string name="feeds_label">Podcasts</string>
<string name="statistics_label">Estadístiques</string>
- <string name="add_feed_label">Afegeix podcast</string>
+ <string name="add_feed_label">Afegir podcast</string>
<string name="episodes_label">Episodis</string>
<string name="queue_label">Cua</string>
<string name="all_episodes_short_label">Tot</string>
@@ -139,7 +139,7 @@
<!--Actions on feeds-->
<string name="mark_all_read_label">Marca-ho tot com a llegit</string>
<string name="mark_all_read_msg">S\'han marcat tots els episodis com a llegits</string>
- <string name="mark_all_read_confirmation_msg">Si us plau confirma que vols marcar tots els episodis com reproduits.</string>
+ <string name="mark_all_read_confirmation_msg">Si us plau confirma que vols marcar tots els episodis com reproduïts.</string>
<string name="mark_all_read_feed_confirmation_msg">Si us plau, confirmeu que voleu marcar tots els episodis d\'aquest podcast com a reproduïts.</string>
<string name="remove_all_new_flags_label">Retirar totes les banderes de \"nou\"</string>
<string name="removed_all_new_flags_msg">Retirades totes les banderes de \"nou\"</string>
@@ -182,7 +182,7 @@
<string name="stream_label">Reprodueix sense baixar</string>
<string name="delete_label">Esborrar</string>
<string name="delete_failed">No s\'ha pogut esborrar el fitxer. Reiniciar el dispositiu pot ajudar.</string>
- <string name="delete_episode_label">Esborrar episodi.</string>
+ <string name="delete_episode_label">Esborrar episodi</string>
<string name="remove_new_flag_label">Retirar bandera de \"nou\"</string>
<string name="removed_new_flag_label">Retirada bandera de \"nou\"</string>
<string name="mark_read_label">Marca com a llegit</string>
@@ -211,7 +211,7 @@
<item quantity="one">%d episodi retirat de la cua.</item>
<item quantity="other">%d episodis retirats de la cua.</item>
</plurals>
- <string name="add_to_favorite_label">Afegit a preferits</string>
+ <string name="add_to_favorite_label">Afegir a preferits</string>
<string name="remove_from_favorite_label">Suprimeix de preferits</string>
<string name="visit_website_label">Visita el lloc web</string>
<string name="skip_episode_label">Omet l\'episodi</string>
@@ -352,7 +352,7 @@
<string name="pref_followQueue_sum">Salta al següent element de la cua en acabar la reproducció</string>
<string name="pref_auto_delete_sum">Suprimeix l\'episodi quan s\'acabi de reproduir</string>
<string name="pref_auto_delete_title">Esborrat automàtic</string>
- <string name="pref_smart_mark_as_played_sum">Marca episodis com com reproduits, encara que quedi menys d\'una certa quantitat de segons de temps</string>
+ <string name="pref_smart_mark_as_played_sum">Marca episodis com reproduïts, encara que quedi menys d\'una certa quantitat de segons de temps per escoltar</string>
<string name="pref_smart_mark_as_played_title">Marca intel·ligent com a reproduït</string>
<string name="pref_skip_keeps_episodes_sum">Mantenir episodis quan són passats de llarg</string>
<string name="pref_skip_keeps_episodes_title">Mantenir els episodis passats de llarg</string>
@@ -440,7 +440,7 @@
<string name="pref_lockscreen_background_title">Estableix el fons del bloqueig de pantalla</string>
<string name="pref_lockscreen_background_sum">Estableix el fons del bloqueig de pantalla a la imatge de l\'episodi actual. Com a efecte secundari, això també mostrarà la imatge en aplicacions de tercers.</string>
<string name="pref_enqueue_location_title">Posició d\'entrada en cola</string>
- <string name="pref_enqueue_location_sum">Afegit episodis a: %1$s</string>
+ <string name="pref_enqueue_location_sum">Afegir episodis a: %1$s</string>
<string name="enqueue_location_back">Final</string>
<string name="enqueue_location_front">Principi</string>
<string name="enqueue_location_after_current">Després de l\'episodi actual</string>
@@ -660,24 +660,24 @@
<string name="discover_powered_by_itunes">Suggeriments d\'iTunes</string>
<string name="search_powered_by">Resultats per %1$s</string>
<!--Local feeds-->
- <string name="add_local_folder">Afegeix carpeta local</string>
+ <string name="add_local_folder">Afegir carpeta local</string>
<string name="local_folder">Carpeta local</string>
<string name="reconnect_local_folder">Torna a connectar la carpeta local</string>
<string name="reconnect_local_folder_warning">En cas de denegació de permisos, pots utilitzar-ho per tornar a connectar a la mateixa carpeta. No seleccionis cap altra carpeta.</string>
<string name="local_feed_description">Aquest podcast virtual es va crear afegint una carpeta a AntennaPod.</string>
<string name="unable_to_start_system_file_manager">No es pot iniciar el gestor de fitxers del sistema</string>
<string name="filter">Filtra</string>
- <string name="hide_is_favorite_label">És preferint</string>
+ <string name="hide_is_favorite_label">És favorit</string>
<string name="not_favorite">No és favorit</string>
<string name="hide_downloaded_episodes_label">Baixat</string>
<string name="hide_not_downloaded_episodes_label">No baixat</string>
<string name="queued_label">En cua</string>
<string name="not_queued_label">No encuat</string>
<string name="has_media">Té mitjans</string>
- <string name="no_media">No hi ha multimèdia</string>
+ <string name="no_media">No te multimèdia</string>
<string name="hide_paused_episodes_label">Pausat</string>
<string name="not_paused">No pausat</string>
- <string name="hide_played_episodes_label">Reproduit</string>
+ <string name="hide_played_episodes_label">Reproduït</string>
<string name="not_played">No reproduït</string>
<!--Sort-->
<string name="sort_title_a_z">Títol (A \u2192 Z)</string>
diff --git a/ui/i18n/src/main/res/values-da/strings.xml b/ui/i18n/src/main/res/values-da/strings.xml
index a6fec5b82..1109c4708 100644
--- a/ui/i18n/src/main/res/values-da/strings.xml
+++ b/ui/i18n/src/main/res/values-da/strings.xml
@@ -414,7 +414,7 @@
<string name="pref_automatic_download_on_battery_sum">Tillad automatisk overførsel, når batteriet ikke oplades</string>
<string name="pref_parallel_downloads_title">Parallelle overførsler</string>
<string name="pref_episode_cache_title">Mellemlager for afsnit</string>
- <string name="pref_episode_cache_summary">Totalt antal af downloadede afsnit gemt på din enhed. Automatisk download stilles i bero, når dette nummer nåes.</string>
+ <string name="pref_episode_cache_summary">Totalt antal af overførte afsnit gemt på din enhed. Automatisk overførsel stilles i bero, når dette nummer nåes.</string>
<string name="pref_episode_cover_title">Brug afsnitbillede</string>
<string name="pref_episode_cover_summary">Brug det afsnitspecifikke cover i lister når muligt. Hvis dette slås fra, vil appen altid bruge podcastens coverbillede.</string>
<string name="pref_show_remain_time_title">Hvis tilbageværende tid</string>
@@ -503,7 +503,7 @@
<string name="double_tap_toast">Tryk på tilbageknappen igen for at afslutte</string>
<string name="back_button_go_to_page">Gå til side ...</string>
<string name="back_button_go_to_page_title">Vælg side</string>
- <string name="pref_delete_removes_from_queue_title">Slet fjernet fra kø</string>
+ <string name="pref_delete_removes_from_queue_title">Slet fjerner fra kø</string>
<string name="pref_delete_removes_from_queue_sum">Fjern automatisk afsnit fra køen, når det slettes.</string>
<string name="pref_filter_feed_title">Abonnementsfilter</string>
<string name="pref_filter_feed_sum">Filtrer dine abonnementer i navigationspanelet og på abonnementsoversigten.</string>
@@ -689,7 +689,7 @@
<string name="add_podcast_by_url">Tilføj podcast via RSS-adresse</string>
<string name="browse_gpoddernet_label">Gennemse gpodder.net</string>
<string name="discover">Opdag</string>
- <string name="discover_hide">Gem</string>
+ <string name="discover_hide">Skjul</string>
<string name="discover_is_hidden">Du valgte at skjule forslag.</string>
<string name="discover_more">mere »</string>
<string name="discover_powered_by_itunes">iTunes forslag</string>
diff --git a/ui/i18n/src/main/res/values-de/strings.xml b/ui/i18n/src/main/res/values-de/strings.xml
index d3f6ded98..e366775a7 100644
--- a/ui/i18n/src/main/res/values-de/strings.xml
+++ b/ui/i18n/src/main/res/values-de/strings.xml
@@ -30,7 +30,7 @@
<string name="app_action_not_found">\"%1$s\" nicht gefunden</string>
<!--SwipeActions-->
<string name="swipeactions_label">Wisch-Aktionen</string>
- <string name="swipeactions_summary">Legen Sie fest, was passiert, wenn Sie in einer Liste über eine Episode swipen</string>
+ <string name="swipeactions_summary">Lege fest, was passiert, wenn Du in einer Liste über eine Episode wischst</string>
<string name="swipe_right">Nach rechts wischen</string>
<string name="swipe_left">Nach Links wischen</string>
<string name="enable_swipeactions">Swipe-Aktionen für diesen Bildschirm aktivieren</string>
@@ -172,6 +172,8 @@ Tippen, um Details anzuzeigen.</string>
<item quantity="one">%d Abonnement aktualisiert.</item>
<item quantity="other">%d Abonnemnts aktualisiert.</item>
</plurals>
+ <string name="edit_tags">Tags bearbeiten</string>
+ <string name="rename_tag_label">Tag umbenennen</string>
<!--actions on feeditems-->
<string name="download_label">Herunterladen</string>
<plurals name="downloading_batch_label">
@@ -364,7 +366,7 @@ Tippen, um Details anzuzeigen.</string>
<string name="network_pref">Netzwerk</string>
<string name="network_pref_sum">Aktualisierungsintervall, Download-Steuerung, Mobile Daten</string>
<string name="feed_refresh_title">Podcasts aktualisieren</string>
- <string name="feed_refresh_sum">Lege ein Intervall oder eine Tageszeit zur automatischen Aktualisierung der Podcasts fest</string>
+ <string name="feed_refresh_sum">Lege ein Intervall oder eine Tageszeit fest, zu welcher automatisch nach neuen Episoden gesucht werden soll</string>
<string name="feed_refresh_interval">Intervall</string>
<string name="feed_refresh_time">Zeit</string>
<string name="feed_refresh_never">Niemals</string>
@@ -631,6 +633,8 @@ Tippen, um Details anzuzeigen.</string>
<!--Feed settings/information screen-->
<string name="authentication_label">Authentifizierung</string>
<string name="authentication_descr">Ändere den Benutzernamen und das Passwort für diesen Podcast und dessen Episoden.</string>
+ <string name="feed_tags_label">Tags</string>
+ <string name="feed_tags_summary">Ändere die Schlagworte (Tags) dieses Podcasts, um deine Abonnements zu organisieren</string>
<string name="feed_folders_include_root">In Hauptliste anzeigen</string>
<string name="auto_download_settings_label">Einstellungen für Automatischen Download</string>
<string name="episode_filters_label">Episoden-Filter</string>
diff --git a/ui/i18n/src/main/res/values-fr/strings.xml b/ui/i18n/src/main/res/values-fr/strings.xml
index b0ffcb348..87e5288d2 100644
--- a/ui/i18n/src/main/res/values-fr/strings.xml
+++ b/ui/i18n/src/main/res/values-fr/strings.xml
@@ -702,8 +702,8 @@
<string name="local_feed_description">Ce podcast a été crée à partir d\'un dossier ajouté à AntennaPod.</string>
<string name="unable_to_start_system_file_manager">Impossible d\'ouvrir le gestionnaire de fichier</string>
<string name="filter">Filtrer</string>
- <string name="hide_is_favorite_label">Est un favori</string>
- <string name="not_favorite">N\'est pas un favori</string>
+ <string name="hide_is_favorite_label">Favori</string>
+ <string name="not_favorite">Pas favori</string>
<string name="hide_downloaded_episodes_label">Téléchargé</string>
<string name="hide_not_downloaded_episodes_label">Non téléchargé</string>
<string name="queued_label">Dans la liste de lecture</string>
diff --git a/ui/i18n/src/main/res/values-hu/strings.xml b/ui/i18n/src/main/res/values-hu/strings.xml
index 4eabe54bb..0bca222b1 100644
--- a/ui/i18n/src/main/res/values-hu/strings.xml
+++ b/ui/i18n/src/main/res/values-hu/strings.xml
@@ -171,6 +171,8 @@
<item quantity="one">%d feliratkozás frissítve.</item>
<item quantity="other">%d feliratkozás frissítve.</item>
</plurals>
+ <string name="edit_tags">Címkék szerkesztése</string>
+ <string name="rename_tag_label">Címke átnevezése</string>
<!--actions on feeditems-->
<string name="download_label">Letöltés</string>
<plurals name="downloading_batch_label">
@@ -183,6 +185,10 @@
<string name="delete_label">Törlés</string>
<string name="delete_failed">A fájl nem törölhető. Az eszköz újraindítása segíthet a probléma megoldásában.</string>
<string name="delete_episode_label">Epizód törlése</string>
+ <plurals name="deleted_multi_episode_batch_label">
+ <item quantity="one">1 letöltött epizód törölve.</item>
+ <item quantity="other">%d letöltött epizód törölve.</item>
+ </plurals>
<string name="remove_new_flag_label">Az „új” jelző eltávolítása</string>
<string name="removed_new_flag_label">Az „új” jelző eltávolítva</string>
<string name="mark_read_label">Megjelölés lejátszottként</string>
@@ -240,6 +246,8 @@
<string name="download_error_forbidden">A podcast kiszolgálója nem válaszol.</string>
<string name="download_canceled_msg">Letöltés megszakítva</string>
<string name="download_error_wrong_size">A kiszolgálókapcsolat elveszett a letöltés befejezése előtt</string>
+ <string name="download_error_blocked">A letöltést egy másik, az eszközön lévő alkalmazás megakadályozta (például egy VPN vagy egy reklámblokkoló).</string>
+ <string name="download_error_certificate">A biztonságos kapcsolat nem építhető fel. Ez azt jelentheti, hogy egy másik, az eszközön lévő alkalmazás (például egy VPN vagy egy reklámblokkoló) blokkolta a letöltést, vagy valami hibás a kiszolgálótanúsítványokban.</string>
<string name="download_report_title">A letöltések hibákkal fejeződtek be</string>
<string name="auto_download_report_title">Elkészültek az automatikus letöltések</string>
<string name="download_error_io_error">Ki-/bemeneti hiba</string>
@@ -255,6 +263,7 @@
<string name="download_type_feed">Csatorna</string>
<string name="download_type_media">Médiafájl</string>
<string name="null_value_podcast_error">Nem lett megjeleníthető podcast megadva.</string>
+ <string name="no_feed_url_podcast_found_by_search">A javasolt podcastnek nem volt RSS-hivatkozása, az AntennaPod talált egy podcastet, amely lehet, hogy egyezik.</string>
<string name="authentication_notification_title">Hitelesítés szükséges</string>
<string name="authentication_notification_msg">A kért erőforráshoz felhasználónév és jelszó szükséges</string>
<string name="confirm_mobile_download_dialog_title">Mobilos letöltés megerősítése</string>
@@ -323,6 +332,7 @@
<string name="storage_sum">Epizódok automatikus törlése, importálása, exportálása</string>
<string name="project_pref">Projekt</string>
<string name="synchronization_pref">Szinkronizálás</string>
+ <string name="synchronization_sum">Szinkronizáció más eszközökkel</string>
<string name="automation">Automatizálás</string>
<string name="download_pref_details">Részletek</string>
<string name="import_export_pref">Importálás/exportálás</string>
@@ -413,8 +423,13 @@
<string name="pref_theme_title_dark">Sötét</string>
<string name="pref_theme_title_trueblack">Fekete (AMOLED-hez alkalmas)</string>
<string name="pref_episode_cache_unlimited">Korlátlan</string>
+ <string name="synchronization_logout">Kijelentkezés</string>
+ <string name="pref_synchronization_logout_toast">Kijelentkezés sikeres</string>
<string name="pref_gpodnet_setlogin_information_title">Bejelentkezési adatok módosítása</string>
<string name="pref_gpodnet_setlogin_information_sum">A gpodder.net fiókjához használt bejelentkezési adatok módosítása.</string>
+ <string name="synchronization_sync_changes_title">Szinkronizálás most</string>
+ <string name="synchronization_full_sync_title">Teljes szinkronizáció kényszerítése</string>
+ <string name="synchronization_login_status"><![CDATA[Bejelentkezve mint <i>%1$s</i>, ekkor: <i>%2$s</i>. <br/><br/>Ha kijelentkezett, akkor újra kiválaszthatja a szinkronizációs szolgáltatóját]]></string>
<string name="pref_playback_speed_sum">A változó sebességű lejátszáshoz elérhető sebességek testreszabása</string>
<string name="pref_feed_playback_speed_sum">A podcast epizódjainak indításakor használandó lejátszási sebesség</string>
<string name="pref_feed_skip">Automatikus kihagyás</string>
@@ -516,6 +531,7 @@
<string name="sync_status_episodes_download">Epizódváltozások letöltése…</string>
<string name="sync_status_upload_played">Lejátszott állapot feltöltése…</string>
<string name="sync_status_subscriptions">Feliratkozások szinkronizálása…</string>
+ <string name="sync_status_wait_for_downloads">Várakozás a letöltések befejezésére…</string>
<string name="sync_status_success">Szinkronizálás sikeres</string>
<string name="sync_status_error">Szinkronizálás sikertelen</string>
<!--import and export-->
@@ -613,6 +629,7 @@
<string name="preview_episode">Előnézet</string>
<string name="stop_preview">Előnézet leállítása</string>
<!--Content descriptions for image buttons-->
+ <string name="toolbar_back_button_content_description">Vissza</string>
<string name="rewind_label">Visszatekerés</string>
<string name="fast_forward_label">Előretekerés</string>
<string name="increase_speed">Sebesség növelése</string>
@@ -630,6 +647,7 @@
<!--Feed settings/information screen-->
<string name="authentication_label">Hitelesítés</string>
<string name="authentication_descr">A felhasználónév és jelszó módosítása ennél a podcastnál és az epizódoknál.</string>
+ <string name="feed_tags_label">Címkék</string>
<string name="feed_folders_include_root">Megjelenítés a fő listában</string>
<string name="auto_download_settings_label">Automatikus letöltési beállítások</string>
<string name="episode_filters_label">Epizódszűrő</string>
@@ -686,6 +704,8 @@
<string name="sort_date_old_new">Dátum (régi \u2192 új)</string>
<string name="sort_duration_short_long">Hossz (rövid \u2192 hosszú)</string>
<string name="sort_duration_long_short">Hossz (hosszú \u2192 rövid)</string>
+ <string name="sort_filename_a_z">Fájlnév (A \u2192 Z)</string>
+ <string name="sort_filename_z_a">Fájlnév (Z \u2192 A)</string>
<string name="sort_a_z">A \u2192 Z</string>
<string name="sort_z_a">Z \u2192 A</string>
<string name="sort_new_old">Új \u2192 régi</string>
@@ -702,7 +722,9 @@
<string name="share_dialog_include_label">Belevétel:</string>
<string name="share_playback_position_dialog_label">Lejátszási pozíció</string>
<string name="share_dialog_episode_website_label">Epizód weboldala</string>
+ <string name="share_dialog_link_to_episode">Hivatkozás az epizódhoz</string>
<string name="share_dialog_media_file_label">Médiafájl</string>
+ <string name="share_starting_position_label">Ettől kezdve:</string>
<!--Audio controls-->
<string name="audio_controls">Hangvezérlők</string>
<string name="playback_speed">Lejátszási sebesség</string>
@@ -749,4 +771,5 @@
<string name="on_demand_config_setting_changed">Beállítás sikeresen frissítve.</string>
<string name="on_demand_config_stream_text">Úgy néz ki, hogy sokszor használja a közvetítést. Szeretné megjeleníteni a közvetítési gombokat az epizódlistákban?</string>
<string name="on_demand_config_download_text">Úgy néz ki, hogy sokszor tölt le. Szeretné megjeleníteni a letöltési gombokat az epizódlistákban?</string>
+ <string name="shortcut_select_subscription">Feliratkozás kiválasztása</string>
</resources>
diff --git a/ui/i18n/src/main/res/values-it/strings.xml b/ui/i18n/src/main/res/values-it/strings.xml
index a93e0527c..9e22da1f0 100644
--- a/ui/i18n/src/main/res/values-it/strings.xml
+++ b/ui/i18n/src/main/res/values-it/strings.xml
@@ -171,6 +171,9 @@
<item quantity="one">%d iscrizione aggiornata.</item>
<item quantity="other">%d iscrizioni aggiornate.</item>
</plurals>
+ <string name="edit_tags">Modifica i tag</string>
+ <string name="rename_tag_label">Rinomina tag</string>
+ <string name="confirm_mobile_feed_refresh_dialog_message">Il download degli episodi su rete mobile è disabilitato nelle impostazioni.\n\nVuoi ugualmente aggiornare le iscrizioni su rete mobile?</string>
<!--actions on feeditems-->
<string name="download_label">Download</string>
<plurals name="downloading_batch_label">
@@ -183,6 +186,10 @@
<string name="delete_label">Elimina</string>
<string name="delete_failed">Impossibile eliminare il file. Prova a riavviare il dispositivo.</string>
<string name="delete_episode_label">Elimina episodio</string>
+ <plurals name="deleted_multi_episode_batch_label">
+ <item quantity="one">1 episodio scaricato eliminato.</item>
+ <item quantity="other">%d episodi scaricati eliminati.</item>
+ </plurals>
<string name="remove_new_flag_label">Rimuovi flag \"nuovo\"</string>
<string name="removed_new_flag_label">Flag \"nuovo\" rimosso</string>
<string name="mark_read_label">Segna come riprodotto</string>
@@ -240,6 +247,8 @@
<string name="download_error_forbidden">L\'host del podcast ha rifiutato di rispondere.</string>
<string name="download_canceled_msg">Download annullato</string>
<string name="download_error_wrong_size">Connessione al server persa prima del completamento del download</string>
+ <string name="download_error_blocked">Il download è stato bloccato da un\'altra app presente sul tuo dispositivo (per esempio una VPN o un ad blocker).</string>
+ <string name="download_error_certificate">Impossibile stabilire una connessione sicura. Un\'altra app sul dispositivo (come VPN o adblocker) ha impedito il download oppure qualcosa non ha funzionato con i certificati del server.</string>
<string name="download_report_title">Download completato con un errore (o errori)</string>
<string name="auto_download_report_title">Download automatici completati</string>
<string name="download_error_io_error">Errore IO</string>
@@ -255,6 +264,7 @@
<string name="download_type_feed">Feed</string>
<string name="download_type_media">File multimediali</string>
<string name="null_value_podcast_error">Nessun è stato fornito alcun podcast che possa essere mostrato.</string>
+ <string name="no_feed_url_podcast_found_by_search">Il podcast suggerito non ha un link RSS, AntennaPod ha trovato un podcast che potrebbe corrispondere</string>
<string name="authentication_notification_title">Autenticazione richiesta</string>
<string name="authentication_notification_msg">La risorsa che hai richiesto richiede un nome utente e una password</string>
<string name="confirm_mobile_download_dialog_title">Conferma download su rete mobile</string>
@@ -323,6 +333,7 @@
<string name="storage_sum">Eliminazione episodi, importazione, esportazione</string>
<string name="project_pref">Progetto</string>
<string name="synchronization_pref">Sincronizzazione</string>
+ <string name="synchronization_sum">Sincronizza con altri dispositivi</string>
<string name="automation">Automazione</string>
<string name="download_pref_details">Dettagli</string>
<string name="import_export_pref">Importa/Esporta</string>
@@ -413,8 +424,20 @@
<string name="pref_theme_title_dark">Scuro</string>
<string name="pref_theme_title_trueblack">Nero (AMOLED ready)</string>
<string name="pref_episode_cache_unlimited">Illimitato</string>
+ <string name="synchronization_logout">Logout</string>
+ <string name="pref_synchronization_logout_toast">Logout eseguito con successo</string>
<string name="pref_gpodnet_setlogin_information_title">Cambia le informazioni di login</string>
<string name="pref_gpodnet_setlogin_information_sum">Cambia le informazioni di login per il tuo account gpodder.net.</string>
+ <string name="synchronization_sync_changes_title">Sincronizza ora</string>
+ <string name="synchronization_full_sync_title">Forza sincronizzazione completa</string>
+ <string name="synchronization_login_status"><![CDATA[Accesso come <i>%1$s</i> su <i>%2$s</i>. <br/><br/>Potrai selezionare un\'altra sincronizzazione una volta effettuato il logout]]></string>
+ <string name="synchronization_summary_unchoosen">Puoi selezionare diversi fornitori per la sincronizzazione delle iscrizioni e dello stato degli episodi con</string>
+ <string name="synchronization_summary_nextcloud">Gpoddersync è un\'app open-source per Nextcloud che puoi facilmente installare sul tuo server. L\'app è indipendente dal progetto AntennaPod.</string>
+ <string name="synchronization_nextcloud_authenticate_browser">Permetti l\'accesso dalla finestra del browser aperta e ritorna ad AntennaPod.</string>
+ <string name="synchronization_choose_title">Scegli provider di sincronizzazione</string>
+ <string name="synchronization_force_sync_summary">Risincronizza tutte le iscrizioni e gli stati dell\'episodio</string>
+ <string name="synchronization_sync_summary">Sincronizza l\'iscrizione e le modifiche dello stato dell\'episodio</string>
+ <string name="dialog_choose_sync_service_title">Scegli provider di sincronizzazione</string>
<string name="pref_playback_speed_sum">Personalizzare le velocità disponibili per le varie velocità di riproduzione.</string>
<string name="pref_feed_playback_speed_sum">Velocità da usare per la riproduzione degli episodi di questo podcast</string>
<string name="pref_feed_skip">Salta automaticamente</string>
@@ -494,6 +517,8 @@
<string name="new_episode_notification_disabled">Notifiche disabilitate</string>
<string name="pref_feed_settings_dialog_msg">Questa impostazione è univoca per ogni podcast. Puoi modificarla aprendo la pagina del podcast.</string>
<string name="pref_contribute">Contribuisci</string>
+ <string name="pref_show_subscription_title">Mostra il titolo del podcast</string>
+ <string name="pref_show_subscription_title_summary">Mostra il nome del podcast sotto l\'immagine di copertina.</string>
<!--About screen-->
<string name="about_pref">Informazioni</string>
<string name="antennapod_version">Versione di AntennaPod</string>
@@ -516,6 +541,7 @@
<string name="sync_status_episodes_download">Download modifiche dell\'episodio...</string>
<string name="sync_status_upload_played">Invio stato della riproduzione...</string>
<string name="sync_status_subscriptions">Sincronizzazione iscrizioni...</string>
+ <string name="sync_status_wait_for_downloads">Attendi che i download vengano completati...</string>
<string name="sync_status_success">Sincronizzazione eseguita con successo</string>
<string name="sync_status_error">Sincronizzazione fallita</string>
<!--import and export-->
@@ -613,6 +639,7 @@
<string name="preview_episode">Anteprima</string>
<string name="stop_preview">Ferma anteprima</string>
<!--Content descriptions for image buttons-->
+ <string name="toolbar_back_button_content_description">Indietro</string>
<string name="rewind_label">Riavvolgi</string>
<string name="fast_forward_label">Avanti veloce</string>
<string name="increase_speed">Aumenta velocità</string>
@@ -630,18 +657,26 @@
<!--Feed settings/information screen-->
<string name="authentication_label">Autenticazione</string>
<string name="authentication_descr">Cambia il nome utente e la password per questo podcast e i suoi episodi.</string>
+ <string name="feed_tags_label">Tag</string>
+ <string name="feed_tags_summary">Cambia i tag di questo podcast per agevolare l\'organizzazione delle tue iscrizioni</string>
<string name="feed_folders_include_root">Mostra nella lista principale</string>
+ <string name="multi_feed_common_tags_info">{fa-info-circle} Vengono mostrati solo i tag comuni alle iscrizioni selezionate. Gli altri tag non vengono modificati.</string>
<string name="auto_download_settings_label">Impostazioni download automatico</string>
<string name="episode_filters_label">Filtro degli episodi</string>
<string name="episode_filters_description">Elenco di termini per filtrare gli episodi da includere o escludere dai download automatici.</string>
<string name="episode_filters_include">Includi</string>
<string name="episode_filters_exclude">Escludi</string>
+ <string name="episode_filters_duration">Durata minima (in minuti)</string>
<string name="episode_filters_hint">Parole singole \n\"Parole multiple\"</string>
<string name="keep_updated">Mantieni aggiornato</string>
<string name="keep_updated_summary">Includi questo podcast nell\'auto-aggiornamento generale</string>
<string name="auto_download_disabled_globally">Il download automatico è disabilitato nelle impostazioni generali.</string>
+ <string name="statistics_time_played">Tempo di riproduzione:</string>
+ <string name="statistics_total_duration">Durata totale (stimata):</string>
+ <string name="statistics_duration_played_episodes">Durata degli episodi riprodotti</string>
<string name="statistics_episodes_on_device">Episodi sul dispositivo:</string>
<string name="statistics_space_used">Spazio utilizzato:</string>
+ <string name="statistics_episodes_started_total">Episodi iniziati/totali:</string>
<string name="statistics_view_all">Vedi per tutti i podcast »</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Importazione di sottoscrizioni da applicazioni monouso in corso...</string>
@@ -686,6 +721,8 @@
<string name="sort_date_old_new">Data (Vecchi \u2192 Nuovi)</string>
<string name="sort_duration_short_long">Durata (Corti \u2192 Lunghi)</string>
<string name="sort_duration_long_short">Durata (Lunghi \u2192 Corti)</string>
+ <string name="sort_filename_a_z">Nome File (A \u2192 Z)</string>
+ <string name="sort_filename_z_a">Nome File (Z \u2192 A)</string>
<string name="sort_a_z">A \u2192 Z</string>
<string name="sort_z_a">Z \u2192 A</string>
<string name="sort_new_old">Nuovo \u2192 Vecchio</string>
@@ -702,7 +739,9 @@
<string name="share_dialog_include_label">Includi:</string>
<string name="share_playback_position_dialog_label">Posizione riproduzione</string>
<string name="share_dialog_episode_website_label">Pagina web episodio</string>
+ <string name="share_dialog_link_to_episode">Link all\'episodio</string>
<string name="share_dialog_media_file_label">File multimediale</string>
+ <string name="share_starting_position_label">Inizia da</string>
<!--Audio controls-->
<string name="audio_controls">Controlli audio</string>
<string name="playback_speed">Velocità di riproduzione</string>
@@ -749,4 +788,7 @@
<string name="on_demand_config_setting_changed">Impostazione aggiornata correttamente.</string>
<string name="on_demand_config_stream_text">Sembra che ascolti molto in streaming. Vuoi che gli elenchi degli episodi mostrino i pulsanti per lo streaming?</string>
<string name="on_demand_config_download_text">Sembra che scarichi molto. Vuoi che gli elenchi degli episodi mostrino i pulsanti per il download?</string>
+ <string name="shortcut_subscription_label">Scorciatoia iscrizione</string>
+ <string name="shortcut_select_subscription">Selezionare podcast</string>
+ <string name="add_shortcut">Aggiungi collegamento</string>
</resources>
diff --git a/ui/i18n/src/main/res/values-ja/strings.xml b/ui/i18n/src/main/res/values-ja/strings.xml
index 44d0b42e1..c441e6778 100644
--- a/ui/i18n/src/main/res/values-ja/strings.xml
+++ b/ui/i18n/src/main/res/values-ja/strings.xml
@@ -13,6 +13,7 @@
<string name="new_label">新規</string>
<string name="settings_label">設定</string>
<string name="downloads_label">ダウンロード</string>
+ <string name="open_autodownload_settings">設定を開く</string>
<string name="downloads_completed_label">完了</string>
<string name="downloads_log_label">ログ</string>
<string name="subscriptions_label">購読</string>
@@ -85,6 +86,7 @@
<string name="auto_download_label">自動ダウンロードに含む</string>
<string name="auto_delete_label">エピソードを自動削除</string>
<string name="feed_volume_reduction">ボリューム削減</string>
+ <string name="feed_volume_reduction_summary">このポッドキャストの音量を下げる: %1$s</string>
<string name="feed_volume_reduction_off">オフ</string>
<string name="feed_volume_reduction_light">ライト</string>
<string name="feed_volume_reduction_heavy">ヘビー</string>
@@ -108,9 +110,11 @@
</plurals>
<string name="loading_more">さらに読み込んでいます…</string>
<string name="episode_notification">エピソードの通知</string>
+ <string name="episode_notification_summary">新しいエピソードを通知する</string>
<plurals name="new_episode_notification_title">
<item quantity="other">新エピソード</item>
</plurals>
+ <string name="new_episode_notification_group_text">新規エピソードがあります。</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">すべて再生済としてマーク</string>
<string name="mark_all_read_msg">すべてのエピソードを再生済にしました</string>
@@ -150,6 +154,7 @@
<string name="remove_new_flag_label">\"新規\" フラグを削除</string>
<string name="removed_new_flag_label">\"新規\" フラグを削除しました</string>
<string name="mark_read_label">再生済としてマーク</string>
+ <string name="marked_as_played_label">再生済みとマーク済み</string>
<string name="mark_read_no_media_label">既読にする</string>
<string name="play_this_to_seek_position">位置にジャンプするには、エピソードを再生する必要があります</string>
<plurals name="marked_read_batch_label">
@@ -186,6 +191,7 @@
<string name="download_error_error_unknown">不明なエラー</string>
<string name="download_error_unsupported_type">サポートしないフィードタイプ</string>
<string name="download_error_connection_error">接続エラー</string>
+ <string name="download_error_unknown_host">サーバーが見つかりません。ネットワークに接続されているときにアドレスが正しく入力されているか確認してください。</string>
<string name="download_error_unauthorized">認証エラー</string>
<string name="download_error_file_type_type">ファイルタイプ エラー</string>
<string name="download_canceled_msg">ダウンロードをキャンセルしました</string>
@@ -210,6 +216,7 @@
<string name="confirm_mobile_streaming_notification_title">モバイルストリーミングの確認</string>
<string name="confirm_mobile_streaming_notification_message">モバイルデータ接続を介したストリーミングは設定で無効になっています。 タップするととにかくストリーミングします。</string>
<string name="confirm_mobile_streaming_button_always">常に</string>
+ <string name="confirm_mobile_streaming_button_once">一度だけ</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">キューに追加するだけ</string>
<string name="confirm_mobile_download_dialog_enable_temporarily">一時的に有効にする</string>
<!--Mediaplayer messages-->
@@ -266,6 +273,7 @@
<string name="storage_sum">エピソードの自動削除、インポート、エクスポート</string>
<string name="project_pref">プロジェクト</string>
<string name="synchronization_pref">同期</string>
+ <string name="synchronization_sum">他のデバイスと同期</string>
<string name="automation">自動</string>
<string name="download_pref_details">詳細</string>
<string name="import_export_pref">インポート/エクスポート</string>
diff --git a/ui/i18n/src/main/res/values-lt/strings.xml b/ui/i18n/src/main/res/values-lt/strings.xml
index ffa272965..42645ffbb 100644
--- a/ui/i18n/src/main/res/values-lt/strings.xml
+++ b/ui/i18n/src/main/res/values-lt/strings.xml
@@ -187,6 +187,7 @@
</plurals>
<string name="edit_tags">Redaguoti žymes</string>
<string name="rename_tag_label">Pervadinti žymę</string>
+ <string name="confirm_mobile_feed_refresh_dialog_message">Epizodų atsiuntimas mobiliuoju internetu išjungtas nustatymuose.\n\nAr vis tiek norite atnaujinti visas tinklalaides mobiliuoju internetu?</string>
<!--actions on feeditems-->
<string name="download_label">Atsisiųsti</string>
<plurals name="downloading_batch_label">
@@ -201,6 +202,12 @@
<string name="delete_label">Ištrinti</string>
<string name="delete_failed">Nepavyksta ištrinti failo. Įrenginio paleidimas iš naujo gali padėti.</string>
<string name="delete_episode_label">Ištrinti epizodą</string>
+ <plurals name="deleted_multi_episode_batch_label">
+ <item quantity="one">1 atsiųstas epizodas ištrintas.</item>
+ <item quantity="few">%d atsiųsti epizodai ištrinti.</item>
+ <item quantity="many">%d atsiųsti epizodai ištrinti.</item>
+ <item quantity="other">%d atsiųsti epizodai ištrinti.</item>
+ </plurals>
<string name="remove_new_flag_label">Pašalinti „naujas“ gairelę</string>
<string name="removed_new_flag_label">„naujas“ gairelė pašalinta</string>
<string name="mark_read_label">Pažymėti kaip perklausytą</string>
@@ -266,6 +273,8 @@
<string name="download_error_forbidden">Tinklalaidę talpinantis serveris atsisako atsakyti.</string>
<string name="download_canceled_msg">Atsiuntimas atšauktas</string>
<string name="download_error_wrong_size">Ryšys su serveriu nutrūko prieš užbaigiant atsiuntimą</string>
+ <string name="download_error_blocked">Atsiuntimą blokavo kita įrenginyje esanti programėlė (pvz. VPN ar reklamos blokavimo programa).</string>
+ <string name="download_error_certificate">Nepavyko užmegzti saugaus ryšio. Tai gali reikšti, jog kita įrenginyje esanti programėlė (pvz. VPN ar reklamos blokavimo programa) blokavo atsiuntimą arba kilo problemų su serverio sertifikatais.</string>
<string name="download_report_title">Atsiuntimai užbaigti su klaida (-omis)</string>
<string name="auto_download_report_title">Automatiniai atsiuntimai užbaigti</string>
<string name="download_error_io_error">Įvesties/išvesties klaida</string>
@@ -283,6 +292,7 @@
<string name="download_type_feed">Sklaidos kanalas</string>
<string name="download_type_media">Medijos failas</string>
<string name="null_value_podcast_error">Nėra pateiktų tinklalaidžių, kurios galėtų būti rodomos.</string>
+ <string name="no_feed_url_podcast_found_by_search">Pasiūlyta tinklalaidė neturi RSS nuorodos, „AntennaPod“ rado galimą tinklalaidės atitikmenį</string>
<string name="authentication_notification_title">Reikalingas tapatumo nustatymas</string>
<string name="authentication_notification_msg">Šis išteklius reikalauja vartotojo vardo bei slaptažodžio</string>
<string name="confirm_mobile_download_dialog_title">Patvirtinkite atsiuntimą mobiliuoju internetu</string>
@@ -450,7 +460,10 @@
<string name="pref_gpodnet_setlogin_information_sum">Keisti prisijungimo prie „gpodder.net“ paskyros duomenis.</string>
<string name="synchronization_sync_changes_title">Sinchronizuoti dabar</string>
<string name="synchronization_full_sync_title">Priverstinis pilnas sinchronizavimas</string>
+ <string name="synchronization_login_status"><![CDATA[Prisijungta kaip <i>%1$s</i> <i>%2$s</i> serveryje. <br/><br/>Atsijungę vėl galėsite pasirinkti sinchronizavimo teikėją]]></string>
<string name="synchronization_summary_unchoosen">Galite pasirinkti iš keleto teikėjų prenumeratų ir epizodų atkūrimo būsenai sinchronizuoti</string>
+ <string name="synchronization_summary_nextcloud">„Gpoddersync“ ir atvirojo kodo „Nextcloud“ programėlė, kurią nesunkiai galite įsidiegti savo serveryje. Ši programėlė yra nepriklausoma nuo „AntennaPod“ projekto.</string>
+ <string name="synchronization_nextcloud_authenticate_browser">Suteikite prieigą atsivėrusioje interneto naršyklėje ir sugrįžkite į „AntennaPod“.</string>
<string name="synchronization_choose_title">Pasirinkite sinchronizavimo teikėją</string>
<string name="synchronization_force_sync_summary">Sinchronizuoti visų prenumeratų ir epizodų būsenas iš naujo</string>
<string name="synchronization_sync_summary">Sinchronizuoti prenumeratų ir epizodų būsenų pokyčius</string>
@@ -535,6 +548,7 @@
<string name="pref_feed_settings_dialog_msg">Šis nustatymas individualus kiekvienai tinklalaidei. Jį pakeisti galite atvėrę tinklalaidės langą.</string>
<string name="pref_contribute">Prisidėti</string>
<string name="pref_show_subscription_title">Rodyti prenumeratos pavadinimą</string>
+ <string name="pref_show_subscription_title_summary">Atvaizduoti prenumeratos pavadinimą viršelio paveikslėlio apačioje.</string>
<!--About screen-->
<string name="about_pref">Apie</string>
<string name="antennapod_version">„AntennaPod“ versija</string>
@@ -557,6 +571,7 @@
<string name="sync_status_episodes_download">Atsiunčiami epizodų pasikeitimai...</string>
<string name="sync_status_upload_played">Išsiunčiama atkūrimo būsena...</string>
<string name="sync_status_subscriptions">Sinchronizuojamos prenumeratos...</string>
+ <string name="sync_status_wait_for_downloads">Laukiama, kol bus užbaigti atsiuntimai...</string>
<string name="sync_status_success">Sinchronizavimas sėkmingas</string>
<string name="sync_status_error">Sinchronizavimas nepavyko</string>
<!--import and export-->
@@ -692,8 +707,12 @@
<string name="keep_updated">Pastoviai atnaujinti</string>
<string name="keep_updated_summary">Įtraukti šią tinklalaidę į (automatinį) visų tinklalaidžių atnaujinimą</string>
<string name="auto_download_disabled_globally">Automatinis atsiuntimas išjungtas pagrindiniuose „AntennaPod“ nustatymuose</string>
+ <string name="statistics_time_played">Atkūrimo trukmė:</string>
+ <string name="statistics_total_duration">Bendra trukmė (apytikslė):</string>
+ <string name="statistics_duration_played_episodes">Atkurtų epizodų trukmė:</string>
<string name="statistics_episodes_on_device">Epizodai įrenginyje:</string>
<string name="statistics_space_used">Naudojama disko vieta:</string>
+ <string name="statistics_episodes_started_total">Pradėti epizodai/iš viso:</string>
<string name="statistics_view_all">Žiūrėti visoms tinklalaidėms »</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Įkeliamos prenumeratos iš specializuotų programėlių...</string>
@@ -738,6 +757,8 @@
<string name="sort_date_old_new">Data (Seni \u2192 Nauji)</string>
<string name="sort_duration_short_long">Trukmė (Trumpi \u2192 Ilgi)</string>
<string name="sort_duration_long_short">Trukmė (Ilgi \u2192 Trumpi)</string>
+ <string name="sort_filename_a_z">Failo vardas (A \u2192 Z)</string>
+ <string name="sort_filename_z_a">Failo vardas (Z \u2192 A)</string>
<string name="sort_a_z">A \u2192 Z</string>
<string name="sort_z_a">Z \u2192 A</string>
<string name="sort_new_old">Nauji \u2192 Seni</string>
@@ -754,7 +775,9 @@
<string name="share_dialog_include_label">Įtraukti:</string>
<string name="share_playback_position_dialog_label">Atkūrimo poziciją</string>
<string name="share_dialog_episode_website_label">Epizodo tinklalapiu</string>
+ <string name="share_dialog_link_to_episode">Epizodo nuoroda</string>
<string name="share_dialog_media_file_label">Medijos failu</string>
+ <string name="share_starting_position_label">Pradedant nuo</string>
<!--Audio controls-->
<string name="audio_controls">Garso valdikliai</string>
<string name="playback_speed">Atkūrimo sparta</string>
@@ -801,5 +824,7 @@
<string name="on_demand_config_setting_changed">Nustatymas sėkmingai atnaujintas.</string>
<string name="on_demand_config_stream_text">Panašu, jog dažnai klausotės tiesiogiai. Ar norite, jog epizodų sąraše būtų rodomi tiesioginio klausymosi mygtukai?</string>
<string name="on_demand_config_download_text">Panašu, jog dažnai atsisiunčiate epizodus. Ar norite, jog epizodų sąraše būtų rodomi atsiuntimo mygtukai?</string>
+ <string name="shortcut_subscription_label">Prenumeratos trumpinys</string>
<string name="shortcut_select_subscription">Pažymėti prenumeratą</string>
+ <string name="add_shortcut">Pridėti trumpinį</string>
</resources>
diff --git a/ui/i18n/src/main/res/values-nl/strings.xml b/ui/i18n/src/main/res/values-nl/strings.xml
index 31f030290..797ea821c 100644
--- a/ui/i18n/src/main/res/values-nl/strings.xml
+++ b/ui/i18n/src/main/res/values-nl/strings.xml
@@ -13,7 +13,7 @@
<string name="new_label">Nieuw</string>
<string name="settings_label">Instellingen</string>
<string name="downloads_label">Downloads</string>
- <string name="open_autodownload_settings">Open Instellingen</string>
+ <string name="open_autodownload_settings">Instellingen openen</string>
<string name="downloads_completed_label">Voltooid</string>
<string name="downloads_log_label">Logboek</string>
<string name="subscriptions_label">Abonnementen</string>
@@ -42,10 +42,10 @@
<string name="statistics_mode_count_all">Alle afgespeelde afleveringen opsommen</string>
<string name="statistics_speed_not_counted">Let op: er wordt geen rekening gehouden met de afspeelsnelheid.</string>
<string name="statistics_reset_data">Statistieken op nul zetten</string>
- <string name="statistics_reset_data_msg">Dit wist alle luistertijden van alle afleveringen. Weet je zeker dat je wilt doorgaan?</string>
- <string name="statistics_counting_since">Sinds %s\nheb je geluisterd:</string>
+ <string name="statistics_reset_data_msg">Dit wist alle luistertijden van alle afleveringen. Doorgaan?</string>
+ <string name="statistics_counting_since">Sinds %s\nheb je beluisterd:</string>
<!--Download Statistics fragment-->
- <string name="total_size_downloaded_podcasts">Totaalgrootte van afleveringen op apparaat:</string>
+ <string name="total_size_downloaded_podcasts">Totaalgrootte van afleveringen op het toestel:</string>
<!--Main activity-->
<string name="drawer_open">Menu openen</string>
<string name="drawer_close">Menu sluiten</string>
@@ -67,7 +67,7 @@
<string name="open_in_browser_label">Openen in browser</string>
<string name="copy_url_label">URL kopiëren</string>
<string name="share_url_label">URL delen</string>
- <string name="copied_url_msg">De url is gekopieerd naar het klembord</string>
+ <string name="copied_url_msg">De URL is gekopieerd naar het klembord</string>
<string name="go_to_position_label">Ga naar deze positie</string>
<!--Playback history-->
<string name="clear_history_label">Geschiedenis wissen</string>
@@ -153,17 +153,17 @@
<string name="share_label_with_ellipses">Delen…</string>
<string name="share_file_label">Bestand delen</string>
<string name="share_website_url_label">Website-adres</string>
- <string name="share_feed_url_label">Podcast-feedurl</string>
+ <string name="share_feed_url_label">Podcast-feed URL</string>
<string name="feed_delete_confirmation_msg">Bevestig dat je de podcast \'%1$s\' en ALLE bijbehorende (gedownloade) afleveringen wilt verwijderen.</string>
<string name="feed_delete_confirmation_msg_batch">Bevestig dat je de geselecteerde podcasts en ALLE bijbehorende (gedownloade) afleveringen wilt verwijderen.</string>
<string name="feed_delete_confirmation_local_msg">Bevestig dat je de podcast \'%1$s\' wilt verwijderen. De bestanden in de lokale bronmap worden bewaard.</string>
<string name="feed_remover_msg">Podcast verwijderen</string>
- <string name="load_complete_feed">Gehele podcast verversen</string>
+ <string name="load_complete_feed">Volledige podcast verversen</string>
<string name="multi_select">Meerdere selecteren</string>
<string name="select_all_above">Alles hierboven selecteren</string>
<string name="select_all_below">Alles hieronder selecteren</string>
<string name="filtered_label">Gefilterd</string>
- <string name="refresh_failed_msg">{fa-exclamation-circle} Vorige verversing mislukt - druk voor meer informatie.</string>
+ <string name="refresh_failed_msg">{fa-exclamation-circle} Vorige verversing mislukt - tik voor meer informatie.</string>
<string name="open_podcast">Podcast openen</string>
<string name="please_wait_for_data">Wacht tot de gegevens geladen zijn</string>
<string name="updates_disabled_label">Updates zijn uitgeschakeld</string>
@@ -184,7 +184,7 @@
<string name="pause_label">Pauzeren</string>
<string name="stream_label">Streamen</string>
<string name="delete_label">Verwijderen</string>
- <string name="delete_failed">Kan bestand niet verwijderen; start je apparaat opnieuw op.</string>
+ <string name="delete_failed">Kan het bestand niet verwijderen. Toestel herstarten helpt wellicht.</string>
<string name="delete_episode_label">Aflevering verwijderen</string>
<plurals name="deleted_multi_episode_batch_label">
<item quantity="one">1 gedownloade aflevering verwijderd.</item>
@@ -231,9 +231,9 @@
<string name="download_running">Bezig met downloaden</string>
<string name="download_error_details">Details</string>
<string name="download_error_details_message">%1$s \n\nURL van bestand:\n%2$s</string>
- <string name="download_error_tap_for_details">Druk voor meer informatie.</string>
+ <string name="download_error_tap_for_details">Tik voor meer informatie.</string>
<string name="download_error_device_not_found">Opslagmedium niet aangetroffen</string>
- <string name="download_error_insufficient_space">Er is onvoldoende ruimte op je apparaat.</string>
+ <string name="download_error_insufficient_space">Er is onvoldoende ruimte op je toestel.</string>
<string name="download_error_http_data_error">HTTP-gegevensfout</string>
<string name="download_error_error_unknown">Onbekende fout</string>
<string name="download_error_parser_exception">De hostserver heeft een beschadigde podcastfeed doorgegeven.</string>
@@ -253,7 +253,7 @@
<string name="auto_download_report_title">Automatisch downloaden afgerond</string>
<string name="download_error_io_error">In-/Uitvoerfout</string>
<string name="download_error_request_error">Opvraagfout</string>
- <string name="download_error_db_access">Fout bij databanktoegang</string>
+ <string name="download_error_db_access">Fout bij databasetoegang</string>
<plurals name="downloads_left">
<item quantity="one">Nog %d download</item>
<item quantity="other">Nog %d downloads</item>
@@ -263,15 +263,15 @@
<string name="download_log_title_unknown">Onbekende titel</string>
<string name="download_type_feed">Feed</string>
<string name="download_type_media">Mediabestand</string>
- <string name="null_value_podcast_error">Er is geen te tonen podcast opgegeven.</string>
- <string name="no_feed_url_podcast_found_by_search">De aanbevolen podcast bevat geen rss-link, maar er is een gelijkaardige podcast gevonden</string>
+ <string name="null_value_podcast_error">Er is niet een te tonen podcast opgegeven.</string>
+ <string name="no_feed_url_podcast_found_by_search">De voorgestelde podcast bevat geen RSS link, er is een mogelijk alternatief gevonden</string>
<string name="authentication_notification_title">Authenticatie vereist</string>
<string name="authentication_notification_msg">De opgevraagde bron vereist een gebruikersnaam en wachtwoord</string>
<string name="confirm_mobile_download_dialog_title">Bevestig downloaden via mobiel internet</string>
<string name="confirm_mobile_download_dialog_message_not_in_queue">Downloaden via mobiel internet is uitgeschakeld in de instellingen.\n\nJe kunt er voor kiezen om de aflevering alleen toe te voegen aan de wachtrij of om downloaden via mobiel internet tijdelijk toe te staan.\n<small>Je keuze wordt 10 minuten onthouden.</small></string>
<string name="confirm_mobile_download_dialog_message">Downloaden via mobiel internet is uitgeschakeld in de instellingen.\n\nWil je dit tijdelijk toestaan?\n<small>Je keuze wordt 10 minuten onthouden.</small></string>
<string name="confirm_mobile_streaming_notification_title">Bevestig streamen via mobiel internet</string>
- <string name="confirm_mobile_streaming_notification_message">Streamen via mobiel internet is uitgeschakeld in de instellingen. Druk om tóch te streamen.</string>
+ <string name="confirm_mobile_streaming_notification_message">Streamen via mobiel internet is uitgeschakeld in de instellingen. Tik om tóch te streamen.</string>
<string name="confirm_mobile_streaming_button_always">Altijd</string>
<string name="confirm_mobile_streaming_button_once">Eenmalig</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">Toevoegen aan wachtrij</string>
@@ -327,7 +327,7 @@
<string name="no_fav_episodes_head_label">Geen favoriete afleveringen</string>
<string name="no_fav_episodes_label">Je kunt afleveringen toevoegen aan je favorieten door ze lang ingedrukt te houden.</string>
<string name="no_subscriptions_head_label">Geen abonnementen</string>
- <string name="no_subscriptions_label">Druk op het plus-pictogram om je te abonneren op een podcast.</string>
+ <string name="no_subscriptions_label">Tik op het plus-pictogram om je te abonneren op een podcast.</string>
<!--Preferences-->
<string name="storage_pref">Opslag</string>
<string name="storage_sum">Automatisch verwijderen, im- en exporteren</string>
@@ -347,7 +347,7 @@
<string name="preference_search_no_results">Geen resultaten</string>
<string name="preference_search_clear_history">Geschiedenis wissen</string>
<string name="media_player">Mediaspeler</string>
- <string name="pref_episode_cleanup_title">Automatisch opschonen</string>
+ <string name="pref_episode_cleanup_title">Aflevering opschonen</string>
<string name="pref_episode_cleanup_summary">Afleveringen verwijderd mogen worden als \'Automatisch downloaden\' ruimte nodig heeft voor nieuwe afleveringen</string>
<string name="pref_pauseOnDisconnect_sum">Afspelen pauzeren als de koptelefoon wordt losgekoppeld of de bluetoothverbinding verbroken</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Afspelen hervatten als de koptelefoon weer wordt aangesloten</string>
@@ -375,7 +375,7 @@
<string name="network_pref_sum">Bijwerktussenpoos, downloadbeheer, mobiel internet</string>
<string name="feed_refresh_title">Podcasts verversen</string>
<string name="feed_refresh_sum">Stel een tussenpoos of tijdstip in waarop automatisch nieuwe afleveringen worden opgehaald</string>
- <string name="feed_refresh_interval">Met tussenpozen&lt;br&gt;</string>
+ <string name="feed_refresh_interval">Met tussenpozen</string>
<string name="feed_refresh_time">Op tijdstip</string>
<string name="feed_refresh_never">Nooit</string>
<string name="feed_refresh_interval_at">om %1$s</string>
@@ -410,13 +410,13 @@
<string name="pref_automatic_download_sum">Stel het automatisch downloaden van afleveringen in.</string>
<string name="pref_autodl_wifi_filter_title">Wifi-filter inschakelen</string>
<string name="pref_autodl_wifi_filter_sum">Automatisch downloaden alleen toestaan via gekozen wifi-netwerken.</string>
- <string name="pref_automatic_download_on_battery_title">Downloaden als het apparaat niet wordt opgeladen</string>
- <string name="pref_automatic_download_on_battery_sum">Downloaden toestaan als het apparaat niet wordt opgeladen</string>
+ <string name="pref_automatic_download_on_battery_title">Downloaden als niet wordt opgeladen</string>
+ <string name="pref_automatic_download_on_battery_sum">Automatisch downloaden toestaan als niet wordt opgeladen</string>
<string name="pref_parallel_downloads_title">Gelijktijdige downloads</string>
<string name="pref_episode_cache_title">Afleveringscache</string>
- <string name="pref_episode_cache_summary">Het totaal aantal gedownloade afleveringen dat moet worden opgeslagen op het apparaat. Automatische downloads worden onderbroken als dit aantal wordt bereikt.</string>
+ <string name="pref_episode_cache_summary">Totaal aantal gedownloade afleveringen in de cache op het toestel. Automatisch downloaden wordt opgeschort als dit aantal is bereikt.</string>
<string name="pref_episode_cover_title">Omslag van aflevering gebruiken</string>
- <string name="pref_episode_cover_summary">Gebruik de bij de aflevering behorende omslag (indien beschikbaar). Als je dit niet inschakelt, dan wordt altijd de omslag van de podcast gebruikt.</string>
+ <string name="pref_episode_cover_summary">Gebruik de aflevering-specifieke omslag in lijsten indien beschikbaar. Indien uitgevinkt, zal de app altijd de podcast omslag afbeelding gebruiken.</string>
<string name="pref_show_remain_time_title">Resterende tijd tonen</string>
<string name="pref_show_remain_time_summary">Schakel in om de resterende tijd van afleveringen te tonen. Schakel uit om de totale duur van afleveringen te tonen.</string>
<string name="pref_theme_title_use_system">Systeemthema gebruiken</string>
@@ -431,8 +431,8 @@
<string name="synchronization_sync_changes_title">Nu synchroniseren</string>
<string name="synchronization_full_sync_title">Volledige synchronisatie afdwingen</string>
<string name="synchronization_login_status"><![CDATA[Ingelogd als <i>%1$s</i> op <i>%2$s</i>. <br/><br/>Na het uitloggen kun je een synchronizatiedienst kiezen]]></string>
- <string name="synchronization_summary_unchoosen">Je kunt meerdere diensten kiezen voor het synchroniseren van je abonnementen en afspeelstatussen</string>
- <string name="synchronization_summary_nextcloud">Gpoddersyng is een open source Nextcloud-app die je kunt installeren op je eigen server. De app niet betrokken is bij het AntennaPod-project.</string>
+ <string name="synchronization_summary_unchoosen">Er is keuze uit meerdere aanbieders om de abonnementen en aflevering-stand mee te synchroniseren</string>
+ <string name="synchronization_summary_nextcloud">Gpoddersync is een open source Nextcloud-app op je eigen server. De app is niet betrokken bij het AntennaPod-project.</string>
<string name="synchronization_nextcloud_authenticate_browser">Verleen toegang in de geopende webbrowser en keer terug naar AntennaPod.</string>
<string name="synchronization_choose_title">Kies een synchronisatiedienst</string>
<string name="synchronization_force_sync_summary">Alle abonnementen en afspeelstatussen opnieuw synchroniseren</string>
@@ -449,15 +449,15 @@
<string name="pref_playback_time_respects_speed_title">Media-informatie aanpassen aan afspeelsnelheid</string>
<string name="pref_playback_time_respects_speed_sum">Getoonde positie en duur worden aangepast aan de afspeelsnelheid</string>
<string name="pref_fast_forward">Snelheid van vooruitspoelen</string>
- <string name="pref_fast_forward_sum">Pas het aantal seconden aan waarmee wordt vooruitgespoeld per druk op de knop</string>
+ <string name="pref_fast_forward_sum">Pas het aantal seconden aan waarmee wordt vooruitgespoeld per klik op de knop</string>
<string name="pref_rewind">Snelheid van terugspoelen</string>
- <string name="pref_rewind_sum">Pas het aantal seconden aan waarmee wordt teruggespoeld per druk op de knop</string>
+ <string name="pref_rewind_sum">Pas het aantal seconden aan waarmee wordt teruggespoeld per klik op de knop</string>
<string name="pref_expandNotify_title">Melding met hoge prioriteit</string>
<string name="pref_expandNotify_sum">Dit klapt meestal de melding uit zodat de bedieningsknoppen kunnen worden getoond.</string>
<string name="pref_persistNotify_title">Bedieningsknoppen behouden</string>
<string name="pref_persistNotify_sum">Ook bedieningsknoppen op het meldings- en vergrendelscherm behouden als het afspelen gepauzeerd wordt.</string>
<string name="pref_compact_notification_buttons_title">Kleine meldingsknoppen gebruiken</string>
- <string name="pref_compact_notification_buttons_sum">Kies de bedieningsknoppen voor als de melding is ingeklapt. De knop afspelen/pauzeren wordt altijd getoond.</string>
+ <string name="pref_compact_notification_buttons_sum">Kies de bedieningsknoppen in het geval de melding is ingeklapt. De afspeel/pauze knop is altijd opgenomen.</string>
<string name="pref_compact_notification_buttons_dialog_title">Kies maximaal %1$d knoppen</string>
<string name="pref_compact_notification_buttons_dialog_error">Je kunt maximaal %1$d knoppen kiezen.</string>
<string name="pref_lockscreen_background_title">Achtergrondafbeelding vergrendelscherm</string>
@@ -475,7 +475,7 @@
<string name="copy_to_clipboard">Kopiëren naar klembord</string>
<string name="copied_to_clipboard">Gekopieerd naar het klembord</string>
<string name="experimental_pref">Experimenteel</string>
- <string name="pref_media_player_message">Kies welke mediaspeler gebruikt moet worden voor het afspelen van bestanden</string>
+ <string name="pref_media_player_message">Kies welke mediaspeler u wilt gebruiken om bestanden af te spelen</string>
<string name="pref_current_value">Huidige instelling: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Netwerkproxy instellen</string>
@@ -496,17 +496,17 @@
<string name="pref_back_button_behavior_title">Gedrag van terugknop</string>
<string name="pref_back_button_behavior_sum">Pas het gedrag van de terugknop aan.</string>
<string name="back_button_default">Standaard</string>
- <string name="back_button_open_drawer">Navigatiemenu openen</string>
+ <string name="back_button_open_drawer">Navigatielade openen</string>
<string name="back_button_double_tap">Dubbeltik om af te sluiten</string>
<string name="back_button_show_prompt">Afsluiten bevestigen</string>
- <string name="close_prompt">Weet je zeker dat je AntennaPod wilt afsluiten?</string>
- <string name="double_tap_toast">Druk nogmaals op de terugknop om af te sluiten</string>
+ <string name="close_prompt">AntennaPod afsluiten?</string>
+ <string name="double_tap_toast">Tik nogmaals op de terugknop om af te sluiten</string>
<string name="back_button_go_to_page">Ga naar pagina...</string>
<string name="back_button_go_to_page_title">Kies een pagina</string>
<string name="pref_delete_removes_from_queue_title">Afleveringen verwijderen uit wachtrij na wissen</string>
<string name="pref_delete_removes_from_queue_sum">Verwijder een aflevering uit de wachtrij als de aflevering in kwestie is verwijderd.</string>
<string name="pref_filter_feed_title">Abonnementsfilter</string>
- <string name="pref_filter_feed_sum">Filter je abonnementen in het navigatiemenu en op het abonnementenscherm.</string>
+ <string name="pref_filter_feed_sum">Filter je abonnementen in de navigatielade en op het abonnementenscherm.</string>
<string name="subscriptions_are_filtered">De abonnementen zijn gefilterd.</string>
<string name="subscriptions_counter_greater_zero">Teller hoger dan nul</string>
<string name="auto_downloaded">Automatisch gedownload</string>
@@ -515,7 +515,7 @@
<string name="not_kept_updated">Niet bijgehouden</string>
<string name="new_episode_notification_enabled">Melding is ingeschakeld</string>
<string name="new_episode_notification_disabled">Melding is uitgeschakeld</string>
- <string name="pref_feed_settings_dialog_msg">Deze instellingen moet per podcast worden in- of uitgeschakeld. Pas aan door de podcastpagina te openen.</string>
+ <string name="pref_feed_settings_dialog_msg">Deze instelling wordt per podcast in- of uitgeschakeld. Daarvoor de podcastpagina openen.</string>
<string name="pref_contribute">Bijdragen</string>
<string name="pref_show_subscription_title">Abonnementsnaam tonen</string>
<string name="pref_show_subscription_title_summary">Toon de abonnementsnaam onder de omslag.</string>
@@ -545,15 +545,15 @@
<string name="sync_status_success">Synchronisatie afgerond</string>
<string name="sync_status_error">Synchronisatie mislukt</string>
<!--import and export-->
- <string name="import_export_summary">Abonnementen en wachtrij overzetten naar ander apparaat</string>
- <string name="database">Databank</string>
+ <string name="import_export_summary">Abonnementen en wachtrijen naar een ander toestel verplaatsen</string>
+ <string name="database">Database</string>
<string name="opml">OPML</string>
<string name="html">HTML</string>
- <string name="html_export_summary">Abonnementen delen met een vriend(in)</string>
+ <string name="html_export_summary">Abonnementen delen met een ander</string>
<string name="opml_export_summary">Abonnementen overzetten naar een andere podcast-app</string>
<string name="opml_import_summary">Abonnementen importeren uit andere podcast-app</string>
- <string name="database_export_summary">Zet je abonnementen, beluisterde afleveringen en wachtrij over naar Antennapod op een ander apparaat</string>
- <string name="database_import_summary">Antennapod-databank importeren van ander apparaat</string>
+ <string name="database_export_summary">Abonnementen, beluisterde afleveringen en wachtrij overzetten naar AntennaPod op een ander toestel</string>
+ <string name="database_import_summary">AntennaPod database van een ander toestel importeren</string>
<string name="opml_import_label">OPML importeren</string>
<string name="opml_add_podcast_label">Podcastlijst (opml) importeren</string>
<string name="opml_reader_error">Er is iets misgegaan tijdens het lezen van het OPML-bestand:</string>
@@ -562,9 +562,9 @@
<string name="deselect_all_label">Alles de-selecteren</string>
<string name="opml_export_label">OPML exporteren</string>
<string name="html_export_label">HTML exporteren</string>
- <string name="database_export_label">Databank exporteren</string>
- <string name="database_import_label">Databank importeren</string>
- <string name="database_import_warning">Als je een databank importeert, dan worden al je huidige abonnementen en afspeelgeschiedenis vervangen. Exporteer ter back-up je huidige databank. Weet je zeker dat je wilt doorgaan?</string>
+ <string name="database_export_label">Database exporteren</string>
+ <string name="database_import_label">Database importeren</string>
+ <string name="database_import_warning">Als je een database importeert, dan worden al je huidige abonnementen en afspeelgeschiedenis vervangen. Exporteer ter back-up je huidige database. Weet je zeker dat je wilt doorgaan?</string>
<string name="please_wait">Even geduld...</string>
<string name="export_error_label">Exportfout</string>
<string name="export_success_title">Geëxporteerd</string>
@@ -572,7 +572,7 @@
<string name="opml_import_ask_read_permission">Toegang tot externe locaties is nodig om het OPML-bestand te kunnen lezen</string>
<string name="successful_import_label">Importeren voltooid</string>
<string name="import_ok">Druk op \'Oké\' om AntennaPod opnieuw te starten.</string>
- <string name="import_no_downgrade">Deze databank is geëxporteerd door een nieuwere versie van Antennapod. Je huidige versie weet nog niet hoe daar mee om te gaan.</string>
+ <string name="import_no_downgrade">Deze database is geëxporteerd door een nieuwere versie van Antennapod. Je huidige versie weet nog niet hoe daar mee om te gaan.</string>
<string name="favorites_export_label">Favorieten exporteren</string>
<string name="favorites_export_summary">Exporteer opgeslagen favorieten naar een bestand</string>
<!--Sleep timer-->
@@ -614,11 +614,11 @@
<string name="gpodnetauth_server_custom">Aangepaste server</string>
<string name="gpodnetauth_host">Hostnaam</string>
<string name="gpodnetauth_select_server">Server kiezen</string>
- <string name="gpodnetauth_device_name">Apparaatnaam</string>
+ <string name="gpodnetauth_device_name">Toestelnaam</string>
<string name="gpodnetauth_device_name_default">AntennaPod op %1$s</string>
<string name="gpodnetauth_existing_devices">Bestaande apparaten</string>
- <string name="gpodnetauth_create_device">Apparaat toevoegen</string>
- <string name="gpodnetauth_finish_descr">Gefeliciteerd! Je gpodder.net-account is nu gekoppeld aan je apparaat. AntennaPod zal voortaan abonnementen automatisch synchroniseren met je gpodder.net-account.</string>
+ <string name="gpodnetauth_create_device">Toestel toevoegen</string>
+ <string name="gpodnetauth_finish_descr">Gefeliciteerd! Je gpodder.net-account is nu gekoppeld aan je toestel. AntennaPod synchroniseert voortaan de abonnementen op je toestel automatisch met je gpodder.net-account</string>
<string name="gpodnetauth_finish_butsyncnow">Nu synchroniseren</string>
<string name="gpodnetsync_error_title">gpodder.net - synchronisatiefout</string>
<string name="gpodnetsync_error_descr">Er is een fout opgetreden tijdens het synchroniseren:\u0020</string>
@@ -674,7 +674,7 @@
<string name="statistics_time_played">Afgespeeld:</string>
<string name="statistics_total_duration">Totale duur (geschat):</string>
<string name="statistics_duration_played_episodes">Duur van beluisterde afleveringen:</string>
- <string name="statistics_episodes_on_device">Afleveringen op apparaat:</string>
+ <string name="statistics_episodes_on_device">Afleveringen op toestel:</string>
<string name="statistics_space_used">Gebruikte ruimte:</string>
<string name="statistics_episodes_started_total">Aantal gestarte afleveringen:</string>
<string name="statistics_view_all">Alle podcasts tonen »</string>
@@ -686,11 +686,11 @@
<string name="search_podcastindex_label">Podcastindex.org doorzoeken</string>
<string name="search_fyyd_label">Fyyd doorzoeken</string>
<string name="advanced">Geavanceerd</string>
- <string name="add_podcast_by_url">Podcast toevoegen middels rss-adres</string>
+ <string name="add_podcast_by_url">Podcast toevoegen middels RSS link</string>
<string name="browse_gpoddernet_label">Verken gpodder.net</string>
<string name="discover">Ontdekken</string>
<string name="discover_hide">Verbergen</string>
- <string name="discover_is_hidden">Je hebt er voor gekozen om aanbevelingen te verbergen.</string>
+ <string name="discover_is_hidden">Je kiest er voor aanbevelingen te verbergen.</string>
<string name="discover_more">meer »</string>
<string name="discover_powered_by_itunes">Aanbevelingen van iTunes</string>
<string name="search_powered_by">Resultaten van %1$s</string>
diff --git a/ui/i18n/src/main/res/values-pl/strings.xml b/ui/i18n/src/main/res/values-pl/strings.xml
index 97a138113..146df2858 100644
--- a/ui/i18n/src/main/res/values-pl/strings.xml
+++ b/ui/i18n/src/main/res/values-pl/strings.xml
@@ -185,6 +185,9 @@
<item quantity="many">%d subskrypcji uaktualniono.</item>
<item quantity="other">%dsubskrypcji uaktualniono.</item>
</plurals>
+ <string name="edit_tags">Edytuj tagi</string>
+ <string name="rename_tag_label">Zmień nazwę tagu</string>
+ <string name="confirm_mobile_feed_refresh_dialog_message">Pobieranie odcinków z użyciem danych komórkowych jest zablokowane w ustawieniach.\n\nCzy nadal chcesz odświeżyć podcasty poprzez dane komórkowe?</string>
<!--actions on feeditems-->
<string name="download_label">Pobierz</string>
<plurals name="downloading_batch_label">
@@ -199,6 +202,12 @@
<string name="delete_label">Usuń</string>
<string name="delete_failed">Nie można usunąć pliku. Restart urządzenia może w tym pomóc.</string>
<string name="delete_episode_label">Usuń odcinek</string>
+ <plurals name="deleted_multi_episode_batch_label">
+ <item quantity="one">Usunięto 1 pobrany odcinek.</item>
+ <item quantity="few">Usunięto kilka pobranych odcinków.</item>
+ <item quantity="many">Usunięto wiele pobranych odcinków.</item>
+ <item quantity="other">Usunięto %d pobranych odcinków.</item>
+ </plurals>
<string name="remove_new_flag_label">Usuń flagę \"nowy\"</string>
<string name="removed_new_flag_label">Usunięto flagę \"nowy\"</string>
<string name="mark_read_label">Oznacz jako odtworzone</string>
@@ -265,6 +274,8 @@
<string name="download_error_forbidden">Serwer podcastu nie odpowiada.</string>
<string name="download_canceled_msg">Pobieranie anulowane</string>
<string name="download_error_wrong_size">Połączenie z serwerem zostało zerwane przed ukończeniem pobierania.</string>
+ <string name="download_error_blocked">Pobieranie zostało zablokowane przez inną aplikację na twoim urządzeniu (np. VPN lub blokadę reklam).</string>
+ <string name="download_error_certificate">Nie można ustanowić bezpiecznego połączenia. Może to oznaczać, że inna aplikacja na twoim urządzeniu (np. VPN lub blokada reklam) zablokowała pobieranie, lub coś jest nie tak z certyfikatami serwera.</string>
<string name="download_report_title">Pobieranie ukończone</string>
<string name="auto_download_report_title">Automatyczne pobieranie ukończone</string>
<string name="download_error_io_error">Błąd wejścia/wyjścia</string>
@@ -282,6 +293,7 @@
<string name="download_type_feed">Kanał</string>
<string name="download_type_media">Plik multimedialny</string>
<string name="null_value_podcast_error">Nie podano podcastu, który można wyświetlić.</string>
+ <string name="no_feed_url_podcast_found_by_search">Zasugerowany podcast nie ma linku RSS, aplikacja AntennaPod znalazła inny podcast, który może pasować</string>
<string name="authentication_notification_title">Wymagana autoryzacja</string>
<string name="authentication_notification_msg">Żądany zasób wymaga podania nazwy użytkownika oraz hasła</string>
<string name="confirm_mobile_download_dialog_title">Potwierdź pobieranie przez sieć komórkową</string>
@@ -350,6 +362,7 @@
<string name="storage_sum">Automatyczne kasowanie odcinków, Import, Eksport</string>
<string name="project_pref">Projekt</string>
<string name="synchronization_pref">Synchronizacja</string>
+ <string name="synchronization_sum">Synchronizuj z innymi urządzeniami</string>
<string name="automation">Automatyzacja</string>
<string name="download_pref_details">Szczegóły</string>
<string name="import_export_pref">Import/Eksport</string>
@@ -442,8 +455,20 @@
<string name="pref_theme_title_dark">Ciemny</string>
<string name="pref_theme_title_trueblack">Czarny (dla ekranów AMOLED)</string>
<string name="pref_episode_cache_unlimited">Nielimitowane</string>
+ <string name="synchronization_logout">Wyloguj</string>
+ <string name="pref_synchronization_logout_toast">Wylogowanie się powiodło</string>
<string name="pref_gpodnet_setlogin_information_title">Zmień informacje logowania</string>
<string name="pref_gpodnet_setlogin_information_sum">Zmień dane logowania konta gpodder.net.</string>
+ <string name="synchronization_sync_changes_title">Synchronizuj teraz</string>
+ <string name="synchronization_full_sync_title">Wymuś pełną synchronizację</string>
+ <string name="synchronization_login_status"><![CDATA[Zalogowany jako <i>%1$s</i>z pośrednictwem <i>%2$s</i><br/><br/>Po wylogowaniu się możesz ponownie wybrać dostawcę synchronizacji]]></string>
+ <string name="synchronization_summary_unchoosen">Możesz wybrać synchronizację subskrypcji i stanu odtwarzania odcinków z pomocą kilku dostawców</string>
+ <string name="synchronization_summary_nextcloud">Gpoddersync to open-source aplikacja Nextcloudu, którą możesz łatwo zainstalować na swój serwer. Aplikacja nie jest powiązana z projektem AntennaPod.</string>
+ <string name="synchronization_nextcloud_authenticate_browser">Zezwól na dostęp w otwartym oknie przeglądarki i wróć do aplikacji AntennaPod.</string>
+ <string name="synchronization_choose_title">Wybierz dostawcę synchronizacji</string>
+ <string name="synchronization_force_sync_summary">Ponownie zsynchronizuj stan wszystkich subskrypcji i odcinków</string>
+ <string name="synchronization_sync_summary">Zsynchronizuj zmiany stanu subskrypcji i odcinka</string>
+ <string name="dialog_choose_sync_service_title">Wybierz dostawcę synchronizacji</string>
<string name="pref_playback_speed_sum">Dostosuj prędkości dostępne dla odtwarzania o zmiennej prędkości</string>
<string name="pref_feed_playback_speed_sum">Prędkość używana podczas odtwarzania odcinków z tego kanału</string>
<string name="pref_feed_skip">Automatyczne pomijanie</string>
@@ -523,6 +548,8 @@
<string name="new_episode_notification_disabled">Powiadomienie wyłączone</string>
<string name="pref_feed_settings_dialog_msg">To ustawienie jest unikalne dla każdego podcastu. Możesz je zmienić otwierając info podcastu.</string>
<string name="pref_contribute">Przyczyń się do rozwoju</string>
+ <string name="pref_show_subscription_title">Pokaż nazwę subskrypcji</string>
+ <string name="pref_show_subscription_title_summary">Wyświetl nazwę subskrypcji pod obrazkiem tytułowym.</string>
<!--About screen-->
<string name="about_pref">O...</string>
<string name="antennapod_version">Wersja AntennaPod</string>
@@ -545,6 +572,7 @@
<string name="sync_status_episodes_download">Pobieranie zmian odcinków...</string>
<string name="sync_status_upload_played">Wysyłanie statusu odtworzeń...</string>
<string name="sync_status_subscriptions">Synchronizowanie subskrypcji...</string>
+ <string name="sync_status_wait_for_downloads">Oczekiwanie na dokończenie pobierania...</string>
<string name="sync_status_success">Synchronizacja udana</string>
<string name="sync_status_error">Synchronizacja nie powiodła się</string>
<!--import and export-->
@@ -648,6 +676,7 @@
<string name="preview_episode">Podgląd</string>
<string name="stop_preview">Zakończ podgląd</string>
<!--Content descriptions for image buttons-->
+ <string name="toolbar_back_button_content_description">Powrót</string>
<string name="rewind_label">Cofnij</string>
<string name="fast_forward_label">Przewiń</string>
<string name="increase_speed">Zwiększ prędkość</string>
@@ -665,18 +694,26 @@
<!--Feed settings/information screen-->
<string name="authentication_label">Autoryzacja</string>
<string name="authentication_descr">Zmień swoją nazwę użytkownika oraz hasło dla tego podcastu i jego odcinków</string>
+ <string name="feed_tags_label">Tagi</string>
+ <string name="feed_tags_summary">Zmień tagi tego podcastu, żeby lepiej zorganizować swoje subskrypcje</string>
<string name="feed_folders_include_root">Pokaż na głównej liście</string>
+ <string name="multi_feed_common_tags_info">{fa-info-circle} Tylko wspólne tagi wybranych subskrypcji są pokazane. Pozostałe tagi zostaną bez zmian.</string>
<string name="auto_download_settings_label">Ustawienia automatycznego pobierania</string>
<string name="episode_filters_label">Filtr odcinków</string>
<string name="episode_filters_description">Wykaz terminów używanych aby zdecydować, czy odcinek powinien być włączony lub wyłączony podczas automatycznego pobierania.</string>
<string name="episode_filters_include">Włączając</string>
<string name="episode_filters_exclude">Wyłączając</string>
+ <string name="episode_filters_duration">Minimalny czas trwania (w minutach)</string>
<string name="episode_filters_hint">Pojedyncze słowa \n\"Kilka słów\"</string>
<string name="keep_updated">Utrzymuj zaktualizowane</string>
<string name="keep_updated_summary">Uwzględnij ten podcast przy (automatycznym) odświeżaniu wszystkich kanałów</string>
<string name="auto_download_disabled_globally">Automatyczne pobieranie jest wyłączone w globalnych ustawieniach AntennaPod</string>
+ <string name="statistics_time_played">Czas odtwarzania:</string>
+ <string name="statistics_total_duration">Całkowity czas trwania (szacunkowy):</string>
+ <string name="statistics_duration_played_episodes">Czas trwania odtworzonych odcinków:</string>
<string name="statistics_episodes_on_device">Odcinki na urządzeniu:</string>
<string name="statistics_space_used">Użyto pamięci:</string>
+ <string name="statistics_episodes_started_total">Rozpoczęte/wszystkie odcinki:</string>
<string name="statistics_view_all">Zobacz wszystkie podcasty »</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Importowanie subskrybcji z jednozadaniowych aplikacji</string>
@@ -721,6 +758,8 @@
<string name="sort_date_old_new">Data (Stare \u2192 Nowe)</string>
<string name="sort_duration_short_long">Długość (Krótkie \u2192 Długie)</string>
<string name="sort_duration_long_short">Długość (Długie \u2192 Krótkie)</string>
+ <string name="sort_filename_a_z">Nazwa pliku (A \u2192 Z)</string>
+ <string name="sort_filename_z_a">Nazwa pliku (Z \u2192 A)</string>
<string name="sort_a_z">A \u2192 Z</string>
<string name="sort_z_a">Z \u2192 A</string>
<string name="sort_new_old">Nowe \u2192 Stare</string>
@@ -737,7 +776,9 @@
<string name="share_dialog_include_label">Dołącz:</string>
<string name="share_playback_position_dialog_label">Pozycja odtwarzania</string>
<string name="share_dialog_episode_website_label">Adres strony odcinka</string>
+ <string name="share_dialog_link_to_episode">Link do odcinka</string>
<string name="share_dialog_media_file_label">Plik multimedialny</string>
+ <string name="share_starting_position_label">Rozpoczęto z</string>
<!--Audio controls-->
<string name="audio_controls">Sterowanie audio</string>
<string name="playback_speed">Prędkość odtwarzania</string>
@@ -782,6 +823,9 @@
<string name="widget_opacity">Nieprzezroczystość</string>
<!--On-Demand configuration-->
<string name="on_demand_config_setting_changed">Ustawienia uaktualnione pomyślnie.</string>
- <string name="on_demand_config_stream_text">Wygląda na to, że dużo streamujesz. Czy chcesz, aby na listach odcinków pokazywać przyciski do stermowania.</string>
- <string name="on_demand_config_download_text">Wygląda na to, że dużo pobierasz. Czy chcesz, aby na listach odcinków pokazywać przyciski do pobierania.</string>
+ <string name="on_demand_config_stream_text">Wygląda na to, że dużo streamujesz. Czy chcesz, aby na listach odcinków pokazywać przyciski do streamowania?</string>
+ <string name="on_demand_config_download_text">Wygląda na to, że dużo pobierasz. Czy chcesz, aby na listach odcinków pokazywać przyciski do pobierania?</string>
+ <string name="shortcut_subscription_label">Skrót subskrypcji</string>
+ <string name="shortcut_select_subscription">Wybierz subskrypcję</string>
+ <string name="add_shortcut">Dodaj subskrypcję</string>
</resources>
diff --git a/ui/i18n/src/main/res/values-pt-rBR/strings.xml b/ui/i18n/src/main/res/values-pt-rBR/strings.xml
index c994b55ac..a4e707c59 100644
--- a/ui/i18n/src/main/res/values-pt-rBR/strings.xml
+++ b/ui/i18n/src/main/res/values-pt-rBR/strings.xml
@@ -171,6 +171,9 @@
<item quantity="one">%d assinatura atualizada.</item>
<item quantity="other">%d assinaturas atualizadas.</item>
</plurals>
+ <string name="edit_tags">Editar etiquetas</string>
+ <string name="rename_tag_label">Renomear etiqueta</string>
+ <string name="confirm_mobile_feed_refresh_dialog_message">O download de episódios pela conexão de dados móveis está desabilitado nas configurações.\n\nVocê ainda deseja atualizar todas as podcasts pelos dados móveis?</string>
<!--actions on feeditems-->
<string name="download_label">Download</string>
<plurals name="downloading_batch_label">
@@ -240,6 +243,8 @@
<string name="download_error_forbidden">O servidor de hospedagem do podcast se recusa a responder.</string>
<string name="download_canceled_msg">Download cancelado</string>
<string name="download_error_wrong_size">A conexão com o servidor foi perdida antes de completar o download</string>
+ <string name="download_error_blocked">O download foi bloqueado por outro aplicativo no seu dispositivo (como um VPN ou ad blocker).</string>
+ <string name="download_error_certificate">Não foi possível estabelecer uma conexão segura. Isso pode significar que outro aplicativo (como um VPN ou ad blocker), no seu dispositivo, bloqueou o download, ou que alguma coisa está errada com os certificados do servidor.</string>
<string name="download_report_title">Downloads finalizados com erro(s)</string>
<string name="auto_download_report_title">Download automático finalizado</string>
<string name="download_error_io_error">Erro de IO</string>
@@ -255,6 +260,7 @@
<string name="download_type_feed">Feed</string>
<string name="download_type_media">Arquivo de mídia</string>
<string name="null_value_podcast_error">Nenhum podcast foi fornecido para ser exibido.</string>
+ <string name="no_feed_url_podcast_found_by_search">A podcast sugerida não tem um link RSS mas AntennaPod achou uma podcast que pode corresponder</string>
<string name="authentication_notification_title">Autenticação requerida</string>
<string name="authentication_notification_msg">O recurso que você solicitou requer um usuário e uma senha</string>
<string name="confirm_mobile_download_dialog_title">Confirmar Download utilizando dados móveis</string>
@@ -323,6 +329,7 @@
<string name="storage_sum">Exclusão automática de episódio, importação, exportação</string>
<string name="project_pref">Projeto</string>
<string name="synchronization_pref">Sincronização</string>
+ <string name="synchronization_sum">Sincronizar com outros dispositivos</string>
<string name="automation">Automação</string>
<string name="download_pref_details">Detalhes</string>
<string name="import_export_pref">Importar/Exportar</string>
@@ -413,8 +420,15 @@
<string name="pref_theme_title_dark">Escuro</string>
<string name="pref_theme_title_trueblack">Preto (preparado para AMOLED)</string>
<string name="pref_episode_cache_unlimited">Ilimitado</string>
+ <string name="synchronization_logout">Terminar sessão</string>
+ <string name="pref_synchronization_logout_toast">Sessão terminada com sucesso</string>
<string name="pref_gpodnet_setlogin_information_title">Alterar informações de login</string>
<string name="pref_gpodnet_setlogin_information_sum">Alterar informações de login da sua conta gpodder.net</string>
+ <string name="synchronization_sync_changes_title">Sincronizar agora</string>
+ <string name="synchronization_full_sync_title">Forçar sincronização completa</string>
+ <string name="synchronization_summary_unchoosen">Você pode escolher de vários serviços para sincronizar suas assinaturas e o estado de reprodução dos episódios com</string>
+ <string name="synchronization_summary_nextcloud">Gpoddersync é um aplicativo Nextcloud de código aberto que você pode facilmente instalar em seu próprio servidor. O aplicativo é independente do projeto AntennaPod.</string>
+ <string name="synchronization_choose_title">Escolher o serviço de sincronização</string>
<string name="pref_playback_speed_sum">Personalize as velocidades disponíveis para reprodução de áudio.</string>
<string name="pref_feed_playback_speed_sum">A velocidade a ser usada ao iniciar a reprodução de áudio para episódios neste podcast</string>
<string name="pref_feed_skip">Salto automático</string>
@@ -494,6 +508,7 @@
<string name="new_episode_notification_disabled">Notificação desabilitada</string>
<string name="pref_feed_settings_dialog_msg">Essa configuração é única para cada podcast. Você pode alterá-la abrindo a página do podcast.</string>
<string name="pref_contribute">Contribuir</string>
+ <string name="pref_show_subscription_title_summary">Mostrar o título da assinatura abaixo da imagem da capa.</string>
<!--About screen-->
<string name="about_pref">Sobre</string>
<string name="antennapod_version">Versão do AntennaPod</string>
@@ -516,6 +531,7 @@
<string name="sync_status_episodes_download">Baixando alterações de episódio…</string>
<string name="sync_status_upload_played">Enviando status de reprodução...</string>
<string name="sync_status_subscriptions">Sincronizando assinaturas...</string>
+ <string name="sync_status_wait_for_downloads">Esperando os downloads terminarem...</string>
<string name="sync_status_success">Sincronização bem sucedida</string>
<string name="sync_status_error">Falha na sincronização</string>
<!--import and export-->
@@ -613,6 +629,7 @@
<string name="preview_episode">Pré-visualizar</string>
<string name="stop_preview">Parar pré-visualização</string>
<!--Content descriptions for image buttons-->
+ <string name="toolbar_back_button_content_description">Voltar</string>
<string name="rewind_label">Retroceder</string>
<string name="fast_forward_label">Avançar</string>
<string name="increase_speed">Aumentar velocidade</string>
@@ -630,6 +647,7 @@
<!--Feed settings/information screen-->
<string name="authentication_label">Autenticação</string>
<string name="authentication_descr">Altera seu nome de usuário e sua senha para este podcast e seus episódios.</string>
+ <string name="feed_tags_label">Etiquetas</string>
<string name="feed_folders_include_root">Exibir na lista principal</string>
<string name="auto_download_settings_label">Configurações do download automático</string>
<string name="episode_filters_label">Filtro de episódios</string>
@@ -703,6 +721,7 @@
<string name="share_playback_position_dialog_label">Posição do playback</string>
<string name="share_dialog_episode_website_label">Webpage do episódio</string>
<string name="share_dialog_media_file_label">Arquivo de media</string>
+ <string name="share_starting_position_label">Iniciando em</string>
<!--Audio controls-->
<string name="audio_controls">Controles de áudio</string>
<string name="playback_speed">Velocidade de reprodução</string>
diff --git a/ui/i18n/src/main/res/values-ru/strings.xml b/ui/i18n/src/main/res/values-ru/strings.xml
index 01dd6fe81..365912c52 100644
--- a/ui/i18n/src/main/res/values-ru/strings.xml
+++ b/ui/i18n/src/main/res/values-ru/strings.xml
@@ -165,7 +165,7 @@
<string name="share_label_with_ellipses">Поделиться…</string>
<string name="share_file_label">Поделиться файлом</string>
<string name="share_website_url_label">Адрес вебсайта</string>
- <string name="share_feed_url_label">Ссылка на канал</string>
+ <string name="share_feed_url_label">Rss-фид подкаста</string>
<string name="feed_delete_confirmation_msg">Подтвердите, что хотите удалить подкаст «%1$s» и все его выпуски (включая загруженные).</string>
<string name="feed_delete_confirmation_msg_batch">Подтвердите, что хотите удалить выбранные подкасты и все их выпуски (включая загруженные).</string>
<string name="feed_delete_confirmation_local_msg">Подтвердите, что хотите удалить подкаст «%1$s». Файлы в локальной исходной папке не будут удалены.</string>
@@ -749,7 +749,7 @@
<string name="hide_paused_episodes_label">Приостановленное</string>
<string name="not_paused">Не на паузе</string>
<string name="hide_played_episodes_label">Прослушанное</string>
- <string name="not_played">Не проигрывается</string>
+ <string name="not_played">Непрослушанное</string>
<!--Sort-->
<string name="sort_title_a_z">от А к Я</string>
<string name="sort_title_z_a">от Я к А</string>
diff --git a/ui/i18n/src/main/res/values-sk/strings.xml b/ui/i18n/src/main/res/values-sk/strings.xml
index 3de3327c2..8d44090e1 100644
--- a/ui/i18n/src/main/res/values-sk/strings.xml
+++ b/ui/i18n/src/main/res/values-sk/strings.xml
@@ -185,6 +185,9 @@
<item quantity="many">%d odberov aktualizovaných.</item>
<item quantity="other">%d odberov aktualizovaných.</item>
</plurals>
+ <string name="edit_tags">Upraviť štítky</string>
+ <string name="rename_tag_label">Premenovať štítok</string>
+ <string name="confirm_mobile_feed_refresh_dialog_message">Sťahovanie epizód cez mobilné dátové pripojenie je v nastaveniach vypnuté.\n\nChcete napriek tomu obnoviť všetky podcasty cez mobilné dáta?</string>
<!--actions on feeditems-->
<string name="download_label">Stiahnuť</string>
<plurals name="downloading_batch_label">
@@ -199,6 +202,12 @@
<string name="delete_label">Vymazať</string>
<string name="delete_failed">Nemožno vymazať súbor. Skúste reštartovať zariadenie.</string>
<string name="delete_episode_label">Odstrániť epizódu</string>
+ <plurals name="deleted_multi_episode_batch_label">
+ <item quantity="one">1 stiahnutá epizóda zmazaná.</item>
+ <item quantity="few">%dstiahnutých epizód zmazaných.</item>
+ <item quantity="many">%dstiahnutých epizód zmazaných.</item>
+ <item quantity="other">%dstiahnutých epizód zmazaných.</item>
+ </plurals>
<string name="remove_new_flag_label">Odstrániť značku „nové“</string>
<string name="removed_new_flag_label">Značka „nové“ bola odstránená</string>
<string name="mark_read_label">Označiť ako prehrané</string>
@@ -264,6 +273,8 @@
<string name="download_error_forbidden">Server podcastu odmieta odpovedať.</string>
<string name="download_canceled_msg">Sťahovanie zrušené</string>
<string name="download_error_wrong_size">Pred dokončením sťahovania došlo k strate pripojenia k serveru</string>
+ <string name="download_error_blocked">Sťahovanie bolo zablokované inou aplikáciou vo Vašom zariadení (napríklad VPN alebo Ad blocker).</string>
+ <string name="download_error_certificate">Nie je možné nadviazať bezpečné spojenie. To môže znamenať, že iná aplikácia vo Vašom zariadení (ako napríklad VPN alebo Ad blocker) zablokovala sťahovanie, alebo, že niečo je v neporiadku s certifikátmi servera.</string>
<string name="download_report_title">Pri sťahovaní nastali chyby</string>
<string name="auto_download_report_title">Automatické sťahovanie dokončené</string>
<string name="download_error_io_error">Chyba IO</string>
@@ -281,6 +292,7 @@
<string name="download_type_feed">Zdroj</string>
<string name="download_type_media">Mediálny súbor</string>
<string name="null_value_podcast_error">Nebol poskytnutý žiadny podcast, ktorý by mohol byť zobrazený.</string>
+ <string name="no_feed_url_podcast_found_by_search">Navrhovaný podcast nemal RSS link, AntennaPod našiel podcast, ktorý by sa mohol zhodovať. </string>
<string name="authentication_notification_title">Vyžaduje sa overenie</string>
<string name="authentication_notification_msg">Zdroj, ktorý ste vybrali, vyžaduje zadanie uživateľského mena a hesla</string>
<string name="confirm_mobile_download_dialog_title">Potvrďte sťahovanie cez mobilné dáta</string>
@@ -349,6 +361,7 @@
<string name="storage_sum">Automatické mazanie epizód, Import, Export</string>
<string name="project_pref">Projekt</string>
<string name="synchronization_pref">Synchronizácia</string>
+ <string name="synchronization_sum">Synchronizovať s ostatnými zariadeniami</string>
<string name="automation">Automatizácia</string>
<string name="download_pref_details">Podrobnosti</string>
<string name="import_export_pref">Import/Export</string>
@@ -441,8 +454,20 @@
<string name="pref_theme_title_dark">Tmavá</string>
<string name="pref_theme_title_trueblack">Čierna (pre AMOLED)</string>
<string name="pref_episode_cache_unlimited">Bez obmedzenia</string>
+ <string name="synchronization_logout">Odhlásiť</string>
+ <string name="pref_synchronization_logout_toast">Odhlásenie bolo úspešné</string>
<string name="pref_gpodnet_setlogin_information_title">Zmena prihlasovacích údajov</string>
<string name="pref_gpodnet_setlogin_information_sum">Zmení prihlasovacie údaje k vášmu gpodder.net účtu.</string>
+ <string name="synchronization_sync_changes_title">Synchronizovať teraz</string>
+ <string name="synchronization_full_sync_title">Vynútiť plnú synchronizáciu</string>
+ <string name="synchronization_login_status"><![CDATA[Prihlásený ako <i>%1$s</i> na <i>%2$s</i>. <br/><br/>Môžete si vybrať Vášho poskytovateľa synchronizácie opäť keď sa odhlásite]]></string>
+ <string name="synchronization_summary_unchoosen">Môžete si vybrať viacerých poskytovateľov na synchronizáciu vašich odberov a stavu prehratia epizódy</string>
+ <string name="synchronization_summary_nextcloud">Gpoddersync je open-source Nexcloud-ová aplikácia, ktorú si viete ľahko nainštalovať na Váš vlastný server. Aplikácia je nezávislá od projektu AntennaPod.</string>
+ <string name="synchronization_nextcloud_authenticate_browser">Udeľte prístup použitím otvoreného webového prehliadača a vráťte sa späť k AntennaPod.</string>
+ <string name="synchronization_choose_title">Vyberte si poskytovateľa synchronizácie</string>
+ <string name="synchronization_force_sync_summary">Znovu synchronizovať všetky odbery a stavy epizód</string>
+ <string name="synchronization_sync_summary">Synchronizovať odber a zmeny stavu epizódy</string>
+ <string name="dialog_choose_sync_service_title">Vyberte si poskytovateľa synchronizácie</string>
<string name="pref_playback_speed_sum">Upraviť predvybrané možnosti pre prehrávanie zvuku rôznymi rýchlosťami</string>
<string name="pref_feed_playback_speed_sum">Rýchlosť, ktorá bude použitá pri začatí prehrávania epizód tohoto podcastu</string>
<string name="pref_feed_skip">Automatické preskočenie</string>
@@ -522,6 +547,8 @@
<string name="new_episode_notification_disabled">Upozornenia vypnuté</string>
<string name="pref_feed_settings_dialog_msg">Toto nastavenie je špecifické pre každý podcast zvlášť. Je možné ho meniť po otvorení prehľadovej stránky podcastu.</string>
<string name="pref_contribute">Pomôžte</string>
+ <string name="pref_show_subscription_title">Ukázať názov odberu</string>
+ <string name="pref_show_subscription_title_summary">Zobraziť nadpis odberu pod obrázkom obalu</string>
<!--About screen-->
<string name="about_pref">O aplikácii</string>
<string name="antennapod_version">Verzia AntennaPod</string>
@@ -544,6 +571,7 @@
<string name="sync_status_episodes_download">Sťahujú sa zmeny epizód…</string>
<string name="sync_status_upload_played">Nahráva sa stav prehratia…</string>
<string name="sync_status_subscriptions">Synchronizujú sa odbery…</string>
+ <string name="sync_status_wait_for_downloads">Čakám na dokončenie sťahovania...</string>
<string name="sync_status_success">Synchronizácia bola úspešná</string>
<string name="sync_status_error">Synchronizácia zlyhala</string>
<!--import and export-->
@@ -647,6 +675,7 @@
<string name="preview_episode">Ukážka</string>
<string name="stop_preview">Ukončiť ukážku</string>
<!--Content descriptions for image buttons-->
+ <string name="toolbar_back_button_content_description">Späť</string>
<string name="rewind_label">Pretočiť</string>
<string name="fast_forward_label">Rýchlo vpred</string>
<string name="increase_speed">Zvýšiť rýchlosť</string>
@@ -664,18 +693,26 @@
<!--Feed settings/information screen-->
<string name="authentication_label">Overenie</string>
<string name="authentication_descr">Zmeniť svoje používateľské meno a heslo pre tento podcast a jeho epizódy.</string>
+ <string name="feed_tags_label">Štítky</string>
+ <string name="feed_tags_summary">Zmeňte si štítky tohto podcastu aby sa pomohlo usporiadaniu Vašich odberov</string>
<string name="feed_folders_include_root">Zobraziť v hlavnom zozname</string>
+ <string name="multi_feed_common_tags_info">{fa-info-circle} Len všeobecné štítky zo všetkých označených odberov sú zobrazené. Ostatné štítky ostávajú nezmenené.</string>
<string name="auto_download_settings_label">Nastavenia automatického sťahovania</string>
<string name="episode_filters_label">Filter epizód</string>
<string name="episode_filters_description">Zoznam výrazov použitých na rozhodnutie, či má byť epizóda zahrnutá alebo vylúčená pri automatickom sťahovaní</string>
<string name="episode_filters_include">Pridať</string>
<string name="episode_filters_exclude">Vylúčiť</string>
+ <string name="episode_filters_duration">Minimálna dĺžka trvania (v minútach)</string>
<string name="episode_filters_hint">Jednotlivé slová \n„Viaceré slová“</string>
<string name="keep_updated">Priebežne aktualizovať</string>
<string name="keep_updated_summary">Zahrnúť tento podcast pri (automatickej) obnove všetkých podcastov</string>
<string name="auto_download_disabled_globally">Automatické sťahovanie je zakázané v hlavných nastaveniach AntennaPodu</string>
+ <string name="statistics_time_played">Doba prehrávania:</string>
+ <string name="statistics_total_duration">Celková dĺžka trvania (odhad):</string>
+ <string name="statistics_duration_played_episodes">Dĺžka trvania prehrávaných epizód:</string>
<string name="statistics_episodes_on_device">Epizód v zariadení:</string>
<string name="statistics_space_used">Použitý priestor:</string>
+ <string name="statistics_episodes_started_total">Epizódy začaté/celkovo:</string>
<string name="statistics_view_all">Zobraziť všetky podcasty »</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Imporovať odbery z jednoúčelových aplikácií…</string>
@@ -720,6 +757,8 @@
<string name="sort_date_old_new">Dátum (Staré \u2192 Nové)</string>
<string name="sort_duration_short_long">Trvanie (Krátke \u2192 Dlhé)</string>
<string name="sort_duration_long_short">Trvanie (Dlhé \u2192 Krátke)</string>
+ <string name="sort_filename_a_z">Názov súboru (A \u2192 Z)</string>
+ <string name="sort_filename_z_a">Názov súboru (Z \u2192 A)</string>
<string name="sort_a_z">A \u2192 Z</string>
<string name="sort_z_a">Z \u2192 A</string>
<string name="sort_new_old">Nové \u2192 Staré</string>
@@ -736,7 +775,9 @@
<string name="share_dialog_include_label">Zahrnúť:</string>
<string name="share_playback_position_dialog_label">Poloha prehrávania</string>
<string name="share_dialog_episode_website_label">Webová stránka epizódy</string>
+ <string name="share_dialog_link_to_episode">Link na epizódu</string>
<string name="share_dialog_media_file_label">Mediálny súbor</string>
+ <string name="share_starting_position_label">Začínať od</string>
<!--Audio controls-->
<string name="audio_controls">Ovládanie zvuku</string>
<string name="playback_speed">Rýchlosť prehrávania</string>
@@ -783,4 +824,7 @@
<string name="on_demand_config_setting_changed">Nastavenie bolo úspešne aktualizované.</string>
<string name="on_demand_config_stream_text">Zdá sa, že veľa streamujete. Chcete, aby zoznamy epizód zobrazovali tlačidlá pre streamovanie?</string>
<string name="on_demand_config_download_text">Zdá sa, že veľa sťahujete. Chcete, aby zoznamy epizód zobrazovali tlačidlá pre sťahovanie?</string>
+ <string name="shortcut_subscription_label">Skratka odberu</string>
+ <string name="shortcut_select_subscription">Vyberte odber</string>
+ <string name="add_shortcut">Pridať skratku</string>
</resources>
diff --git a/ui/i18n/src/main/res/values-sv/strings.xml b/ui/i18n/src/main/res/values-sv/strings.xml
index caabb24cf..528a0a88a 100644
--- a/ui/i18n/src/main/res/values-sv/strings.xml
+++ b/ui/i18n/src/main/res/values-sv/strings.xml
@@ -25,7 +25,7 @@
<string name="episode_cache_full_message">Episodcachens gräns har nåtts. Du kan öka cachens storlek i inställningarna.</string>
<string name="playback_statistics_label">Uppspelning</string>
<string name="download_statistics_label">Nedladdningar</string>
- <string name="notification_pref_fragment">Notifieringar</string>
+ <string name="notification_pref_fragment">Aviseringar</string>
<!--Google Assistant-->
<string name="app_action_not_found">\"%1$s\" hittades inte</string>
<!--SwipeActions-->
@@ -36,7 +36,7 @@
<string name="enable_swipeactions">Aktivera svepåtgärder för denna skärm</string>
<string name="change_setting">Ändra</string>
<!--Statistics fragment-->
- <string name="total_time_listened_to_podcasts">Total uppspelningstid:</string>
+ <string name="total_time_listened_to_podcasts">Total spelad tid:</string>
<string name="statistics_mode">Statistikläge</string>
<string name="statistics_mode_normal">Beräkna faktisk speltid. Att spela två gånger räknas två gånger, men att markera som spelad räknas inte</string>
<string name="statistics_mode_count_all">Summera alla episoder som är markerade som spelade</string>
@@ -50,7 +50,7 @@
<string name="drawer_open">Öppna meny</string>
<string name="drawer_close">Stäng meny</string>
<string name="drawer_preferences">Menyinställningar</string>
- <string name="drawer_feed_order_unplayed_episodes">Sortera efter räknare</string>
+ <string name="drawer_feed_order_unplayed_episodes">Sortera efter antal ospelade</string>
<string name="drawer_feed_order_alphabetical">Sortera alfabetiskt</string>
<string name="drawer_feed_order_last_update">Sortera efter publiceringsdatum</string>
<string name="drawer_feed_order_most_played">Sortera efter antal spelade episoder</string>
@@ -153,7 +153,7 @@
<string name="share_label_with_ellipses">Dela...</string>
<string name="share_file_label">Dela fil</string>
<string name="share_website_url_label">Webbsideadress</string>
- <string name="share_feed_url_label">Podcasflödes URL</string>
+ <string name="share_feed_url_label">Podcastflödes URL</string>
<string name="feed_delete_confirmation_msg">Bekräfta att du vill ta bort podcast \"%1$s\" och ALLA dess episoder (inklusive nedladdade episoder).</string>
<string name="feed_delete_confirmation_msg_batch">Bekräfta att du vill ta bort valda podcasts och ALLA deras episoder (inklusive nedladdade episoder).</string>
<string name="feed_delete_confirmation_local_msg">Bekräfta att du vill ta bort alla podcasts \"%1$s\". Filerna i den lokala källkatalogen kommer inte att raderas.</string>
@@ -387,7 +387,7 @@
<string name="pref_pauseOnHeadsetDisconnect_title">Hörlurar eller Bluetooth kopplas bort</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Hörlurar återanslutna</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Blutetooth återansluts</string>
- <string name="pref_stream_over_download_title">Föredra Strömmning</string>
+ <string name="pref_stream_over_download_title">Föredra strömmning</string>
<string name="pref_stream_over_download_sum">Visa strömningsknappen istället för nedlanningsknappen i listor.</string>
<string name="pref_mobileUpdate_title">Mobila uppdateringar</string>
<string name="pref_mobileUpdate_sum">Välj vad som ska tillåtas över mobila dataanslutningar</string>
@@ -452,11 +452,11 @@
<string name="pref_fast_forward_sum">Anpassa antalet sekunder att hoppa framåt när snabbspolningsknappen används</string>
<string name="pref_rewind">Snabbspolningslängd bakåt</string>
<string name="pref_rewind_sum">Anpassa antalet sekunder att hoppa bakåt när snabbspolningsknappen bakåt används</string>
- <string name="pref_expandNotify_title">Hög notifieringsprioritet</string>
+ <string name="pref_expandNotify_title">Hög aviseringsprioritet</string>
<string name="pref_expandNotify_sum">Detta expanderar oftast notifieringen och visar uppspelningskontroller.</string>
<string name="pref_persistNotify_title">Bestående uppspelningskontroller</string>
<string name="pref_persistNotify_sum">Behåll avisering och kontroller på låsskärmen när uppspelningen pausas.</string>
- <string name="pref_compact_notification_buttons_title">Kompakta Notifieringsknappar</string>
+ <string name="pref_compact_notification_buttons_title">Kompakta aviseringsknappar</string>
<string name="pref_compact_notification_buttons_sum">Ändra uppspelningsknapparna när notifieringen är kollapsad. Spela/paus-knappen visas alltid.</string>
<string name="pref_compact_notification_buttons_dialog_title">Välj maximalt %1$d st.</string>
<string name="pref_compact_notification_buttons_dialog_error">Du kan bara välja maximalt %1$d st.</string>
@@ -480,7 +480,7 @@
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Använd en nätverksproxy</string>
<string name="pref_no_browser_found">Ingen webbläsare hittades.</string>
- <string name="pref_enqueue_downloaded_title">Köa Nedladdade</string>
+ <string name="pref_enqueue_downloaded_title">Köa nedladdad</string>
<string name="pref_enqueue_downloaded_summary">Lägg nedladdade episoder i uppspelningskön</string>
<string name="media_player_builtin">Androids inbyggda spelare (föråldrad)</string>
<string name="media_player_sonic">Sonic Mediaspelare (föråldrad)</string>
@@ -626,7 +626,7 @@
<string name="gpodnetsync_pref_report_failed">Misslyckades</string>
<string name="gpodnetsync_username_characters_error">Användarnamn får bara innehålla bokstäver, siffror, bindesstreck och understreck.</string>
<!--Directory chooser-->
- <string name="choose_data_directory">Välj Datakatalog</string>
+ <string name="choose_data_directory">Välj katalog</string>
<string name="choose_data_directory_message">Välj rotkatalogen för din data. AntennaPod skapar de underkataloger som behövs.</string>
<string name="choose_data_directory_available_space">%1$s av %2$s ledigt</string>
<string name="pref_pausePlaybackForFocusLoss_sum">Pausa uppspelning istället för att sänka volymen när en annan app vill spela ljud</string>
@@ -771,7 +771,7 @@
<string name="notification_channel_downloading">Laddar ner</string>
<string name="notification_channel_downloading_description">Visas under tiden som nedladdning pågår.</string>
<string name="notification_channel_playing">Uppspelning pågår</string>
- <string name="notification_channel_playing_description">Medger kontroll över uppspelning. Detta är huvudnotifieringen som du ser när en podcast spelas.</string>
+ <string name="notification_channel_playing_description">Tillåt kontroll över uppspelning. Detta är huvudaviseringen som du ser när en podcast spelas.</string>
<string name="notification_channel_download_error">Nedladdning misslyckads</string>
<string name="notification_channel_download_error_description">Visas när nedladdning eller flödesuppdatering misslyckas.</string>
<string name="notification_channel_sync_error">Synkronisering misslyckades</string>
diff --git a/ui/i18n/src/main/res/values/strings.xml b/ui/i18n/src/main/res/values/strings.xml
index ef07e0000..88e5dc144 100644
--- a/ui/i18n/src/main/res/values/strings.xml
+++ b/ui/i18n/src/main/res/values/strings.xml
@@ -190,7 +190,7 @@
</plurals>
<string name="edit_tags">Edit tags</string>
<string name="rename_tag_label">Rename tag</string>
- <string name="confirm_mobile_feed_refresh_dialog_message">Downloading episodes over mobile data connection is disabled in the settings.\n\nDo you still want to refresh all podcasts over mobile data?</string>
+ <string name="confirm_mobile_feed_refresh_dialog_message">Refreshing podcasts over mobile data connection is disabled in the settings.\n\nDo you want to refresh anyway?</string>
<!-- actions on feeditems -->
<string name="download_label">Download</string>