Merge branch 'master' into develop

This commit is contained in:
ByteHamster 2020-10-17 23:35:24 +02:00
commit 8f6c560f01
47 changed files with 747 additions and 248 deletions

View File

@ -43,7 +43,7 @@ trans.ar = app/src/main/play/listings/ar/full-description.txt
trans.az = app/src/main/play/listings/az-AZ/full-description.txt
trans.bg = app/src/main/play/listings/bg/full-description.txt
trans.ca = app/src/main/play/listings/ca/full-description.txt
trans.cs = app/src/main/play/listings/cs-CZ/full-description.txt
trans.cs_CZ = app/src/main/play/listings/cs-CZ/full-description.txt
trans.da = app/src/main/play/listings/da-DK/full-description.txt
trans.de = app/src/main/play/listings/de-DE/full-description.txt
trans.el = app/src/main/play/listings/el-GR/full-description.txt
@ -65,7 +65,7 @@ trans.lt = app/src/main/play/listings/lt/full-description.txt
trans.nl = app/src/main/play/listings/nl-NL/full-description.txt
trans.pl_PL = app/src/main/play/listings/pl-PL/full-description.txt
trans.pt_BR = app/src/main/play/listings/pt-BR/full-description.txt
trans.pt_PT = app/src/main/play/listings/pt-PT/full-description.txt
trans.pt = app/src/main/play/listings/pt-PT/full-description.txt
trans.ro_RO = app/src/main/play/listings/ro/full-description.txt
trans.ru_RU = app/src/main/play/listings/ru-RU/full-description.txt
trans.sl_SI = app/src/main/play/listings/sl/full-description.txt
@ -83,7 +83,7 @@ trans.ar = app/src/main/play/listings/ar/short-description.txt
trans.az = app/src/main/play/listings/az-AZ/short-description.txt
trans.bg = app/src/main/play/listings/bg/short-description.txt
trans.ca = app/src/main/play/listings/ca/short-description.txt
trans.cs = app/src/main/play/listings/cs-CZ/short-description.txt
trans.cs_CZ = app/src/main/play/listings/cs-CZ/short-description.txt
trans.da = app/src/main/play/listings/da-DK/short-description.txt
trans.de = app/src/main/play/listings/de-DE/short-description.txt
trans.el = app/src/main/play/listings/el-GR/short-description.txt
@ -105,7 +105,7 @@ trans.lt = app/src/main/play/listings/lt/short-description.txt
trans.nl = app/src/main/play/listings/nl-NL/short-description.txt
trans.pl_PL = app/src/main/play/listings/pl-PL/short-description.txt
trans.pt_BR = app/src/main/play/listings/pt-BR/short-description.txt
trans.pt_PT = app/src/main/play/listings/pt-PT/short-description.txt
trans.pt = app/src/main/play/listings/pt-PT/short-description.txt
trans.ro_RO = app/src/main/play/listings/ro/short-description.txt
trans.ru_RU = app/src/main/play/listings/ru-RU/short-description.txt
trans.sl_SI = app/src/main/play/listings/sl/short-description.txt

View File

@ -14,8 +14,8 @@ android {
// "1.2.3-SNAPSHOT" -> 1020300
// "1.2.3-RC4" -> 1020304
// "1.2.3" -> 1020395
versionCode 2000195
versionName "2.0.1"
versionCode 2000295
versionName "2.0.2"
multiDexEnabled false
vectorDrawables.useSupportLibrary true

View File

@ -26,6 +26,7 @@ import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@ -78,6 +79,7 @@ public class MainActivity extends CastEnabledActivity {
public static final String EXTRA_OPEN_PLAYER = "open_player";
public static final String EXTRA_REFRESH_ON_START = "refresh_on_start";
public static final String EXTRA_STARTED_FROM_SEARCH = "started_from_search";
public static final String KEY_GENERATED_VIEW_ID = "generated_view_id";
private @Nullable DrawerLayout drawerLayout;
private @Nullable ActionBarDrawerToggle drawerToggle;
@ -99,6 +101,9 @@ public class MainActivity extends CastEnabledActivity {
public void onCreate(Bundle savedInstanceState) {
lastTheme = UserPreferences.getNoTitleTheme();
setTheme(lastTheme);
if (savedInstanceState != null) {
ensureGeneratedViewIdGreaterThan(savedInstanceState.getInt(KEY_GENERATED_VIEW_ID, 0));
}
super.onCreate(savedInstanceState);
StorageUtils.checkStorageAvailability(this);
setContentView(R.layout.main);
@ -150,6 +155,25 @@ public class MainActivity extends CastEnabledActivity {
sheetBehavior.setBottomSheetCallback(bottomSheetCallback);
}
/**
* ViewCompat.generateViewId stores the current ID in a static variable.
* When the process is killed, the variable gets reset.
* This makes sure that we do not get ID collisions
* and therefore errors when trying to restore state from another view.
*/
@SuppressWarnings("StatementWithEmptyBody")
private void ensureGeneratedViewIdGreaterThan(int minimum) {
while (ViewCompat.generateViewId() <= minimum) {
// Generate new IDs
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_GENERATED_VIEW_ID, ViewCompat.generateViewId());
}
private BottomSheetBehavior.BottomSheetCallback bottomSheetCallback =
new BottomSheetBehavior.BottomSheetCallback() {
@Override

View File

@ -8,6 +8,7 @@ import androidx.annotation.AttrRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.util.IntentUtils;
public class VisitWebsiteActionButton extends ItemActionButton {
@ -29,8 +30,7 @@ public class VisitWebsiteActionButton extends ItemActionButton {
@Override
public void onClick(Context context) {
Uri uri = Uri.parse(item.getLink());
context.startActivity(new Intent(Intent.ACTION_VIEW, uri));
IntentUtils.openInBrowser(context, item.getLink());
}
@Override

View File

@ -281,7 +281,12 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (!super.onOptionsItemSelected(item)) {
if (item.getItemId() == R.id.action_search) {
item.getActionView().post(() -> iconTintManager.updateTint());
}
if (super.onOptionsItemSelected(item)) {
return true;
} else {
if (feed == null) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(
R.string.please_wait_for_data, Toast.LENGTH_LONG);
@ -332,8 +337,6 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
DownloadRequestErrorDialogCreator.newRequestErrorDialog(getActivity(), e.getMessage());
return true;
}
} else {
return true;
}
}

View File

@ -38,6 +38,8 @@ import io.reactivex.schedulers.Schedulers;
public class ItemPagerFragment extends Fragment {
private static final String ARG_FEEDITEMS = "feeditems";
private static final String ARG_FEEDITEM_POS = "feeditem_pos";
private static final String KEY_PAGER_ID = "pager_id";
private ViewPager2 pager;
/**
* Creates a new instance of an ItemPagerFragment.
@ -77,12 +79,16 @@ public class ItemPagerFragment extends Fragment {
feedItems = getArguments().getLongArray(ARG_FEEDITEMS);
int feedItemPos = getArguments().getInt(ARG_FEEDITEM_POS);
ViewPager2 pager = layout.findViewById(R.id.pager);
pager = layout.findViewById(R.id.pager);
// FragmentStatePagerAdapter documentation:
// > When using FragmentStatePagerAdapter the host ViewPager must have a valid ID set.
// When opening multiple ItemPagerFragments by clicking "item" -> "visit podcast" -> "item" -> etc,
// the ID is no longer unique and FragmentStatePagerAdapter does not display any pages.
int newId = ViewCompat.generateViewId();
if (savedInstanceState != null && savedInstanceState.getInt(KEY_PAGER_ID, 0) != 0) {
// Restore state by using the same ID as before. ID collisions are prevented in MainActivity.
newId = savedInstanceState.getInt(KEY_PAGER_ID, 0);
}
pager.setId(newId);
pager.setAdapter(new ItemPagerAdapter(this));
pager.setCurrentItem(feedItemPos, false);
@ -99,6 +105,12 @@ public class ItemPagerFragment extends Fragment {
return layout;
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_PAGER_ID, pager.getId());
}
@Override
public void onDestroyView() {
super.onDestroyView();

View File

@ -8,6 +8,7 @@ import androidx.appcompat.widget.SearchView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.util.ThemeUtils;
import de.danoeh.antennapod.fragment.SearchFragment;
/**
@ -33,6 +34,7 @@ public class MenuItemUtils extends de.danoeh.antennapod.core.menuhandler.MenuIte
public static void setupSearchItem(Menu menu, MainActivity activity, long feedId, String feedTitle) {
MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView sv = (SearchView) searchItem.getActionView();
sv.setBackgroundColor(ThemeUtils.getColorFromAttr(activity, android.R.attr.windowBackground));
sv.setQueryHint(activity.getString(R.string.search_label));
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override

View File

@ -1,7 +1,9 @@
package de.danoeh.antennapod.view;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.view.ContextThemeWrapper;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
@ -33,16 +35,20 @@ public abstract class ToolbarIconTintManager implements AppBarLayout.OnOffsetCha
public void updateTint() {
if (isTinted) {
doTint(new ContextThemeWrapper(context, R.style.Theme_AntennaPod_Dark));
if (toolbar.getNavigationIcon() != null) { // Tablets do not show a navigation icon
toolbar.getNavigationIcon().setColorFilter(0xffffffff, PorterDuff.Mode.SRC_ATOP);
}
toolbar.getOverflowIcon().setColorFilter(0xffffffff, PorterDuff.Mode.SRC_ATOP);
safeSetColorFilter(toolbar.getNavigationIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
safeSetColorFilter(toolbar.getOverflowIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
safeSetColorFilter(toolbar.getCollapseIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
} else {
doTint(context);
if (toolbar.getNavigationIcon() != null) { // Tablets do not show a navigation icon
toolbar.getNavigationIcon().clearColorFilter();
}
toolbar.getOverflowIcon().clearColorFilter();
safeSetColorFilter(toolbar.getNavigationIcon(), null);
safeSetColorFilter(toolbar.getOverflowIcon(), null);
safeSetColorFilter(toolbar.getCollapseIcon(), null);
}
}
private void safeSetColorFilter(Drawable icon, PorterDuffColorFilter filter) {
if (icon != null) {
icon.setColorFilter(filter);
}
}

View File

@ -24,8 +24,8 @@ AntennaPod ist von Podcast-Enthusiasten gemacht und frei im wahrsten Sinne des W
<b>Tritt der AntennaPod-Community bei!</b>
AntennaPod wird aktiv von Freiwilligen weiterentwickelt. Auch du kannst bei der Entwicklung mit Quellcode oder Kommentaren mitwirken!
Wir verwenden GitHub für Funktionswünsche, Fehlerberichte und zur Beteiligung an der Entwicklung:
https://www.github.com/AntennaPod/AntennaPod
Unsere freundlichen Freiwilligen im Forum stehen dir bei allen Fragen zur Seite. Gerne kannst du dich dort auch über neue Funktionen und über Podcasting generell austauschen.
https://forum.antennapod.org/
Mit Transifex kannst du uns beim Übersetzen helfen:
https://www.transifex.com/antennapod/antennapod

View File

@ -1,4 +1,4 @@
AntennaPod on taskuhäälingu haldur ja esitaja, millega saad kohese ligipääsu miljonitele tasuta ja tasulistele saadetele nii ise- kui suurtegijatelt nagu BBC, NPR ja CNN. Lisa, impordi ja ekspordi nende voogusid ilma muredeta kasutades iTunes'i taskuhäälingute andmebaasi, OPML fail või lihtsalt RSS URL-e.
AntennaPod on taskuhäälingu haldur ja esitaja, millega saad kohe ligipääsu miljonitele tasuta ja tasulistele saadetele nii ise- kui suurtegijatelt nagu BBC, NPR ja CNN. Lisa, impordi ja ekspordi nende voogusid ilma probleemideta, kasutades iTunes'i taskuhäälingute andmebaasi, OPML faili või lihtsalt RSS URL-e.
Laadi alla, voogedasta või lisa kuulamise järjekorda saateid ning naudi neid täpselt nii, nagu sina tahad, kasutades muudetavat taasesituse kiirust, peatükkide tuge ja unetaimerit.
Säästa pingutuselt, aku kestuselt ja mobiilse andmeside kasutuselt võimekate automatiseerimise vahenditega saadete allalaadimiseks (määra millal, mis sagedusega ja millistest WiFi võrkudes) ning kustutamiseks (vastavalt sinu lemmikutele ja viivituse sätetele).
@ -24,8 +24,8 @@ Kuna AntennaPod on tehtud taskuhäälingu entusiastide poolt, on AntennaPod vaba
<b>Liitu AntennaPodi kogukonnaga!</b>
AntennaPod on vabatahtlike poolt aktiivselt arendamisel. Ka sina võid anda oma osa, kirjutades koodi või andes tagasisidet!
GitHub on koht, kus esitada uute võimaluste soove, vearaporteid ja kooditäiendusi:
https://www.github.com/AntennaPod/AntennaPod
Meie sõbralikud foorumi liikmed aitavad sind meeleldi leida vastuse kõigile küsimustele. Oled oodatud arutama nii äpi võimalusi kui taskuhäälinguid üldiselt.
https://forum.antennapod.org/
Transifex on koht, kus saab aidata tõlgetega:
https://www.transifex.com/antennapod/antennapod

View File

@ -24,8 +24,8 @@ Conçu par des fans de podcast, AntennaPod est gratuit, open source et sans publ
<b>Rejoignez la communauté d'AntennaPod !</b>
AntennaPod est développé activement par des volontaires. Vous pouvez aussi contribuer avec du code, des traductions ou des commentaires !
Rendez-vous sur GitHub pour demander de nouvelles options, signaler des bugs ou pour contribuer au développement :
https://www.github.com/AntennaPod/AntennaPod
Les utilisateurs de notre forum seront heureux de répondre à vos questions. Rejoignez-nous pour discuter des fonctionnalités et des podcasts.
https://forum.antennapod.org/
Rendez-vous sur Transifex pour aider la traduction :
https://www.transifex.com/antennapod/antennapod

View File

@ -1,6 +1,6 @@
AntennaPod é un xestor de podcast e reprodutor que che permite acceder a millóns de contidos gratuítos e de pagamento, desde produtores independentes a grandes empresas de contidos como BBC, NPR ou CNN. Engade, importa e exporta as súas fontes sen complicacións utilizando a base de datos de iTunes, ficheiros OPML ou URL de RSS.
Descarga, difunde ou pon e cola episodios e desfrutaos do xeito que prefiras, con velocidade de reprodución axustable, soporte de capítulos e apagado programable.
De xeito doado, aforrando batería e datos móbiles e con ferramentas potentes para a automatización das descargas (indicando horarios, intervalos e redes WiFi) e borrado de ficheiros (baseado nos favoritos e axustes temporais).
Descarga, difunde ou pon e cola episodios e desfrútaos do xeito que prefiras, con velocidade de reprodución axustable, soporte de capítulos e apagado programable.
De xeito doado, aforrando batería e datos móbiles, con ferramentas potentes para a automatización das descargas (indicando horarios, intervalos e redes WiFi) e borrado de ficheiros (baseado nos favoritos e axustes temporais).
Feita por entusiastas do podcast, AntennaPod é libre en todos os sentidos da palabra: código aberto, gratuíto e sen anuncios.
@ -17,15 +17,15 @@ Feita por entusiastas do podcast, AntennaPod é libre en todos os sentidos da pa
<b>Xestiona o sistema</b>
• Toma o control das descargas automáticas: escolle fontes, exclúe redes móbiles, redes Wifi específicas, que o móbil esté cargando ou establece horarios para a descarga
• Xestiona o almacenaxe establecendo a número de episodios gardados, borrado intelixente e escollendo a localización preferida.
• Xestiona a almacenaxe establecendo a número de episodios gardados, borrado intelixente e escollendo a localización preferida.
• Adáptase ao teu entorno utilizando os decorados claro ou escuro
• Respalda as túas subscricións con gPodder.net e a exportación OPML
<b>Participa na comunidade AntennaPod!</b>
AntennaPod está baixo continuo desenvolvemento grazas a voluntarios. Vostede tamén pode contribuir, con código ou con comentarios!
AntennaPod está baixo continuo desenvolvemento grazas a persoas voluntarias. Ti tamén podes contribuír, con código ou con comentarios!
Podes solicitar novas características utilizando GitHub, así como informe de fallos ou contribuír ao código:
https://www.github.com/AntennaPod/AntennaPod
No noso foro estamos encantados de poder axudarche con calquera dúbida que teñas. Convidámoste a comentar a aplicación e o podcasting en xeral.
https://forum.antennapod.org/
As traducións fanse en Transifex:
https://www.transifex.com/antennapod/antennapod

View File

@ -24,8 +24,8 @@ Podcast-rajongók készítésében, az AntennaPod teljesen szabad, nyílt forrá
<b>Csatlakozzon az AntennaPod közösséghez!</b>
Az AntennaPodot aktívan fejlesztik az önkéntesek. Ön is közreműködhet: kóddal vagy megjegyzésekkel!
A GitHub a funkciókérések, hibajelentések és a kódbeküldés helye:
https://www.github.com/AntennaPod/AntennaPod
A barátságos fórumtagjaink örömmel segítenek minden felmerülő kérdésben. Meghívjuk, hogy beszélgessen a funkciókról, valamint általánosságban a podcastolásról.
https://forum.antennapod.org/
A Transifexen segíthet a fordításokban:
https://www.transifex.com/antennapod/antennapod

View File

@ -1,14 +1,14 @@
AntennaPod è un riproduttore e gestore di podcast che permette l'accesso immediato a milioni di podcast gratuiti e a pagamento, dai podcaster indipendenti alle più grandi emittenti come BBC, NPR e CNN. Aggiungi, importa e esporta in modo semplice usando il database di podcast di iTunes, un file OPML o i semplici URL RSS.
Scarica, ascolta in streaming o accoda gli episodi e goditeli come preferisci grazie alla velocità di riproduzione modificabile, al supporto ai capitoli e al timer di spegnimento.
Risparmia fatica, carica della batteria e dati con i potenti controlli automatizzati per il download degli episodi (orari specifici, intervalli di tempo e reti WiFi selezionate) e l'eliminazione degli episodi (gestione dei preferiti e i tempi di cancellazione).
AntennaPod è un riproduttore e gestore di podcast che permette l'accesso immediato a milioni di podcast gratuiti e a pagamento, dai podcaster indipendenti alle grandi emittenti come BBC, NPR e CNN. Aggiungi, importa ed esporta i feed in modo semplice tramite il database di iTunes, i file OPML o i semplici indirizzi RSS.
Scarica, accoda o ascolta in streaming gli episodi e goditeli come preferisci grazie alla velocità di riproduzione modificabile, al supporto ai capitoli e al timer di spegnimento.
Risparmia fatica, carica della batteria e dati grazie ai potenti controlli automatizzati per il download degli episodi (orari specifici, intervalli di tempo e reti WiFi specifiche) e l'eliminazione degli episodi (gestione dei preferiti e tempi di cancellazione).
Creato da appassionati di podcast, AntennaPod è libero in tutti i sensi: open source, gratuito e senza pubblicità.
Creato da appassionati di podcast, AntennaPod è libero in tutti i sensi: open source, gratuito e senza pubblicità.
<b>Importa, organizza e riproduci</b>
• Gestisci la riproduzione ovunque: widget nella schermata home, tendina delle notifiche, cuffie e controlli bluetooth.
• Gestisci la riproduzione ovunque: widget nella schermata home, tendina delle notifiche, cuffie e controlli Bluetooth.
• Aggiungi e importa le sottoscrizioni tramite iTunes e gPodder, o anche tramite file OPML, collegamenti RSS o Atom.
• Goditi l'ascolto nel modo che preferisci grazie alla velocità di riproduzione modificabile, il supporto ai capitoli, la memorizzazione dello stato di riproduzione e un timer di spegnimento avanzato (scuoti per riavviare o riduci il volume)
• Accedi ai feed e agli episodi protetti tramite utente e password
• Goditi l'ascolto nel modo che preferisci grazie alla velocità di riproduzione modificabile, al supporto ai capitoli, alla memorizzazione dello stato di riproduzione e al timer di spegnimento avanzato (scuoti per riavviare o riduci il volume)
• Accedi tramite utente e password ai feed e agli episodi riservati
<b>Tieni traccia, condividi & ricerca</b>
• Tieni traccia dei migliori episodi di sempre segnandoli come preferiti
@ -16,16 +16,16 @@ Creato da appassionati di podcast, AntennaPod è libero in tutti i sensi: open
• Condividi gli episodi e i feed tramite opzioni avanzate di condivisione via social o email, i servizi di gPodder.net o l'esportazione OPML.
<b>Controlla il sistema</b>
• Gestisci il download automatico: puoi selezionare i feed, escludere le reti mobili, utilizzare reti WiFi specifiche, impostare il download solo se in carica e scaricare in orari o intervalli selezionati.
• Gestisci lo spazio impostando l'occupazione massima degli episodi, la cancellazione intelligente e il percorso in cui scaricare i file.
• Adattati alle tue preferenze grazie ai temi chiaro o scuro.
• Effettua il backup delle sottoscrizioni grazie all'integrazione di gPodder.net e all'esportazione in OPML
• Gestisci il download automatico: puoi selezionare i feed, escludere le reti mobili, utilizzare reti WiFi specifiche, impostare il download solo quando in carica e scaricare ad orari o intervalli selezionati.
• Gestisci lo spazio impostando il numero massimo di episodi da tenere, la cancellazione intelligente e il percorso in cui scaricare i file.
• Adattalo alle tue preferenze grazie ai temi chiaro o scuro.
• Effettua il backup delle sottoscrizioni grazie all'integrazione con gPodder.net e all'esportazione in OPML.
<b>Partecipa alla community di AntennaPod!</b>
AntennaPod è sviluppato da volontari. Anche tu puoi contribuire, con il codice o con dei commenti!
GitHub è la piattaforma usata per le richieste di funzionalità, le segnalazioni di bug o i contributi al codice:
https://www.github.com/AntennaPod/AntennaPod
I simpatici membri del nostro forum sono felici di rispondere a qualsiasi domanda tu possa avere. Ti invitiamo anche a discutere di funzionalità e podcasting.
https://forum.antennapod.org/
Transifex è dove puoi contribuire alla traduzione:
https://www.transifex.com/antennapod/antennapod

View File

@ -1,42 +1,31 @@
היישומון אנטנה־פּוֹד הוא נגן ומנהל פודקאסטים שמעניק לך גישה ישירה למיליונים של פודקאסטים בחינם ובתשלום, החל ממגישי פודקאסטים עצמאיים ועד למפיצים גדולים כגון BBC, NPR ו־CNN. ניתן להוסיף, לייבא ולייצא את ההזנות שלהם בקלות יחסית באמצעות מסד נתוני הפודקאסטים של iTunes, קובצי OPML או כתובות של RSS. מאפשר לך לחסוך במאמץ, סוללה ותקשורת נתונים עם פקדי אוטומציה להורדה של פרקים (לפי זמנים, הפרשי זמן ורשתות אלחוטיות) ומחיקה של פרקים (על בסיס הגדרות המועדפים וההשהיה שלך).<br>
אבל הכי חשוב: ניתן להוריד, להזרים או לסדר רשימות של פרקים וליהנות מהם בכל דרך שמתאימה לך עם מהירויות נגינה משתנות, תמיכה במקטעים ומתזמן שינה
היישומון אנטנה־פּוֹד הוא נגן ומנהל פודקאסטים שמעניק לך גישה ישירה למיליונים של פודקאסטים בחינם ובתשלום, החל ממגישי פודקאסטים עצמאיים ועד למפיצים גדולים כגון BBC, NPR ו־CNN. ניתן להוסיף, לייבא ולייצא את ההזנות שלהם בקלות יחסית באמצעות מסד נתוני הפודקאסטים של iTunes, קובצי OPML או כתובות של RSS.
ניתן להוריד, להזרים או לסדר רשימות של פרקים וליהנות מהם בכל דרך שמתאימה לך עם מהירויות נגינה משתנות, תמיכה במקטעים ומתזמן שינה
ניתן לחסוך במאמץ, סוללה וניצולת חבילת נתונים עם בקרת אוטומציה מתקדמת להורדת פרקים (תוך הגדרת זמנים, מרווחים ורשתות אלחוטיות) ומחיקת פרקים (על בסיס המועדפים והגדרות ההשהיה שלך).
מיוצרת על ידי חובבי פודקאסטים, אנטנהפוד הינה תוכנה חינמית בכל מובן המילה: קוד פתוח, ללא עלות וללא פרסומות.
היישומון אנטנהפּוֹד, שנוצר על ידי חובבי פודקאסטים, הוא חופשי במלוא מובן המילה: קוד פתוח, ללא עלות, ללא פרסומות.
<b>כל התכונות:</b><br>
ייבוא, ארגון ונגינה<br>
&#8226; ניתן להוסיף ולייבא הזנות דרך הספריות של iTunes ושל gPodder.net, קובצי OPML וקישורי RSS או Atom<br>
&#8226; ניתן לנהל את הנגינה מכל מקום: וידג׳ט על מסך הבית, התרעות המערכת ופקדי שקע אוזניות ובלוטות׳<br>
&#8226; פשוט ליהנות בדרך שלך עם מהירות נגינה משתנה, תמיכה במקטעים (MP3, VorbisComment ו־Podlove), שמירת מיקום הנגינה ומתזמן שינה מתקדם (ניתן לנער כדי לאפס, להנמיך את עצמך השמע ולהאט את מהירות הנגינה)<br>
&#8226; גישה להזנות ולפרקים המוגנים בססמה<br>
&#8226; ניתן להשתמש בעימודי ההזנות שלנו (www.podlove.org/paged-feeds)
<b>ייבוא, ארגון והשמעה</b>
• ניתן לנהל את הנגינה מכל מקום: וידג׳ט על מסך הבית, התרעות המערכת ופקדי שקע אוזניות ובלוטות׳
• ניתן להוסיף ולייבא הזנות דרך הספריות של iTunes ושל gPodder.net, קובצי OPML וקישורי RSS או Atom
• פשוט ליהנות בדרך שלך עם מהירות נגינה משתנה, תמיכה במקטעים, שמירת מיקום הנגינה ומתזמן שינה מתקדם (ניתן לנער כדי לאפס, להנמיך את עצמת השמע)
• גישה להזנות ולפרקים המוגנים בססמה
מעקב, שיתוף והבעת הערכה<br>
&#8226; מעקב אחר הטובים שבטובים על ידי סימון פרקים כמועדפים<br>
&#8226; ניתן לאתר פרק אחד דרך היסטוריית הנגינה או על ידי חיפוש (כותרות והערות פרק)<br>
&#8226; ניתן לשתף פרקים והזנות דרך אפשרויות מתקדמות ברשתות חברתיות ודוא״ל, שירותי gPodder.net ודרך ייצוא OPML<br>
<b>מעקב, שיתוף והערכה</b>
מעקב אחר הטובים שבטובים על ידי סימון פרקים כמועדפים
ניתן לאתר פרק אחד דרך היסטוריית הנגינה או על ידי חיפוש כותרות והערות פרק
ניתן לשתף פרקים והזנות דרך אפשרויות מתקדמות ברשתות חברתיות ודוא״ל, שירותי gPodder.net ודרך ייצוא OPML
שליטה במערכת<br>
&#8226; ניתן לשלוט על הורדה אוטומטית: לבחור הזנות, להחריג רשתות סלולריות, לבחור רשתות אלחוטיות מסוימות, לדרוש מהטלפון להיות בטעינה ולהגדיר מועדים או מרווחי זמן<br>
&#8226; ניתן לנהל את האחסון על ידי הגדרת כמות הפרקים שנשמרים במטמון, מחיקה חכמה (בהתבסס על המועדפים ומצב הנגינה שלך) ובחירת המיקום המועדף עליך<br>
&#8226; ניתן להשתמש באנטנה־פּוֹד בשפה שלך (HE, EN, DE, CS, NL, NB, JA, PT, ES, SV, CA, UK, FR, KO, TR, ZH)<br>
&#8226; התאמה לסביבה שלך באמצעות ערכות עיצוב בהירה וכהה<br>
&#8226; גיבוי התמיכה שלך עם שילוב מול gPodder.net וייצוא של OPML
<b>שליטה במערכת</b>
• ניתן לשלוט על הורדה אוטומטית: לבחור הזנות, להחריג רשתות סלולריות, לבחור רשתות אלחוטיות מסוימות, לדרוש מהטלפון להיות בטעינה ולהגדיר מועדים או מרווחי זמן
• ניתן לנהל את האחסון על ידי הגדרת כמות הפרקים שנשמרים במטמון, מחיקה חכמה (בהתבסס על המועדפים ומצב הנגינה שלך) ובחירת המיקום המועדף עליך
• התאמה לסביבה שלך באמצעות ערכות עיצוב בהירה וכהה
• גיבוי המינויים שלך עם שילוב מול gPodder.net וייצוא של OPML
<b>מזמינים אותך להצטרף לקהילת אנטנה־פּוֹד!</b><br>
<b>מזמינים אותך להצטרף עוד היום לקהילת אנטנהפּוֹד!</b>
את תהליכי הפיתוח הפעילים של אנטנה־פּוֹד מובילים מתנדבים. ניתן לתרום גם כן, עם קוד או עם הערה!
GitHub הוא המקום בו אנו מרכזים את בקשות התכונות, דיווחי התקלות ותרומות הקוד:<br>
https://www.github.com/AntennaPod/AntennaPod
חברי הפורום החביבים שלנו שמחים לסייע בכל שאלה שעשויה לצוץ לך. מזמינים אותך לדון בתכונות של היישומון ועל פודקאסטים בכלל.
https://forum.antennapod.org/
הקבוצה שלנו ב־Google היא המקום לשתף את הרעיונות שלך, רגעי הפודקאסט המועדפים עליך ואת הערכתך לכל המתנדבים:<br>
https://groups.google.com/forum/#!forum/antennapod
יש לך שאלה או שמעניין אותך לתת לנו משוב?
https://twitter.com/@AntennaPod
Transifex הוא המקום לסייע בתרגומים:<br>
https://www.transifex.com/antennapod/antennapod
מזמינים אותך לחקור את תכנית הבדיקות שלנו כדי לקבל את התכונות העדכניות ביותר לפני כולם:<br>
https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod
Transifex הוא המקום לסייע עם התרגומים:
https://www.transifex.com/antennapod/antennapod

View File

@ -0,0 +1,31 @@
„AntennaPod“ yra tinklalaidžių tvarkytuvė ir leistuvė, įgalinanti prieigą prie milijonų nemokamų ir mokamų tinklalaidžių, nuo nepriklausomų kūrėjų iki didžiųjų leidyklų, tokių kaip „BBC“, „NPR“ ir „CNN“. Be vargo pridėkite, importuokite ir eksportuokite sklaidos kanalus naudodamiesi „iTunes“ tinklalaidžių duomenų baze, OPML failais ar RSS kanalais.
Atsisiųskite, klausykitės iš karto ar dėkite epizodus į eilę ir mėgaukitės jais pasirinkę atkūrimo spartą, naudodamiesi skyrių palaikymu bei miego laikmačiu.
Sutaupykite pastangų, baterijos energijos ir suvartotų mobiliųjų duomenų naudodamiesi galingais automatizacijos valdikliais epizodų atsiuntimui (nurodykite laiką, intervalą ir „WiFi“ tinklus) ir epizodų trynimui (remiantis Jūsų mėgstamaisiais ir atidėjimo nustatymais).
Sukurtas tinklalaidžių entuziastų, „AntennaPod“ yra laisvas visomis prasmėmis: atvirojo kodo, be mokesčių, be reklamų.
<b>Importuokite, tvarkykite ir atkurkite</b>
• Valdykite atkūrimą bet kur: pradžios ekrane, programų pranešimuose, ausinių ar „Bluetooth“ valdikliu
• Pridėkite ar importuokite sklaidos kanalus iš „iTunes“ ir „gPodder.net“, OPML failų, RSS ar Atom nuorodų
• Mėgaukitės klausydamiesi taip, kaip Jums patinka, naudodamiesi derinama atkūrimo sparta, skyrių palaikymu, išsaugota atkūrimo pozicija ir miego laikmačiu (pakračius nustatomas iš naujo, mažinamas garsis)
• Pasiekite slaptažodžiu apsaugotus sklaidos kanalus ir epizodus
<b>Sekite, dalinkitės ir branginkite</b>
• Kaupkite geriausius žymėdami epizodus kaip mėgstamus
• Raskite norimą epizodą pasinaudoję atkūrimo istorija ar paieška pavadinimuose ir laidų užrašuose
• Dalinkitės epizodais ir sklaidos kanalais per socialinius tinklus, el. paštu, „gPodder.net“ ir OPML failus
<b>Valdykite sistemą</b>
• Valdykite automatinį atsiuntimą: pasirinkite sklaidos kanalus, neleiskite atsiuntimų mobiliuoju ryšiu, apibrėžkite leistinus belaidžius tinklus, reikalaukite, jog atsiuntimai būtų vykdomi įkrovos metu, nurodykite atsiuntimų dienos metą ar intervalą
• Valdykite laikmenos naudojimą nurodant podėlyje laikomų epizodų kiekį, išmanų trynimą ir nurodant norimą saugojimo vietą
• Pritaikykite savo aplinkai pasirinkę šviesią ar tamsią temą
• Kurkite prenumeratų atsargines kopijas „gPodder.net“ ar OPML failais
<b>Prisijunkite prie AntennaPod bendruomenės!</b>
„AntennaPod“ vysto savanoriai. Ir Jūs galite prisidėti, nuo atsiliepimų iki programinio kodo!
Draugiški mūsų forumo nariai pasiruošę padėti visais turimais klausimais. Kviečiame diskutuoti apie programėlės funkcijas bei bendrai apie tinklalaides.
https://forum.antennapod.org/
Prie vertimų galite prisidėti „Transifex“:
https://www.transifex.com/antennapod/antennapod

View File

@ -0,0 +1 @@
Patogi naudoti, lanksti atvirojo kodo tinklalaidžių tvarkytuvė bei leistuvė

View File

@ -0,0 +1 @@
AntennaPod

View File

@ -24,8 +24,8 @@ AntennaPod is gemaakt door podcast-enthousiastelingen. Het team van vrijwilliger
<b>Doe mee met de AntennaPod-gemeenschap!</b>
AntennaPod wordt regelmatig geüpdatet door vrijwilligers. En jij kan ook helpen, met code of commentaar!
Je kunt op GitHub terecht voor foutmeldingen, verzoekjes voor nieuwe functies en bijdragen aan de code:
https://www.github.com/AntennaPod/AntennaPod
De vriendelijke leden van ons forum helpen je graag met welke vraag dan ook. Deel gerust ook ideëen voor nieuwe functies of podcasts in het algemeen.
https://forum.antennapod.org/
Transifex is de beste plek om te helpen met vertalen:
https://www.transifex.com/antennapod/antennapod

View File

@ -0,0 +1,31 @@
AntennaPod é um tocador e gerenciador de podcasts que lhe oferece acesso a milhões de podcasts gratuitos ou pagos, de podcasters independentes ou dos principais publicadores de conteúdo como BBC, NPR e CNN. Adicione, importe e exporte seus feeds facilmente usando a biblioteca do iTunes, arquivos OPML ou URLs RSS.
Baixe, transmita ou enfileire episódios e curta-os como quiser com velocidades de reprodução ajustáveis, suporte a capítulos e um temporizador.
Economize esforço, bateria e uso de dados móveis com avançados recursos para automatizar o download de episódios (especificar horários, intervalos e redes WiFi) e a sua remoção (com base em seus favoritos e configurações de atraso).
Feito por entusiastas de podcast, o AntennaPod é gratuito em todos os sentidos da palavra: código aberto, sem custos, sem anúncios.
Importe, organize e toque
&#8226; Gerencie suas reproduções de qualquer lugar: widget da tela inicial, notificações de sistema e fone de ouvido e controles bluetooth<br>
&#8226; Adicione and importe feeds pelo iTunes e diretorios gPodder.net, arquivos OPML e links RSS ou Atom<br>
&#8226; Ouça do seu jeito com velocidade de reprodução ajustável, suporte a capítulos (MP3, VorbisComment e Podlove), marcador da posição de reprodução e um despertador avançado (chacoalhe para reiniciar, volume reduzido e reprodução desacelerada)<br>
&#8226; Acesse feeds e episódios protegidos por senha
Acompanhe, compartilhe e aprecie
&#8226; Guarde o melhor do melhor marcando episódios como favoritos<br>
&#8226; Encontre aquele episódio específico através do histórico de execução ou pelo sistema de busca (através de títulos e anotações)<br>
&#8226; Compartilhe episódios e <i>feeds</i> através de opções em redes sociais, email, os serviços da gPodder.net e exportação OPML<br>
Controle o sistema
&#8226; Tenha controle sobre a automação dos <i>downloads</i>: escolha <i>feeds</i>, exclua redes móveis, selecione redes específicas de WiFi, exija que o telefone esteja sendo carregado e defina horários ou intervalos<br>
&#8226; Gerencie o armazenamento configurando a quantidade de episódios em cache, exclusão inteligente dos episódios (baseada nos seus favoritos e status de reprodução)<br>
&#8226; Adapte-se ao ambiente utilizando os temas claro ou escuro<br>
&#8226; Faça <i>backup</i> das suas inscrições com a integração ao gPodder.net e exportação de OPML
Junte-se à comunidade do AntennaPod!
O AntennaPod está sob constante desenvolvimento através de voluntários. Você também pode contribuir, com código ou um comentário!
Nossos simpáticos membros do fórum ficarão felizes em ajudar com todas as perguntas que você tiver. Você está convidado a discutir sobre funcionalidades e podcasts em geral também.
https://forum.antennapod.org/
Transifex é o lugar para ajudar com as traduções:<br>
https://www.transifex.com/antennapod/antennapod

View File

@ -0,0 +1 @@
Um player de podcasts fácil de usar, flexível e de código aberto

View File

@ -0,0 +1 @@
AntennaPod

View File

@ -0,0 +1,31 @@
AntennaPod é um gestor de podcasts que lhe permite aceder a milhões de podcasts, gratuitos ou pagos, sejam eles publicadores independentes ou grandes cadeias tais como as estações BBC, NPR e CNN. A adição de fontes é muito fácil através do serviço iTunes, ficheiros OPML e fontes RSS.
Pode descarregar, emitir ou colocar episódios na fila de reprodução ao seu gosto, pode utilizar velocidades variáveis de reprodução, tem suporte a capítulos e um temporizador.
Poupe tempo, economize bateria e dados móveis através dos mecanismos de controlo de descargas de episódios (possibilidade de especificar intervalos ou horas para as descargas e redes Wi-Fi) e de eliminação de episódios (de acordo com as suas preferências).
Criado por entusiastas de podcasts, AntennaPod é livre em todos os sentidos da palavra: open source, gratuito e sem publicidade.
<b>Importação, organização e reprodução</b>
• Gestão de podcasts através do widget, barra de notificações e controlos de auriculares ou bluetooth
• Adicione e importe fontes existentes nos diretórios iTunes e gPodder.net, ficheiros OPML e ligações ATOM e RSS
• Velocidade variável de reprodução, suporte a capítulos, memorização da posição de reprodução e um temporizador avançado (agite para repor, baixar e aumentar o volume)
• Acesso a fontes e episódios protegidos por palavra-passe
<b>Monitorizar, partilhar e apreciar</b>
• Monitorize os seus episódio preferidos marcando-os como favoritos
• Localize um episódio no histórico de reprodução ou através de uma pesquisa por título ou notas
• Partilhe episódios e fontes nas redes sociais, por e-mail, no diretório gPodder.net ou através de ficheiros OPML
<b>Controlo de sistema</b>
• Controle todas as descargas automáticas: escolha as fontes, exclua redes móveis, especifique as redes Wi-Fi, indique se o telefone deve estar a ser carregado e defina as horas ou intervalos das descargas
• Gestão do armazenamento através da cache de episódios, da eliminação inteligente e selecionando a localização dos dados
• Adapte-se ao seu ambiente através dos temas claro ou escuro
• Guarde as suas subscrições com a integração gPodder.net ou através da exportação OPML
<b>Integrar a comunidade AntennaPod!</b>
O AntennaPod é desenvolvido por voluntários. Você também pode contribuir na programação ou reportando os erros encontrados!
Os membros do nosso fórum podem ajudar-vos em relação às vossas dúvidas. Sinta-se à vontade para propor funcionalidades ou simplesmente falar connosco.
https://forum.antennapod.org/
Transifex é o local certo para ajudar a traduzir a aplicação:
https://www.transifex.com/antennapod/antennapod

View File

@ -0,0 +1 @@
Gestor e reprodutor de podcasts simples, flexível e open souce

View File

@ -0,0 +1 @@
AntennaPod

View File

@ -1,4 +1,4 @@
AntennaPod — менеджер и проигрыватель подкастов, который обеспечит Вас мгновенным доступом к миллионам бесплатных и платных подкастов, как от независимых подкастеров, так и крупных издательских домов. С лёгкостью добавляйте, импортируйте и экспортируйте их каналы используя каталог подкастов iTunes, файлы OPML или адреса каналов RSS.
AntennaPod — менеджер и проигрыватель подкастов, который обеспечит вас мгновенным доступом к миллионам бесплатных и платных подкастов, как от независимых подкастеров, так и крупных издательских домов. С легкостью добавляйте, импортируйте и экспортируйте их каналы используя каталог подкастов iTunes, файлы OPML или адреса каналов RSS.
Загружайте, транслируйте по сети или добавляйте выпуски в очередь и наслаждайтесь ими так, как вам нравится, с регулируемой скоростью воспроизведения, поддержкой оглавления и таймером сна.
Экономьте время, заряд батареи и мобильный трафик при помощи мощных средств автоматизации загрузки выпусков (фильтрация, указание времени и интервалов, а также сетей WiFi) и их удаления (избранные и настройки хранения).
@ -7,8 +7,8 @@ AntennaPod — менеджер и проигрыватель подкастов
<b>Импортируйте, систематизируйте и слушайте</b>
• Всевозможное управление воспроизведением: виджетом, системным уведомлением и кнопками проводных и беспроводных гарнитур
• Добавление и импорт каналов через каталоги iTunes и gPodder.net, файлы OPML и ссылки на каналы в RSS или Atom
• Приятное Вам прослушивание с регулировкой скорости воспроизведения, оглавлениями, запоминанием места воспроизведения и продвинутым таймером сна (со сбросом при встряхивании, снижением громкости)
• Доступ к каналам и выпускам защищённым паролем
• Приятное вам прослушивание с регулировкой скорости воспроизведения, оглавлениями, запоминанием места воспроизведения и продвинутым таймером сна (со сбросом при встряхивании, снижением громкости)
• Доступ к каналам и выпускам, защищенным паролем
<b>Отслеживайте, делитесь и благодарите</b>
• Отслеживайте лучших из лучших, помещая выпуски в избранное
@ -16,16 +16,16 @@ AntennaPod — менеджер и проигрыватель подкастов
• Разнообразие способов поделиться выпусками и каналами через социальные сети и e-mail, услуги gPodder.net и экспорт в OPML
<b>Управляйте системой</b>
• Управление автоматической загрузкой: выбор отдельных каналов, запрет на использование мобильных сетей, выбор определённых точек доступа WiFi, только во время зарядки телефона и в заданное время или интервалы
• Управление хранением путём задания количества выпусков в кэше, автоудаление и выбор предпочтительного размещения
• Приспосабливается к Вашему окружению посредством светлого или тёмного оформления
• Резервирование Ваших подписок путём интеграции с gPodder.net и экпорта в OPML
• Управление автоматической загрузкой: выбор отдельных каналов, запрет на использование мобильных сетей, выбор определенных точек доступа WiFi, только во время зарядки телефона и в заданное время или интервалы
• Управление хранением: ограничение количества кешируемых выпусков, автоудаление и выбор расположения файлов
• Приспосабливается к вашему окружению посредством светлого или темного оформления
• Резервирование ваших подписок путем интеграции с gPodder.net и экпорта в OPML
<b>Присоединяйтесь к сообществу AntennaPod!</b>
AntennaPod постоянно развивается силами добровольцев. Вы тоже можете сделать свой вклад при помощи кода или комментария!
Посещайте GitHub для запроса новых возможностей, уведомления об ошибках и внесения кода:
https://www.github.com/AntennaPod/AntennaPod
Участники нашего дружелюбного форума рады помочь вам с любым вопросом. Мы приглашаем вас обсудить возможности приложения и подкастинг вообще.
https://forum.antennapod.org/
Помогайте с переводом приложения на Transifex:
https://www.transifex.com/antennapod/antennapod

View File

@ -24,8 +24,8 @@ Gjord av podcastenthusiaster, AntennaPod är fri i alla ordets bemärkelser: öp
<b>Gå med i AntennaPods gemenskap!</b>
AntennaPod är under aktiv utveckling av volontärer. Du kan också bidra, med kod eller kommentarer!
GitHub är platsen att gå till för att be om funktioner, skapa buggrapporter eller bidra med kod:
https://www.github.com/AntennaPod/AntennaPod
Våra vänliga forummedlemmar hjälper glatt till med alla frågor du har. Du inbjuds också att diskutera funktioner och podcasting generellt.
https://forum.antennapod.org/
Transifex är platsen att gå till för att hjälpa till med översättningen:
https://www.transifex.com/antennapod/antennapod

View File

@ -24,8 +24,8 @@ AntennaPod是一个播客管理器和播放器可以让你即时访问数以
<b>加入AntennaPod社区</b>
志愿者正在积极开发 AntennaPod 。您也可以通过代码或评论做出贡献!
前往Github请求功能、报告错误和贡献代码
https://www.github.com/AntennaPod/AntennaPod
我们友好的论坛成员乐意为您的每个问题提供帮助。 我们还邀请您讨论功能和播客。
https://forum.antennapod.org/
要帮忙翻译请前往Transifex
https://www.transifex.com/antennapod/antennapod

View File

@ -0,0 +1,31 @@
AntennaPod 是 Podcast 訂閱管理工具。從百家爭鳴的獨立 Postcasters 到各立山頭的大廠如 BBC、CNN、NPR 等,讓數百萬免費或付費的 Podcast 唾手可得。您可以使用 iTunes 的 Podcast 資料庫、OPML 檔或RSS 網址等方式,輕鬆新增、匯入或匯出資料來源。
將各 Podcast 劇集下載、串流播放或放入隊列,然後可以調整播放速度、跳躍章節、設定睡眠時間等等,用您喜愛的方式聆聽享受。
用強大的自動下載設定指定時間、頻率、WiFi 下載,並且可以依據最愛劇集與延遲設定等方式刪除已經聽過的劇集。省力、省電、省數據。
AntennaPod 由 Podcast 愛好者鼎力製作,免費、無廣告、開放原始碼,給您最全面的自由。
<b>匯入、管理、播放</b>
• 從主畫面小工具、系統通知、耳機或藍牙控制器隨處播放
• 利用 iTunes、gPodder.net 目錄、OPML 檔、RSS 或 Atom 連結匯入、新增 Podcast
• 擁有自訂播放速度、支援章節、記憶播放進度、設定睡眠時間等功能,享受自由聆聽的樂趣
• 支援以密碼保護的 Podcast
<b>保留、分享</b>
• 將特定一集設定為最愛,永久留存
• 自播放紀錄、標題或附註等處搜尋特定一集
• 以社群網站、電子郵件、gPodder.net 或匯出 OPML 等方式分享 Podcast
<b>一手掌控</b>
• 選擇特定 Podcast、只用特定 WiFi 下載、僅在充電時下載、設定更新頻率與次數等等機制,完整控制自動下載功能
• 設定暫存集數上限、智慧刪除、設定儲存位置等機制,方便管理設備空間
• 根據系統環境採用明亮或暗夜佈景
• 以整合的 gPodder.net 服務或匯出 OPML 來備份訂閱清單
<b>加入 AntennaPod 社群!</b>
AntennaPod 由志工熱情製作,您也可以加入 -- 幫忙寫程式或給意見都非常歡迎!
若您遇上使用問題,論壇上的社群成員都樂意提供協助。您也可以加入討論未來功能、其他 Podcast 相關的事情。
https://forum.antennapod.org/
協助翻譯請至 Transifex
https://www.transifex.com/antennapod/antennapod

View File

@ -0,0 +1 @@
易用、靈活的開源 podcast 管理及播放器

View File

@ -0,0 +1 @@
AntennaPod

View File

@ -67,7 +67,8 @@
android:max="500"
tools:progress="100"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp" />
android:layout_marginRight="8dp"
android:clickable="true"/>
<RelativeLayout
android:layout_width="match_parent"

View File

@ -67,6 +67,9 @@ project.ext {
iconifyVersion = "2.2.2"
audioPlayerVersion = "v2.0.0"
// Only used for free builds. This version should be updated regularly.
conscryptVersion = "2.4.0"
// Google Play build
wearableSupportVersion = "2.6.0"

View File

@ -101,6 +101,9 @@ dependencies {
System.out.println("core: free build hack, skipping some dependencies")
}
// bundle conscrypt with free builds
freeImplementation "org.conscrypt:conscrypt-android:$conscryptVersion"
testImplementation "org.awaitility:awaitility:$awaitilityVersion"
testImplementation 'junit:junit:4.13'
testImplementation 'org.mockito:mockito-core:1.10.19'

View File

@ -1,6 +1,8 @@
package de.danoeh.antennapod.core;
import android.content.Context;
import java.security.Security;
import org.conscrypt.Conscrypt;
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
@ -53,6 +55,7 @@ public class ClientConfig {
}
private static void installSslProvider(Context context) {
// ProviderInstaller is a closed-source Google library
// Insert bundled conscrypt as highest security provider (overrides OS version).
Security.insertProviderAt(Conscrypt.newProvider(), 1);
}
}

View File

@ -1,39 +1,16 @@
package de.danoeh.antennapod.core.service.download;
import android.os.Build;
import androidx.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log;
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
import java.io.File;
import java.io.IOException;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Socket;
import java.net.SocketAddress;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
import de.danoeh.antennapod.core.service.UserAgentInterceptor;
import de.danoeh.antennapod.core.ssl.BackportTrustManager;
import de.danoeh.antennapod.core.ssl.NoV1SslSocketFactory;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.util.Flavors;
import okhttp3.Cache;
import okhttp3.CipherSuite;
import okhttp3.ConnectionSpec;
@ -45,6 +22,19 @@ import okhttp3.Request;
import okhttp3.Response;
import okhttp3.internal.http.StatusLine;
import javax.net.ssl.X509TrustManager;
import java.io.File;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* Provides access to a HttpClient singleton.
*/
@ -149,13 +139,20 @@ public class AntennapodHttpClient {
});
}
}
if (Build.VERSION.SDK_INT < 21) {
builder.sslSocketFactory(new CustomSslSocketFactory(), trustManager());
if (Flavors.FLAVOR == Flavors.FREE) {
// The Free flavor bundles a modern conscrypt (security provider), so CustomSslSocketFactory
// is only used to make sure that modern protocols (TLSv1.3 and TLSv1.2) are enabled and
// that old, deprecated, protocols (like SSLv3, TLSv1.0 and TLSv1.1) are disabled.
X509TrustManager trustManager = BackportTrustManager.create();
builder.sslSocketFactory(new NoV1SslSocketFactory(trustManager), trustManager);
} else if (Build.VERSION.SDK_INT < 21) {
X509TrustManager trustManager = BackportTrustManager.create();
builder.sslSocketFactory(new NoV1SslSocketFactory(trustManager), trustManager);
// workaround for Android 4.x for certain web sites.
// see: https://github.com/square/okhttp/issues/4053#issuecomment-402579554
List<CipherSuite> cipherSuites = new ArrayList<>(
ConnectionSpec.MODERN_TLS.cipherSuites());
List<CipherSuite> cipherSuites = new ArrayList<>(ConnectionSpec.MODERN_TLS.cipherSuites());
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA);
@ -168,101 +165,7 @@ public class AntennapodHttpClient {
return builder;
}
/**
* Closes expired connections. This method should be called by the using class once has finished its work with
* the HTTP client.
*/
public static synchronized void cleanup() {
if (httpClient != null) {
// does nothing at the moment
}
}
private static X509TrustManager trustManager() {
try {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:"
+ Arrays.toString(trustManagers));
}
return (X509TrustManager) trustManagers[0];
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
return null;
}
}
public static void setCacheDirectory(File cacheDirectory) {
AntennapodHttpClient.cacheDirectory = cacheDirectory;
}
private static class CustomSslSocketFactory extends SSLSocketFactory {
private SSLSocketFactory factory;
public CustomSslSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, null);
factory= sslContext.getSocketFactory();
} catch(GeneralSecurityException e) {
e.printStackTrace();
}
}
@Override
public String[] getDefaultCipherSuites() {
return factory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return factory.getSupportedCipherSuites();
}
public Socket createSocket() throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket();
configureSocket(result);
return result;
}
public Socket createSocket(String var1, int var2) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2);
configureSocket(result);
return result;
}
public Socket createSocket(Socket var1, String var2, int var3, boolean var4) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
configureSocket(result);
return result;
}
public Socket createSocket(InetAddress var1, int var2) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2);
configureSocket(result);
return result;
}
public Socket createSocket(String var1, int var2, InetAddress var3, int var4) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
configureSocket(result);
return result;
}
public Socket createSocket(InetAddress var1, int var2, InetAddress var3, int var4) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
configureSocket(result);
return result;
}
private void configureSocket(SSLSocket s) {
s.setEnabledProtocols(new String[] { "TLSv1.2", "TLSv1.1", "TLSv1" } );
}
}
}

View File

@ -71,6 +71,7 @@ public class HttpDownloader extends Downloader {
// set header explicitly so that okhttp doesn't do transparent gzip
Log.d(TAG, "addHeader(\"Accept-Encoding\", \"identity\")");
httpReq.addHeader("Accept-Encoding", "identity");
httpReq.cacheControl(new CacheControl.Builder().noCache().build()); // noStore breaks CDNs
}
if (!TextUtils.isEmpty(request.getLastModified())) {
@ -259,7 +260,6 @@ public class HttpDownloader extends Downloader {
onFail(DownloadError.ERROR_CONNECTION_ERROR, request.getSource());
} finally {
IOUtils.closeQuietly(out);
AntennapodHttpClient.cleanup();
IOUtils.closeQuietly(responseBody);
}
}

View File

@ -0,0 +1,73 @@
package de.danoeh.antennapod.core.ssl;
public class BackportCaCerts {
public static final String SECTIGO_USER_TRUST = "-----BEGIN CERTIFICATE-----\n"
+ "MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB\n"
+ "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n"
+ "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n"
+ "BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw\n"
+ "MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV\n"
+ "BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\n"
+ "aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy\n"
+ "dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\n"
+ "AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B\n"
+ "3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY\n"
+ "tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/\n"
+ "Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2\n"
+ "VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT\n"
+ "79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6\n"
+ "c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT\n"
+ "Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l\n"
+ "c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee\n"
+ "UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE\n"
+ "Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\n"
+ "BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G\n"
+ "A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF\n"
+ "Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO\n"
+ "VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3\n"
+ "ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs\n"
+ "8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR\n"
+ "iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze\n"
+ "Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ\n"
+ "XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/\n"
+ "qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB\n"
+ "VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB\n"
+ "L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG\n"
+ "jjxDah2nGN59PRbxYvnKkKj9\n"
+ "-----END CERTIFICATE-----\n";
public static final String COMODO = "-----BEGIN CERTIFICATE-----\n"
+ "MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB\n"
+ "hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n"
+ "A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV\n"
+ "BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5\n"
+ "MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT\n"
+ "EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\n"
+ "Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh\n"
+ "dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR\n"
+ "6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X\n"
+ "pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC\n"
+ "9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV\n"
+ "/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf\n"
+ "Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z\n"
+ "+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w\n"
+ "qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah\n"
+ "SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC\n"
+ "u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf\n"
+ "Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq\n"
+ "crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\n"
+ "FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB\n"
+ "/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl\n"
+ "wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM\n"
+ "4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV\n"
+ "2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna\n"
+ "FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ\n"
+ "CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK\n"
+ "boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke\n"
+ "jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL\n"
+ "S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb\n"
+ "QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl\n"
+ "0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB\n"
+ "NVOFBkpdn627G190\n"
+ "-----END CERTIFICATE-----";
}

View File

@ -0,0 +1,58 @@
package de.danoeh.antennapod.core.ssl;
import android.util.Log;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import java.io.ByteArrayInputStream;
import java.nio.charset.Charset;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateFactory;
import java.util.ArrayList;
import java.util.List;
/**
* SSL trust manager that allows old Android systems to use modern certificates.
*/
public class BackportTrustManager {
private static final String TAG = "BackportTrustManager";
private static X509TrustManager getSystemTrustManager(KeyStore keystore) {
TrustManagerFactory factory;
try {
factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
factory.init(keystore);
for (TrustManager manager : factory.getTrustManagers()) {
if (manager instanceof X509TrustManager) {
return (X509TrustManager) manager;
}
}
} catch (NoSuchAlgorithmException | KeyStoreException e) {
e.printStackTrace();
}
throw new IllegalStateException("Unexpected default trust managers");
}
public static X509TrustManager create() {
try {
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(null); // Clear
CertificateFactory cf = CertificateFactory.getInstance("X.509");
keystore.setCertificateEntry("BACKPORT_COMODO_ROOT_CA", cf.generateCertificate(
new ByteArrayInputStream(BackportCaCerts.COMODO.getBytes(Charset.forName("UTF-8")))));
keystore.setCertificateEntry("SECTIGO_USER_TRUST_CA", cf.generateCertificate(
new ByteArrayInputStream(BackportCaCerts.SECTIGO_USER_TRUST.getBytes(Charset.forName("UTF-8")))));
List<X509TrustManager> managers = new ArrayList<>();
managers.add(getSystemTrustManager(keystore));
managers.add(getSystemTrustManager(null));
return new CompositeX509TrustManager(managers);
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
return null;
}
}
}

View File

@ -0,0 +1,60 @@
package de.danoeh.antennapod.core.ssl;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Represents an ordered list of {@link X509TrustManager}s with additive trust. If any one of the composed managers
* trusts a certificate chain, then it is trusted by the composite manager.
* Based on https://stackoverflow.com/a/16229909
*/
public class CompositeX509TrustManager implements X509TrustManager {
private final List<X509TrustManager> trustManagers;
public CompositeX509TrustManager(List<X509TrustManager> trustManagers) {
this.trustManagers = trustManagers;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
CertificateException reason = null;
for (X509TrustManager trustManager : trustManagers) {
try {
trustManager.checkClientTrusted(chain, authType);
return; // someone trusts them. success!
} catch (CertificateException e) {
// maybe someone else will trust them
reason = e;
}
}
throw reason;
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
CertificateException reason = null;
for (X509TrustManager trustManager : trustManagers) {
try {
trustManager.checkServerTrusted(chain, authType);
return; // someone trusts them. success!
} catch (CertificateException e) {
// maybe someone else will trust them
reason = e;
}
}
throw reason;
}
@Override
public X509Certificate[] getAcceptedIssuers() {
List<X509Certificate> certificates = new ArrayList<>();
for (X509TrustManager trustManager : trustManagers) {
certificates.addAll(Arrays.asList(trustManager.getAcceptedIssuers()));
}
return certificates.toArray(new X509Certificate[0]);
}
}

View File

@ -0,0 +1,100 @@
package de.danoeh.antennapod.core.ssl;
import de.danoeh.antennapod.core.util.Flavors;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.GeneralSecurityException;
/**
* SSLSocketFactory that does not use TLS 1.0
* This fixes issues with old Android versions that abort if the server does not know TLS 1.0
*/
public class NoV1SslSocketFactory extends SSLSocketFactory {
private SSLSocketFactory factory;
public NoV1SslSocketFactory(TrustManager trustManager) {
try {
SSLContext sslContext;
if (Flavors.FLAVOR == Flavors.FREE) {
// Free flavor (bundles modern conscrypt): support for TLSv1.3 is guaranteed.
sslContext = SSLContext.getInstance("TLSv1.3");
} else {
// Play flavor (security provider can vary): only TLSv1.2 is guaranteed.
sslContext = SSLContext.getInstance("TLSv1.2");
}
sslContext.init(null, new TrustManager[] {trustManager}, null);
factory = sslContext.getSocketFactory();
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
}
@Override
public String[] getDefaultCipherSuites() {
return factory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return factory.getSupportedCipherSuites();
}
public Socket createSocket() throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket();
configureSocket(result);
return result;
}
public Socket createSocket(String var1, int var2) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2);
configureSocket(result);
return result;
}
public Socket createSocket(Socket var1, String var2, int var3, boolean var4) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
configureSocket(result);
return result;
}
public Socket createSocket(InetAddress var1, int var2) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2);
configureSocket(result);
return result;
}
public Socket createSocket(String var1, int var2, InetAddress var3, int var4) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
configureSocket(result);
return result;
}
public Socket createSocket(InetAddress var1, int var2, InetAddress var3, int var4) throws IOException {
SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
configureSocket(result);
return result;
}
private void configureSocket(SSLSocket s) {
if (Flavors.FLAVOR == Flavors.FREE) {
// Free flavor (bundles modern conscrypt): TLSv1.3 and modern cipher suites are
// guaranteed. Protocols older than TLSv1.2 are now deprecated and can be disabled.
s.setEnabledProtocols(new String[] { "TLSv1.3", "TLSv1.2" });
} else {
// Play flavor (security provider can vary): only TLSv1.2 is guaranteed, supported
// cipher suites may vary. Old protocols might be necessary to keep things working.
// TLS 1.0 is enabled by default on some old systems, which causes connection errors.
// This disables that.
s.setEnabledProtocols(new String[] { "TLSv1.2", "TLSv1.1", "TLSv1" });
}
}
}

View File

@ -40,7 +40,7 @@
<string name="drawer_open">Otevřít menu</string>
<string name="drawer_close">Zavřít menu</string>
<string name="drawer_preferences">Nastavení panelu</string>
<string name="drawer_feed_order_unplayed_episodes">Řadit dle počtu</string>
<string name="drawer_feed_order_unplayed_episodes">Řadit dle čítače</string>
<string name="drawer_feed_order_alphabetical">Řadit abecedně</string>
<string name="drawer_feed_order_last_update">Řadit dle data zveřejnění</string>
<string name="drawer_feed_order_most_played">Řadit podle počtu poslechnutých epizod</string>
@ -110,12 +110,21 @@
<item quantity="many">%d dnů po dokončení</item>
<item quantity="other">%d dnů po dokončení</item>
</plurals>
<plurals name="num_selected_label">
<item quantity="one">%d vybrána</item>
<item quantity="few">%d vybrány</item>
<item quantity="many">%d vybráno</item>
<item quantity="other">%d vybráno</item>
</plurals>
<string name="loading_more">Načítají se další…</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Označit vše jako poslechnuté</string>
<string name="mark_all_read_msg">Všechny epizody označeny jako poslechnuté</string>
<string name="mark_all_read_confirmation_msg">Potvrďte prosím, že chcete označit všechny vybrané epizody jako poslechnuté.</string>
<string name="mark_all_read_feed_confirmation_msg">Potvrďte prosím, že chcete označit všechny epizody tohoto podcastu jako poslechnuté.</string>
<string name="remove_all_new_flags_label">Odstranit příznak „nová“ ze všech epizod</string>
<string name="removed_all_new_flags_msg">Příznak „nová“ odstraněn ze všech epizod</string>
<string name="remove_all_new_flags_confirmation_msg">Potvrďte prosím, že chcete odstranit příznak „nová“ ze všech epizod.</string>
<string name="show_info_label">Informace o zdroji</string>
<string name="show_feed_settings_label">Zobrazit nastavení podcastu</string>
<string name="feed_info_label">Informace o podcastu</string>
@ -132,6 +141,7 @@
<string name="share_item_url_with_position_label">Sdílet URL souboru s časovou značkou</string>
<string name="feed_delete_confirmation_msg">Potvrďte prosím, že chcete smazat podcast „%1$s“ a VŠECHNY jeho epizody (včetně stažených epizod).</string>
<string name="feed_remover_msg">Odstraňování podcastu</string>
<string name="load_complete_feed">Aktualizovat celý podcast</string>
<string name="multi_select">Výběr více položek</string>
<string name="select_all_above">Vybrat všechny výše</string>
<string name="select_all_below">Vybrat všechny níže</string>
@ -168,10 +178,13 @@
<item quantity="many">%d epizod staženo.</item>
<item quantity="other">%d epizod staženo.</item>
</plurals>
<string name="remove_new_flag_label">Odstranit příznak „nová“</string>
<string name="removed_new_flag_label">Příznak „nová“ odstraněn</string>
<string name="mark_read_label">Označit jako poslechnuté</string>
<string name="marked_as_read_label">Označeno jako poslechnuté</string>
<string name="mark_read_no_media_label">Označit jako poslechnuté</string>
<string name="marked_as_read_no_media_label">Označeno jako poslechnuté</string>
<string name="play_this_to_seek_position">Pro přeskočení na pozice musíte epizodu přehrát</string>
<plurals name="marked_read_batch_label">
<item quantity="one">%d epizoda označena jako přehraná</item>
<item quantity="few">%d epizody označeny jako přehrané</item>
@ -180,9 +193,27 @@
</plurals>
<string name="mark_unread_label">Označit jako neposlechnuté</string>
<string name="mark_unread_label_no_media">Označit jako nepřečtené</string>
<plurals name="marked_unread_batch_label">
<item quantity="one">%d epizoda označena jako neposlechnutá</item>
<item quantity="few">%d epizody označeny jako neposlechnuté</item>
<item quantity="many">%d epizod označeno jako neposlechnuté</item>
<item quantity="other">%d epizod označeno jako neposlechnuté</item>
</plurals>
<string name="add_to_queue_label">Přidat do fronty</string>
<string name="added_to_queue_label">Přidáno do fronty</string>
<plurals name="added_to_queue_batch_label">
<item quantity="one">%d epizoda přidána do fronty</item>
<item quantity="few">%d epizody přidány do fronty</item>
<item quantity="many">%d epizod přidáno do fronty</item>
<item quantity="other">%d epizod přidáno do fronty</item>
</plurals>
<string name="remove_from_queue_label">Odebrat z fronty</string>
<plurals name="removed_from_queue_batch_label">
<item quantity="one">%d epizoda odebrána z fronty</item>
<item quantity="few">%d epizody odebrány z fronty</item>
<item quantity="many">%d epizod odebráno z fronty</item>
<item quantity="other">%d epizod odebráno z fronty</item>
</plurals>
<string name="add_to_favorite_label">Přidat k oblíbeným</string>
<string name="added_to_favorites">Přidáno k oblíbeným</string>
<string name="remove_from_favorite_label">Odebrat z obíbených</string>
@ -233,6 +264,7 @@
<string name="download_type_feed">Kanál</string>
<string name="download_type_media">Soubor</string>
<string name="download_request_error_dialog_message_prefix">Nastala chyba při pokusu o stažení souboru:\u0020</string>
<string name="null_value_podcast_error">Nebyl poskytnut žádný podcast, co by mohl být zobrazen.</string>
<string name="authentication_notification_title">Vyžadováno ověření</string>
<string name="authentication_notification_msg">Zdroj který jste vybrali vyžaduje zadání uživatelského jména a hesla</string>
<string name="confirm_mobile_download_dialog_title">Potvrdit mobilní stahování</string>
@ -285,13 +317,17 @@
<!--Variable Speed-->
<string name="download_plugin_label">Stáhnout modul</string>
<string name="no_playback_plugin_title">Modul není nainstalován</string>
<string name="no_playback_plugin_or_sonic_msg">Pro správnou funkci proměnlivé rychlosti přehrávání je doporučeno povolit vestavěný přehrávač Sonic.</string>
<string name="set_playback_speed_label">Rychlosti přehrávání</string>
<string name="enable_sonic">Povolit Sonic</string>
<!--Empty list labels-->
<string name="no_items_header_label">Žádné epizody ve frontě</string>
<string name="no_items_label">Přidejte epizodu stažením nebo dlouhým dotykem a volbou „Přidat do fronty“.</string>
<string name="no_shownotes_label">Tato epizoda neobsahuje žádné poznámky.</string>
<string name="no_run_downloads_head_label">Neběží žádná stahování</string>
<string name="no_run_downloads_label">Můžete stáhnout epizody tohoto podcastu z obrazovky s jeho detaily.</string>
<string name="no_comp_downloads_head_label">Žádné stažené epizody</string>
<string name="no_comp_downloads_label">Můžete stáhnout epizody tohoto podcastu z obrazovky s jeho detaily.</string>
<string name="no_log_downloads_head_label">Žádné záznamy o stahování</string>
<string name="no_log_downloads_label">Až proběhnou nějaká stahování, tak se záznamy o nich objeví zde.</string>
<string name="no_history_head_label">Žádná historie</string>
@ -304,6 +340,7 @@
<string name="no_fav_episodes_label">Epizody si můžete přidat mezi oblíbené dlouhým dotykem.</string>
<string name="no_chapters_head_label">Žádné kapitoly</string>
<string name="no_chapters_label">Tato epizoda nemá žádné kapitoly.</string>
<string name="no_subscriptions_head_label">Žádené sbírky</string>
<string name="no_subscriptions_label">Pro přidání podcastu do sbírky se dotkněte ikonky plus níže.</string>
<!--Preferences-->
<string name="storage_pref">Úložiště</string>
@ -317,6 +354,7 @@
<string name="import_export_pref">Importovat/Exportovat</string>
<string name="import_export_search_keywords">zálohovat, obnovit</string>
<string name="appearance">Vzhled</string>
<string name="external_elements">Externí elementy</string>
<string name="interruptions">Přerušení</string>
<string name="playback_control">Ovládání přehrávání</string>
<string name="preference_search_hint">Vyhledávání…</string>
@ -328,6 +366,8 @@
<string name="pref_pauseOnDisconnect_sum">Při odpojení sluchátek nebo bluetooth připojení pozastavit přehrávání.</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Pokračovat v přehrávání po připojení sluchátek</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Pokračovat v přehrávání po připojení bluetooth</string>
<string name="pref_hardwareForwardButtonSkips_title">Tlačítko rychle vpřed přeskakuje</string>
<string name="pref_hardwareForwardButtonSkips_sum">Stisk tlačítka rychle vpřed (FF) na připojeném zařízení Bluetooth přeskočí na další epizodu místo rychlého přetočení vpřed.</string>
<string name="pref_hardwarePreviousButtonRestarts_title">Tlačítko zpět restartuje</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">Po stlačení hardwarového tlačítka pro posun zpět místo přetočení vpřed restartovat přehrávání aktuální epizody</string>
<string name="pref_followQueue_sum">Po přehrání položky z fronty přejít automaticky na další</string>
@ -337,10 +377,14 @@
<string name="pref_smart_mark_as_played_title">Chytré označování jako poslechnuté</string>
<string name="pref_skip_keeps_episodes_sum">Neodstraňovat epizody při jejich přeskočení</string>
<string name="pref_skip_keeps_episodes_title">Nemazat přeskočené epizody</string>
<string name="pref_favorite_keeps_episodes_sum">Nemazat epizody, které jsou mezi oblíbenými.</string>
<string name="pref_favorite_keeps_episodes_title">Nemazat oblíbené epizody</string>
<string name="playback_pref">Přehrávání</string>
<string name="playback_pref_sum">Ovládání tlačítky sluchátek, přeskakování, fronta</string>
<string name="network_pref">Síť</string>
<string name="network_pref_sum">Četnost aktualizací, ovládání stahování, mobilní data</string>
<string name="pref_autoUpdateIntervallOrTime_title">Aktualizovat interval nebo čas v průběhu dne</string>
<string name="pref_autoUpdateIntervallOrTime_sum">Zvolte čas mezi aktualizacemi nebo čas v rámci dne, kdy proběhne automatická aktualizace podcastů</string>
<string name="pref_autoUpdateIntervallOrTime_message">Můžete nastavit <i>interval</i> jako třeba \"každé 2 hodiny\", nastavit specifický <i>čas v průběhu dne</i> jako \"7:00\" nebo úplně <i>vypnout</i> automatické aktualizace.\n\n<small>Mějte na paměti: Časy aktualizací nejsou přesné. Možná zaznamenáte krátká zpoždění.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Vypnout</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Nastavit interval</string>
@ -351,17 +395,24 @@
<string name="pref_pauseOnHeadsetDisconnect_title">Sluchátka odpojena</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Sluchátka připojena</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Bluetooth připojeno</string>
<string name="pref_stream_over_download_title">Upřednostnit streamování</string>
<string name="pref_stream_over_download_sum">Zobrazit tlačítko streamovat místo tlačítka stáhnout v seznamech.</string>
<string name="pref_mobileUpdate_title">Mobilní aktualizace</string>
<string name="pref_mobileUpdate_sum">Vyberte, co by mělo být povoleno přes mobilní data</string>
<string name="pref_mobileUpdate_refresh">Obnovit podcast</string>
<string name="pref_mobileUpdate_images">Obrázky podcastů/epizod</string>
<string name="pref_mobileUpdate_auto_download">Automatické stahování</string>
<string name="pref_mobileUpdate_episode_download">Stahování epizod</string>
<string name="pref_mobileUpdate_streaming">Streamování</string>
<string name="user_interface_label">Uživatelské rozhraní</string>
<string name="user_interface_sum">Vzhled, poradí ve sbírce, uzamčená obrazovka</string>
<string name="pref_set_theme_title">Vybrat motiv</string>
<string name="pref_nav_drawer_items_title">Změnit navigační panel</string>
<string name="pref_nav_drawer_items_sum">Upravit zobrazení položek v navigačním panelu.</string>
<string name="pref_nav_drawer_feed_order_title">Nastavit pořadí sbírek</string>
<string name="pref_nav_drawer_feed_order_sum">Upravit pořadí vašich sbírek</string>
<string name="pref_nav_drawer_feed_counter_title">Nastavit počítadlo sbírek</string>
<string name="pref_nav_drawer_feed_counter_title">Nastavit čítač sbírek</string>
<string name="pref_nav_drawer_feed_counter_sum">Změnit informaci zobrazenou čítačem sbírek. Též ovlivňuje řazení, je-li nastaveno na „podle čítače“.</string>
<string name="pref_set_theme_sum">Změnit vzhled AntennaPod.</string>
<string name="pref_automatic_download_title">Automatické stahování</string>
<string name="pref_automatic_download_sum">Nastavení automatického stahování epizod.</string>
@ -371,6 +422,9 @@
<string name="pref_automatic_download_on_battery_sum">Povolit automatické stahování i pokud není baterie nabíjena</string>
<string name="pref_parallel_downloads_title">Paralelní stahování</string>
<string name="pref_episode_cache_title">Historie epizod</string>
<string name="pref_episode_cache_summary">Celkový počet epizod stažených na zařízení. Automatické stahování se zastaví při dosažení této hodnoty.</string>
<string name="pref_episode_cover_title">Použít obrázek epizody</string>
<string name="pref_episode_cover_summary">Použít obrázek přímo z epizody, pokud je k dispozici. Není-li tato možnost zaškrtnuta, tak se vžy použije obrázek podcastu.</string>
<string name="pref_theme_title_use_system">Použít systémové téma</string>
<string name="pref_theme_title_light">Světlý</string>
<string name="pref_theme_title_dark">Tmavý</string>
@ -387,9 +441,10 @@
<string name="pref_gpodnet_setlogin_information_sum">Změní přihlašovací údaje k vašemu gpodder.net účtu.</string>
<string name="pref_gpodnet_sync_changes_title">Synchronizovat ihned</string>
<string name="pref_gpodnet_sync_changes_sum">Synchronizovat odběr a změny stavu epizody s gpodder.net.</string>
<string name="pref_gpodnet_full_sync_title">Synchronizovat vše ihned</string>
<string name="pref_gpodnet_full_sync_sum">Synchronizovat všechny odběry a stav epizod s gpodder.net.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Přihlášen jako <i>%1$s</i> z přístroje <i>%2$s</i>]]></string>
<string name="pref_gpodnet_notifications_title">Zobrazovat upozornění na chyby synchronizace</string>
<string name="pref_gpodnet_notifications_title">Zobrazovat oznámení o chybách synchronizace</string>
<string name="pref_gpodnet_notifications_sum">Toto nastavení se netýká chyb přihlášení.</string>
<string name="pref_playback_speed_title">Rychlosti přehrávání</string>
<string name="pref_playback_speed_sum">Přizpůsobení rychlosti je dostupné pro přehrávání zvuku různými rychlostmi</string>
@ -398,16 +453,20 @@
<string name="pref_feed_skip_sum">Přeskočit úvod a závěr.</string>
<string name="pref_feed_skip_ending">Přeskočit posledních</string>
<string name="pref_feed_skip_intro">Přeskočit prvních</string>
<string name="pref_feed_skip_ending_toast">Přeskočeno posledních %d sekund</string>
<string name="pref_feed_skip_intro_toast">Přeskočeno prvních %d sekund</string>
<string name="pref_playback_time_respects_speed_title">Upravit informace o médiu vzhledem k rychlosti přehrávání.</string>
<string name="pref_playback_time_respects_speed_sum">Zobrazené délka a pozice jsou upravené vzhledem k rychlosti přehrávání</string>
<string name="pref_fast_forward">Délka času posunu vpřed</string>
<string name="pref_fast_forward_sum">Upravit o kolik sekund se přeskočí dopředu při stisku tlačítka rychle vpřed (FF).</string>
<string name="pref_rewind">Délka času posunu zpět</string>
<string name="pref_rewind_sum">Upravit o kolik sekund se přeskočí zpět při stisku tlačítka přetočit zpět (RW).</string>
<string name="pref_gpodnet_sethostname_title">Nastavit hostname</string>
<string name="pref_gpodnet_sethostname_use_default_host">Použít přednastaveného hosta</string>
<string name="pref_expandNotify_title">Vysoká priorita pro upozorně</string>
<string name="pref_expandNotify_title">Vysoká priorita pro oznáme</string>
<string name="pref_expandNotify_sum">Toto obvykle přidá tlačítka ovládání přehrávání do zpráv upozornění</string>
<string name="pref_persistNotify_title">Pevné ovládání přehrávání</string>
<string name="pref_persistNotify_sum">Zachovat upozornění a ovládání na obrazovce uzamčení i při pozastaveném přehrávání.</string>
<string name="pref_persistNotify_sum">Zachovat oznámení a ovládání na obrazovce uzamčení i při pozastaveném přehrávání.</string>
<string name="pref_compact_notification_buttons_title">Nastavení tlačítek uzamčené obrazovky</string>
<string name="pref_compact_notification_buttons_sum">Změnit tlačítka ovládání na obrazovce uzamčení. Tlačítka přehrát/pozastavit jsou vždy zobrazena.</string>
<string name="pref_compact_notification_buttons_dialog_title">Vybrat maximálně %1$d položek</string>
@ -416,7 +475,9 @@
<string name="pref_lockscreen_background_sum">Nastavit pozadí uzamčené obrazovky na obrázek aktuální epizody. Jako vedlejší efekt zobrazí toto nastavení obrázek i v aplikacích třetích stran. </string>
<string name="pref_showDownloadReport_title">Zobrazit report stahování</string>
<string name="pref_showDownloadReport_sum">Pokud selže stahování, vygenerovat report zobrazující detaily o chybě.</string>
<string name="pref_expand_notify_unsupport_toast">Verze Androidu nižší než 4.1 nepodporují rozšířená upozornění.</string>
<string name="pref_showAutoDownloadReport_title">Zobrazovat hlášení automatického stahování</string>
<string name="pref_showAutoDownloadReport_sum">Zobrazovat oznámení o automaticky stažených epizodách.</string>
<string name="pref_expand_notify_unsupport_toast">Verze Androidu nižší než 4.1 nepodporují rozšířená oznámení.</string>
<string name="pref_enqueue_location_title">Pozice přidávání do fronty</string>
<string name="pref_enqueue_location_sum">Přidávat epizody na: %1$s</string>
<string name="enqueue_location_back">konec</string>
@ -425,7 +486,9 @@
<string name="pref_smart_mark_as_played_disabled">Vypnuto</string>
<string name="pref_image_cache_size_title">Velikost odkládací paměti obrázků</string>
<string name="pref_image_cache_size_sum">Velikost diskové paměti pro obrázky.</string>
<string name="visit_user_forum">Uživatelské fórum</string>
<string name="bug_report_title">Nahlásit chybu</string>
<string name="open_bug_tracker">Otevřít systém pro sledování a hlášení chyb (bug tracker)</string>
<string name="export_logs">Exportovat záznamy</string>
<string name="copy_to_clipboard">Zkopírovat do schránky</string>
<string name="copied_to_clipboard">Zkopírováno do schránky</string>
@ -490,6 +553,7 @@
<string name="database">Databáze</string>
<string name="opml">OPML</string>
<string name="html">HTML</string>
<string name="html_export_summary">Ukažte své sbírky přátelům</string>
<string name="opml_export_summary">Přenést sbírky do jiné podcastové aplikace</string>
<string name="opml_import_summary">Importovat vaše sbírky z jiné podcastové aplikace</string>
<string name="database_export_summary">Přenést sbírky, poslechnuté epizody a frontu do aplikace AntennaPod na jiném zařízení</string>
@ -582,6 +646,7 @@
<string name="choose_data_directory">Vybrat umístění dat</string>
<string name="choose_data_directory_message">Vyberte prosím váš výchozí datový adresář. AntennaPod vytvoří všechny potřebné podadresáře.</string>
<string name="choose_data_directory_permission_rationale">Ke změně datového adresáře je vyžadován přístup k externímu úložišti</string>
<string name="choose_data_directory_available_space">%1$s z %2$s zdarma</string>
<string name="create_folder_msg">Vytvořit adresář \"%1$s\"?</string>
<string name="create_folder_success">Nový adresář vytvořen</string>
<string name="create_folder_error_no_write_access">Nelze zapisovat do adresáře</string>
@ -600,6 +665,9 @@
<string name="pref_restart_required">Pro aktivování změn nastavení bylo třeba restartovat aplikaci AntennaPod.</string>
<!--Online feed view-->
<string name="subscribe_label">Odebírat</string>
<string name="subscribing_label">Přidává se do sbírky…</string>
<string name="preview_episode">Spustit ukázku</string>
<string name="stop_preview">Zastavit ukázku</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Posunout zpět</string>
<string name="fast_forward_label">Posunout vpřed</string>
@ -613,6 +681,9 @@
<string name="is_favorite_label">Epizoda je označená jako oblíbená</string>
<string name="drag_handle_content_description">Tahem změnit pozici této položky</string>
<string name="load_next_page_label">Načíst další stranu</string>
<string name="switch_pages">Přehodit stránku</string>
<string name="position">Pozice: %1$s</string>
<string name="apply_action">Vykonat</string>
<!--Feed information screen-->
<string name="authentication_label">Ověření</string>
<string name="authentication_descr">Změnit uživatelské jméno a heslo pro tento podcast a jeho epizody.</string>
@ -638,6 +709,7 @@
<string name="browse_gpoddernet_label">Prohledávat gpodder.net</string>
<string name="discover">Objevit</string>
<string name="discover_more">více »</string>
<string name="search_powered_by">Vyhledávání poskytuje %1$s</string>
<string name="filter">Filtr</string>
<!--Episodes apply actions-->
<string name="all_label">Vše</string>
@ -716,11 +788,22 @@
<string name="cast_failed_receiver_player_error">Přijímač zaznamenal závažnou chybu</string>
<string name="cast_failed_media_error_skipping">Chyba přehrávání médií. Přeskakuji...</string>
<!--Notification channels-->
<string name="notification_channel_user_action">Je vyžadována činnost z vaší strany</string>
<string name="notification_channel_user_action_description">Zobrazuje se, pokud je požadována činnost z vaší strany. Například je-li potřeba zadat heslo.</string>
<string name="notification_channel_downloading">Stahuji</string>
<string name="notification_channel_downloading_description">Zobrazuje se v průběhu stahování.</string>
<string name="notification_channel_playing">Přehrává se</string>
<string name="notification_channel_playing_description">Umožňuje ovládat přehrávání. Toto je to hlavní oznámení, které uvidité při přehrávání podcastu.</string>
<string name="notification_channel_error">Chyby</string>
<string name="notification_channel_error_description">Zobrazuje se, když se něco nepovedlo. Například pokud selhalo stahování anebo synchronizace gpodder.</string>
<string name="notification_channel_auto_download">Automatické stahování</string>
<string name="notification_channel_episode_auto_download">Zobrazuje se po automatickém stažení epizod.</string>
<!--Widget settings-->
<string name="widget_settings">Nastavení widgetu</string>
<string name="widget_create_button">Vytvořit widget</string>
<string name="widget_opacity">Průhlednost</string>
<!--On-Demand configuration-->
<string name="on_demand_config_setting_changed">Nastavení úspěšně aktualizováno</string>
<string name="on_demand_config_stream_text"> Vypadá to, že častěji streamujete než stahujete. Chcete zobrazovat tlačítko streamovat v seznamu epizod? </string>
<string name="on_demand_config_download_text">Vypadá to, že častěji stahujete než streamujete. Chcete zobrazovat tlačítko stáhnout v seznamu epizod?</string>
</resources>

View File

@ -509,8 +509,11 @@
<!--About screen-->
<string name="about_pref">Honi buruz</string>
<string name="antennapod_version">AntennaPod bertsioa</string>
<string name="contributors">Laguntzaileak</string>
<string name="contributors_summary">Denek lagun dezakete gure foroan kodea, itzulpenak edo erabiltzaileei laguntza emanez.</string>
<string name="developers">Garatzaileak</string>
<string name="translators">Itzultzaileak</string>
<string name="special_thanks">Esker bereziak</string>
<string name="privacy_policy">Pribatutasun politika</string>
<string name="licenses">Baimenak</string>
<string name="licenses_summary">AntennaPod-ek beste software ezin hobeak erabiltzen ditu</string>
@ -554,6 +557,8 @@
<string name="import_select_file">Aukeratu inportatzeko fitxategia</string>
<string name="import_ok">Inportazio arrakastatsua.\n\nSakatu OK, AntennaPod berrabiarazteko</string>
<string name="import_no_downgrade">Datu-basea AntennaPod-en bertsio berriago batekin esportatu zen. Uneko aplikazioak ez daki nola inportatu.</string>
<string name="favorites_export_label">Gogokoak esportatu</string>
<string name="favorites_export_summary">Gorde diren gogokoak esportatu artxibatzeko</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Ezarri tenporizadore bat</string>
<string name="disable_sleeptimer_label">Desgaitu tenporizadorea</string>

View File

@ -85,6 +85,7 @@
<string name="auto_download_apply_to_items_message">تنظیمات جدید <i>بارگیری خودکار</i> به طور خودکار بر قسمت‌های جدید اعمال خواهد شد.\nآیا می‌خواهید بر قسمت‌هایی قبلاً منتشر شده هم اعمال شود؟</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>
@ -204,6 +205,7 @@
<string name="deactivate_auto_download">غیر فعال کردن بارگیری خودکار</string>
<string name="reset_position">تنظیم مجدد موقعیت پخش</string>
<string name="removed_item">مورد حذف شده است</string>
<string name="no_items_selected">چیزی انتخاب نشده است</string>
<!--Download messages and labels-->
<string name="download_successful">موفقیت‌آمیز</string>
<string name="download_pending">بارگیری معوق</string>
@ -324,6 +326,8 @@
<string name="storage_sum">حذف خودکار قسمت، درون‌ریزی، برون‌ریزی</string>
<string name="project_pref">پروژه</string>
<string name="queue_label">صف</string>
<string name="synchronization_pref">هم‌گام‌سازی</string>
<string name="synchronization_sum">با کمک gpodder.net با دستگاه‌های دیگر هم‌گام کنید</string>
<string name="automation">اتوماسیون</string>
<string name="download_pref_details">جزئیات</string>
<string name="import_export_pref">وارد/صادر کرد</string>

View File

@ -323,7 +323,7 @@
<!--Empty list labels-->
<string name="no_items_header_label">Brak odcinków w kolejce</string>
<string name="no_items_label">Dodaj odcinek, pobierając go, lub przytrzymaj dłużej na odcinku i wybierz \"Dodaj do kolejki\".</string>
<string name="no_shownotes_label">Ten epizod nie ma notatek.</string>
<string name="no_shownotes_label">Ten odcinek nie ma notatek.</string>
<string name="no_run_downloads_head_label">Brak aktywnych pobierań</string>
<string name="no_run_downloads_label">Możesz pobrać odcinki z ekranu informacji o podcaście</string>
<string name="no_comp_downloads_head_label">Brak pobranych odcinków</string>
@ -528,8 +528,10 @@
<!--About screen-->
<string name="about_pref">O...</string>
<string name="antennapod_version">Wersja AntennaPod</string>
<string name="contributors">Kontrybutorzy</string>
<string name="developers">Twórcy</string>
<string name="translators">Tłumacze</string>
<string name="special_thanks">Specjalne podziękowania</string>
<string name="privacy_policy">Polityka prywatności</string>
<string name="licenses">Licencje</string>
<string name="licenses_summary">AntennaPod używa różnego świetnego oprogramowania/bibliotek</string>
@ -573,6 +575,8 @@
<string name="import_select_file">Wybierz plik do Importowania</string>
<string name="import_ok">Import zakończony powodzeniem.\n\nNaciśnij OK aby zrestartować AntennaPod</string>
<string name="import_no_downgrade">Baza danych została eksportowana z nowszej wersji AntennaPod. Twoja wersja nie potrafi obsłużyć tego pliku. </string>
<string name="favorites_export_label">Eksport ulubionych</string>
<string name="favorites_export_summary">Ulubione wyeksportowano do pliku</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Ustaw czas do wyłączenia</string>
<string name="disable_sleeptimer_label">Wyłącz wyłącznik czasowy</string>

View File

@ -384,6 +384,7 @@
<string name="pref_mobileUpdate_episode_download">Download de episódios</string>
<string name="pref_mobileUpdate_streaming">Streaming</string>
<string name="user_interface_label">Interface com usuário</string>
<string name="user_interface_sum">Aparência, pedidos de assinatura, tela de bloqueio</string>
<string name="pref_set_theme_title">Selecionar tema</string>
<string name="pref_nav_drawer_items_title">Configurar itens da Gaveta de Navegação</string>
<string name="pref_nav_drawer_items_sum">Escolher quais itens irão aparecer na gaveta de navegação.</string>
@ -400,6 +401,10 @@
<string name="pref_automatic_download_on_battery_sum">Permitir download automático enquanto a bateria não está carregando</string>
<string name="pref_parallel_downloads_title">Downloads paralelos</string>
<string name="pref_episode_cache_title">Cache de episódios</string>
<string name="pref_episode_cache_summary">Número total de episódios baixados em cache no dispositivo. O download automático será suspenso se esse número for atingido.</string>
<string name="pref_episode_cover_title">Usar capa do episódio</string>
<string name="pref_episode_cover_summary">Use a capa específica do episódio sempre que disponível. Se desmarcado, o aplicativo sempre usará a imagem da capa do podcast.</string>
<string name="pref_theme_title_use_system">Usar tema do sistema</string>
<string name="pref_theme_title_light">Claro</string>
<string name="pref_theme_title_dark">Escuro</string>
<string name="pref_theme_title_trueblack">Preto (preparado para AMOLED)</string>
@ -415,12 +420,22 @@
<string name="pref_gpodnet_setlogin_information_sum">Alterar informações de login da sua conta gpodder.net</string>
<string name="pref_gpodnet_sync_changes_title">Sincronizar agora</string>
<string name="pref_gpodnet_sync_changes_sum">Sincronizar as alterações de estado da inscrição e de episódios com o gpodder.net.</string>
<string name="pref_gpodnet_full_sync_title">Forçar sincronização completa</string>
<string name="pref_gpodnet_full_sync_sum">Sincronizar os estados das inscrições e episódios com o gpodder.net.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Entrou como <i>%1$s</i> com o dispositivo <i>%2$s</i>]]></string>
<string name="pref_gpodnet_notifications_title">Exibir notificações de erros de sincronismo</string>
<string name="pref_gpodnet_notifications_sum">Essa configuração não se aplica a erros de autenticação.</string>
<string name="pref_playback_speed_title">Velocidades de Reprodução</string>
<string name="pref_playback_speed_sum">Personalize as velocidades variáveis de 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>
<string name="pref_feed_skip_sum">Pule as introduções e os créditos finais.</string>
<string name="pref_feed_skip_ending">Pular últimos</string>
<string name="pref_feed_skip_intro">Pular primeiros</string>
<string name="pref_feed_skip_ending_toast">Pulou últimos %d segundos</string>
<string name="pref_feed_skip_intro_toast">Pulou os primeiros %d segundos</string>
<string name="pref_playback_time_respects_speed_title">Ajuste as informações da mídia para a velocidade de reprodução</string>
<string name="pref_playback_time_respects_speed_sum">A posição exibida e a duração são adaptadas à velocidade de reprodução</string>
<string name="pref_fast_forward">Tempo de avanço rápido</string>
<string name="pref_fast_forward_sum">Personalize os segundos para avançar quando o botão avanço rápido for clicado</string>
<string name="pref_rewind">Tempo de retroceder</string>
@ -439,15 +454,29 @@
<string name="pref_lockscreen_background_sum">Configurar o plano de fundo da tela de bloqueio para a imagem do episódio atual. Como um efeito colateral, também ira mostrar imagens de aplicativos de terceiros.</string>
<string name="pref_showDownloadReport_title">Mostrar Relatório de Downloads</string>
<string name="pref_showDownloadReport_sum">Se os downloads falharem, gerar um relatório que mostra os detalhes da falha.</string>
<string name="pref_showAutoDownloadReport_title">Mostrar relatório de downloads automáticos</string>
<string name="pref_showAutoDownloadReport_sum">Mostra uma notificação para episódios baixados automaticamente.</string>
<string name="pref_expand_notify_unsupport_toast">Versões do Android inferiores a 4.1 não suportam notificações expansíveis</string>
<string name="pref_enqueue_location_title">Local da fila</string>
<string name="pref_enqueue_location_sum">Adicionar episódios para: %1$s</string>
<string name="enqueue_location_back">Final</string>
<string name="enqueue_location_front">Início</string>
<string name="enqueue_location_after_current">Depois do episódio atual</string>
<string name="pref_smart_mark_as_played_disabled">Desabilitado</string>
<string name="pref_image_cache_size_title">Tamanho da Imagem em Cache</string>
<string name="pref_image_cache_size_sum">Tamanho do cache de disco para imagens.</string>
<string name="visit_user_forum">Fórum de usuários</string>
<string name="bug_report_title">Reportar um bug</string>
<string name="open_bug_tracker">Abrir registro de bugs</string>
<string name="export_logs">Exportar logs</string>
<string name="copy_to_clipboard">Copiar para clipboard</string>
<string name="copied_to_clipboard">Copiado para clipboard</string>
<string name="experimental_pref">Experimental</string>
<string name="pref_media_player_message">Selecione qual reprodutor de mídia usar para reproduzir os arquivos</string>
<string name="pref_current_value">Valor atual: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Configurar um proxy da rede</string>
<string name="pref_faq">Perguntas mais frequentes</string>
<string name="pref_no_browser_found">Nenhum navegador web encontrado.</string>
<string name="pref_cast_title">Suporte ao Chromecast</string>
<string name="pref_cast_message_play_flavor">Habilitar o suporte para reprodução remota de mídia em dispositivos Cast (como Chromecast, Caixa de som ou Android TV)</string>
@ -455,6 +484,8 @@
<string name="pref_enqueue_downloaded_title">Enfileirar os baixados</string>
<string name="pref_enqueue_downloaded_summary">Adicionar episódios baixados à fila</string>
<string name="media_player_builtin">Reprodutor próprio do Android</string>
<string name="media_player_switch_to_exoplayer">Alterar para ExoPlayer</string>
<string name="media_player_switched_to_exoplayer">Alterado para ExoPlayer</string>
<string name="pref_skip_silence_title">Pular silêncio no áudio</string>
<string name="pref_videoBehavior_title">Após fechar vídeo</string>
<string name="pref_videoBehavior_sum">Comportamento ao parar a reprodução de vídeo</string>

View File

@ -40,8 +40,8 @@
<string name="drawer_open">打開選單</string>
<string name="drawer_close">關閉選單</string>
<string name="drawer_preferences">側邊選單設定</string>
<string name="drawer_feed_order_unplayed_episodes">數量排序</string>
<string name="drawer_feed_order_alphabetical">按字母排序</string>
<string name="drawer_feed_order_unplayed_episodes">計數器排序</string>
<string name="drawer_feed_order_alphabetical">按字母排序</string>
<string name="drawer_feed_order_last_update">按發布日期排序</string>
<string name="drawer_feed_order_most_played">按已播放的集數排序</string>
<string name="drawer_feed_counter_new_unplayed">新增及未播放集數</string>
@ -319,7 +319,7 @@
<string name="synchronization_pref">同步</string>
<string name="synchronization_sum">利用 gpodder.net 與其他裝置同步</string>
<string name="automation">自動化</string>
<string name="download_pref_details">詳情</string>
<string name="download_pref_details">細節</string>
<string name="import_export_pref">匯入/匯出</string>
<string name="import_export_search_keywords">備份, 還原, backup, restore, export, import, 匯出, 匯入</string>
<string name="appearance">外觀</string>
@ -351,10 +351,10 @@
<string name="playback_pref">播放</string>
<string name="playback_pref_sum">耳機線控、快轉時間、待播清單</string>
<string name="network_pref">網路</string>
<string name="network_pref_sum">更新週期、下載控制、行動數據</string>
<string name="network_pref_sum">更新週期、下載控制、行動網路</string>
<string name="pref_autoUpdateIntervallOrTime_title">更新週期</string>
<string name="pref_autoUpdateIntervallOrTime_sum">設定 Podcast 節目清單的更新週期</string>
<string name="pref_autoUpdateIntervallOrTime_message">您可以設定「每 2 小時」這類的<i>週期</i>或指定「每天早上 7 點」這種<i>每日定時</i>,也可以<i>停用</i> 自動更新。\n\n<small>請注意:這裡的時間並非十分精準,可能會有些許延遲。</small></string>
<string name="pref_autoUpdateIntervallOrTime_message">您可以設定「每 2 小時」這類的<i>週期</i>或指定「每天早上 7 點」這種<i>每日定時</i>,也可以<i>停用</i> 自動更新。\n\n<small>請注意:這裡的時間並非十分精準,可能會有些許延遲。</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">停用</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">設定週期</string>
<string name="pref_autoUpdateIntervallOrTime_TimeOfDay">設定每日定時</string>
@ -366,20 +366,20 @@
<string name="pref_unpauseOnBluetoothReconnect_title">連上藍牙時繼續播放</string>
<string name="pref_stream_over_download_title">偏好串流</string>
<string name="pref_stream_over_download_sum">在清單中顯示串流播放按鈕取代下載鈕</string>
<string name="pref_mobileUpdate_title">行動網路更新</string>
<string name="pref_mobileUpdate_title">允許以行動網路…</string>
<string name="pref_mobileUpdate_sum">選擇以行動網路連線時可以做的事</string>
<string name="pref_mobileUpdate_refresh">更新 Podcast</string>
<string name="pref_mobileUpdate_images">封面</string>
<string name="pref_mobileUpdate_images">更新封面</string>
<string name="pref_mobileUpdate_auto_download">自動下載</string>
<string name="pref_mobileUpdate_episode_download">下載單集</string>
<string name="pref_mobileUpdate_streaming">串流播放</string>
<string name="user_interface_label">使用者介面</string>
<string name="user_interface_sum">外觀、訂閱序、鎖定畫面</string>
<string name="user_interface_sum">外觀、訂閱序、鎖定畫面</string>
<string name="pref_set_theme_title">選擇主題</string>
<string name="pref_nav_drawer_items_title">設定側邊選單</string>
<string name="pref_nav_drawer_items_sum">調整側邊選單裡要顯示的項目</string>
<string name="pref_nav_drawer_feed_order_title">設定訂閱順序</string>
<string name="pref_nav_drawer_feed_order_sum">更改您的訂閱順序</string>
<string name="pref_nav_drawer_feed_order_title">設定訂閱排序方式</string>
<string name="pref_nav_drawer_feed_order_sum">更改您訂閱頻道的排序方式</string>
<string name="pref_nav_drawer_feed_counter_title">設定訂閱計數器</string>
<string name="pref_nav_drawer_feed_counter_sum">調整訂閱計數器中要顯示的東西,同時也會在排序方式設定為「計數」時影響排序。</string>
<string name="pref_set_theme_sum">更改 AntennaPod 的外觀</string>
@ -394,12 +394,12 @@
<string name="pref_episode_cache_summary">在本機中可以暫存的集數,若達上限則將停止自動下載。</string>
<string name="pref_episode_cover_title">使用單集的封面圖</string>
<string name="pref_episode_cover_summary">在單集有專屬封面的情況下使用該封面圖。如果取消,則一律使用 Podcast 的封面圖。</string>
<string name="pref_theme_title_use_system">使用系統主題</string>
<string name="pref_theme_title_use_system">依據系統設定</string>
<string name="pref_theme_title_light">淡色</string>
<string name="pref_theme_title_dark">深色</string>
<string name="pref_theme_title_trueblack">黑色 (適用 AMOLED 螢幕)</string>
<string name="pref_episode_cache_unlimited">無限</string>
<string name="pref_update_interval_hours_plural"></string>
<string name="pref_update_interval_hours_plural"></string>
<string name="pref_update_interval_hours_singular">小時</string>
<string name="pref_update_interval_hours_manual">手動</string>
<string name="pref_gpodnet_authenticate_title">登入</string>
@ -490,7 +490,7 @@
<string name="back_button_show_prompt">離開前需要確認</string>
<string name="close_prompt">確定關閉 AntennaPod</string>
<string name="double_tap_toast">重按返回鍵以離開</string>
<string name="back_button_go_to_page">前往頁面...</string>
<string name="back_button_go_to_page">前往頁面</string>
<string name="back_button_go_to_page_title">選擇頁面</string>
<string name="pref_delete_removes_from_queue_title">刪除時同步自待播清單中移除</string>
<string name="pref_delete_removes_from_queue_sum">刪除某單集後,也自動將其從待播清單中移除</string>
@ -693,7 +693,7 @@
<string name="sort_title_a_z">標題 (A \u2192 Z)</string>
<string name="sort_title_z_a">標題 (Z \u2192 A)</string>
<string name="sort_date_new_old">日期 (新 \u2192 舊)</string>
<string name="sort_date_old_new">標題 (舊 \u2192 新)</string>
<string name="sort_date_old_new">日期 (舊 \u2192 新)</string>
<string name="sort_duration_short_long">單集時間 (短 \u2192 長)</string>
<string name="sort_duration_long_short">單集時間 (長 \u2192 短)</string>
<string name="sort_a_z">A \u2192 Z</string>