mirror of
https://github.com/TeamNewPipe/NewPipe.git
synced 2024-11-22 19:12:45 +01:00
Merge branch 'dev' into fix-service-id-not-initialized
This commit is contained in:
commit
c890ab44d6
@ -48,7 +48,7 @@ dependencies {
|
||||
exclude module: 'support-annotations'
|
||||
}
|
||||
|
||||
compile 'com.github.TeamNewPipe:NewPipeExtractor:7ae274b'
|
||||
compile 'com.github.TeamNewPipe:NewPipeExtractor:1df3f67'
|
||||
|
||||
testCompile 'junit:junit:4.12'
|
||||
testCompile 'org.mockito:mockito-core:1.10.19'
|
||||
|
@ -12,7 +12,6 @@ import java.io.InterruptedIOException;
|
||||
import java.net.URL;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
@ -135,11 +134,8 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader {
|
||||
}
|
||||
|
||||
in = new BufferedReader(new InputStreamReader(con.getInputStream()));
|
||||
for (Map.Entry<String, List<String>> entry : con.getHeaderFields().entrySet()) {
|
||||
System.err.println(entry.getKey() + ": " + entry.getValue());
|
||||
}
|
||||
String inputLine;
|
||||
|
||||
String inputLine;
|
||||
while ((inputLine = in.readLine()) != null) {
|
||||
response.append(inputLine);
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import io.reactivex.Flowable;
|
||||
|
||||
import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.CREATION_DATE;
|
||||
import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.ID;
|
||||
import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.SEARCH;
|
||||
import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.SERVICE_ID;
|
||||
import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.TABLE_NAME;
|
||||
|
||||
@ -27,11 +28,20 @@ public interface SearchHistoryDAO extends HistoryDAO<SearchHistoryEntry> {
|
||||
@Override
|
||||
int deleteAll();
|
||||
|
||||
@Query("DELETE FROM " + TABLE_NAME + " WHERE " + SEARCH + " = :query")
|
||||
int deleteAllWhereQuery(String query);
|
||||
|
||||
@Query("SELECT * FROM " + TABLE_NAME + ORDER_BY_CREATION_DATE)
|
||||
@Override
|
||||
Flowable<List<SearchHistoryEntry>> getAll();
|
||||
|
||||
@Query("SELECT * FROM " + TABLE_NAME + " GROUP BY " + SEARCH + ORDER_BY_CREATION_DATE + " LIMIT :limit")
|
||||
Flowable<List<SearchHistoryEntry>> getUniqueEntries(int limit);
|
||||
|
||||
@Query("SELECT * FROM " + TABLE_NAME + " WHERE " + SERVICE_ID + " = :serviceId" + ORDER_BY_CREATION_DATE)
|
||||
@Override
|
||||
Flowable<List<SearchHistoryEntry>> listByService(int serviceId);
|
||||
|
||||
@Query("SELECT * FROM " + TABLE_NAME + " WHERE " + SEARCH + " LIKE :query || '%' GROUP BY " + SEARCH + " LIMIT :limit")
|
||||
Flowable<List<SearchHistoryEntry>> getSimilarEntries(String query, int limit);
|
||||
}
|
||||
|
@ -2,14 +2,16 @@ package org.schabi.newpipe.fragments.list.search;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.TooltipCompat;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
@ -25,12 +27,14 @@ import android.view.ViewGroup;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.AutoCompleteTextView;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.schabi.newpipe.NewPipeDatabase;
|
||||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.ReCaptchaActivity;
|
||||
import org.schabi.newpipe.database.history.dao.SearchHistoryDAO;
|
||||
import org.schabi.newpipe.database.history.model.SearchHistoryEntry;
|
||||
import org.schabi.newpipe.extractor.InfoItem;
|
||||
import org.schabi.newpipe.extractor.ListExtractor;
|
||||
import org.schabi.newpipe.extractor.NewPipe;
|
||||
@ -38,26 +42,35 @@ import org.schabi.newpipe.extractor.StreamingService;
|
||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||
import org.schabi.newpipe.extractor.search.SearchEngine;
|
||||
import org.schabi.newpipe.extractor.search.SearchResult;
|
||||
import org.schabi.newpipe.fragments.BackPressable;
|
||||
import org.schabi.newpipe.fragments.list.BaseListFragment;
|
||||
import org.schabi.newpipe.history.HistoryListener;
|
||||
import org.schabi.newpipe.report.UserAction;
|
||||
import org.schabi.newpipe.util.Constants;
|
||||
import org.schabi.newpipe.util.AnimationUtils;
|
||||
import org.schabi.newpipe.util.ExtractorHelper;
|
||||
import org.schabi.newpipe.util.LayoutManagerSmoothScroller;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.StateSaver;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.net.SocketException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import icepick.State;
|
||||
import io.reactivex.Flowable;
|
||||
import io.reactivex.Notification;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.ObservableSource;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.functions.BiFunction;
|
||||
import io.reactivex.functions.Consumer;
|
||||
import io.reactivex.functions.Function;
|
||||
import io.reactivex.functions.Predicate;
|
||||
@ -66,21 +79,22 @@ import io.reactivex.subjects.PublishSubject;
|
||||
|
||||
import static org.schabi.newpipe.util.AnimationUtils.animateView;
|
||||
|
||||
public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor.NextItemsResult> {
|
||||
public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor.NextItemsResult> implements BackPressable {
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Search
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
/**
|
||||
* The suggestions will appear only if the query meet this threshold (>=).
|
||||
* The suggestions will only be fetched from network if the query meet this threshold (>=).
|
||||
* (local ones will be fetched regardless of the length)
|
||||
*/
|
||||
private static final int THRESHOLD_SUGGESTION = 3;
|
||||
private static final int THRESHOLD_NETWORK_SUGGESTION = 1;
|
||||
|
||||
/**
|
||||
* How much time have to pass without emitting a item (i.e. the user stop typing) to fetch/show the suggestions, in milliseconds.
|
||||
*/
|
||||
private static final int SUGGESTIONS_DEBOUNCE = 150; //ms
|
||||
private static final int SUGGESTIONS_DEBOUNCE = 120; //ms
|
||||
|
||||
@State
|
||||
protected int filterItemCheckedId = -1;
|
||||
@ -89,47 +103,54 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
@State
|
||||
protected int serviceId = Constants.NO_SERVICE_ID;
|
||||
@State
|
||||
protected String searchQuery = "";
|
||||
protected String searchQuery;
|
||||
@State
|
||||
protected String lastSearchedQuery;
|
||||
@State
|
||||
protected boolean wasSearchFocused = false;
|
||||
|
||||
private int currentPage = 0;
|
||||
private int currentNextPage = 0;
|
||||
private String searchLanguage;
|
||||
private boolean showSuggestions = true;
|
||||
private boolean isSuggestionsEnabled = true;
|
||||
|
||||
private PublishSubject<String> suggestionPublisher = PublishSubject.create();
|
||||
private Disposable searchDisposable;
|
||||
private Disposable suggestionWorkerDisposable;
|
||||
private Disposable suggestionDisposable;
|
||||
private CompositeDisposable disposables = new CompositeDisposable();
|
||||
|
||||
private SuggestionListAdapter suggestionListAdapter;
|
||||
private SearchHistoryDAO searchHistoryDAO;
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Views
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
private View searchToolbarContainer;
|
||||
private AutoCompleteTextView searchEditText;
|
||||
private EditText searchEditText;
|
||||
private View searchClear;
|
||||
|
||||
private View suggestionsPanel;
|
||||
private RecyclerView suggestionsRecyclerView;
|
||||
|
||||
/*////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
public static SearchFragment getInstance(int serviceId, String query) {
|
||||
SearchFragment searchFragment = new SearchFragment();
|
||||
searchFragment.setQuery(serviceId, query);
|
||||
searchFragment.searchOnResume();
|
||||
|
||||
if (!TextUtils.isEmpty(query)) {
|
||||
searchFragment.setSearchOnResume();
|
||||
}
|
||||
|
||||
return searchFragment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set wasLoading to true so when the fragment onResume is called, the initial search is done.
|
||||
* (it will only start searching if the query is not null or empty)
|
||||
*/
|
||||
private void searchOnResume() {
|
||||
if (!TextUtils.isEmpty(searchQuery)) {
|
||||
wasLoading.set(true);
|
||||
}
|
||||
private void setSearchOnResume() {
|
||||
wasLoading.set(true);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
@ -140,6 +161,16 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
suggestionListAdapter = new SuggestionListAdapter(activity);
|
||||
searchHistoryDAO = NewPipeDatabase.getInstance().searchHistoryDAO();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||
isSuggestionsEnabled = preferences.getBoolean(getString(R.string.show_search_suggestions_key), true);
|
||||
searchLanguage = preferences.getString(getString(R.string.search_language_key), getString(R.string.default_language_value));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -147,15 +178,23 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
return inflater.inflate(R.layout.fragment_search, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View rootView, Bundle savedInstanceState) {
|
||||
super.onViewCreated(rootView, savedInstanceState);
|
||||
showSearchOnStart();
|
||||
initSearchListeners();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
|
||||
wasSearchFocused = searchEditText.hasFocus();
|
||||
|
||||
if (searchDisposable != null) searchDisposable.dispose();
|
||||
if (suggestionWorkerDisposable != null) suggestionWorkerDisposable.dispose();
|
||||
if (suggestionDisposable != null) suggestionDisposable.dispose();
|
||||
if (disposables != null) disposables.clear();
|
||||
hideSoftKeyboard(searchEditText);
|
||||
hideKeyboardSearch();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -163,10 +202,6 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
if (DEBUG) Log.d(TAG, "onResume() called");
|
||||
super.onResume();
|
||||
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||
showSuggestions = preferences.getBoolean(getString(R.string.show_search_suggestions_key), true);
|
||||
searchLanguage = preferences.getString(getString(R.string.search_language_key), getString(R.string.default_language_value));
|
||||
|
||||
if (!TextUtils.isEmpty(searchQuery)) {
|
||||
if (wasLoading.getAndSet(false)) {
|
||||
if (currentNextPage > currentPage) loadMoreItems();
|
||||
@ -181,7 +216,16 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
}
|
||||
}
|
||||
|
||||
if (suggestionWorkerDisposable == null || suggestionWorkerDisposable.isDisposed()) initSuggestionObserver();
|
||||
if (suggestionDisposable == null || suggestionDisposable.isDisposed()) initSuggestionObserver();
|
||||
|
||||
if (TextUtils.isEmpty(searchQuery) || wasSearchFocused) {
|
||||
showKeyboardSearch();
|
||||
showSuggestionsPanel();
|
||||
} else {
|
||||
hideKeyboardSearch();
|
||||
hideSuggestionsPanel();
|
||||
}
|
||||
wasSearchFocused = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -194,10 +238,8 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (!activity.isChangingConfigurations()) StateSaver.onDestroy(savedState);
|
||||
|
||||
if (searchDisposable != null) searchDisposable.dispose();
|
||||
if (suggestionWorkerDisposable != null) suggestionWorkerDisposable.dispose();
|
||||
if (suggestionDisposable != null) suggestionDisposable.dispose();
|
||||
if (disposables != null) disposables.clear();
|
||||
}
|
||||
|
||||
@ -205,7 +247,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
switch (requestCode) {
|
||||
case ReCaptchaActivity.RECAPTCHA_REQUEST:
|
||||
if (resultCode == Activity.RESULT_OK && searchQuery.length() != 0) {
|
||||
if (resultCode == Activity.RESULT_OK && !TextUtils.isEmpty(searchQuery)) {
|
||||
search(searchQuery);
|
||||
} else Log.e(TAG, "ReCaptcha failed");
|
||||
break;
|
||||
@ -216,6 +258,23 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
}
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Init
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
@Override
|
||||
protected void initViews(View rootView, Bundle savedInstanceState) {
|
||||
super.initViews(rootView, savedInstanceState);
|
||||
suggestionsPanel = rootView.findViewById(R.id.suggestions_panel);
|
||||
suggestionsRecyclerView = rootView.findViewById(R.id.suggestions_list);
|
||||
suggestionsRecyclerView.setAdapter(suggestionListAdapter);
|
||||
suggestionsRecyclerView.setLayoutManager(new LayoutManagerSmoothScroller(activity));
|
||||
|
||||
searchToolbarContainer = activity.findViewById(R.id.toolbar_search_container);
|
||||
searchEditText = searchToolbarContainer.findViewById(R.id.toolbar_search_edit_text);
|
||||
searchClear = searchToolbarContainer.findViewById(R.id.toolbar_search_clear);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// State Saving
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
@ -236,8 +295,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle bundle) {
|
||||
searchQuery = searchEditText != null && !TextUtils.isEmpty(searchEditText.getText().toString())
|
||||
? searchEditText.getText().toString() : searchQuery;
|
||||
searchQuery = searchEditText != null ? searchEditText.getText().toString() : searchQuery;
|
||||
super.onSaveInstanceState(bundle);
|
||||
}
|
||||
|
||||
@ -252,7 +310,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
} else {
|
||||
if (searchEditText != null) {
|
||||
searchEditText.setText("");
|
||||
showSoftKeyboard(searchEditText);
|
||||
showKeyboardSearch();
|
||||
}
|
||||
animateView(errorPanelRoot, false, 200);
|
||||
}
|
||||
@ -273,12 +331,6 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
}
|
||||
|
||||
inflater.inflate(R.menu.menu_search, menu);
|
||||
|
||||
searchToolbarContainer = activity.findViewById(R.id.toolbar_search_container);
|
||||
searchEditText = searchToolbarContainer.findViewById(R.id.toolbar_search_edit_text);
|
||||
searchClear = searchToolbarContainer.findViewById(R.id.toolbar_search_clear);
|
||||
setupSearchView();
|
||||
|
||||
restoreFilterChecked(menu, filterItemCheckedId);
|
||||
}
|
||||
|
||||
@ -308,14 +360,13 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
|
||||
private SearchEngine.Filter getFilterFromMenuId(int itemId) {
|
||||
switch (itemId) {
|
||||
case R.id.menu_filter_all:
|
||||
return SearchEngine.Filter.ANY;
|
||||
case R.id.menu_filter_video:
|
||||
return SearchEngine.Filter.STREAM;
|
||||
case R.id.menu_filter_channel:
|
||||
return SearchEngine.Filter.CHANNEL;
|
||||
case R.id.menu_filter_playlist:
|
||||
return SearchEngine.Filter.PLAYLIST;
|
||||
case R.id.menu_filter_all:
|
||||
default:
|
||||
return SearchEngine.Filter.ANY;
|
||||
}
|
||||
@ -327,9 +378,9 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
|
||||
private TextWatcher textWatcher;
|
||||
|
||||
private void setupSearchView() {
|
||||
searchEditText.setText(searchQuery != null ? searchQuery : "");
|
||||
searchEditText.setAdapter(suggestionListAdapter);
|
||||
private void showSearchOnStart() {
|
||||
if (DEBUG) Log.d(TAG, "showSearchOnStart() called, searchQuery → " + searchQuery+", lastSearchedQuery → " + lastSearchedQuery);
|
||||
searchEditText.setText(searchQuery);
|
||||
|
||||
if (TextUtils.isEmpty(searchQuery) || TextUtils.isEmpty(searchEditText.getText())) {
|
||||
searchToolbarContainer.setTranslationX(100);
|
||||
@ -341,15 +392,10 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
searchToolbarContainer.setAlpha(1f);
|
||||
searchToolbarContainer.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
initSearchListeners();
|
||||
|
||||
if (TextUtils.isEmpty(searchQuery) || wasSearchFocused) showSoftKeyboard(searchEditText);
|
||||
else hideSoftKeyboard(searchEditText);
|
||||
wasSearchFocused = false;
|
||||
}
|
||||
|
||||
private void initSearchListeners() {
|
||||
if (DEBUG) Log.d(TAG, "initSearchListeners() called");
|
||||
searchClear.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
@ -359,11 +405,9 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
return;
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
searchEditText.setText("", false);
|
||||
} else searchEditText.setText("");
|
||||
suggestionListAdapter.updateAdapter(new ArrayList<String>());
|
||||
showSoftKeyboard(searchEditText);
|
||||
searchEditText.setText("");
|
||||
suggestionListAdapter.setItems(new ArrayList<SuggestionItem>());
|
||||
showKeyboardSearch();
|
||||
}
|
||||
});
|
||||
|
||||
@ -373,7 +417,9 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (DEBUG) Log.d(TAG, "onClick() called with: v = [" + v + "]");
|
||||
searchEditText.showDropDown();
|
||||
if (isSuggestionsEnabled && errorPanelRoot.getVisibility() != View.VISIBLE) {
|
||||
showSuggestionsPanel();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@ -381,22 +427,24 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
@Override
|
||||
public void onFocusChange(View v, boolean hasFocus) {
|
||||
if (DEBUG) Log.d(TAG, "onFocusChange() called with: v = [" + v + "], hasFocus = [" + hasFocus + "]");
|
||||
if (hasFocus) searchEditText.showDropDown();
|
||||
if (isSuggestionsEnabled && hasFocus && errorPanelRoot.getVisibility() != View.VISIBLE) {
|
||||
showSuggestionsPanel();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
searchEditText.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
suggestionListAdapter.setListener(new SuggestionListAdapter.OnSuggestionItemSelected() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "onItemClick() called with: parent = [" + parent + "], view = [" + view + "], position = [" + position + "], id = [" + id + "]");
|
||||
}
|
||||
String s = suggestionListAdapter.getSuggestion(position);
|
||||
if (DEBUG) Log.d(TAG, "onItemClick text = " + s);
|
||||
submitQuery(s);
|
||||
public void onSuggestionItemSelected(SuggestionItem item) {
|
||||
search(item.query);
|
||||
searchEditText.setText(item.query);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuggestionItemLongClick(SuggestionItem item) {
|
||||
if (item.fromHistory) showDeleteSuggestionDialog(item);
|
||||
}
|
||||
});
|
||||
searchEditText.setThreshold(THRESHOLD_SUGGESTION);
|
||||
|
||||
if (textWatcher != null) searchEditText.removeTextChangedListener(textWatcher);
|
||||
textWatcher = new TextWatcher() {
|
||||
@ -411,32 +459,32 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
String newText = searchEditText.getText().toString();
|
||||
if (!TextUtils.isEmpty(newText)) suggestionPublisher.onNext(newText);
|
||||
suggestionPublisher.onNext(newText);
|
||||
}
|
||||
};
|
||||
searchEditText.addTextChangedListener(textWatcher);
|
||||
|
||||
searchEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
||||
@Override
|
||||
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
||||
if (DEBUG)
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "onEditorAction() called with: v = [" + v + "], actionId = [" + actionId + "], event = [" + event + "]");
|
||||
}
|
||||
if (event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER || event.getAction() == EditorInfo.IME_ACTION_SEARCH)) {
|
||||
submitQuery(searchEditText.getText().toString());
|
||||
search(searchEditText.getText().toString());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if (suggestionWorkerDisposable == null || suggestionWorkerDisposable.isDisposed()) initSuggestionObserver();
|
||||
if (suggestionDisposable == null || suggestionDisposable.isDisposed()) initSuggestionObserver();
|
||||
}
|
||||
|
||||
private void unsetSearchListeners() {
|
||||
if (DEBUG) Log.d(TAG, "unsetSearchListeners() called");
|
||||
searchClear.setOnClickListener(null);
|
||||
searchClear.setOnLongClickListener(null);
|
||||
searchEditText.setOnClickListener(null);
|
||||
searchEditText.setOnItemClickListener(null);
|
||||
searchEditText.setOnFocusChangeListener(null);
|
||||
searchEditText.setOnEditorActionListener(null);
|
||||
|
||||
@ -444,68 +492,166 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
textWatcher = null;
|
||||
}
|
||||
|
||||
private void showSoftKeyboard(View view) {
|
||||
if (DEBUG) Log.d(TAG, "showSoftKeyboard() called with: view = [" + view + "]");
|
||||
if (view == null) return;
|
||||
private void showSuggestionsPanel() {
|
||||
if (DEBUG) Log.d(TAG, "showSuggestionsPanel() called");
|
||||
animateView(suggestionsPanel, AnimationUtils.Type.LIGHT_SLIDE_AND_ALPHA, true, 200);
|
||||
}
|
||||
|
||||
if (view.requestFocus()) {
|
||||
private void hideSuggestionsPanel() {
|
||||
if (DEBUG) Log.d(TAG, "hideSuggestionsPanel() called");
|
||||
animateView(suggestionsPanel, AnimationUtils.Type.LIGHT_SLIDE_AND_ALPHA, false, 200);
|
||||
}
|
||||
|
||||
private void showKeyboardSearch() {
|
||||
if (DEBUG) Log.d(TAG, "showKeyboardSearch() called");
|
||||
if (searchEditText == null) return;
|
||||
|
||||
if (searchEditText.requestFocus()) {
|
||||
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
|
||||
imm.showSoftInput(searchEditText, InputMethodManager.SHOW_IMPLICIT);
|
||||
}
|
||||
}
|
||||
|
||||
private void hideSoftKeyboard(View view) {
|
||||
if (DEBUG) Log.d(TAG, "hideSoftKeyboard() called with: view = [" + view + "]");
|
||||
if (view == null) return;
|
||||
private void hideKeyboardSearch() {
|
||||
if (DEBUG) Log.d(TAG, "hideKeyboardSearch() called");
|
||||
if (searchEditText == null) return;
|
||||
|
||||
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
|
||||
imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
|
||||
|
||||
view.clearFocus();
|
||||
searchEditText.clearFocus();
|
||||
}
|
||||
|
||||
private void showDeleteSuggestionDialog(final SuggestionItem item) {
|
||||
new AlertDialog.Builder(activity)
|
||||
.setTitle(item.query)
|
||||
.setMessage(R.string.delete_item_search_history)
|
||||
.setCancelable(true)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
disposables.add(Observable
|
||||
.fromCallable(new Callable<Integer>() {
|
||||
@Override
|
||||
public Integer call() throws Exception {
|
||||
return searchHistoryDAO.deleteAllWhereQuery(item.query);
|
||||
}
|
||||
})
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Consumer<Integer>() {
|
||||
@Override
|
||||
public void accept(Integer howManyDeleted) throws Exception {
|
||||
suggestionPublisher.onNext(searchEditText.getText().toString());
|
||||
}
|
||||
}, new Consumer<Throwable>() {
|
||||
@Override
|
||||
public void accept(Throwable throwable) throws Exception {
|
||||
showSnackBarError(throwable, UserAction.SOMETHING_ELSE, "none", "Deleting item failed", R.string.general_error);
|
||||
}
|
||||
}));
|
||||
}
|
||||
}).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBackPressed() {
|
||||
if (suggestionsPanel.getVisibility() == View.VISIBLE && infoListAdapter.getItemsList().size() > 0 && !isLoading.get()) {
|
||||
hideSuggestionsPanel();
|
||||
hideKeyboardSearch();
|
||||
searchEditText.setText(lastSearchedQuery);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void giveSearchEditTextFocus() {
|
||||
showSoftKeyboard(searchEditText);
|
||||
showKeyboardSearch();
|
||||
}
|
||||
|
||||
private void initSuggestionObserver() {
|
||||
if (suggestionWorkerDisposable != null) suggestionWorkerDisposable.dispose();
|
||||
final Predicate<String> checkEnabledAndLength = new Predicate<String>() {
|
||||
@Override
|
||||
public boolean test(@io.reactivex.annotations.NonNull String s) throws Exception {
|
||||
boolean lengthCheck = s.length() >= THRESHOLD_SUGGESTION;
|
||||
// Clear the suggestions adapter if the length check fails
|
||||
if (!lengthCheck && !suggestionListAdapter.isEmpty()) {
|
||||
suggestionListAdapter.updateAdapter(new ArrayList<String>());
|
||||
}
|
||||
// Only pass through if suggestions is enabled and the query length is equal or greater than THRESHOLD_SUGGESTION
|
||||
return showSuggestions && lengthCheck;
|
||||
}
|
||||
};
|
||||
if (DEBUG) Log.d(TAG, "initSuggestionObserver() called");
|
||||
if (suggestionDisposable != null) suggestionDisposable.dispose();
|
||||
|
||||
suggestionWorkerDisposable = suggestionPublisher
|
||||
final Observable<String> observable = suggestionPublisher
|
||||
.debounce(SUGGESTIONS_DEBOUNCE, TimeUnit.MILLISECONDS)
|
||||
.startWith(!TextUtils.isEmpty(searchQuery) ? searchQuery : "")
|
||||
.filter(checkEnabledAndLength)
|
||||
.switchMap(new Function<String, Observable<Notification<List<String>>>>() {
|
||||
.startWith(searchQuery != null ? searchQuery : "")
|
||||
.filter(new Predicate<String>() {
|
||||
@Override
|
||||
public Observable<Notification<List<String>>> apply(@io.reactivex.annotations.NonNull String query) throws Exception {
|
||||
return ExtractorHelper.suggestionsFor(serviceId, query, searchLanguage).toObservable().materialize();
|
||||
public boolean test(@io.reactivex.annotations.NonNull String query) throws Exception {
|
||||
return isSuggestionsEnabled;
|
||||
}
|
||||
});
|
||||
|
||||
suggestionDisposable = observable
|
||||
.switchMap(new Function<String, ObservableSource<Notification<List<SuggestionItem>>>>() {
|
||||
@Override
|
||||
public ObservableSource<Notification<List<SuggestionItem>>> apply(@io.reactivex.annotations.NonNull final String query) throws Exception {
|
||||
final Flowable<List<SearchHistoryEntry>> flowable = query.length() > 0
|
||||
? searchHistoryDAO.getSimilarEntries(query, 3)
|
||||
: searchHistoryDAO.getUniqueEntries(25);
|
||||
final Observable<List<SuggestionItem>> local = flowable.toObservable()
|
||||
.map(new Function<List<SearchHistoryEntry>, List<SuggestionItem>>() {
|
||||
@Override
|
||||
public List<SuggestionItem> apply(@io.reactivex.annotations.NonNull List<SearchHistoryEntry> searchHistoryEntries) throws Exception {
|
||||
List<SuggestionItem> result = new ArrayList<>();
|
||||
for (SearchHistoryEntry entry : searchHistoryEntries)
|
||||
result.add(new SuggestionItem(true, entry.getSearch()));
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
if (query.length() < THRESHOLD_NETWORK_SUGGESTION) {
|
||||
// Only pass through if the query length is equal or greater than THRESHOLD_NETWORK_SUGGESTION
|
||||
return local.materialize();
|
||||
}
|
||||
|
||||
final Observable<List<SuggestionItem>> network = ExtractorHelper.suggestionsFor(serviceId, query, searchLanguage).toObservable()
|
||||
.map(new Function<List<String>, List<SuggestionItem>>() {
|
||||
@Override
|
||||
public List<SuggestionItem> apply(@io.reactivex.annotations.NonNull List<String> strings) throws Exception {
|
||||
List<SuggestionItem> result = new ArrayList<>();
|
||||
for (String entry : strings) result.add(new SuggestionItem(false, entry));
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
return Observable.zip(local, network, new BiFunction<List<SuggestionItem>, List<SuggestionItem>, List<SuggestionItem>>() {
|
||||
@Override
|
||||
public List<SuggestionItem> apply(@io.reactivex.annotations.NonNull List<SuggestionItem> localResult, @io.reactivex.annotations.NonNull List<SuggestionItem> networkResult) throws Exception {
|
||||
List<SuggestionItem> result = new ArrayList<>();
|
||||
if (localResult.size() > 0) result.addAll(localResult);
|
||||
|
||||
// Remove duplicates
|
||||
final Iterator<SuggestionItem> iterator = networkResult.iterator();
|
||||
while (iterator.hasNext() && localResult.size() > 0) {
|
||||
final SuggestionItem next = iterator.next();
|
||||
for (SuggestionItem item : localResult) {
|
||||
if (item.query.equals(next.query)) {
|
||||
iterator.remove();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (networkResult.size() > 0) result.addAll(networkResult);
|
||||
return result;
|
||||
}
|
||||
}).materialize();
|
||||
}
|
||||
})
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Consumer<Notification<List<String>>>() {
|
||||
.subscribe(new Consumer<Notification<List<SuggestionItem>>>() {
|
||||
@Override
|
||||
public void accept(@io.reactivex.annotations.NonNull Notification<List<String>> listNotification) throws Exception {
|
||||
public void accept(@io.reactivex.annotations.NonNull Notification<List<SuggestionItem>> listNotification) throws Exception {
|
||||
if (listNotification.isOnNext()) {
|
||||
handleSuggestions(listNotification.getValue());
|
||||
if (errorPanelRoot.getVisibility() == View.VISIBLE) {
|
||||
hideLoading();
|
||||
}
|
||||
} else if (listNotification.isOnError()) {
|
||||
Throwable error = listNotification.getError();
|
||||
if (!ExtractorHelper.isInterruptedCaused(error)) {
|
||||
if (!ExtractorHelper.hasAssignableCauseThrowable(error,
|
||||
IOException.class, SocketException.class, InterruptedException.class, InterruptedIOException.class)) {
|
||||
onSuggestionError(error);
|
||||
}
|
||||
}
|
||||
@ -520,6 +666,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
|
||||
private void search(final String query) {
|
||||
if (DEBUG) Log.d(TAG, "search() called with: query = [" + query + "]");
|
||||
if (query.isEmpty()) return;
|
||||
|
||||
try {
|
||||
final StreamingService service = NewPipe.getServiceByUrl(query);
|
||||
@ -544,7 +691,6 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
@Override
|
||||
public void accept(Throwable throwable) throws Exception {
|
||||
showError(getString(R.string.url_not_supported_toast), false);
|
||||
hideLoading();
|
||||
}
|
||||
}));
|
||||
return;
|
||||
@ -553,18 +699,18 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
// Exception occurred, it's not a url
|
||||
}
|
||||
|
||||
hideSoftKeyboard(searchEditText);
|
||||
this.searchQuery = query;
|
||||
this.currentPage = 0;
|
||||
lastSearchedQuery = query;
|
||||
searchQuery = query;
|
||||
currentPage = 0;
|
||||
infoListAdapter.clearStreamItemList();
|
||||
hideSuggestionsPanel();
|
||||
hideKeyboardSearch();
|
||||
|
||||
if (activity instanceof HistoryListener) {
|
||||
((HistoryListener) activity).onSearch(serviceId, query);
|
||||
suggestionPublisher.onNext(query);
|
||||
}
|
||||
|
||||
final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
final String searchLanguageKey = getContext().getString(R.string.search_language_key);
|
||||
searchLanguage = sharedPreferences.getString(searchLanguageKey, getContext().getString(R.string.default_language_value));
|
||||
startLoading(false);
|
||||
}
|
||||
|
||||
@ -624,7 +770,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
@Override
|
||||
protected void onItemSelected(InfoItem selectedItem) {
|
||||
super.onItemSelected(selectedItem);
|
||||
hideSoftKeyboard(searchEditText);
|
||||
hideKeyboardSearch();
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
@ -635,13 +781,10 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
this.filter = filter;
|
||||
this.filterItemCheckedId = item.getItemId();
|
||||
item.setChecked(true);
|
||||
if (searchQuery != null && !searchQuery.isEmpty()) search(searchQuery);
|
||||
}
|
||||
|
||||
private void submitQuery(String query) {
|
||||
if (DEBUG) Log.d(TAG, "submitQuery() called with: query = [" + query + "]");
|
||||
if (query.isEmpty()) return;
|
||||
search(query);
|
||||
if (!TextUtils.isEmpty(searchQuery)) {
|
||||
search(searchQuery);
|
||||
}
|
||||
}
|
||||
|
||||
private void setQuery(int serviceId, String searchQuery) {
|
||||
@ -649,19 +792,23 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
this.searchQuery = searchQuery;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showError(String message, boolean showRetryButton) {
|
||||
super.showError(message, showRetryButton);
|
||||
hideSoftKeyboard(searchEditText);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Suggestion Results
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
public void handleSuggestions(@NonNull List<String> suggestions) {
|
||||
public void handleSuggestions(@NonNull final List<SuggestionItem> suggestions) {
|
||||
if (DEBUG) Log.d(TAG, "handleSuggestions() called with: suggestions = [" + suggestions + "]");
|
||||
suggestionListAdapter.updateAdapter(suggestions);
|
||||
suggestionsRecyclerView.smoothScrollToPosition(0);
|
||||
suggestionsRecyclerView.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
suggestionListAdapter.setItems(suggestions);
|
||||
}
|
||||
});
|
||||
|
||||
if (errorPanelRoot.getVisibility() == View.VISIBLE) {
|
||||
hideLoading();
|
||||
}
|
||||
}
|
||||
|
||||
public void onSuggestionError(Throwable exception) {
|
||||
@ -682,6 +829,13 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
showListFooter(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showError(String message, boolean showRetryButton) {
|
||||
super.showError(message, showRetryButton);
|
||||
hideSuggestionsPanel();
|
||||
hideKeyboardSearch();
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Search Results
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
@ -692,6 +846,8 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
showSnackBarError(result.errors, UserAction.SEARCHED, NewPipe.getNameOfService(serviceId), searchQuery, 0);
|
||||
}
|
||||
|
||||
lastSearchedQuery = searchQuery;
|
||||
|
||||
if (infoListAdapter.getItemsList().size() == 0) {
|
||||
if (result.resultList.size() > 0) {
|
||||
infoListAdapter.addInfoItemList(result.resultList);
|
||||
|
@ -0,0 +1,16 @@
|
||||
package org.schabi.newpipe.fragments.list.search;
|
||||
|
||||
public class SuggestionItem {
|
||||
public final boolean fromHistory;
|
||||
public final String query;
|
||||
|
||||
public SuggestionItem(boolean fromHistory, String query) {
|
||||
this.fromHistory = fromHistory;
|
||||
this.query = query;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[" + fromHistory + "→" + query + "]";
|
||||
}
|
||||
}
|
@ -1,89 +1,108 @@
|
||||
package org.schabi.newpipe.fragments.list.search;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.database.MatrixCursor;
|
||||
import android.support.v4.widget.ResourceCursorAdapter;
|
||||
import android.content.res.TypedArray;
|
||||
import android.support.annotation.AttrRes;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/*
|
||||
* Created by Christian Schabesberger on 02.08.16.
|
||||
*
|
||||
* Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>
|
||||
* SuggestionListAdapter.java is part of NewPipe.
|
||||
*
|
||||
* NewPipe is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* NewPipe is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* {@link ResourceCursorAdapter} to display suggestions.
|
||||
*/
|
||||
public class SuggestionListAdapter extends ResourceCursorAdapter {
|
||||
|
||||
private static final String[] columns = new String[]{"_id", "title"};
|
||||
private static final int INDEX_ID = 0;
|
||||
private static final int INDEX_TITLE = 1;
|
||||
public class SuggestionListAdapter extends RecyclerView.Adapter<SuggestionListAdapter.SuggestionItemHolder> {
|
||||
private final ArrayList<SuggestionItem> items = new ArrayList<>();
|
||||
private final Context context;
|
||||
private OnSuggestionItemSelected listener;
|
||||
|
||||
public interface OnSuggestionItemSelected {
|
||||
void onSuggestionItemSelected(SuggestionItem item);
|
||||
void onSuggestionItemLongClick(SuggestionItem item);
|
||||
}
|
||||
|
||||
public SuggestionListAdapter(Context context) {
|
||||
super(context, android.R.layout.simple_list_item_1, null, 0);
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public void setItems(List<SuggestionItem> items) {
|
||||
this.items.clear();
|
||||
this.items.addAll(items);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setListener(OnSuggestionItemSelected listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(View view, Context context, Cursor cursor) {
|
||||
ViewHolder viewHolder = new ViewHolder(view);
|
||||
viewHolder.suggestionTitle.setText(cursor.getString(INDEX_TITLE));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the suggestion list
|
||||
* @param suggestions the list of suggestions
|
||||
*/
|
||||
public void updateAdapter(List<String> suggestions) {
|
||||
MatrixCursor cursor = new MatrixCursor(columns, suggestions.size());
|
||||
int i = 0;
|
||||
for (String suggestion : suggestions) {
|
||||
String[] columnValues = new String[columns.length];
|
||||
columnValues[INDEX_TITLE] = suggestion;
|
||||
columnValues[INDEX_ID] = Integer.toString(i);
|
||||
cursor.addRow(columnValues);
|
||||
i++;
|
||||
}
|
||||
changeCursor(cursor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the suggestion for a position
|
||||
* @param position the position of the suggestion
|
||||
* @return the suggestion
|
||||
*/
|
||||
public String getSuggestion(int position) {
|
||||
return ((Cursor) getItem(position)).getString(INDEX_TITLE);
|
||||
public SuggestionItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
return new SuggestionItemHolder(LayoutInflater.from(context).inflate(R.layout.item_search_suggestion, parent, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence convertToString(Cursor cursor) {
|
||||
return cursor.getString(INDEX_TITLE);
|
||||
public void onBindViewHolder(SuggestionItemHolder holder, int position) {
|
||||
final SuggestionItem currentItem = getItem(position);
|
||||
holder.updateFrom(currentItem);
|
||||
holder.itemView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (listener != null) listener.onSuggestionItemSelected(currentItem);
|
||||
}
|
||||
});
|
||||
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
|
||||
@Override
|
||||
public boolean onLongClick(View v) {
|
||||
if (listener != null) listener.onSuggestionItemLongClick(currentItem);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private class ViewHolder {
|
||||
private final TextView suggestionTitle;
|
||||
private ViewHolder(View view) {
|
||||
this.suggestionTitle = view.findViewById(android.R.id.text1);
|
||||
private SuggestionItem getItem(int position) {
|
||||
return items.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return items.size();
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return getItemCount() == 0;
|
||||
}
|
||||
|
||||
public static class SuggestionItemHolder extends RecyclerView.ViewHolder {
|
||||
private final TextView itemSuggestionQuery;
|
||||
private final ImageView suggestionIcon;
|
||||
|
||||
// Cache some ids, as they can potentially be constantly updated/recycled
|
||||
private final int historyResId;
|
||||
private final int searchResId;
|
||||
|
||||
private SuggestionItemHolder(View rootView) {
|
||||
super(rootView);
|
||||
suggestionIcon = rootView.findViewById(R.id.item_suggestion_icon);
|
||||
itemSuggestionQuery = rootView.findViewById(R.id.item_suggestion_query);
|
||||
|
||||
historyResId = resolveResourceIdFromAttr(rootView.getContext(), R.attr.history);
|
||||
searchResId = resolveResourceIdFromAttr(rootView.getContext(), R.attr.search);
|
||||
}
|
||||
|
||||
private void updateFrom(SuggestionItem item) {
|
||||
suggestionIcon.setImageResource(item.fromHistory ? historyResId : searchResId);
|
||||
itemSuggestionQuery.setText(item.query);
|
||||
}
|
||||
|
||||
private static int resolveResourceIdFromAttr(Context context, @AttrRes int attr) {
|
||||
TypedArray a = context.getTheme().obtainStyledAttributes(new int[]{attr});
|
||||
int attributeResourceId = a.getResourceId(0, 0);
|
||||
a.recycle();
|
||||
return attributeResourceId;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ public class AnimationUtils {
|
||||
private static final boolean DEBUG = MainActivity.DEBUG;
|
||||
|
||||
public enum Type {
|
||||
ALPHA, SCALE_AND_ALPHA, LIGHT_SCALE_AND_ALPHA
|
||||
ALPHA, SCALE_AND_ALPHA, LIGHT_SCALE_AND_ALPHA, SLIDE_AND_ALPHA, LIGHT_SLIDE_AND_ALPHA
|
||||
}
|
||||
|
||||
public static void animateView(View view, boolean enterOrExit, long duration) {
|
||||
@ -95,9 +95,16 @@ public class AnimationUtils {
|
||||
case LIGHT_SCALE_AND_ALPHA:
|
||||
animateLightScaleAndAlpha(view, enterOrExit, duration, delay, execOnEnd);
|
||||
break;
|
||||
case SLIDE_AND_ALPHA:
|
||||
animateSlideAndAlpha(view, enterOrExit, duration, delay, execOnEnd);
|
||||
break;
|
||||
case LIGHT_SLIDE_AND_ALPHA:
|
||||
animateLightSlideAndAlpha(view, enterOrExit, duration, delay, execOnEnd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Animate the background color of a view
|
||||
*/
|
||||
@ -237,4 +244,50 @@ public class AnimationUtils {
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
|
||||
private static void animateSlideAndAlpha(final View view, boolean enterOrExit, long duration, long delay, final Runnable execOnEnd) {
|
||||
if (enterOrExit) {
|
||||
view.setTranslationY(-view.getHeight());
|
||||
view.setAlpha(0f);
|
||||
view.animate().setInterpolator(new FastOutSlowInInterpolator()).alpha(1f).translationY(0)
|
||||
.setDuration(duration).setStartDelay(delay).setListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
if (execOnEnd != null) execOnEnd.run();
|
||||
}
|
||||
}).start();
|
||||
} else {
|
||||
view.animate().setInterpolator(new FastOutSlowInInterpolator()).alpha(0f).translationY(-view.getHeight())
|
||||
.setDuration(duration).setStartDelay(delay).setListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
view.setVisibility(View.GONE);
|
||||
if (execOnEnd != null) execOnEnd.run();
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
|
||||
private static void animateLightSlideAndAlpha(final View view, boolean enterOrExit, long duration, long delay, final Runnable execOnEnd) {
|
||||
if (enterOrExit) {
|
||||
view.setTranslationY(-view.getHeight() / 2);
|
||||
view.setAlpha(0f);
|
||||
view.animate().setInterpolator(new FastOutSlowInInterpolator()).alpha(1f).translationY(0)
|
||||
.setDuration(duration).setStartDelay(delay).setListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
if (execOnEnd != null) execOnEnd.run();
|
||||
}
|
||||
}).start();
|
||||
} else {
|
||||
view.animate().setInterpolator(new FastOutSlowInInterpolator()).alpha(0f).translationY(-view.getHeight() / 2)
|
||||
.setDuration(duration).setStartDelay(delay).setListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
view.setVisibility(View.GONE);
|
||||
if (execOnEnd != null) execOnEnd.run();
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,43 @@
|
||||
package org.schabi.newpipe.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.PointF;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.LinearSmoothScroller;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
|
||||
public class LayoutManagerSmoothScroller extends LinearLayoutManager {
|
||||
|
||||
public LayoutManagerSmoothScroller(Context context) {
|
||||
super(context, VERTICAL, false);
|
||||
}
|
||||
|
||||
public LayoutManagerSmoothScroller(Context context, int orientation, boolean reverseLayout) {
|
||||
super(context, orientation, reverseLayout);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
|
||||
RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext());
|
||||
smoothScroller.setTargetPosition(position);
|
||||
startSmoothScroll(smoothScroller);
|
||||
}
|
||||
|
||||
private class TopSnappedSmoothScroller extends LinearSmoothScroller {
|
||||
public TopSnappedSmoothScroller(Context context) {
|
||||
super(context);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public PointF computeScrollVectorForPosition(int targetPosition) {
|
||||
return LayoutManagerSmoothScroller.this
|
||||
.computeScrollVectorForPosition(targetPosition);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getVerticalSnapPreference() {
|
||||
return SNAP_TO_START;
|
||||
}
|
||||
}
|
||||
}
|
@ -101,6 +101,18 @@ public class DownloadManagerImpl implements DownloadManager {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort a list of mission by its timestamp. Oldest first
|
||||
* @param missions the missions to sort
|
||||
*/
|
||||
static void sortByTimestamp(List<DownloadMission> missions) {
|
||||
Collections.sort(missions, new Comparator<DownloadMission>() {
|
||||
@Override
|
||||
public int compare(DownloadMission o1, DownloadMission o2) {
|
||||
return Long.valueOf(o1.timestamp).compareTo(o2.timestamp);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads finished missions from the data source
|
||||
@ -111,12 +123,8 @@ public class DownloadManagerImpl implements DownloadManager {
|
||||
finishedMissions = new ArrayList<>();
|
||||
}
|
||||
// Ensure its sorted
|
||||
Collections.sort(finishedMissions, new Comparator<DownloadMission>() {
|
||||
@Override
|
||||
public int compare(DownloadMission o1, DownloadMission o2) {
|
||||
return (int) (o1.timestamp - o2.timestamp);
|
||||
}
|
||||
});
|
||||
sortByTimestamp(finishedMissions);
|
||||
|
||||
mMissions.ensureCapacity(mMissions.size() + finishedMissions.size());
|
||||
for (DownloadMission mission : finishedMissions) {
|
||||
File downloadedFile = mission.getDownloadedFile();
|
||||
|
@ -51,6 +51,25 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/suggestions_panel"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?android:attr/windowBackground"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
android:visibility="gone"
|
||||
tools:background="@android:color/transparent"
|
||||
tools:visibility="visible">
|
||||
|
||||
<android.support.v7.widget.RecyclerView
|
||||
android:id="@+id/suggestions_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scrollbars="vertical"
|
||||
tools:listitem="@layout/item_search_suggestion"/>
|
||||
</LinearLayout>
|
||||
|
||||
<!--ERROR PANEL-->
|
||||
<include
|
||||
android:id="@+id/error_panel"
|
||||
|
36
app/src/main/res/layout/item_search_suggestion.xml
Normal file
36
app/src/main/res/layout/item_search_suggestion.xml
Normal file
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:clickable="true"
|
||||
android:orientation="horizontal"
|
||||
android:paddingBottom="8dp"
|
||||
android:paddingTop="8dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/item_suggestion_icon"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
tools:ignore="ContentDescription,RtlHardcoded"
|
||||
tools:src="?attr/history"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/item_suggestion_query"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="2"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||
android:textSize="14sp"
|
||||
tools:ignore="RtlHardcoded"
|
||||
tools:text="Search query"/>
|
||||
</LinearLayout>
|
@ -4,16 +4,9 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="?attr/colorPrimary"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true">
|
||||
android:background="?attr/colorPrimary">
|
||||
|
||||
<View
|
||||
android:id="@+id/dropdown_anchor"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<AutoCompleteTextView
|
||||
<EditText
|
||||
android:id="@+id/toolbar_search_edit_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
@ -24,7 +17,6 @@
|
||||
android:background="?attr/colorPrimary"
|
||||
android:drawableLeft="?attr/search"
|
||||
android:drawablePadding="8dp"
|
||||
android:dropDownAnchor="@+id/dropdown_anchor"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
android:hint="@string/search"
|
||||
|
@ -17,23 +17,23 @@
|
||||
<string name="use_external_audio_player_title">Použít externí audio přehrávač</string>
|
||||
|
||||
<string name="download_path_audio_summary">Cesta, kam se uloží stažené audio</string>
|
||||
<string name="download_path_audio_dialog_title">Zadejte umístění pro stažené audio soubory.</string>
|
||||
<string name="download_path_audio_dialog_title">Zadejte umístění pro stažené audio soubory</string>
|
||||
|
||||
<string name="download_path_audio_title">Umístění pro stažené audio</string>
|
||||
<string name="default_resolution_title">Výchozí rozlišení</string>
|
||||
<string name="play_with_kodi_title">Přehrát pomocí Kodi</string>
|
||||
<string name="kore_not_found">Aplikace Kore nenalezena. Nainstalovat Kore?</string>
|
||||
<string name="kore_not_found">Aplikace Kore nenalezena. Chcete ji nainstalovat?</string>
|
||||
<string name="view_count_text">%1$s zhlédnutí</string>
|
||||
<string name="download_path_title">Umístění pro stažené video</string>
|
||||
<string name="download_path_summary">Cesta, kam se uloží stažené video.</string>
|
||||
<string name="download_path_summary">Cesta, kam se uloží stažené video</string>
|
||||
<string name="download_path_dialog_title">Zadejte umístění pro stažená videa</string>
|
||||
|
||||
<string name="show_play_with_kodi_title">Zobrazit možnost \"Přehrát pomocí Kodi\"</string>
|
||||
<string name="show_play_with_kodi_summary">Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi.</string>
|
||||
<string name="show_play_with_kodi_summary">Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi</string>
|
||||
<string name="play_audio">Audio</string>
|
||||
<string name="default_audio_format_title">Výchozí audio formát</string>
|
||||
<string name="webm_description">WebM — svobodný formát</string>
|
||||
<string name="m4a_description">m4a — lepší kvalita</string>
|
||||
<string name="m4a_description">M4A — lepší kvalita</string>
|
||||
<string name="theme_title">Téma</string>
|
||||
<string name="dark_theme_title">Tmavé</string>
|
||||
<string name="light_theme_title">Světlé</string>
|
||||
@ -51,10 +51,10 @@
|
||||
<string name="general_error">Chyba</string>
|
||||
<string name="network_error">Chyba sítě</string>
|
||||
<string name="could_not_load_thumbnails">Nebylo možné nahrát všechny náhledy</string>
|
||||
<string name="youtube_signature_decryption_error">Nebylo možné dekódovat URL videa.</string>
|
||||
<string name="parsing_error">Nebylo možné analyzovat webovou stránku.</string>
|
||||
<string name="content_not_available">Obsah není k dispozici.</string>
|
||||
<string name="blocked_by_gema">Obsah blokuje GEMA.</string>
|
||||
<string name="youtube_signature_decryption_error">Nebylo možné dekódovat URL videa</string>
|
||||
<string name="parsing_error">Nebylo možné analyzovat webovou stránku</string>
|
||||
<string name="content_not_available">Obsah není k dispozici</string>
|
||||
<string name="blocked_by_gema">Obsah blokuje GEMA</string>
|
||||
|
||||
<string name="list_thumbnail_view_description">Náhled videa</string>
|
||||
<string name="detail_thumbnail_view_description">Náhled videa</string>
|
||||
@ -66,16 +66,16 @@
|
||||
|
||||
<string name="err_dir_create">Nebylo možné vytvořit složku pro stažené soubory \'%1$s\'</string>
|
||||
<string name="info_dir_created">Vytvořena složka pro stažené soubory \'%1$s\'</string>
|
||||
<string name="autoplay_by_calling_app_title">Automaticky přehrávat při otevření z jiné aplikace</string>
|
||||
<string name="autoplay_by_calling_app_summary">Automaticky přehrát video, když je NewPipe otevřen z jiné aplikace.</string>
|
||||
<string name="autoplay_by_calling_app_title">Automaticky přehrávat</string>
|
||||
<string name="autoplay_by_calling_app_summary">Automaticky přehrát video, když je NewPipe otevřen z jiné aplikace</string>
|
||||
<string name="content">Obsah</string>
|
||||
<string name="show_age_restricted_content_title">Zobrazovat věkově omezený obsah</string>
|
||||
<string name="video_is_age_restricted">Toto video je věkově omezeno. Povolte věkově omezená videa v nastavení.</string>
|
||||
<string name="duration_live">živě</string>
|
||||
|
||||
<string name="light_parsing_error">Nebylo možné kompletně analyzovat stránku.</string>
|
||||
<string name="light_parsing_error">Nebylo možné kompletně analyzovat stránku</string>
|
||||
<string name="main_bg_subtitle">Pro začátek stiskni hledat</string>
|
||||
<string name="msg_copied">Zkopírováno do schránky.</string>
|
||||
<string name="msg_copied">Zkopírováno do schránky</string>
|
||||
<string name="msg_wait">Počkejte prosím…</string>
|
||||
<string name="msg_running">NewPipe se stahuje</string>
|
||||
<string name="msg_running_detail">Stiskněte pro detaily</string>
|
||||
@ -104,15 +104,15 @@
|
||||
<string name="could_not_load_image">Nepodařilo se nahrát obrázek</string>
|
||||
<string name="app_ui_crash">Aplikace/UI spadlo</string>
|
||||
<string name="live_streams_not_supported">Tento stream je vysílán živě, funkce ještě není podporována.</string>
|
||||
<string name="could_not_get_stream">Nepodařilo se dostat žádný stream.</string>
|
||||
<string name="could_not_setup_download_menu">Nepodařilo se nastavit menu stahování.</string>
|
||||
<string name="could_not_get_stream">Nepodařilo se dostat žádný stream</string>
|
||||
<string name="could_not_setup_download_menu">Nepodařilo se nastavit menu stahování</string>
|
||||
<string name="error_report_title">Nahlásit chybu</string>
|
||||
|
||||
<string name="downloads">Stažené soubory</string>
|
||||
<string name="downloads_title">Stažené soubory</string>
|
||||
<string name="what_device_headline">Info:</string>
|
||||
<string name="your_comment">Vaše poznámky (Anglicky):</string>
|
||||
<string name="storage_permission_denied">Oprávnění přístupu do Úložiště bylo zamítnuto</string>
|
||||
<string name="storage_permission_denied">Oprávnění přístupu do úložiště bylo zamítnuto</string>
|
||||
<string name="view">Shlédnout</string>
|
||||
<string name="add">Nová mise</string>
|
||||
<string name="finish">Hotovo</string>
|
||||
@ -123,9 +123,9 @@
|
||||
|
||||
<string name="black_theme_title">Černé</string>
|
||||
|
||||
<string name="checksum">Checksum</string>
|
||||
<string name="checksum">Kontrolní součet</string>
|
||||
|
||||
<string name="no_available_dir">Prosím vyberte dostupnou složku pro stažení souborů.</string>
|
||||
<string name="no_available_dir">Prosím vyberte dostupnou složku pro stažení souborů</string>
|
||||
|
||||
<string name="user_report">Hlášení uživatele</string>
|
||||
|
||||
@ -150,4 +150,111 @@ otevření ve vyskakovacím okně</string>
|
||||
<string name="default_video_format_title">Preferovaný video formát</string>
|
||||
<string name="popup_remember_size_pos_title">Zapamatovat si velikost a pozici vyskakovacího okna</string>
|
||||
<string name="popup_remember_size_pos_summary">Zapamatovat si poslední nastavení velikosti a pozice vyskakovacího okna</string>
|
||||
</resources>
|
||||
<string name="popup_mode_share_menu_title">Režim NewPipe vyskakovacího okna</string>
|
||||
<string name="subscribe_button_title">Odebírat</string>
|
||||
<string name="subscribed_button_title">Odebírané</string>
|
||||
<string name="channel_unsubscribed">Odběr zrušen</string>
|
||||
<string name="subscription_change_failed">Nelze změnit odběr</string>
|
||||
<string name="subscription_update_failed">Nelze aktualizovat odběr</string>
|
||||
|
||||
<string name="tab_main">Hlavní</string>
|
||||
<string name="tab_subscriptions">Odběry</string>
|
||||
|
||||
<string name="fragment_whats_new">Co je nové</string>
|
||||
|
||||
<string name="controls_background_title">V pozadí</string>
|
||||
<string name="controls_popup_title">V okně</string>
|
||||
|
||||
<string name="default_popup_resolution_title">Výchozí rozlišení v okně</string>
|
||||
<string name="player_gesture_controls_title">Nastavení gest přehrávače</string>
|
||||
<string name="player_gesture_controls_summary">Používat gesta pro kontrolu jasu a hlasitosti přehrávače</string>
|
||||
<string name="show_search_suggestions_title">Vyhledat návrhy</string>
|
||||
<string name="show_search_suggestions_summary">Ukazovat návrhy při vyhledávání</string>
|
||||
<string name="enable_search_history_title">Historie prohlížení</string>
|
||||
<string name="enable_search_history_summary">Ukládat hledané výrazy lokálně</string>
|
||||
<string name="enable_watch_history_title">Historie</string>
|
||||
<string name="enable_watch_history_summary">Evidovat sledovaná videa</string>
|
||||
<string name="resume_on_audio_focus_gain_title">Přehrávat po přechodu do popředí</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">Pokračovat v přehrávání po přerušení (např. hovor)</string>
|
||||
<string name="settings_category_player_title">Přehrávač</string>
|
||||
<string name="settings_category_player_behavior_title">Chování</string>
|
||||
<string name="settings_category_history_title">Historie</string>
|
||||
<string name="settings_category_popup_title">V okně</string>
|
||||
<string name="popup_playing_toast">Přehrávání v okně</string>
|
||||
<string name="playlist">Playlist</string>
|
||||
<string name="disabled">Vypnuto</string>
|
||||
<string name="filter">Filtr</string>
|
||||
<string name="refresh">Obnovit</string>
|
||||
<string name="clear">Vyčistit</string>
|
||||
<string name="popup_resizing_indicator_title">Změna velikosti</string>
|
||||
<string name="best_resolution">Nejlepší rozlošení</string>
|
||||
<string name="undo">Vrátit</string>
|
||||
|
||||
<string name="notification_channel_name">NewPipe notifikace</string>
|
||||
<string name="notification_channel_description">Notifikace pro NewPipe v pozadí a v okně</string>
|
||||
|
||||
<string name="search_no_results">Žádné výsledky</string>
|
||||
<string name="empty_subscription_feed_subtitle">Je tu sranda jak v márnici</string>
|
||||
|
||||
<string name="use_old_player_summary">Starý zabudovaný Mediaframework přehrávač</string>
|
||||
|
||||
<string name="short_billion">B</string>
|
||||
|
||||
<string name="no_subscribers">Žádní odběratelé</string>
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s odběratel</item>
|
||||
<item quantity="few">%s odběratelů</item>
|
||||
<item quantity="many">%s odběratelé</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Žádná shlédnutí</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s shlédnutí</item>
|
||||
<item quantity="few">%s shlédnutí</item>
|
||||
<item quantity="many">%s shlédnutí</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Žádná videa</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s video</item>
|
||||
<item quantity="few">%s videí</item>
|
||||
<item quantity="many">%s videa</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<string name="settings_category_downloads_title">Stahování</string>
|
||||
<string name="settings_file_charset_title">Povolené znaky v názvech souborů</string>
|
||||
<string name="settings_file_replacement_character_summary">Neplatné znaky jdou nahrazeny těmito znaky</string>
|
||||
<string name="settings_file_replacement_character_title">Náhradní znak</string>
|
||||
|
||||
<string name="charset_letters_and_digits">Písmena a číslice</string>
|
||||
<string name="charset_most_special_characters">Většina speciálních znaků</string>
|
||||
|
||||
<string name="title_activity_about">O NewPipe</string>
|
||||
<string name="action_settings">Nastavení</string>
|
||||
<string name="action_about">O</string>
|
||||
<string name="title_licenses">Licence třetích stran</string>
|
||||
<string name="copyright" formatted="true">© %1$s od %2$s pod %3$s</string>
|
||||
<string name="error_unable_to_load_license">Nemožné nahrát licenci</string>
|
||||
<string name="action_open_website">Otevřít webstránku</string>
|
||||
<string name="tab_about">O</string>
|
||||
<string name="tab_contributors">Přispěvatelé</string>
|
||||
<string name="tab_licenses">Licence</string>
|
||||
<string name="app_description">Bezplatná a nenáročná YouTube aplikace pro Android.</string>
|
||||
<string name="view_on_github">Zobraz na GitHubu</string>
|
||||
<string name="app_license_title">Licence NewPipe</string>
|
||||
<string name="contribution_encouragement">Pokud máte nápady na zlepšení jako; překlad, změny designu, vylepšování kódu nebo opravdu velké změny kódu - pomoc je vždy vítána. Čím více se udělá, tím lepší to bude!</string>
|
||||
<string name="read_full_license">Přečíst licenci</string>
|
||||
<string name="contribution_title">Příspěvek</string>
|
||||
|
||||
<string name="title_activity_history">Histrorie</string>
|
||||
<string name="title_history_search">Vyhledáváno</string>
|
||||
<string name="title_history_view">Sledováno</string>
|
||||
<string name="history_disabled">Historie je vypnutá</string>
|
||||
<string name="action_history">Historie</string>
|
||||
<string name="history_empty">Historie je prázdná</string>
|
||||
<string name="history_cleared">Historie byla vymazána</string>
|
||||
<string name="item_deleted">Položka byla odstraněna</string>
|
||||
</resources>
|
||||
|
@ -119,7 +119,7 @@
|
||||
|
||||
<string name="start">Starten</string>
|
||||
<string name="pause">Pause</string>
|
||||
<string name="view">Ansehen</string>
|
||||
<string name="view">Abspielen</string>
|
||||
<string name="add">Neue Mission</string>
|
||||
<string name="finish">OK</string>
|
||||
<string name="msg_server_unsupported">Server nicht unterstützt</string>
|
||||
@ -254,4 +254,9 @@
|
||||
<string name="charset_most_special_characters">Die meisten Sonderzeichen</string>
|
||||
|
||||
<string name="item_deleted">Element gelöscht</string>
|
||||
<string name="resume_on_audio_focus_gain_title">Fortsetzen bei erneutem Fokussieren</string>
|
||||
<string name="settings_category_player_title">Player</string>
|
||||
<string name="empty_subscription_feed_subtitle">Nichts hier außer Grillen</string>
|
||||
|
||||
<string name="delete_item_search_history">Möchten Sie dieses Element aus dem Suchverlauf löschen?</string>
|
||||
</resources>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="view_count_text">%1$s visualizaciones</string>
|
||||
<string name="upload_date_text">Publicado en %1$s</string>
|
||||
<string name="upload_date_text">Publicado el %1$s</string>
|
||||
<string name="no_player_found">No se encontró ningún reproductor de vídeo. ¿Desea instalar VLC?</string>
|
||||
<string name="install">Instalar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
@ -12,7 +12,7 @@
|
||||
<string name="settings">Ajustes</string>
|
||||
<string name="did_you_mean">¿Quiso decir: %1$s?</string>
|
||||
<string name="share_dialog_title">Compartir con</string>
|
||||
<string name="choose_browser">Seleccionar navegador</string>
|
||||
<string name="choose_browser">Elegir navegador</string>
|
||||
<string name="screen_rotation">rotación</string>
|
||||
<string name="download_path_title">Ruta de descarga de vídeo</string>
|
||||
<string name="download_path_summary">Ruta para almacenar los vídeos descargados</string>
|
||||
@ -72,7 +72,7 @@
|
||||
<string name="show_age_restricted_content_title">Mostrar contenido restringido por edad</string>
|
||||
<string name="video_is_age_restricted">Vídeo restringido por edad. Permitir este tipo de material es posible desde Ajustes.</string>
|
||||
|
||||
<string name="main_bg_subtitle">Toque buscar para empezar</string>
|
||||
<string name="main_bg_subtitle">Toque en buscar para empezar</string>
|
||||
<string name="autoplay_by_calling_app_title">Autoreproducir</string>
|
||||
<string name="autoplay_by_calling_app_summary">Reproducir automáticamente un vídeo cuando NewPipe es llamado desde otra aplicación</string>
|
||||
<string name="duration_live">en vivo</string>
|
||||
@ -170,7 +170,7 @@ abrir en modo popup</string>
|
||||
<string name="settings_category_popup_title">Popup</string>
|
||||
<string name="popup_resizing_indicator_title">Redimensionando</string>
|
||||
|
||||
<string name="use_external_video_player_summary">Algunas resoluciones podrían no tener audio cuando esta opción está activada</string>
|
||||
<string name="use_external_video_player_summary">Algunas resoluciones podrían NO tener audio cuando esta opción está activada</string>
|
||||
<string name="player_gesture_controls_title">Controles de gestos del reproductor</string>
|
||||
<string name="player_gesture_controls_summary">Usar gestos para controlar el brillo y volumen del reproductor</string>
|
||||
<string name="show_search_suggestions_title">Sugerencias de búsqueda</string>
|
||||
@ -238,7 +238,7 @@ abrir en modo popup</string>
|
||||
<string name="undo">Deshacer</string>
|
||||
|
||||
<string name="search_no_results">No hay resultados</string>
|
||||
<string name="empty_subscription_feed_subtitle">Nada aquí, pero grillos</string>
|
||||
<string name="empty_subscription_feed_subtitle">Nada más que grillos</string>
|
||||
|
||||
<string name="no_subscribers">Sin suscriptores</string>
|
||||
<plurals name="subscribers">
|
||||
@ -259,4 +259,5 @@ abrir en modo popup</string>
|
||||
</plurals>
|
||||
|
||||
<string name="item_deleted">Elemento eliminado</string>
|
||||
<string name="delete_item_search_history">¿Desea eliminar este elemento del historial de búsqueda?</string>
|
||||
</resources>
|
||||
|
@ -18,7 +18,7 @@
|
||||
<string name="settings">Paramètres</string>
|
||||
<string name="share">Partager</string>
|
||||
<string name="share_dialog_title">Partager avec</string>
|
||||
<string name="show_play_with_kodi_summary">Afficher une option pour lire la vidéo via la médiathèque Kodi</string>
|
||||
<string name="show_play_with_kodi_summary">Afficher une option pour lire la vidéo via Kodi</string>
|
||||
<string name="show_play_with_kodi_title">Afficher l’option « Lire avec Kodi »</string>
|
||||
<string name="upload_date_text">Ajoutée le %1$s</string>
|
||||
<string name="view_count_text">%1$s vues</string>
|
||||
@ -133,34 +133,33 @@
|
||||
<string name="reCaptcha_title">Test reCAPTCHA</string>
|
||||
<string name="recaptcha_request_toast">Test reCAPTCHA demandé</string>
|
||||
|
||||
<string name="open_in_popup_mode">Ouvrir dans une fenêtre popup</string>
|
||||
<string name="popup_mode_share_menu_title">Mode popup de NewPipe</string>
|
||||
<string name="open_in_popup_mode">Ouvrir dans une fenêtre flottante</string>
|
||||
<string name="popup_mode_share_menu_title">Mode flottant de NewPipe</string>
|
||||
|
||||
<string name="popup_playing_toast">Lecture en mode popup</string>
|
||||
<string name="popup_playing_toast">Lire dans le lecteur flottant</string>
|
||||
<string name="yes">Oui</string>
|
||||
<string name="later">Plus tard</string>
|
||||
<string name="disabled">Désactivé</string>
|
||||
|
||||
<string name="info_labels">Quoi :\\nRequête :\\nLang. du contenu:\\nService :\\nHeure GMT :\\nPaquage :\\nVersion :\\nVersion de l\'OS:\\nGamme globale d\'IPs :</string>
|
||||
<string name="info_labels">Quoi :\\nRequête :\\nLangue du contenu :\\nService :\\nHeure GMT :\\nPaquet :\\nVersion :\\nVersion du système :\\nGlob. Plage IP :</string>
|
||||
<string name="use_old_player_title">Utiliser l\'ancien lecteur</string>
|
||||
<string name="use_old_player_summary">Ancienne version du lecteur Mediaframework</string>
|
||||
<string name="short_thousand">K</string>
|
||||
<string name="short_million">M</string>
|
||||
|
||||
<string name="msg_popup_permission">Cette permission est nécessaire
|
||||
pour ouvrir en mode popup</string>
|
||||
<string name="msg_popup_permission">Cette permission est nécessaire pour ouvrir en mode flottant</string>
|
||||
|
||||
<string name="controls_background_title">Arrière-plan</string>
|
||||
<string name="controls_popup_title">Lecture intégrée</string>
|
||||
<string name="controls_popup_title">Lecture flottante</string>
|
||||
|
||||
<string name="default_popup_resolution_title">Résolution de la lecture intégrée</string>
|
||||
<string name="default_popup_resolution_title">Résolution de la lecture flottante</string>
|
||||
<string name="show_higher_resolutions_title">Afficher des résolutions plus grandes</string>
|
||||
<string name="show_higher_resolutions_summary">Seulement certains périphériques supportent la lecture 2K/4K</string>
|
||||
<string name="default_video_format_title">Format vidéo par défaut</string>
|
||||
<string name="popup_remember_size_pos_title">Mémoriser la taille et la position du lecteur intégré</string>
|
||||
<string name="popup_remember_size_pos_summary">Mémoriser les derniers emplacements et la taille du lecteur intégré</string>
|
||||
<string name="popup_remember_size_pos_title">Mémoriser la taille et la position du lecteur flottant</string>
|
||||
<string name="popup_remember_size_pos_summary">Mémoriser les derniers emplacements et la taille du lecteur flottant</string>
|
||||
|
||||
<string name="settings_category_popup_title">Lecteur intégré</string>
|
||||
<string name="settings_category_popup_title">Lecteur flottant</string>
|
||||
<string name="filter">Filtre</string>
|
||||
<string name="refresh">Actualiser</string>
|
||||
<string name="clear">Effacer</string>
|
||||
@ -178,7 +177,7 @@ pour ouvrir en mode popup</string>
|
||||
|
||||
<string name="subscribe_button_title">S\'abonner</string>
|
||||
<string name="subscribed_button_title">Abonné</string>
|
||||
<string name="channel_unsubscribed">Désabonné de la chaîne</string>
|
||||
<string name="channel_unsubscribed">Désabonner de la chaîne</string>
|
||||
<string name="tab_main">Principal</string>
|
||||
<string name="tab_subscriptions">Abonnements</string>
|
||||
|
||||
@ -189,7 +188,7 @@ pour ouvrir en mode popup</string>
|
||||
<string name="action_about">À propos</string>
|
||||
<string name="title_licenses">Licences tierces</string>
|
||||
<string name="error_unable_to_load_license">Impossible de charger la licence</string>
|
||||
<string name="action_open_website">Ouvrir le site web</string>
|
||||
<string name="action_open_website">Ouvrir le site</string>
|
||||
<string name="tab_about">À propos</string>
|
||||
<string name="tab_contributors">Contributeurs</string>
|
||||
<string name="tab_licenses">Licences</string>
|
||||
@ -231,7 +230,7 @@ pour ouvrir en mode popup</string>
|
||||
<string name="settings_category_player_behavior_title">Comportement</string>
|
||||
<string name="settings_category_history_title">Historique</string>
|
||||
<string name="playlist">Liste de lecture</string>
|
||||
<string name="notification_channel_description">Notifications pour les lecteurs Background et Popup de NewPipe</string>
|
||||
<string name="notification_channel_description">Notifications pour les lecteurs arrière-plan et flottant de NewPipe</string>
|
||||
|
||||
<string name="search_no_results">Aucun résultat</string>
|
||||
<string name="empty_subscription_feed_subtitle">Rien ici à part des grillons</string>
|
||||
@ -257,4 +256,5 @@ pour ouvrir en mode popup</string>
|
||||
<string name="charset_most_special_characters">Caractères spéciaux</string>
|
||||
|
||||
<string name="item_deleted">Objet effacé</string>
|
||||
<string name="delete_item_search_history">Voulez-vous supprimer cet élément de l\'historique de recherche ?</string>
|
||||
</resources>
|
||||
|
@ -1,23 +1,23 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources><string name="main_bg_subtitle">Dodirni pretragu za početak</string>
|
||||
<resources><string name="main_bg_subtitle">Dodirnite pretragu za početak</string>
|
||||
<string name="view_count_text">%1$s pregleda</string>
|
||||
<string name="upload_date_text">Objavljeno %1$s</string>
|
||||
<string name="no_player_found">Svirač za stream nije pronađen. Želite li instalirati VLC?</string>
|
||||
<string name="no_player_found">Reproduktor za stream nije pronađen. Želite li instalirati VLC?</string>
|
||||
<string name="install">Instaliraj</string>
|
||||
<string name="cancel">Poništi</string>
|
||||
<string name="open_in_browser">Otvori u pregledniku</string>
|
||||
<string name="open_in_popup_mode">Otvori skočni prozor</string>
|
||||
<string name="share">Podijeli</string>
|
||||
<string name="download">Preuzimanje</string>
|
||||
<string name="search">Traži</string>
|
||||
<string name="search">Pretraživanje</string>
|
||||
<string name="settings">Postavke</string>
|
||||
<string name="did_you_mean">Jeste li mislili: %1$s ?</string>
|
||||
<string name="share_dialog_title">Podijeli putem</string>
|
||||
<string name="choose_browser">Izaberi pretraživač</string>
|
||||
<string name="screen_rotation">rotacija</string>
|
||||
<string name="use_external_video_player_title">Koristi vanjski svirač videa</string>
|
||||
<string name="use_external_video_player_summary">Nele rezolucije NEĆE imati zvuk kad je ova opcija uključena</string>
|
||||
<string name="use_external_audio_player_title">Koristi vanjski svirač glazbe</string>
|
||||
<string name="use_external_video_player_title">Koristi vanjski reproduktor videozapisa</string>
|
||||
<string name="use_external_video_player_summary">Neke razlučivosti NEĆE imati zvuk kad je ova opcija omogućena</string>
|
||||
<string name="use_external_audio_player_title">Koristi vanjski reproduktor za zvuk</string>
|
||||
<string name="popup_mode_share_menu_title">NewPipe skočni prozor</string>
|
||||
<string name="subscribe_button_title">Pretplati se</string>
|
||||
<string name="subscribed_button_title">Pretplaćeno</string>
|
||||
@ -25,7 +25,7 @@
|
||||
<string name="subscription_change_failed">Nije moguće promijeniti pretplatu</string>
|
||||
<string name="subscription_update_failed">Nije moguće osvježiti pretplatu</string>
|
||||
|
||||
<string name="tab_main">Glavno</string>
|
||||
<string name="tab_main">Početna</string>
|
||||
<string name="tab_subscriptions">Pretplate</string>
|
||||
|
||||
<string name="fragment_whats_new">Što je novo</string>
|
||||
@ -33,63 +33,63 @@
|
||||
<string name="controls_background_title">Pozadina</string>
|
||||
<string name="controls_popup_title">Skočni prozor</string>
|
||||
|
||||
<string name="download_path_title">Putanja za preuzimanje videa</string>
|
||||
<string name="download_path_summary">Putanja za spremanje videa</string>
|
||||
<string name="download_path_dialog_title">Unesi putanju za preuzimanje videa</string>
|
||||
<string name="download_path_title">Put za preuzimanje videozapisa</string>
|
||||
<string name="download_path_summary">Put za spremanje videozapisa u</string>
|
||||
<string name="download_path_dialog_title">Unesi put za preuzimanje videozapisa</string>
|
||||
|
||||
<string name="download_path_audio_title">Putanja za preuzimanje zvuka</string>
|
||||
<string name="download_path_audio_summary">Putanja za spremanje zvuka</string>
|
||||
<string name="download_path_audio_dialog_title">Unesi download putanju za audio datoteke</string>
|
||||
<string name="download_path_audio_title">Put za preuzimanje zvuka</string>
|
||||
<string name="download_path_audio_summary">Put za spremanje preuzetog zvuka u</string>
|
||||
<string name="download_path_audio_dialog_title">Unesi put za preuzimanje zvučne datoteke</string>
|
||||
|
||||
<string name="autoplay_by_calling_app_title">Automatski reproduciraj kada je NewPipe otvoren iz druge aplikacije</string>
|
||||
<string name="autoplay_by_calling_app_summary">Automatski reproduciraj video kad je NewPipe otvoren iz druge aplikacije</string>
|
||||
<string name="default_resolution_title">Zadana rezolucija</string>
|
||||
<string name="default_popup_resolution_title">Zadana rezolucija skočnog prozora</string>
|
||||
<string name="show_higher_resolutions_title">Prikaži veće rezolucije</string>
|
||||
<string name="show_higher_resolutions_summary">Samo neki uređaji podržavaju reprodukciju 2K/4K videa</string>
|
||||
<string name="autoplay_by_calling_app_title">Automatski reprod. kada je NewPipe pozvan iz druge aplikacije</string>
|
||||
<string name="autoplay_by_calling_app_summary">Automatski reproduciraj videozapis kad je NewPipe pozvan iz druge aplikacije</string>
|
||||
<string name="default_resolution_title">Zadana razlučivost</string>
|
||||
<string name="default_popup_resolution_title">Zadana razlučivost skočnog prozora</string>
|
||||
<string name="show_higher_resolutions_title">Prikaži veće razlučivosti</string>
|
||||
<string name="show_higher_resolutions_summary">Samo neki uređaji podržavaju reprodukciju 2K/4K videozapisa</string>
|
||||
<string name="play_with_kodi_title">Reproduciraj sa Kodijem</string>
|
||||
<string name="kore_not_found">Kore aplikacija nije pronađena. Instaliraj Kore?</string>
|
||||
<string name="kore_not_found">Kore aplikacija nije pronađena. Želite li ju instalirati?</string>
|
||||
<string name="show_play_with_kodi_title">Prikaži \"Reproduciraj putem Kodija\" opciju</string>
|
||||
<string name="show_play_with_kodi_summary">Prikaži opciju za reproduciranje videa putem Kodija</string>
|
||||
<string name="play_audio">Audio</string>
|
||||
<string name="default_audio_format_title">Zadani audio format</string>
|
||||
<string name="default_video_format_title">Preferirani video format</string>
|
||||
<string name="show_play_with_kodi_summary">Prikaži opciju za reproduciranje videozapisa putem Kodija</string>
|
||||
<string name="play_audio">Zvuk</string>
|
||||
<string name="default_audio_format_title">Zadani format zvuka</string>
|
||||
<string name="default_video_format_title">Zadani format videozapisa</string>
|
||||
<string name="webm_description">WebM - slobodni format</string>
|
||||
<string name="m4a_description">m4a - bolja kvaliteta</string>
|
||||
<string name="m4a_description">M4A - bolja kvaliteta</string>
|
||||
<string name="theme_title">Tema</string>
|
||||
<string name="light_theme_title">Svijetla</string>
|
||||
<string name="dark_theme_title">Tamna</string>
|
||||
<string name="black_theme_title">Crno</string>
|
||||
<string name="popup_remember_size_pos_title">Zapamti veličinu i poziciju skočnog prozora</string>
|
||||
<string name="popup_remember_size_pos_summary">Zapamti posljednju veličinu i poziciju postavljenu skočnom prozoru</string>
|
||||
<string name="player_gesture_controls_title">Playerovo kontroliranje gestama</string>
|
||||
<string name="player_gesture_controls_summary">Koristi geste za kontrolu svjetline i glasnoće playera</string>
|
||||
<string name="popup_remember_size_pos_summary">Zapamti posljednju veličinu i poziciju skočnog prozora</string>
|
||||
<string name="player_gesture_controls_title">Kontroliranje reproduktora gestama</string>
|
||||
<string name="player_gesture_controls_summary">Koristi geste za kontrolu svjetline i glasnoće reproduktora</string>
|
||||
<string name="show_search_suggestions_title">Sugestije pri traženju</string>
|
||||
<string name="show_search_suggestions_summary">Prikaži sugestije pri traženju</string>
|
||||
<string name="show_search_suggestions_summary">Prikaži prijedloge pri traženju</string>
|
||||
<string name="enable_search_history_title">Povijest pretraživanja</string>
|
||||
<string name="enable_search_history_summary">Spremi svaku pretragu lokalno</string>
|
||||
<string name="enable_watch_history_title">Povijest gledanja</string>
|
||||
<string name="enable_watch_history_summary">Spremaj povijest gledanja</string>
|
||||
<string name="enable_search_history_summary">Svaku pretragu spremi lokalno</string>
|
||||
<string name="enable_watch_history_title">Povijest</string>
|
||||
<string name="enable_watch_history_summary">Pratite pogledane videozapise</string>
|
||||
<string name="resume_on_audio_focus_gain_title">Nastavi nakon dobivanja fokusa</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi)</string>
|
||||
|
||||
|
||||
<string name="download_dialog_title">Preuzmi</string>
|
||||
|
||||
<string name="next_video_title">Sljedeći video</string>
|
||||
<string name="show_next_and_similar_title">Prikaži sljedeći i slične videe</string>
|
||||
<string name="next_video_title">Sljedeći videozapis</string>
|
||||
<string name="show_next_and_similar_title">Prikaži sljedeće i slične videozapise</string>
|
||||
<string name="url_not_supported_toast">URL nije podržan</string>
|
||||
<string name="search_language_title">Preferirani jezik sadržaja</string>
|
||||
<string name="settings_category_video_audio_title">Video i audio</string>
|
||||
<string name="search_language_title">Zadani jezik sadržaja</string>
|
||||
<string name="settings_category_video_audio_title">Video i zvuk</string>
|
||||
<string name="settings_category_popup_title">Skočni prozor</string>
|
||||
<string name="settings_category_appearance_title">Izgled</string>
|
||||
<string name="settings_category_other_title">Drugo</string>
|
||||
<string name="background_player_playing_toast">Sviraj u pozadini</string>
|
||||
<string name="background_player_playing_toast">Reprodukcija u pozadini</string>
|
||||
<string name="popup_playing_toast">Reproduciram u skočnom prozoru</string>
|
||||
<string name="play_btn_text">Reproduciraj</string>
|
||||
<string name="content">Sadržaj</string>
|
||||
<string name="show_age_restricted_content_title">Prikaži eksplicitni sadržaj</string>
|
||||
<string name="video_is_age_restricted">Video je dobno ograničen. Prije uključi eksplicitni sadržaj u postavkama.</string>
|
||||
<string name="video_is_age_restricted">Videozapis je dobno ograničen. Dopuštanje takvog sadržaja moguće je u postavkama.</string>
|
||||
<string name="duration_live">uživo</string>
|
||||
<string name="downloads">Preuzimanja</string>
|
||||
<string name="downloads_title">Preuzimanja</string>
|
||||
@ -103,23 +103,23 @@
|
||||
<string name="refresh">Osvježi</string>
|
||||
<string name="clear">Očisti</string>
|
||||
<string name="popup_resizing_indicator_title">Mijenjanje veličine</string>
|
||||
<string name="best_resolution">Najbolja rezolucija</string>
|
||||
<string name="best_resolution">Najbolja razlučivost</string>
|
||||
|
||||
<string name="general_error">Greška</string>
|
||||
<string name="network_error">Greška u mreži</string>
|
||||
<string name="could_not_load_thumbnails">Nije moguće učitati sve ikone</string>
|
||||
<string name="youtube_signature_decryption_error">Nije moguće dekriptirati URL potpis videa.</string>
|
||||
<string name="parsing_error">Nije moguće dohvatiti stranicu.</string>
|
||||
<string name="light_parsing_error">Nije moguće dohvatiti stranicu u potpunosti.</string>
|
||||
<string name="content_not_available">Sadržaj nije dostupan.</string>
|
||||
<string name="blocked_by_gema">Blokirano od GEMA-e.</string>
|
||||
<string name="could_not_setup_download_menu">Nije moguće postaviti download menu.</string>
|
||||
<string name="live_streams_not_supported">Ovo je PRIJENOS UŽIVO. Oni nisu još podržani.</string>
|
||||
<string name="could_not_get_stream">Nije moguće dobaviti stream.</string>
|
||||
<string name="youtube_signature_decryption_error">Nije moguće dešifrirati URL potpis videozapisa</string>
|
||||
<string name="parsing_error">Nije moguće dohvatiti stranicu</string>
|
||||
<string name="light_parsing_error">Nije moguće u potpunosti dohvatiti stranicu</string>
|
||||
<string name="content_not_available">Sadržaj nije dostupan</string>
|
||||
<string name="blocked_by_gema">Blokirano od GEMA-e</string>
|
||||
<string name="could_not_setup_download_menu">Nije moguće postaviti izbornik za preuzimanje</string>
|
||||
<string name="live_streams_not_supported">Ovo je PRIJENOS UŽIVO, koji još nije podržan.</string>
|
||||
<string name="could_not_get_stream">Nije moguće dobaviti stream</string>
|
||||
<string name="could_not_load_image">Nije moguće učitati sliku</string>
|
||||
<string name="app_ui_crash">Aplikacija/UI se srušio</string>
|
||||
<string name="sorry_string">Oprostitee, ovo se nije trebalo dogoditi.</string>
|
||||
<string name="error_report_button_text">Prijavi grešku putem e-maila</string>
|
||||
<string name="error_report_button_text">Prijavi pogrešku putem e-maila</string>
|
||||
<string name="error_snackbar_message">Oprostite, neke greške su se dogodile.</string>
|
||||
<string name="error_snackbar_action">PRIJAVI</string>
|
||||
<string name="what_device_headline">Informacije:</string>
|
||||
@ -129,25 +129,25 @@
|
||||
<string name="error_details_headline">Detalji:</string>
|
||||
|
||||
|
||||
<string name="list_thumbnail_view_description">Ikona za pregled videa</string>
|
||||
<string name="detail_thumbnail_view_description">Ikona za pregled videa</string>
|
||||
<string name="detail_uploader_thumbnail_view_description">Profilna slika uploadera</string>
|
||||
<string name="list_thumbnail_view_description">Sličica pregleda videozapisa</string>
|
||||
<string name="detail_thumbnail_view_description">Sličica pregleda videozapisa</string>
|
||||
<string name="detail_uploader_thumbnail_view_description">Profilna slika prenositelja</string>
|
||||
<string name="detail_likes_img_view_description">Goreglasovi</string>
|
||||
<string name="detail_dislikes_img_view_description">Doljeglasovi</string>
|
||||
<string name="use_tor_title">Koristi Tor</string>
|
||||
<string name="use_tor_summary">(Eksperimentalno) Forsiraj promet preuzimanja kroz Tor radi povećane privatnosti (streamanje videa nije još podržano).</string>
|
||||
<string name="use_tor_summary">(Eksperimentalno) Prisili promet preuzimanja kroz Tor radi povećane privatnosti (streamanje videozapisa još nije podržano).</string>
|
||||
<string name="report_error">Prijavi grešku</string>
|
||||
<string name="user_report">Korisničke prijave</string>
|
||||
|
||||
<string name="err_dir_create">Nije moguće napraviti direktorij za preuzimanje \'%1$s\'</string>
|
||||
<string name="info_dir_created">Napravljen direktorij za preuzimanje \'%1$s\'</string>
|
||||
|
||||
<string name="video">Video</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="video">Videozapis</string>
|
||||
<string name="audio">Zvuk</string>
|
||||
<string name="retry">Ponovno pokušaj</string>
|
||||
<string name="storage_permission_denied">Dozvola za pisanje po memoriji je odbijena</string>
|
||||
<string name="use_old_player_title">Koristi stari player</string>
|
||||
<string name="use_old_player_summary">Stari ugrađeni Mediaframework player.</string>
|
||||
<string name="storage_permission_denied">Dozvola za pisanje po pohrani je odbijena</string>
|
||||
<string name="use_old_player_title">Koristi stari reproduktor</string>
|
||||
<string name="use_old_player_summary">Stari ugrađeni Mediaframework reproduktor</string>
|
||||
|
||||
|
||||
<string name="short_thousand">tis</string>
|
||||
@ -157,13 +157,13 @@
|
||||
<string name="start">Počni</string>
|
||||
<string name="pause">Pauziraj</string>
|
||||
<string name="view">Pregled</string>
|
||||
<string name="delete">Obriši</string>
|
||||
<string name="delete">Izbriši</string>
|
||||
<string name="checksum">Kontrolna suma</string>
|
||||
|
||||
<string name="add">Novi zadatak</string>
|
||||
<string name="finish">U redu</string>
|
||||
|
||||
<string name="msg_name">Ime datoteke</string>
|
||||
<string name="msg_name">Naziv datoteke</string>
|
||||
<string name="msg_threads">Niti</string>
|
||||
<string name="msg_error">Greška</string>
|
||||
<string name="msg_server_unsupported">Server nije podržan</string>
|
||||
@ -172,16 +172,17 @@
|
||||
<string name="msg_running">NewPipe preuzima</string>
|
||||
<string name="msg_running_detail">Dodirni za detalje</string>
|
||||
<string name="msg_wait">Molimo pričekajte…</string>
|
||||
<string name="msg_copied">Kopirano u clipboard.</string>
|
||||
<string name="no_available_dir">Molimo odaberite dostupni direktorij za preuzimanje.</string>
|
||||
<string name="msg_popup_permission">Ova dozvola je potrebna za otvaranje skočnog prozora</string>
|
||||
<string name="msg_copied">Kopirano u međuspremnik</string>
|
||||
<string name="no_available_dir">Molimo odaberite dostupnu mapu za preuzimanje</string>
|
||||
<string name="msg_popup_permission">Ova dozvola je potrebna za
|
||||
\notvaranje skočnog prozora</string>
|
||||
|
||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||
<string name="reCaptcha_title">reCAPTCHA zadatak</string>
|
||||
<string name="recaptcha_request_toast">Traži se reCAPTCHA zadatak</string>
|
||||
|
||||
<string name="settings_category_downloads_title">Preuzimanja</string>
|
||||
<string name="settings_file_charset_title">Dozvoljeni znakovi u imenima datoteka</string>
|
||||
<string name="settings_file_charset_title">Dozvoljeni znakovi u nazivima datoteka</string>
|
||||
<string name="settings_file_replacement_character_summary">Nedozvoljeni znakovi su zamjenjeni ovima</string>
|
||||
<string name="settings_file_replacement_character_title">Znak za zamjenu</string>
|
||||
|
||||
@ -190,7 +191,7 @@
|
||||
|
||||
<string name="title_activity_about">O NewPipeu</string>
|
||||
<string name="action_settings">Postavke</string>
|
||||
<string name="action_about">O</string>
|
||||
<string name="action_about">O aplikaciji</string>
|
||||
<string name="title_licenses">Licence treće strane</string>
|
||||
<string name="copyright" formatted="true">© %1$s od %2$s pod %3$s</string>
|
||||
<string name="error_unable_to_load_license">Nije moguće učitati licencu</string>
|
||||
@ -198,7 +199,7 @@
|
||||
<string name="tab_about">O</string>
|
||||
<string name="tab_contributors">Doprinositelji</string>
|
||||
<string name="tab_licenses">Licence</string>
|
||||
<string name="app_description">Besplatni, slobodni i lagani YouTube frontend za Android.</string>
|
||||
<string name="app_description">Besplatna i lagana YouTube aplikacija za Android.</string>
|
||||
<string name="view_on_github">Pogledaj na GitHubu</string>
|
||||
<string name="app_license_title">Licenca za NewPipe</string>
|
||||
<string name="contribution_encouragement">Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobro došla. Što više radimo, to bolji postajemo!</string>
|
||||
@ -210,10 +211,41 @@
|
||||
<string name="title_history_view">Gledano</string>
|
||||
<string name="history_disabled">Povijest ugašena</string>
|
||||
<string name="action_history">Povijest</string>
|
||||
<string name="history_empty">Povijest prazna.</string>
|
||||
<string name="history_empty">Povijest je prazna</string>
|
||||
<string name="history_cleared">Povijest očišćena</string>
|
||||
|
||||
<string name="notification_channel_name">NewPipe obavijest</string>
|
||||
<string name="notification_channel_description">Obavijesti za NewPipe pozadinske i skočne playere</string>
|
||||
<string name="notification_channel_description">Obavijesti za NewPipe pozadinske i skočne reproduktore</string>
|
||||
|
||||
</resources>
|
||||
<string name="settings_category_player_title">Reproduktor</string>
|
||||
<string name="settings_category_player_behavior_title">Ponašanje</string>
|
||||
<string name="settings_category_history_title">Povijest</string>
|
||||
<string name="playlist">Popis naslova</string>
|
||||
<string name="undo">Poništi</string>
|
||||
|
||||
<string name="search_no_results">Nema rezultata</string>
|
||||
<string name="empty_subscription_feed_subtitle">Ovdje nema ništa osim cvrčaka</string>
|
||||
|
||||
<string name="no_subscribers">Nema pretplatnika</string>
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s pretplatnik</item>
|
||||
<item quantity="few">%s pretplatnika</item>
|
||||
<item quantity="other">%s pretplatnika</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Nema pregleda</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s pregled</item>
|
||||
<item quantity="few">%s pregleda</item>
|
||||
<item quantity="other">%s pregledi</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Nema videozapisa</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s video</item>
|
||||
<item quantity="few">%s videozapisa</item>
|
||||
<item quantity="other">%s videozapisi</item>
|
||||
</plurals>
|
||||
|
||||
<string name="item_deleted">Stavka je izbrisana</string>
|
||||
</resources>
|
||||
|
@ -12,16 +12,16 @@
|
||||
<string name="settings">Impostazioni</string>
|
||||
<string name="did_you_mean">Intendevi: %1$s ?</string>
|
||||
<string name="share_dialog_title">Condividi con</string>
|
||||
<string name="choose_browser">Scegli browser</string>
|
||||
<string name="choose_browser">Scegli il browser</string>
|
||||
<string name="screen_rotation">rotazione</string>
|
||||
<string name="download_path_title">Cartella dei video scaricati</string>
|
||||
<string name="download_path_summary">Cartella in cui memorizzare i video scaricati.</string>
|
||||
<string name="download_path_title">Percorso dei video scaricati</string>
|
||||
<string name="download_path_summary">Percorso in cui memorizzare i video scaricati</string>
|
||||
<string name="download_path_dialog_title">Inserisci il percorso per i download</string>
|
||||
<string name="default_resolution_title">Risoluzione predefinita</string>
|
||||
<string name="play_with_kodi_title">Riproduci con Kodi</string>
|
||||
<string name="kore_not_found">L\'applicazione Kore non è stata trovata. Vorresti installarla?</string>
|
||||
<string name="kore_not_found">L\'applicazione Kore non è stata trovata. Vuoi installarla?</string>
|
||||
<string name="show_play_with_kodi_title">Mostra l\'opzione \"Riproduci con Kodi\"</string>
|
||||
<string name="show_play_with_kodi_summary">Mostra l\'opzione per riprodurre i video tramite Kodi.</string>
|
||||
<string name="show_play_with_kodi_summary">Mostra l\'opzione per riprodurre i video tramite Kodi</string>
|
||||
<string name="play_audio">Audio</string>
|
||||
<string name="default_audio_format_title">Formato audio predefinito</string>
|
||||
<string name="webm_description">WebM — formato libero</string>
|
||||
@ -30,7 +30,7 @@
|
||||
<string name="next_video_title">Prossimo video</string>
|
||||
<string name="show_next_and_similar_title">Mostra video a seguire e video simili</string>
|
||||
<string name="url_not_supported_toast">URL non supportato</string>
|
||||
<string name="search_language_title">Lingua preferita per i contenuti</string>
|
||||
<string name="search_language_title">Lingua predefinita per i contenuti</string>
|
||||
<string name="settings_category_video_audio_title">Video e Audio</string>
|
||||
|
||||
<string name="list_thumbnail_view_description">Anteprima video</string>
|
||||
@ -40,12 +40,12 @@
|
||||
<string name="detail_likes_img_view_description">Mi piace</string>
|
||||
<string name="err_dir_create">Impossibile creare la cartella di download \'%1$s\'</string>
|
||||
<string name="info_dir_created">Creata la cartella per i download \'%1$s\'</string>
|
||||
<string name="use_external_video_player_title">Usa un lettore video esterno</string>
|
||||
<string name="use_external_audio_player_title">Usa un lettore audio esterno</string>
|
||||
<string name="use_external_video_player_title">Usa un riproduttore video esterno</string>
|
||||
<string name="use_external_audio_player_title">Usa un riproduttore audio esterno</string>
|
||||
|
||||
<string name="download_path_audio_title">Cartella degli audio scaricati</string>
|
||||
<string name="download_path_audio_summary">Cartella dove salvare gli audio scaricati.</string>
|
||||
<string name="download_path_audio_dialog_title">Inserisci la cartella per i file audio</string>
|
||||
<string name="download_path_audio_title">Percorso degli audio scaricati</string>
|
||||
<string name="download_path_audio_summary">Percorso dove salvare gli audio scaricati</string>
|
||||
<string name="download_path_audio_dialog_title">Inserisci il percorso per i file audio</string>
|
||||
|
||||
<string name="theme_title">Tema</string>
|
||||
<string name="dark_theme_title">Scuro</string>
|
||||
@ -63,26 +63,26 @@
|
||||
<string name="content_not_available">Contenuto non disponibile</string>
|
||||
<string name="blocked_by_gema">Bloccato dalla GEMA</string>
|
||||
<string name="use_tor_title">Usa Tor</string>
|
||||
<string name="use_tor_summary">(Sperimentale) Forza il traffico in download tramite Tor per una maggiore privacy (lo streaming dei video non è ancora supportato).</string>
|
||||
<string name="use_tor_summary">(Sperimentale) Forza il traffico in download tramite Tor per una maggiore riservatezza (lo streaming dei video non è ancora supportato).</string>
|
||||
|
||||
<string name="parsing_error">Impossibile analizzare il sito web</string>
|
||||
<string name="could_not_setup_download_menu">Impossibile impostare il menù di download</string>
|
||||
|
||||
|
||||
<string name="live_streams_not_supported">Questo è uno stream dal vivo. Gli stream dal vivo non sono ancora supportati.</string>
|
||||
<string name="live_streams_not_supported">Questo è uno stream in diretta, il quale non è ancora supportato.</string>
|
||||
|
||||
|
||||
<string name="content">Contenuti</string>
|
||||
<string name="show_age_restricted_content_title">Mostra contenuti vincolati all\'età</string>
|
||||
<string name="video_is_age_restricted">Questo video è riservato ad un pubblico maturo. Per accedervi, abilita \"Mostra video vincolati all\'età\" nelle impostazioni.</string>
|
||||
<string name="video_is_age_restricted">Questo video è riservato ad un pubblico maggiorenne. Per accedervi, abilita \"Mostra video vincolati all\'età\" nelle impostazioni.</string>
|
||||
|
||||
<string name="main_bg_subtitle">Tocca \"cerca\" per iniziare</string>
|
||||
<string name="autoplay_by_calling_app_title">Inizia automaticamente la riproduzione se NewPipe viene aperto da un\'altra app</string>
|
||||
<string name="autoplay_by_calling_app_title">Riproduzione automatica</string>
|
||||
<string name="autoplay_by_calling_app_summary">Riproduci i video automaticamente quando NewPipe viene aperto da un\'altra app</string>
|
||||
<string name="duration_live">in diretta</string>
|
||||
|
||||
<string name="light_parsing_error">Impossibile eseguire il parsing completo del sito</string>
|
||||
<string name="could_not_get_stream">Non è stato ottenuto alcuno stream</string>
|
||||
<string name="light_parsing_error">Impossibile analizzare completamente il sito web</string>
|
||||
<string name="could_not_get_stream">Non è stato ottenuto alcun flusso</string>
|
||||
<string name="sorry_string">Ci dispiace, non sarebbe dovuto succedere.</string>
|
||||
<string name="error_report_button_text">Segnala l\'errore via e-mail</string>
|
||||
<string name="error_snackbar_message">Ci dispiace, c\'è stato qualche errore.</string>
|
||||
@ -99,18 +99,18 @@
|
||||
<string name="video">Video</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="retry">Riprova</string>
|
||||
<string name="storage_permission_denied">È stato negato il permesso di accedere all\'archiviazione di massa</string>
|
||||
<string name="storage_permission_denied">È stato negato il permesso di accesso all\'archiviazione di massa</string>
|
||||
<string name="downloads">Download</string>
|
||||
<string name="downloads_title">Download</string>
|
||||
<string name="error_report_title">Segnalazione errori</string>
|
||||
|
||||
<string name="start">Inizia</string>
|
||||
<string name="pause">Pausa</string>
|
||||
<string name="view">Visualizza</string>
|
||||
<string name="view">Riproduci</string>
|
||||
<string name="delete">Elimina</string>
|
||||
<string name="checksum">Checksum</string>
|
||||
<string name="checksum">Codice di controllo</string>
|
||||
|
||||
<string name="add">Nuova missione</string>
|
||||
<string name="add">Nuovo obiettivo</string>
|
||||
<string name="finish">OK</string>
|
||||
|
||||
<string name="msg_name">Nome del file</string>
|
||||
@ -126,7 +126,7 @@
|
||||
<string name="no_available_dir">Seleziona una cartella disponibile in cui salvare i download</string>
|
||||
|
||||
<string name="could_not_load_image">Impossibile caricare l\'immagine</string>
|
||||
<string name="app_ui_crash">L\'app/UI è andata in crash</string>
|
||||
<string name="app_ui_crash">L\'app/UI si è interrotta</string>
|
||||
<string name="info_labels">Cosa:\\nRichiesta:\\nLingua contenuto:\\nServizio:\\nOrario GMT:\\nPacchetto:\\nVersione:\\nVersione SO:\\nRange IP glob.:</string>
|
||||
|
||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||
@ -149,26 +149,26 @@
|
||||
|
||||
|
||||
<string name="open_in_popup_mode">Apri in modalità popup</string>
|
||||
<string name="popup_mode_share_menu_title">NewPipe Modo popup</string>
|
||||
<string name="popup_mode_share_menu_title">NewPipe in modalità popup</string>
|
||||
|
||||
<string name="popup_playing_toast">Riproduzione in modalità popup</string>
|
||||
<string name="disabled">Disattivato</string>
|
||||
|
||||
<string name="use_old_player_title">Usa il vecchio riproduttore</string>
|
||||
<string name="use_external_video_player_summary">Alcune risoluzioni non avranno audio se questa opzione viene abilitata.</string>
|
||||
<string name="use_external_video_player_summary">Alcune risoluzioni NON avranno l\'audio se questa opzione viene abilitata</string>
|
||||
<string name="controls_background_title">In sottofondo</string>
|
||||
<string name="controls_popup_title">Popup</string>
|
||||
|
||||
<string name="default_popup_resolution_title">Risoluzione predefinita per il popup</string>
|
||||
<string name="default_popup_resolution_title">Risoluzione predefinita per la modalità popup</string>
|
||||
<string name="show_higher_resolutions_title">Mostra risoluzioni più alte</string>
|
||||
<string name="show_higher_resolutions_summary">Solo alcuni dispositivi supportano la riproduzione di video in 2K e 4K.</string>
|
||||
<string name="default_video_format_title">Formato video preferito</string>
|
||||
<string name="show_higher_resolutions_summary">Solo alcuni dispositivi supportano la riproduzione di video in 2K e 4K</string>
|
||||
<string name="default_video_format_title">Formato video predefinito</string>
|
||||
<string name="popup_remember_size_pos_title">Ricorda grandezza e posizione del popup</string>
|
||||
<string name="popup_remember_size_pos_summary">Ricorda l\'ultima grandezza e posizione del popup</string>
|
||||
<string name="player_gesture_controls_title">Controlli gestuali</string>
|
||||
<string name="player_gesture_controls_summary">Usa i gesti per controllare luminosità e volume.</string>
|
||||
<string name="player_gesture_controls_summary">Usa i gesti per controllare luminosità e volume</string>
|
||||
<string name="show_search_suggestions_title">Suggerimenti di ricerca</string>
|
||||
<string name="show_search_suggestions_summary">Mostra suggerimenti durante la ricerca.</string>
|
||||
<string name="show_search_suggestions_summary">Mostra i suggerimenti durante la ricerca</string>
|
||||
|
||||
<string name="settings_category_popup_title">Popup</string>
|
||||
<string name="filter">Filtra i risultati</string>
|
||||
@ -177,10 +177,10 @@
|
||||
<string name="popup_resizing_indicator_title">Ridimensionamento</string>
|
||||
<string name="best_resolution">Risoluzione migliore</string>
|
||||
|
||||
<string name="use_old_player_summary">Precedente riproduttore integrato facente uso di Mediaframework</string>
|
||||
<string name="use_old_player_summary">Precedente riproduttore integrato Mediaframework</string>
|
||||
|
||||
<string name="msg_popup_permission">Questo permesso è necessario
|
||||
\nper la modalità popup</string>
|
||||
<string name="msg_popup_permission">Questo permesso è necessario
|
||||
\nper aprire la modalità popup</string>
|
||||
|
||||
<string name="action_settings">Impostazioni</string>
|
||||
<string name="action_about">Informazioni</string>
|
||||
@ -206,7 +206,7 @@
|
||||
|
||||
<string name="tab_subscriptions">Iscrizioni</string>
|
||||
|
||||
<string name="fragment_whats_new">Nuovo</string>
|
||||
<string name="fragment_whats_new">Novità</string>
|
||||
|
||||
<string name="enable_search_history_title">Cronologia ricerche</string>
|
||||
<string name="enable_search_history_summary">Salva le ricerche localmente</string>
|
||||
@ -233,10 +233,10 @@
|
||||
<string name="history_cleared">Cronologia cancellata</string>
|
||||
|
||||
<string name="tab_main">Principale</string>
|
||||
<string name="settings_category_player_title">Player</string>
|
||||
<string name="settings_category_player_title">Riproduttore</string>
|
||||
<string name="settings_category_player_behavior_title">Comportamento</string>
|
||||
<string name="settings_category_history_title">Cronologia</string>
|
||||
<string name="playlist">Playlist</string>
|
||||
<string name="playlist">Scaletta</string>
|
||||
<string name="undo">Annulla</string>
|
||||
|
||||
<string name="notification_channel_name">Notifiche NewPipe</string>
|
||||
@ -262,4 +262,7 @@
|
||||
</plurals>
|
||||
|
||||
<string name="item_deleted">Elemento eliminato</string>
|
||||
<string name="empty_subscription_feed_subtitle">Nulla da mostrare</string>
|
||||
|
||||
<string name="delete_item_search_history">Vuoi eliminare questo elemento dalla cronologia?</string>
|
||||
</resources>
|
||||
|
@ -104,7 +104,7 @@
|
||||
<string name="storage_permission_denied">Toegang tot opslag geweigerd</string>
|
||||
<string name="start">Begin</string>
|
||||
<string name="pause">Pauzeren</string>
|
||||
<string name="view">Bekijken</string>
|
||||
<string name="view">Afspelen</string>
|
||||
<string name="delete">Verwijderen</string>
|
||||
<string name="checksum">Controlesom</string>
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
<string name="download_path_audio_summary">Ścieżka zapisu pobranych audio</string>
|
||||
<string name="download_path_audio_dialog_title">Podaj ścieżkę zapisu audio</string>
|
||||
|
||||
<string name="autoplay_by_calling_app_title">Autoodtwarzanie po wezwaniu z innej aplikacji</string>
|
||||
<string name="autoplay_by_calling_app_title">Autoodtwarzanie</string>
|
||||
<string name="autoplay_by_calling_app_summary">Automatycznie odtwórz video kiedy NewPipe zostanie wywołany z innej aplikacji</string>
|
||||
<string name="default_resolution_title">Domyślna rozdzielczość</string>
|
||||
<string name="play_with_kodi_title">Odtwórz w Kodi</string>
|
||||
@ -205,7 +205,7 @@
|
||||
<string name="enable_search_history_summary">Zapisuj historie wyszukiwania lokalnie</string>
|
||||
<string name="enable_watch_history_title">Historia oglądania</string>
|
||||
<string name="enable_watch_history_summary">Zapisuj historie oglądania</string>
|
||||
<string name="resume_on_audio_focus_gain_title"></string>
|
||||
<string name="resume_on_audio_focus_gain_title"/>
|
||||
<string name="resume_on_audio_focus_gain_summary">Kontynuuj odtwarzanie po przerwaniu (np. po rozmowie telefonicznej)</string>
|
||||
|
||||
|
||||
@ -221,4 +221,12 @@
|
||||
<string name="history_empty">Historia jest pusta.</string>
|
||||
<string name="history_cleared">Historia została wyczyszczona</string>
|
||||
|
||||
</resources>
|
||||
<string name="settings_category_player_title">Odtwarzacz</string>
|
||||
<string name="settings_category_player_behavior_title">Zachowanie</string>
|
||||
<string name="settings_category_history_title">Historia</string>
|
||||
<string name="playlist">Playlista</string>
|
||||
<string name="undo">Cofnij</string>
|
||||
|
||||
<string name="search_no_results">Brak wyników</string>
|
||||
<string name="no_views">Brak wyświetleń</string>
|
||||
</resources>
|
||||
|
@ -7,7 +7,7 @@
|
||||
<string name="what_device_headline">Informações:</string>
|
||||
<string name="webm_description">WebM — formato aberto</string>
|
||||
<string name="view_count_text">%1$s visualizações</string>
|
||||
<string name="view">Ver</string>
|
||||
<string name="view">Reproduzir</string>
|
||||
<string name="video_is_age_restricted">Vídeo com restrição de idade. Permissão para vídeos com essa restrição podem ser feitas no menu configurações.</string>
|
||||
<string name="video">Vídeo</string>
|
||||
<string name="autoplay_by_calling_app_summary">Reproduzir o vídeo automaticamente quando o NewPipe for aberto a partir de outro app</string>
|
||||
@ -95,7 +95,7 @@
|
||||
<string name="light_parsing_error">Não foi possível interpretar completamente o site</string>
|
||||
<string name="list_thumbnail_view_description">Miniatura do vídeo</string>
|
||||
<string name="live_streams_not_supported">Isto é uma transmissão ao vivo, a qual ainda não é suportada.</string>
|
||||
<string name="main_bg_subtitle">Toque em busca para começar</string>
|
||||
<string name="main_bg_subtitle">Toque em pesquisar para começar</string>
|
||||
<string name="msg_exists">Arquivo já existe</string>
|
||||
<string name="msg_threads">Threads</string>
|
||||
<string name="msg_url_malform">URL inválida ou internet indisponível</string>
|
||||
@ -233,12 +233,13 @@ abrir em modo popup</string>
|
||||
|
||||
<string name="no_videos">Nenhum video</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s video</item>
|
||||
<item quantity="other">%s videos</item>
|
||||
<item quantity="one">%s vídeo</item>
|
||||
<item quantity="other">%s vídeos</item>
|
||||
</plurals>
|
||||
|
||||
<string name="item_deleted">Item excluído</string>
|
||||
<string name="settings_category_player_title">Player</string>
|
||||
<string name="settings_category_player_title">Reprodutor</string>
|
||||
<string name="empty_subscription_feed_subtitle">Não há nada aqui</string>
|
||||
|
||||
</resources>
|
||||
<string name="delete_item_search_history">Deseja apagar este item do seu histórico de busca?</string>
|
||||
</resources>
|
||||
|
@ -21,18 +21,18 @@
|
||||
<string name="download_path_dialog_title">Introduza o caminho para os vídeos</string>
|
||||
<string name="default_resolution_title">Resolução padrão</string>
|
||||
<string name="play_with_kodi_title">Reproduzir no Kodi</string>
|
||||
<string name="kore_not_found">Aplicação não encontrada. Instalar o Kore?</string>
|
||||
<string name="kore_not_found">Aplicação Kore não encontrada. Quer instalá-la?</string>
|
||||
<string name="show_play_with_kodi_title">Mostrar opção \"Reproduzir no Kodi\"</string>
|
||||
<string name="show_play_with_kodi_summary">Mostra uma opção para reproduzir o vídeo no Kodi</string>
|
||||
<string name="play_audio">Áudio</string>
|
||||
<string name="default_audio_format_title">Formato áudio padrão</string>
|
||||
<string name="webm_description">WebM — formato livre</string>
|
||||
<string name="m4a_description">m4a — melhor qualidade</string>
|
||||
<string name="m4a_description">M4A — melhor qualidade</string>
|
||||
<string name="download_dialog_title">Transferir</string>
|
||||
<string name="next_video_title">Vídeo seguinte</string>
|
||||
<string name="show_next_and_similar_title">Mostrar vídeos seguintes e semelhantes</string>
|
||||
<string name="url_not_supported_toast">URL não suportado</string>
|
||||
<string name="search_language_title">Idioma preferido do conteúdo</string>
|
||||
<string name="search_language_title">Idioma predefinido do conteúdo</string>
|
||||
<string name="settings_category_video_audio_title">Vídeo e áudio</string>
|
||||
|
||||
<string name="list_thumbnail_view_description">Miniatura de vídeos</string>
|
||||
@ -60,19 +60,19 @@
|
||||
<string name="info_dir_created">Diretório \'%1$s\' criado com sucesso</string>
|
||||
<string name="general_error">Erro</string>
|
||||
<string name="could_not_load_thumbnails">Incapaz de carregar todas as miniaturas</string>
|
||||
<string name="youtube_signature_decryption_error">Incapaz de decodificar a assinatura do vídeo.</string>
|
||||
<string name="parsing_error">Incapaz de processar o sítio web.</string>
|
||||
<string name="content_not_available">Conteúdo não disponível.</string>
|
||||
<string name="blocked_by_gema">Bloqueado pela GEMA.</string>
|
||||
<string name="youtube_signature_decryption_error">Incapaz de decodificar a assinatura do vídeo</string>
|
||||
<string name="parsing_error">Incapaz de processar o sítio da web</string>
|
||||
<string name="content_not_available">Conteúdo não disponível</string>
|
||||
<string name="blocked_by_gema">Bloqueado pela GEMA</string>
|
||||
|
||||
<string name="content">Conteúdo</string>
|
||||
<string name="show_age_restricted_content_title">Restringir conteúdo por idade</string>
|
||||
<string name="video_is_age_restricted">O vídeo está restrito por idade. Ative a restrição de vídeos por idade nas definições.</string>
|
||||
<string name="video_is_age_restricted">Vídeo com restrição de idade. É possível permitir este material através das Definições.</string>
|
||||
|
||||
<string name="light_parsing_error">Não foi possível processar o sítio web.</string>
|
||||
<string name="could_not_setup_download_menu">Não foi possível configurar o menu de transferências.</string>
|
||||
<string name="live_streams_not_supported">Esta é uma EMISSÃO EM DIRETO. Estas emissões ainda não são suportadas.</string>
|
||||
<string name="could_not_get_stream">Não foi possível obter a emissão.</string>
|
||||
<string name="light_parsing_error">Não foi possível processar o sítio da web</string>
|
||||
<string name="could_not_setup_download_menu">Não foi possível configurar o menu de transferências</string>
|
||||
<string name="live_streams_not_supported">Esta é uma EMISSÃO EM DIRETO, as quais ainda não são suportadas.</string>
|
||||
<string name="could_not_get_stream">Não foi possível obter a emissão</string>
|
||||
<string name="sorry_string">Desculpe, isto não deveria ter acontecido.</string>
|
||||
<string name="error_report_button_text">Reportar erro por e-mail</string>
|
||||
<string name="error_snackbar_message">Ocorreram alguns erros.</string>
|
||||
@ -86,9 +86,9 @@
|
||||
<string name="video">Vídeo</string>
|
||||
<string name="audio">Áudio</string>
|
||||
<string name="retry">Tentar novamente</string>
|
||||
<string name="storage_permission_denied">Não foi concedida permissão para aceder ao armazenamento</string>
|
||||
<string name="storage_permission_denied">Permissão para aceder ao armazenamento foi negada</string>
|
||||
<string name="main_bg_subtitle">Toque para iniciar a pesquisa</string>
|
||||
<string name="autoplay_by_calling_app_title">Reproduzir se invocado por outra aplicação</string>
|
||||
<string name="autoplay_by_calling_app_title">Reprodução automática</string>
|
||||
<string name="autoplay_by_calling_app_summary">Reproduzir vídeo automaticamente se o NewPipe for invocado por outra aplicação</string>
|
||||
<string name="duration_live">direto</string>
|
||||
|
||||
@ -101,7 +101,7 @@
|
||||
|
||||
<string name="start">Iniciar</string>
|
||||
<string name="pause">Pausa</string>
|
||||
<string name="view">Ver</string>
|
||||
<string name="view">Reproduzir</string>
|
||||
<string name="delete">Apagar</string>
|
||||
<string name="checksum">Checksum</string>
|
||||
|
||||
@ -115,8 +115,8 @@
|
||||
<string name="msg_url_malform">URL inválido ou Internet não disponível</string>
|
||||
<string name="msg_running_detail">Toque para detalhes</string>
|
||||
<string name="msg_wait">Por favor aguarde…</string>
|
||||
<string name="msg_copied">Copiado para a área de transferência.</string>
|
||||
<string name="no_available_dir">Por favor selecione um diretório disponível.</string>
|
||||
<string name="msg_copied">Copiado para a área de transferência</string>
|
||||
<string name="no_available_dir">Por favor selecione um diretório disponível para download</string>
|
||||
|
||||
<string name="finish">OK</string>
|
||||
<string name="msg_threads">Processos</string>
|
||||
@ -145,11 +145,11 @@ o modo “popup“</string>
|
||||
<string name="reCaptcha_title">Desafio reCAPTCHA</string>
|
||||
<string name="recaptcha_request_toast">Desafio reCAPTCHA solicitado</string>
|
||||
|
||||
<string name="popup_mode_share_menu_title">Modo popup de NewPipe</string>
|
||||
<string name="popup_mode_share_menu_title">Modo popup do NewPipe</string>
|
||||
|
||||
<string name="popup_playing_toast">Reproduzir em modo de popup</string>
|
||||
<string name="use_old_player_title">Usar reprodutor antigo</string>
|
||||
<string name="use_old_player_summary">Versão antiga no reprodutor Mediaframework.</string>
|
||||
<string name="use_old_player_summary">Versão antiga do reprodutor Mediaframework</string>
|
||||
<string name="default_video_format_title">Formato de vídeo preferido</string>
|
||||
<string name="disabled">Desativado</string>
|
||||
|
||||
@ -186,10 +186,73 @@ o modo “popup“</string>
|
||||
<string name="tab_about">Sobre</string>
|
||||
<string name="tab_contributors">Colaboradores</string>
|
||||
<string name="tab_licenses">Licenças</string>
|
||||
<string name="app_description">Aplicação leve, simples e grátis de Youtube para Android.</string>
|
||||
<string name="view_on_github">Ver no Github</string>
|
||||
<string name="app_description">Aplicação leve, simples e grátis de YouTube para Android.</string>
|
||||
<string name="view_on_github">Ver no GitHub</string>
|
||||
<string name="app_license_title">Licença do NewPipe</string>
|
||||
<string name="contribution_encouragement">Se tem ideias, tradução, alterações de design, limpeza de código ou alterações de código pesado, ajuda é sempre bem-vinda. Quanto mais se faz melhor fica!</string>
|
||||
<string name="contribution_encouragement">Se tem ideias de tradução, alterações de design, limpeza de código ou alterações de código pesado—ajuda é sempre bem-vinda. Quanto mais se faz melhor fica!</string>
|
||||
<string name="read_full_license">Ler licença</string>
|
||||
<string name="contribution_title">Contribuição</string>
|
||||
<string name="subscribe_button_title">Subscrever</string>
|
||||
<string name="subscribed_button_title">Subscrito</string>
|
||||
<string name="channel_unsubscribed">Canal não subscrito</string>
|
||||
<string name="subscription_change_failed">Incapaz de alterar a subscrição</string>
|
||||
<string name="subscription_update_failed">Incapaz de atualizar a subscrição</string>
|
||||
|
||||
<string name="tab_main">Principal</string>
|
||||
<string name="tab_subscriptions">Subscrições</string>
|
||||
|
||||
<string name="fragment_whats_new">O que há de novo</string>
|
||||
|
||||
<string name="enable_search_history_title">Histórico de Pesquisa</string>
|
||||
<string name="enable_search_history_summary">Armazenar termos de pesquisa localmente</string>
|
||||
<string name="enable_watch_history_title">Histórico</string>
|
||||
<string name="enable_watch_history_summary">Armazenar histórico de vídeos assistidos</string>
|
||||
<string name="resume_on_audio_focus_gain_title">Retomar reprodução ao ganhar foco</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">Continuar reprodução após interrupções (ex. chamadas)</string>
|
||||
<string name="settings_category_player_title">Reprodutor de vídeo</string>
|
||||
<string name="settings_category_player_behavior_title">Comportamento</string>
|
||||
<string name="settings_category_history_title">Histórico</string>
|
||||
<string name="playlist">Lista de Reprodução</string>
|
||||
<string name="undo">Desfazer</string>
|
||||
|
||||
<string name="notification_channel_name">Notificação do NewPipe</string>
|
||||
<string name="notification_channel_description">Notificações do NewPipe em Segundo Plano e Reprodutores de Vídeo em Popup</string>
|
||||
|
||||
<string name="search_no_results">Sem resultados</string>
|
||||
<string name="empty_subscription_feed_subtitle">Aqui não há nada para ver</string>
|
||||
|
||||
<string name="no_subscribers">Sem subscritores</string>
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s subscrito</item>
|
||||
<item quantity="other">%s subscritos</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Sem visualizações</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s visualização</item>
|
||||
<item quantity="other">%s visualizações</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Sem vídeos</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s vídeo</item>
|
||||
<item quantity="other">%s vídeos</item>
|
||||
</plurals>
|
||||
|
||||
<string name="settings_category_downloads_title">Download</string>
|
||||
<string name="settings_file_charset_title">Caracteres permitidos em nomes de ficheiros</string>
|
||||
<string name="settings_file_replacement_character_summary">Caracteres inválidos são substituídos por este valor</string>
|
||||
<string name="settings_file_replacement_character_title">Caracter de substituição</string>
|
||||
|
||||
<string name="charset_letters_and_digits">Letras e dígitos</string>
|
||||
<string name="charset_most_special_characters">Caracteres mais especiais</string>
|
||||
|
||||
<string name="title_activity_history">Histórico</string>
|
||||
<string name="title_history_search">Procurados</string>
|
||||
<string name="title_history_view">Visualizado</string>
|
||||
<string name="history_disabled">Histórico está desativado</string>
|
||||
<string name="action_history">Histórico</string>
|
||||
<string name="history_empty">O histórico está vazio</string>
|
||||
<string name="history_cleared">Histórico eliminado</string>
|
||||
<string name="item_deleted">Objeto eliminado</string>
|
||||
</resources>
|
||||
|
@ -79,7 +79,7 @@
|
||||
<string name="general_error">Ошибка</string>
|
||||
<string name="your_comment">Ваш комментарий (на английском):</string>
|
||||
<string name="err_dir_create">Невозможно создать папку для загрузки \'%1$s\'</string>
|
||||
<string name="autoplay_by_calling_app_title">Автоматически воспроизводить при открытии из другого приложения</string>
|
||||
<string name="autoplay_by_calling_app_title">Воспроизводить автоматически</string>
|
||||
<string name="autoplay_by_calling_app_summary">Автоматически воспроизводить видео при вызове NewPipe из другого приложения</string>
|
||||
<string name="content">Контент</string>
|
||||
<string name="video_is_age_restricted">Видео с возрастными ограничениями. Разрешить подобный контент можно в настройках.</string>
|
||||
@ -96,10 +96,10 @@
|
||||
<string name="live_streams_not_supported">Это прямая трансляция, они пока не поддерживаются.</string>
|
||||
<string name="could_not_load_image">Не удалось загрузить изображение</string>
|
||||
<string name="app_ui_crash">"Падение приложения/пользовательского интерфейса "</string>
|
||||
<string name="sorry_string">Простите, такое не должно было произойти.</string>
|
||||
<string name="sorry_string">Простите, это не должно было произойти.</string>
|
||||
<string name="error_report_button_text">Отправить отчёт об ошибке по электронной почте</string>
|
||||
<string name="error_snackbar_message">Простите, произошли ошибки.</string>
|
||||
<string name="error_snackbar_action">ОТЧЕТ</string>
|
||||
<string name="error_snackbar_action">ОТЧЁТ</string>
|
||||
<string name="what_device_headline">Информация:</string>
|
||||
<string name="what_happened_headline">Что произошло:</string>
|
||||
<string name="error_details_headline">Детали:</string>
|
||||
@ -223,4 +223,38 @@
|
||||
<string name="history_empty">История пуста</string>
|
||||
<string name="history_cleared">История очищена</string>
|
||||
|
||||
<string name="settings_category_player_title">Плеер</string>
|
||||
<string name="settings_category_player_behavior_title">Поведение</string>
|
||||
<string name="settings_category_history_title">История</string>
|
||||
<string name="playlist">Плейлист</string>
|
||||
<string name="undo">Отменить</string>
|
||||
|
||||
<string name="search_no_results">Нет результатов</string>
|
||||
<string name="empty_subscription_feed_subtitle">Тут только сверчки</string>
|
||||
|
||||
<string name="no_subscribers">Нет подписчиков</string>
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s подписчик</item>
|
||||
<item quantity="few">%s подписчика</item>
|
||||
<item quantity="many">%s подписчиков</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Нет просмотров</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s просмотр</item>
|
||||
<item quantity="few">%s просмотра</item>
|
||||
<item quantity="many">%s просмотров</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Нет видео</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s видео</item>
|
||||
<item quantity="few">%s видео</item>
|
||||
<item quantity="many">%s видео</item>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<string name="item_deleted">Элемент удалён</string>
|
||||
</resources>
|
||||
|
@ -102,7 +102,7 @@
|
||||
<string name="main_bg_subtitle">Začnite z iskanjem</string>
|
||||
<string name="start">Začni</string>
|
||||
<string name="pause">Premor</string>
|
||||
<string name="view">Poglej</string>
|
||||
<string name="view">Predvajaj</string>
|
||||
<string name="delete">Izbriši</string>
|
||||
<string name="checksum">Nadzorna vsota</string>
|
||||
|
||||
@ -272,4 +272,5 @@ odpiranje v pojavnem načinu</string>
|
||||
</plurals>
|
||||
|
||||
<string name="item_deleted">Predmet je izbrisan</string>
|
||||
<string name="delete_item_search_history">Ali želite izbrisati predmet iz zgodovine iskanja?</string>
|
||||
</resources>
|
||||
|
@ -100,7 +100,7 @@
|
||||
<string name="autoplay_by_calling_app_summary">Аутоматско пуштање видеа по позиву друге апликације</string>
|
||||
<string name="start">Почни</string>
|
||||
<string name="pause">Паузирај</string>
|
||||
<string name="view">Приказ</string>
|
||||
<string name="view">Пусти</string>
|
||||
<string name="delete">Обриши</string>
|
||||
<string name="checksum">Хеш</string>
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="main_bg_subtitle">Başlamak için aramaya dokunun</string>
|
||||
<string name="view_count_text">%1$s izlenme</string>
|
||||
<string name="view_count_text">%1$s görüntüleme</string>
|
||||
<string name="upload_date_text">Yayımlanma: %1$s</string>
|
||||
<string name="no_player_found">Yayın oynatıcı bulunamadı. VLC\'yi kurmak ister misiniz?</string>
|
||||
<string name="no_player_found">Akış oynatıcı bulunamadı. VLC\'yi kurmak ister misiniz?</string>
|
||||
<string name="install">Kur</string>
|
||||
<string name="cancel">İptal</string>
|
||||
<string name="open_in_browser">Tarayıcıda aç</string>
|
||||
@ -12,7 +12,7 @@
|
||||
<string name="search">Ara</string>
|
||||
<string name="settings">Ayarlar</string>
|
||||
<string name="did_you_mean">Bunu mu demek istediniz: %1$s ?</string>
|
||||
<string name="share_dialog_title">Bununla paylaş</string>
|
||||
<string name="share_dialog_title">Şununla paylaş</string>
|
||||
<string name="choose_browser">Tarayıcı seç</string>
|
||||
<string name="screen_rotation">döndürme</string>
|
||||
<string name="use_external_video_player_title">Harici video oynatıcı kullan</string>
|
||||
@ -26,17 +26,17 @@
|
||||
<string name="download_path_audio_summary">İndirilmiş seslerin saklanacağı konum</string>
|
||||
<string name="download_path_audio_dialog_title">Ses dosyaları için indirme konumu girin</string>
|
||||
|
||||
<string name="autoplay_by_calling_app_title">Başka uygulamadan çağrıldığında kendiliğinden oynat</string>
|
||||
<string name="autoplay_by_calling_app_title">Kendiliğinden oynat</string>
|
||||
<string name="autoplay_by_calling_app_summary">NewPipe başka bir uygulamadan çağırıldığında videoyu kendiliğinden oynatır</string>
|
||||
<string name="default_resolution_title">Öntanımlı çözünürlük</string>
|
||||
<string name="play_with_kodi_title">Kodi ile çal</string>
|
||||
<string name="kore_not_found">Kore uygulaması bulunamadı. Kurmak ister misiniz?</string>
|
||||
<string name="play_with_kodi_title">Kodi ile oynat</string>
|
||||
<string name="kore_not_found">Kore uygulaması bulunamadı. Kur?</string>
|
||||
<string name="show_play_with_kodi_title">\"Kodi ile Oynat\" seçeneğini göster</string>
|
||||
<string name="show_play_with_kodi_summary">Kodi medya merkezi aracılığıyla video oynatmak için bir seçenek görüntüler</string>
|
||||
<string name="show_play_with_kodi_summary">Kodi ortam merkezi aracılığıyla video oynatmak için bir seçenek görüntüler</string>
|
||||
<string name="default_audio_format_title">Öntanımlı ses biçimi</string>
|
||||
<string name="webm_description">WebM - özgür biçim</string>
|
||||
<string name="m4a_description">m4a — daha iyi kalite</string>
|
||||
<string name="theme_title">Tema</string>
|
||||
<string name="webm_description">WebM — özgür biçim</string>
|
||||
<string name="m4a_description">M4A — daha iyi nitelik</string>
|
||||
<string name="theme_title">Gövde</string>
|
||||
<string name="dark_theme_title">Koyu</string>
|
||||
<string name="light_theme_title">Açık</string>
|
||||
|
||||
@ -44,16 +44,16 @@
|
||||
<string name="next_video_title">Sonraki video</string>
|
||||
<string name="show_next_and_similar_title">Sonraki ve benzer videoları göster</string>
|
||||
<string name="url_not_supported_toast">URL desteklenmiyor</string>
|
||||
<string name="search_language_title">Yeğlenen içerik dili</string>
|
||||
<string name="search_language_title">Öntanımlı içerik dili</string>
|
||||
<string name="play_audio">Ses</string>
|
||||
<string name="settings_category_video_audio_title">Video ve Ses</string>
|
||||
<string name="settings_category_appearance_title">Görünüm</string>
|
||||
<string name="settings_category_other_title">Diğer</string>
|
||||
<string name="background_player_playing_toast">Arka planda çalıyor</string>
|
||||
<string name="background_player_playing_toast">Arka planda oynatıyor</string>
|
||||
<string name="play_btn_text">Oynat</string>
|
||||
<string name="content">İçerik</string>
|
||||
<string name="show_age_restricted_content_title">Yaş sınırlı içeriği göster</string>
|
||||
<string name="video_is_age_restricted">Bu video Yaş Sınırlıdır. İlk önce ayarlardaki yaş sınırlı videoları etkinleştirin.</string>
|
||||
<string name="video_is_age_restricted">Yaş Sınırlı Video. Bu gibi materyallere Ayarlar\'dan izin verilebilir.</string>
|
||||
<string name="duration_live">canlı</string>
|
||||
<string name="downloads">İndirilenler</string>
|
||||
<string name="downloads_title">İndirilenler</string>
|
||||
@ -62,24 +62,24 @@
|
||||
<string name="general_error">Hata</string>
|
||||
<string name="network_error">Ağ hatası</string>
|
||||
<string name="could_not_load_thumbnails">Küçük resimlerin tümü yüklenemedi</string>
|
||||
<string name="youtube_signature_decryption_error">Video URL imzası çözülemedi.</string>
|
||||
<string name="parsing_error">Web sitesi ayrıştırılamadı.</string>
|
||||
<string name="light_parsing_error">Web sitesi tümüyle ayrıştırılamadı.</string>
|
||||
<string name="content_not_available">İçerik yok.</string>
|
||||
<string name="blocked_by_gema">GEMA tarafından engellendi.</string>
|
||||
<string name="live_streams_not_supported">Bu bir CANLI YAYIN. Bunlar henüz desteklenmiyor.</string>
|
||||
<string name="could_not_get_stream">Herhangi bir yayın alınamadı.</string>
|
||||
<string name="youtube_signature_decryption_error">Video URL imzası çözülemedi</string>
|
||||
<string name="parsing_error">Web sitesi ayrıştırılamadı</string>
|
||||
<string name="light_parsing_error">Web sitesi tümüyle ayrıştırılamadı</string>
|
||||
<string name="content_not_available">İçerik kullanılabilir değil</string>
|
||||
<string name="blocked_by_gema">GEMA tarafından engellendi</string>
|
||||
<string name="live_streams_not_supported">Bu bir CANLI AKIŞ, henüz desteklenmiyor.</string>
|
||||
<string name="could_not_get_stream">Herhangi bir akış alınamadı</string>
|
||||
<string name="could_not_load_image">Resim yüklenemedi</string>
|
||||
<string name="app_ui_crash">Uygulama/Kullanıcı arayüzü çöktü</string>
|
||||
<string name="sorry_string">Üzgünüz, bu olmamalıydı.</string>
|
||||
<string name="error_report_button_text">Hatayı postayla bildir</string>
|
||||
<string name="error_report_button_text">Hatayı e-postayla bildir</string>
|
||||
<string name="error_snackbar_message">Üzgünüz, bazı hatalar oluştu.</string>
|
||||
<string name="error_snackbar_action">BİLDİR</string>
|
||||
<string name="what_device_headline">Bilgi:</string>
|
||||
<string name="what_happened_headline">Ne oldu:</string>
|
||||
<string name="info_labels">Ne:\\nİstek:\\nİçerik Dili:\\nHizmet:\\nGMT Zamanı:\\nPaket:\\nSürüm:\\nİşletim sistemi sürümü:\\nGlob. IP aralığı:</string>
|
||||
<string name="detail_thumbnail_view_description">Video ön izleme küçük resmi</string>
|
||||
<string name="detail_uploader_thumbnail_view_description">Yükleyenin kullanıcı küçük resmi</string>
|
||||
<string name="detail_uploader_thumbnail_view_description">Yükleyenin küçük resmi</string>
|
||||
<string name="detail_likes_img_view_description">Beğeni</string>
|
||||
<string name="detail_dislikes_img_view_description">Beğenmeme</string>
|
||||
<string name="use_tor_title">Tor kullan</string>
|
||||
@ -93,11 +93,11 @@
|
||||
<string name="video">Video</string>
|
||||
<string name="audio">Ses</string>
|
||||
<string name="retry">Yeniden dene</string>
|
||||
<string name="storage_permission_denied">Depolamaya erişme izni reddedildi</string>
|
||||
<string name="storage_permission_denied">Depolama erişim izni reddedildi</string>
|
||||
|
||||
<string name="start">Başlat</string>
|
||||
<string name="pause">Duraklat</string>
|
||||
<string name="view">Görünüm</string>
|
||||
<string name="view">Oynat</string>
|
||||
<string name="delete">Sil</string>
|
||||
<string name="checksum">Sağlama</string>
|
||||
|
||||
@ -114,13 +114,13 @@
|
||||
<string name="msg_running">NewPipe İndiriyor</string>
|
||||
<string name="msg_running_detail">Ayrıntılar için dokun</string>
|
||||
<string name="msg_wait">Lütfen bekleyin…</string>
|
||||
<string name="msg_copied">Panoya kopyalandı.</string>
|
||||
<string name="no_available_dir">Lütfen kullanılabilir bir indirme dizini seçin.</string>
|
||||
<string name="msg_copied">Panoya kopyalandı</string>
|
||||
<string name="no_available_dir">Lütfen uygun bir indirme klasörü seçin</string>
|
||||
|
||||
|
||||
<string name="could_not_setup_download_menu">İndirme menüsü kurulamadı.</string>
|
||||
<string name="could_not_setup_download_menu">İndirme menüsü ayarlanamadı</string>
|
||||
<string name="open_in_popup_mode">Açılır pencere kipinde aç</string>
|
||||
<string name="popup_mode_share_menu_title">NewPipe Açılır pencere kipi</string>
|
||||
<string name="popup_mode_share_menu_title">NewPipe açılır pencere kipi</string>
|
||||
|
||||
<string name="default_popup_resolution_title">Öntanımlı açılır pencere çözünürlüğü</string>
|
||||
<string name="show_higher_resolutions_title">Daha yüksek çözünürlükleri göster</string>
|
||||
@ -141,7 +141,7 @@
|
||||
|
||||
<string name="list_thumbnail_view_description">Video ön izleme küçük resmi</string>
|
||||
<string name="use_old_player_title">Eski oynatıcıyı kullan</string>
|
||||
<string name="use_old_player_summary">Eski içe gömülü Mediaframework oynatıcısı.</string>
|
||||
<string name="use_old_player_summary">Eski içe gömülü Mediaframework oynatıcısı</string>
|
||||
|
||||
|
||||
<string name="short_thousand">K</string>
|
||||
@ -162,15 +162,15 @@
|
||||
<string name="refresh">Yenile</string>
|
||||
<string name="clear">Temizle</string>
|
||||
|
||||
<string name="popup_remember_size_pos_title">Açılır pencere boyutunu ve yerini hatırla</string>
|
||||
<string name="popup_remember_size_pos_summary">Açılır pencerenin ayarlandığı en son boyutu ve yeri hatırla</string>
|
||||
<string name="popup_remember_size_pos_title">Açılır pencere boyutunu ve yerini anımsa</string>
|
||||
<string name="popup_remember_size_pos_summary">Açılır pencerenin ayarlandığı son boyutu ve yeri anımsa</string>
|
||||
|
||||
<string name="settings_category_popup_title">Açılır Pencere</string>
|
||||
<string name="popup_resizing_indicator_title">Boyutlandırılıyor</string>
|
||||
|
||||
<string name="use_external_video_player_summary">Bu seçenek etkinken bazı çözünürlüklerin sesi olmayacak</string>
|
||||
<string name="player_gesture_controls_summary">Oynatıcının parlaklığını ve sesini yönetmek için el hareketlerini kullan</string>
|
||||
<string name="player_gesture_controls_title">Oynatıcı el hareketi kontrolleri</string>
|
||||
<string name="player_gesture_controls_title">Oynatıcı el hareketi denetimleri</string>
|
||||
<string name="show_search_suggestions_title">Arama önerileri</string>
|
||||
<string name="show_search_suggestions_summary">Ararken önerileri göster</string>
|
||||
|
||||
@ -186,10 +186,10 @@
|
||||
<string name="tab_about">Hakkında</string>
|
||||
<string name="tab_contributors">Katkıda bulunanlar</string>
|
||||
<string name="tab_licenses">Lisanslar</string>
|
||||
<string name="app_description">Android için hafif ücretsiz bir Youtube arayüzü.</string>
|
||||
<string name="view_on_github">Github\'da görüntüle</string>
|
||||
<string name="app_description">Android için özgür hafif bir YouTube arayüzü.</string>
|
||||
<string name="view_on_github">GitHub\'da gör</string>
|
||||
<string name="app_license_title">NewPipe\'ın Lisansı</string>
|
||||
<string name="contribution_encouragement">Fikirleriniz, çeviri, tasarım değişiklikleri olsun, kod temizliği, yada gerçek köklü kod değişikleri olsun, yardımınıza her zaman açığız. Daha çok yapıldıkça daha iyiye gider!</string>
|
||||
<string name="contribution_encouragement">Fikirleriniz; çeviri, tasarım değişiklikleri, kod temizliği, ya da gerçek köklü kod değişikleri olsun—yardımınıza her zaman açığız. Daha çok yapıldıkça daha iyiye gider!</string>
|
||||
<string name="read_full_license">Lisansı oku</string>
|
||||
<string name="contribution_title">Katkı</string>
|
||||
<string name="settings_category_downloads_title">İndirme</string>
|
||||
@ -200,4 +200,60 @@
|
||||
<string name="charset_letters_and_digits">Harfler ve rakamlar</string>
|
||||
<string name="charset_most_special_characters">Özel karakterlerin çoğu</string>
|
||||
|
||||
</resources>
|
||||
<string name="subscribe_button_title">Abone ol</string>
|
||||
<string name="subscribed_button_title">Abone olundu</string>
|
||||
<string name="channel_unsubscribed">Kanal aboneliğinden çıktınız</string>
|
||||
<string name="subscription_change_failed">Abonelik değiştirilemiyor</string>
|
||||
<string name="subscription_update_failed">Abonelik güncellenemiyor</string>
|
||||
|
||||
<string name="tab_main">Temel</string>
|
||||
<string name="tab_subscriptions">Abonelikler</string>
|
||||
|
||||
<string name="fragment_whats_new">Yenilikler Ne</string>
|
||||
|
||||
<string name="enable_search_history_title">Arama geçmişi</string>
|
||||
<string name="enable_search_history_summary">Arama sorgularını yerel olarak biriktir</string>
|
||||
<string name="enable_watch_history_title">Geçmiş</string>
|
||||
<string name="enable_watch_history_summary">İzlenen videoların kaydını tut</string>
|
||||
<string name="resume_on_audio_focus_gain_title">Odaklanıldığında sürdür</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">Kesilmelerden sonra (örn. telefon çağrıları) oynatmayı sürdür</string>
|
||||
<string name="settings_category_player_title">Oynatıcı</string>
|
||||
<string name="settings_category_player_behavior_title">Davranış</string>
|
||||
<string name="settings_category_history_title">Geçmiş</string>
|
||||
<string name="playlist">Oynatma listesi</string>
|
||||
<string name="undo">Geri al</string>
|
||||
|
||||
<string name="notification_channel_name">NewPipe Bildirimi</string>
|
||||
<string name="notification_channel_description">New Pipe Arka Plan ve Açılır Pencere Oynatıcıları için bildirimler</string>
|
||||
|
||||
<string name="search_no_results">Sonuç yok</string>
|
||||
<string name="empty_subscription_feed_subtitle">Burada Cırcır Böceklerinden Başka Şey Yok</string>
|
||||
|
||||
<string name="no_subscribers">Abone yok</string>
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s abone</item>
|
||||
<item quantity="other">%s abone</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Görüntüleme yok</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s görüntüleme</item>
|
||||
<item quantity="other">%s görüntüleme</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Video yok</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s video</item>
|
||||
<item quantity="other">%s video</item>
|
||||
</plurals>
|
||||
|
||||
<string name="title_activity_history">Geçmiş</string>
|
||||
<string name="title_history_search">Arandı</string>
|
||||
<string name="title_history_view">İzlendi</string>
|
||||
<string name="history_disabled">Geçmiş devre dışı</string>
|
||||
<string name="action_history">Geçmiş</string>
|
||||
<string name="history_empty">Geçmiş boş</string>
|
||||
<string name="history_cleared">Geçmiş temizlendi</string>
|
||||
<string name="item_deleted">Öge silindi</string>
|
||||
<string name="delete_item_search_history">Bu içeriği arama geçmişinden silmek istiyor musunuz?</string>
|
||||
</resources>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<string name="no_player_found">Không tìm thấy trình phát. Bạn có muốn cài đặt VLC?</string>
|
||||
<string name="install">Cài đặt</string>
|
||||
<string name="cancel">Hủy</string>
|
||||
<string name="open_in_browser">Mở trong teinhf duyệt</string>
|
||||
<string name="open_in_browser">Mở trong trình duyệt</string>
|
||||
<string name="open_in_popup_mode">Mở trong chế độ popup</string>
|
||||
<string name="share">Chia sẻ</string>
|
||||
<string name="download">Tải về</string>
|
||||
@ -179,4 +179,8 @@
|
||||
<string name="search_language_title">Ngôn ngữ nội dung ưu tiên</string>
|
||||
<string name="settings_category_video_audio_title">Video & Âm thanh</string>
|
||||
<string name="settings_category_popup_title">Bật lên</string>
|
||||
<string name="enable_watch_history_title">Lịch sử</string>
|
||||
<string name="settings_category_history_title">Lịch sử</string>
|
||||
<string name="playlist">Danh sách</string>
|
||||
<string name="search_no_results">Không tìm thấy</string>
|
||||
</resources>
|
||||
|
@ -194,7 +194,7 @@
|
||||
<!-- Missions -->
|
||||
<string name="start">Start</string>
|
||||
<string name="pause">Pause</string>
|
||||
<string name="view">View</string>
|
||||
<string name="view">Play</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="checksum">Checksum</string>
|
||||
|
||||
@ -265,4 +265,5 @@
|
||||
<string name="history_empty">The history is empty</string>
|
||||
<string name="history_cleared">History cleared</string>
|
||||
<string name="item_deleted">Item deleted</string>
|
||||
<string name="delete_item_search_history">Do you want to delete this item from search history?</string>
|
||||
</resources>
|
||||
|
@ -1,4 +1,4 @@
|
||||
package us.shandian.giga.get.get;
|
||||
package us.shandian.giga.get;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
@ -153,4 +153,34 @@ public class DownloadManagerImplTest {
|
||||
assertSame(missions.get(1), downloadManager.getMission(1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sortByTimestamp() throws Exception {
|
||||
ArrayList<DownloadMission> downloadMissions = new ArrayList<>();
|
||||
DownloadMission mission = new DownloadMission();
|
||||
mission.timestamp = 0;
|
||||
|
||||
DownloadMission mission1 = new DownloadMission();
|
||||
mission1.timestamp = Integer.MAX_VALUE + 1L;
|
||||
|
||||
DownloadMission mission2 = new DownloadMission();
|
||||
mission2.timestamp = 2L * Integer.MAX_VALUE ;
|
||||
|
||||
DownloadMission mission3 = new DownloadMission();
|
||||
mission3.timestamp = 2L * Integer.MAX_VALUE + 5L;
|
||||
|
||||
|
||||
downloadMissions.add(mission3);
|
||||
downloadMissions.add(mission1);
|
||||
downloadMissions.add(mission2);
|
||||
downloadMissions.add(mission);
|
||||
|
||||
|
||||
DownloadManagerImpl.sortByTimestamp(downloadMissions);
|
||||
|
||||
assertEquals(mission, downloadMissions.get(0));
|
||||
assertEquals(mission1, downloadMissions.get(1));
|
||||
assertEquals(mission2, downloadMissions.get(2));
|
||||
assertEquals(mission3, downloadMissions.get(3));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user