diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java index d6684b3dd..d57443261 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java @@ -82,7 +82,11 @@ public class EhEngine { private static final Pattern PATTERN_NEED_HATH_CLIENT = Pattern.compile("(You must have a H@H client assigned to your account to use this feature\\.)"); - public static void initialize() { } + public static EhFilter sEhFilter; + + public static void initialize() { + sEhFilter = EhFilter.getInstance(); + } private static void doThrowException(Call call, int code, @Nullable Headers headers, @Nullable String body, Throwable e) throws Throwable { @@ -170,6 +174,18 @@ public class EhEngine { } private static void fillGalleryList(@Nullable EhClient.Task task, OkHttpClient okHttpClient, List list, String url, boolean filter) throws Throwable { + // Filter title and uploader + if (filter) { + for (int i = 0, n = list.size(); i < n; i++) { + GalleryInfo info = list.get(i); + if (!sEhFilter.filterTitle(info) || !sEhFilter.filterUploader(info)) { + list.remove(i); + i--; + n--; + } + } + } + boolean hasTags = false; boolean hasPages = false; boolean hasRated = false; @@ -185,11 +201,25 @@ public class EhEngine { } } - boolean needApi = (Settings.getShowGalleryPages() && !hasPages) || hasRated; + boolean needApi = (filter && sEhFilter.needTags() && !hasTags) || + (Settings.getShowGalleryPages() && !hasPages) || + hasRated; if (needApi) { fillGalleryListByApi(task, okHttpClient, list, url); } + // Filter tag + if (filter) { + for (int i = 0, n = list.size(); i < n; i++) { + GalleryInfo info = list.get(i); + if (!sEhFilter.filterTag(info) || !sEhFilter.filterTagNamespace(info)) { + list.remove(i); + i--; + n--; + } + } + } + for (GalleryInfo info : list) { info.thumb = EhUrl.getFixedPreviewThumbUrl(info.thumb); } diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhFilter.java b/app/src/main/java/com/hippo/ehviewer/client/EhFilter.java index cecbeea68..0ce586e03 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhFilter.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Hippo Seven + * Copyright 2016 Hippo Seven * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,11 @@ package com.hippo.ehviewer.client; import android.util.Log; + import com.hippo.ehviewer.EhDB; +import com.hippo.ehviewer.client.data.GalleryInfo; import com.hippo.ehviewer.dao.Filter; + import java.util.ArrayList; import java.util.List; @@ -87,4 +90,192 @@ public final class EhFilter { public List getTagNamespaceFilterList() { return mTagNamespaceFilterList; } + + public synchronized void addFilter(Filter filter) { + // enable filter by default before it is added to database + filter.enable = true; + EhDB.addFilter(filter); + + switch (filter.mode) { + case MODE_TITLE: + filter.text = filter.text.toLowerCase(); + mTitleFilterList.add(filter); + break; + case MODE_UPLOADER: + mUploaderFilterList.add(filter); + break; + case MODE_TAG: + filter.text = filter.text.toLowerCase(); + mTagFilterList.add(filter); + break; + case MODE_TAG_NAMESPACE: + filter.text = filter.text.toLowerCase(); + mTagNamespaceFilterList.add(filter); + break; + default: + Log.d(TAG, "Unknown mode: " + filter.mode); + break; + } + } + + public synchronized void triggerFilter(Filter filter) { + EhDB.triggerFilter(filter); + } + + public synchronized void deleteFilter(Filter filter) { + EhDB.deleteFilter(filter); + + switch (filter.mode) { + case MODE_TITLE: + mTitleFilterList.remove(filter); + break; + case MODE_UPLOADER: + mUploaderFilterList.remove(filter); + break; + case MODE_TAG: + mTagFilterList.remove(filter); + break; + case MODE_TAG_NAMESPACE: + mTagNamespaceFilterList.remove(filter); + break; + default: + Log.d(TAG, "Unknown mode: " + filter.mode); + break; + } + } + + public synchronized boolean needTags() { + return 0 != mTagFilterList.size() || 0 != mTagNamespaceFilterList.size(); + } + + public synchronized boolean filterTitle(GalleryInfo info) { + if (null == info) { + return false; + } + + // Title + String title = info.title; + List filters = mTitleFilterList; + if (null != title && filters.size() > 0) { + for (int i = 0, n = filters.size(); i < n; i++) { + if (filters.get(i).enable && title.contains(filters.get(i).text)) { + return false; + } + } + } + + return true; + } + + public synchronized boolean filterUploader(GalleryInfo info) { + if (null == info) { + return false; + } + + // Uploader + String uploader = info.uploader; + List filters = mUploaderFilterList; + if (null != uploader && filters.size() > 0) { + for (int i = 0, n = filters.size(); i < n; i++) { + if (filters.get(i).enable && uploader.equals(filters.get(i).text)) { + return false; + } + } + } + + return true; + } + + private boolean matchTag(String tag, String filter) { + if (null == tag || null == filter) { + return false; + } + + String tagNamespace; + String tagName; + String filterNamespace; + String filterName; + int index = tag.indexOf(':'); + if (index < 0) { + tagNamespace = null; + tagName = tag; + } else { + tagNamespace = tag.substring(0, index); + tagName = tag.substring(index + 1); + } + index = filter.indexOf(':'); + if (index < 0) { + filterNamespace = null; + filterName = filter; + } else { + filterNamespace = filter.substring(0, index); + filterName = filter.substring(index + 1); + } + + if (null != tagNamespace && null != filterNamespace && + !tagNamespace.equals(filterNamespace)) { + return false; + } + if (!tagName.equals(filterName)) { + return false; + } + + return true; + } + + public synchronized boolean filterTag(GalleryInfo info) { + if (null == info) { + return false; + } + + // Tag + String[] tags = info.simpleTags; + List filters = mTagFilterList; + if (null != tags && filters.size() > 0) { + for (String tag: tags) { + for (int i = 0, n = filters.size(); i < n; i++) { + if (filters.get(i).enable && matchTag(tag, filters.get(i).text)) { + return false; + } + } + } + } + + return true; + } + + private boolean matchTagNamespace(String tag, String filter) { + if (null == tag || null == filter) { + return false; + } + + String tagNamespace; + int index = tag.indexOf(':'); + if (index >= 0) { + tagNamespace = tag.substring(0, index); + return tagNamespace.equals(filter); + } else { + return false; + } + } + + public synchronized boolean filterTagNamespace(GalleryInfo info) { + if (null == info) { + return false; + } + + String[] tags = info.simpleTags; + List filters = mTagNamespaceFilterList; + if (null != tags && filters.size() > 0) { + for (String tag: tags) { + for (int i = 0, n = filters.size(); i < n; i++) { + if (filters.get(i).enable && matchTagNamespace(tag, filters.get(i).text)) { + return false; + } + } + } + } + + return true; + } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/FilterActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/FilterActivity.java index ace569c12..068641afb 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/FilterActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/FilterActivity.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Hippo Seven + * Copyright 2016 Hippo Seven * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,21 +16,24 @@ package com.hippo.ehviewer.ui; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; +import android.content.DialogInterface; import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.text.TextUtils; +import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.EditText; import android.widget.ImageView; +import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.snackbar.Snackbar; +import com.google.android.material.textfield.TextInputLayout; import com.hippo.easyrecyclerview.EasyRecyclerView; import com.hippo.ehviewer.R; import com.hippo.ehviewer.client.EhFilter; @@ -100,17 +103,119 @@ public class FilterActivity extends ToolbarActivity { mFilterList = null; } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + getMenuInflater().inflate(R.menu.activity_filter, menu); + return true; + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; + case R.id.action_add: + showAddFilterDialog(); + return true; + case R.id.action_tip: + showTipDialog(); + return true; default: return super.onOptionsItemSelected(item); } } + private void showTipDialog() { + new AlertDialog.Builder(this) + .setTitle(R.string.filter) + .setMessage(R.string.filter_tip) + .show(); + } + + private void showAddFilterDialog() { + AlertDialog dialog = new AlertDialog.Builder(this) + .setTitle(R.string.add_filter) + .setView(R.layout.dialog_add_filter) + .setPositiveButton(R.string.add, null) + .show(); + AddFilterDialogHelper helper = new AddFilterDialogHelper(); + helper.setDialog(dialog); + } + + private void showDeleteFilterDialog(final Filter filter) { + String message = getString(R.string.delete_filter, filter.text); + new AlertDialog.Builder(this) + .setMessage(message) + .setPositiveButton(R.string.delete, (dialog, which) -> { + if (DialogInterface.BUTTON_POSITIVE != which || null == mFilterList) { + return; + } + mFilterList.delete(filter); + if (null != mAdapter) { + mAdapter.notifyDataSetChanged(); + } + updateView(true); + }).show(); + } + + private class AddFilterDialogHelper implements View.OnClickListener { + + @Nullable + private AlertDialog mDialog; + @Nullable + private Spinner mSpinner; + @Nullable + private TextInputLayout mInputLayout; + @Nullable + private EditText mEditText; + + public void setDialog(AlertDialog dialog) { + mDialog = dialog; + mSpinner = (Spinner) ViewUtils.$$(dialog, R.id.spinner); + mInputLayout = (TextInputLayout) ViewUtils.$$(dialog, R.id.text_input_layout); + mEditText = mInputLayout.getEditText(); + View button = dialog.getButton(DialogInterface.BUTTON_POSITIVE); + if (null != button) { + button.setOnClickListener(this); + } + } + + @Override + public void onClick(View v) { + if (null == mFilterList || null == mDialog || null == mSpinner || + null == mInputLayout || null == mEditText) { + return; + } + + String text = mEditText.getText().toString().trim(); + if (TextUtils.isEmpty(text)) { + mInputLayout.setError(getString(R.string.text_is_empty)); + return; + } else { + mInputLayout.setError(null); + } + int mode = mSpinner.getSelectedItemPosition(); + + Filter filter = new Filter(); + filter.mode = mode; + filter.text = text; + mFilterList.add(filter); + + if (null != mAdapter) { + mAdapter.notifyDataSetChanged(); + } + updateView(true); + + mDialog.dismiss(); + mDialog = null; + mSpinner = null; + mInputLayout = null; + mEditText = null; + } + } + private class FilterHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private final TextView text; @@ -124,14 +229,27 @@ public class FilterActivity extends ToolbarActivity { if (null != icon) { icon.setOnClickListener(this); } + // click on the filter text to enable/disable it + text.setOnClickListener(this); } @Override public void onClick(View v) { - ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - if (clipboard != null) { - clipboard.setPrimaryClip(ClipData.newPlainText("filter", text.getText().toString())); - Snackbar.make(v, R.string.copied_to_clipboard, 3000).show(); + int position = getAdapterPosition(); + if (position < 0 || null == mFilterList) { + return; + } + Filter filter = mFilterList.get(position); + if (FilterList.MODE_HEADER != filter.mode) { + if (v instanceof ImageView) { + showDeleteFilterDialog(filter); + } else if (v instanceof TextView) { + mFilterList.trigger(filter); + + //for updating delete line on filter text + mAdapter.notifyItemChanged(getAdapterPosition()); + } + } } } @@ -167,7 +285,14 @@ public class FilterActivity extends ToolbarActivity { break; } - return new FilterHolder(getLayoutInflater().inflate(layoutId, parent, false)); + FilterHolder holder = new FilterHolder(getLayoutInflater().inflate(layoutId, parent, false)); + + if (R.layout.item_filter == layoutId) { + holder.icon.setImageDrawable( + DrawableManager.getVectorDrawable(FilterActivity.this, R.drawable.v_delete_x24)); + } + + return holder; } @Override @@ -315,5 +440,17 @@ public class FilterActivity extends ToolbarActivity { throw new IndexOutOfBoundsException(); } + + public void add(Filter filter) { + mEhFilter.addFilter(filter); + } + + public void delete(Filter filter) { + mEhFilter.deleteFilter(filter); + } + + public void trigger(Filter filter) { + mEhFilter.triggerFilter(filter); + } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java index 3ba20636a..616d204d9 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java @@ -67,6 +67,7 @@ import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.UrlOpener; import com.hippo.ehviewer.client.EhCacheKeyFactory; import com.hippo.ehviewer.client.EhClient; +import com.hippo.ehviewer.client.EhFilter; import com.hippo.ehviewer.client.EhRequest; import com.hippo.ehviewer.client.EhTagDatabase; import com.hippo.ehviewer.client.EhUrl; @@ -80,6 +81,7 @@ import com.hippo.ehviewer.client.data.PreviewSet; import com.hippo.ehviewer.client.exception.NoHAtHClientException; import com.hippo.ehviewer.client.parser.RateGalleryParser; import com.hippo.ehviewer.dao.DownloadInfo; +import com.hippo.ehviewer.dao.Filter; import com.hippo.ehviewer.ui.CommonOperations; import com.hippo.ehviewer.ui.GalleryActivity; import com.hippo.ehviewer.ui.MainActivity; @@ -480,6 +482,8 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene mDownload.setOnLongClickListener(this); mRead.setOnClickListener(this); + mUploader.setOnLongClickListener(this); + mBelowHeader = mainView.findViewById(R.id.below_header); View belowHeader = mBelowHeader; @@ -1319,6 +1323,51 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene } } + private void showFilterUploaderDialog() { + Context context = getContext2(); + String uploader = getUploader(); + if (context == null || uploader == null) { + return; + } + + new AlertDialog.Builder(context) + .setMessage(getString(R.string.filter_the_uploader, uploader)) + .setPositiveButton(android.R.string.ok, (dialog, which) -> { + if (which != DialogInterface.BUTTON_POSITIVE) { + return; + } + + Filter filter = new Filter(); + filter.mode = EhFilter.MODE_UPLOADER; + filter.text = uploader; + EhFilter.getInstance().addFilter(filter); + + showTip(R.string.filter_added, LENGTH_SHORT); + }).show(); + } + + private void showFilterTagDialog(String tag) { + Context context = getContext2(); + if (context == null) { + return; + } + + new AlertDialog.Builder(context) + .setMessage(getString(R.string.filter_the_tag, tag)) + .setPositiveButton(android.R.string.ok, (dialog, which) -> { + if (which != DialogInterface.BUTTON_POSITIVE) { + return; + } + + Filter filter = new Filter(); + filter.mode = EhFilter.MODE_TAG; + filter.text = tag; + EhFilter.getInstance().addFilter(filter); + + showTip(R.string.filter_added, LENGTH_SHORT); + }).show(); + } + private void showTagDialog(final String tag) { final Context context = getContext2(); if (null == context) { @@ -1335,14 +1384,14 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene new AlertDialog.Builder(context) .setTitle(tag) - .setItems(R.array.tag_menu_entries, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case 0: - UrlOpener.openUrl(context, EhUrl.getTagDefinitionUrl(tag2), false); - break; - } + .setItems(R.array.tag_menu_entries, (dialog, which) -> { + switch (which) { + case 0: + UrlOpener.openUrl(context, EhUrl.getTagDefinitionUrl(tag2), false); + break; + case 1: + showFilterTagDialog(tag); + break; } }).show(); } @@ -1354,7 +1403,9 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene return false; } - if (mDownload == v) { + if (mUploader == v) { + showFilterUploaderDialog(); + } else if (mDownload == v) { GalleryInfo galleryInfo = getGalleryInfo(); if (galleryInfo != null) { CommonOperations.startDownload(activity, galleryInfo, true); diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7e27908f4..97a62b329 100755 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -141,8 +141,6 @@ Aus Favoriten entfernt Fehler beim Hinzufügen zu Favoriten Fehler beim Entfernen aus Favoriten - Den Uploader \"%s\" zu die Filterliste hinzufügen? - Der Filter wurde hinzugefügt EIN MEISTERSTÜCK WUNDERVOLL SEHR GUT @@ -243,22 +241,13 @@ Deiner Lesungsverlauf wird hier angezeigt. Verlaufdaten löschen Verlaufdaten löschen? - Filter - Filter werden hier angezeigt Titel Uploader Etikett Namensraum der Etikett - Titelfilter %s löschen? - Uploaderfilter %s löschen? - Etikettfilter %s löschen? - Filter %s löschen? Hinweis - Filter erstellen Definition anzeigen - Filtertext Normale Suche: Nur durchsuchen.\n\nUploader spezifizieren: Die Galerie, die vom Uploader hochgeladen ist, auflisten. Andere Optionen werden ignoriert.\n\nEtikett spezifizieren: Die Galerie, die das Etikett hat, auflisten. Nur ein Etikett kann eingegeben werden. Andere Optionen werden ignoriert. - Titelfilter: die Galerie, deren Titel das Wort enthalten, ausschließen.\n\nUploaderfilter: Die vom Uploader hochgeladen Galerie ausschließen.\n\nEtikettfilter: Die Galerie, die die Etikett haben, ausschließen. Es wird länger dauern, Galerieliste zu laden.\n\nEtikettnamensraumfilter: Die Galerie, die den Etikettnamensraum haben, ausschließen. Es wird länger dauern, Galerieliste zu laden. Sperrmuster festlegen Zeichne ein Muster, um es als Sperrmuster festzulegen.\nLasse frei, um das Sperrmuster zu entfernen. Festlegen @@ -318,7 +307,6 @@ Ausgeschlossene Namensraum-Etiketten Galerie in der ausgeschlossenen Namensraum werden vom Standard-Etikett-Suchen versteckt Japanische Titel anzeigen - Filter Achtung auf mobile Daten anzeigen Lesen Richtung des Bildschirms diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 07c353baf..52df19ece 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -195,8 +195,6 @@ Eliminado de favoritos No se ha podido agregar a favoritos Error al borrar de favoritos - ¿Añadir el uploader \"%s\" a la lista de filtros? - Filtro añadido OBRA MAESTRA @@ -306,21 +304,12 @@ ¿Limpiar historial? - Filtros - Los filtros se muestran acá Título Uploader Etiqueta Etiqueta de espacio de nombres - ¿Eliminar filtro de título \"%s\"? - ¿Eliminar filtro de uploader \"%s\"? - ¿Eliminar filtro de etiquetas \"%s\"? - ¿Eliminar filtro \"%s\"? Sugerencia - Añadir filtro Mostrar definición - Filtro de texto - Filtro de título: excluye la galería cuyo título contiene la palabra.\n\nFiltro de uploader: excluye las galerías subidas por el uploader.\n\nFiltro de etiquetas: excluye la galería que contiene la etiqueta, toma más tiempo para cargar la lista de galerías.\n\nFiltro de etiqueta de nombre de espacio: excluye la galería que contiene el espacio de nombres de la etiqueta, toma más tiempo para cargar la lista de galerías. Establecer protección por patrón @@ -369,7 +358,6 @@ Mostrar títulos en japonés Mostrar número de páginas de la galería Se verá cuántas páginas tiene una galería - Filtros Advertencia de redes moviles Lectura diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f0d8100d3..f197cbe66 100755 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -207,8 +207,6 @@ Retirer de favoris Impossible de l\'ajouter à favoris Impossible de la retirer de favoris - Ajouter l\'uploader \"%s\" à la liste de filtre ? - Filter added CHEF-D\'ŒUVRE @@ -325,21 +323,12 @@ Effacer toute l\'historique ? - Filtre - Vos filtres s\'afficheront ici Titre Uploader Tag Espace de nom de tag - Supprimer le filtre de titre \"%s\" ? - Supprimer le filtre d\'uploader \"%s\" ? - Supprimer le filtre de tag \"%s\" ? - Supprimer le filtre \"%s\" ? Astuce - Ajouter le filtre Montrer expliques - Texte du filtre - Filtre de titre : exclure les galeries dont le titre contient le mot.\n\nFiltre d\'uploader : exclure les galerie mises en ligne par cet uploader.\n\nFiltre de tag : exclure les galeries qui ont ce tag. Il vas prendre plus de temps pour charger la liste.\n\nFiltre d\'espace de nom de tag : exclure les galeries qui ont cette espace de nom de tag. Il vas prendre plus de temps pour charger la liste. Définir le modéle de déverrouillage @@ -392,7 +381,6 @@ Espaces de nom de tag exclues Exclure espaces de nom spécifiées de une recherche de tag par défaut Montrer les titres japonais - Filtre Avertissement de données mobiles Lecture diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f58b66bfa..a13bbaa44 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -206,8 +206,6 @@ お気に入りから削除しました。 お気に入りに追加失敗しました。 お気に入りからの削除に失敗しました。 - アップローダフィルター「%s」を追加しますか? - フィルターが追加されました。 良すぎてたまらない @@ -323,20 +321,12 @@ 閲覧履歴をすべて削除しますか? - フィルター タイトル アップローダ タグ タグの名前空間 - タイトル フィルター「%s」を削除しますか? - アップローダ フィルター「%s」を削除しますか? - タグ フィルター「%s」を削除しますか? - フィルター「%s」を削除しますか? ヒント - フィルターを追加 ヘルプを表示 - フィルターテキスト - タイトルフィルター:タイトルにキーワードがあるギャラリーを除外します。\n\nアップローダ:このアップローダがアップロードしたギャラリーを除外します。\n\nタグフィルター:このタグを含むギャラリーを除外します。ギャラリーリストを取得するのにもっと時間がかかります。\n\nタグセットフィルター:このタグセットを含むギャラリーを除外します。ギャラリーリストを取得するのにもっと時間がかかります。 パターン保護を設定 @@ -390,7 +380,6 @@ 言語を除外 指定した言語のギャラリーをホームページと検索から隠す 日本語タイトルを表示 - フィルター モバイルネットワーク警告 閲覧 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 98ba087b8..56c9b6807 100755 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -214,8 +214,6 @@ 즐겨찾기에서 제거했습니다. 즐겨찾기에 추가하지 못했습니다. 즐겨찾기에서 제거하지 못했습니다. - 필터 목록에 \"%s\" 업로더를 추가하시겠습니까? - 필터 추가됨 갤러리 정보 @@ -319,21 +317,12 @@ 모든 방문 기록을 지우시겠습니까? - 필터 - 필터가 여기에 표시됩니다. 제목 업로더 태그 태그 네임스페이스 - \"%s\" 제목 필터를 삭제하시겠습니까? - \"%s\" 업로더 필터를 삭제하시겠습니까? - \"%s\" 태그 필터를 삭제하시겠습니까? - \"%s\" 필터를 삭제하시겠습니까? 팁 - 필터 추가 정의 표시 - 텍스트 필터 - 제목 필터: 제목에 해당 단어를 포함한 갤러리를 제외합니다.\n\n업로더 필터: 해당 업로더가 업로드한 갤러리를 제외합니다.\n\n태그 필터: 해당 태그를 포함한 갤러리를 제외합니다. 갤러리 목록을 불러오는 데 시간이 좀 더 걸립니다.\n\n태그 네임스페이스 필터: 해당 태그 네임스페이스를 포함한 갤러리를 제외합니다. 갤러리 목록을 불러오는 데 시간이 좀 더 걸립니다. 패턴 보호 사용 @@ -413,7 +402,6 @@ 영어 태그 대신 번역된 태그를 표시합니다. 데이터 파일을 다운로드하는데 시간이 걸립 수 있습니다. Placeholder https://placeholder - 필터 모바일 데이터 경고 읽기 diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 82c025a7c..478bb22cd 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -216,8 +216,6 @@ ลบออกจากรายการโปรดแล้ว เกิดความล้มเหลวในการเพิ่มเข้าในรายการโปรด เกิดข้อล้มเหลวในการลบออกจากรายการโปรด - เพิ่มชื้อผู้อัพโหลด \"%s\" เข้าในตัวกรองลิสต์ไหม? - ตัวกรองถูกเพิ่มแล้ว นี้มันผลงานมาสเตอร์พีคชัดๆ! @@ -334,21 +332,12 @@ จะลบประวัติทั้งหมดเลยหรือไม่? - ตัวกรอง - ตัวกรองจะอยู่ตรงนี้ ชื่อเรื่อง ผู้อัพโหลด แท็ก ชื่อของแท็ก - จะลบตัวกรองแท็ก \"%s\" หรือไม่? - จะลบตัวกรองผู้อัพโหลด \"%s\" หรือไม่? - จะลบตัวกรองแท็ก \"%s\" หรือไม่? - จะลบตัวกรอง \"%s\" หรือไม่? คำแนะนำ - เพิ่มตัวกรอง แสดงความหมาย - ตัวกรองข้อความ - ตัวกรองชื่อเรื่อง: จะไม่แสดงแกลเลอรี่ที่มีคำเหล่านี้ให้เห็น\n\nตัวกรองผู้อัพโหลด: จะไม่แสดงแกลเลอรี่ที่ผู้อัพโหลดที่ถูกกรองได้อัพโหลดไว้\n\nตัวกรองแท็ก: จะไม่แสดงแกลเลอรี่ที่มีแท็กเหล่านี้ อาจจะใช้เวลาในการแยกออกจากรายการแกลเลอรี่\n\nตัวกรองแท็กเนมสเปซ: จะไม่แสดงแกลเลอรี่ที่เนมสเปซของแท็กนี้ อาจจะใช้เวลาในการแยกออกจากรายการแกลเลอรี่ ตั้้งการป้องกันแบบรูปแบบ @@ -431,7 +420,6 @@ แสดงแท็กการแปลภาษาแทนที่ข้อความต้นฉบับ (อาจใช้เวลามากขึ้นเพื่อดาวน์โหลดไฟล์ข้อมูล) Placeholder https://placeholder - ตัวกรอง เตือนการใช้เครือข่ายมือถือ การอ่าน diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 71ca11523..aad560bac 100755 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -229,8 +229,9 @@ 移除收藏 添加收藏失败 移除收藏失败 - 添加上传者过滤项“%s”? - 已添加过滤项 + 屏蔽上传者“%s”? + 屏蔽标签“%s”? + 已添加屏蔽项 根本把持不住 @@ -347,21 +348,18 @@ 清除所有阅读历史? - 过滤 - 这里是过滤列表 + 屏蔽画廊 + 这里是屏蔽列表 标题 上传者 标签 标签组 - 删除标题过滤项“%s”? - 删除上传者过滤项“%s”? - 删除标签过滤项“%s”? - 删除过滤项“%s”? + 删除屏蔽项“%s”? 提示 - 添加过滤项 + 添加屏蔽项 查看定义 - 过滤项文本 - 标题过滤项:排除标题含有该关键字的画廊。\n\n上传者过滤项:排除该上传者上传的画廊。\n\n标签过滤项:排除包含该标签的画廊,这会使获取画廊列表花费更多时间。\n\n标签组过滤项:排除包含该标签组的画廊,这会使获取画廊列表花费更多时间。 + 屏蔽项文本 + 该屏蔽系统会在 EHentai 网站屏蔽系统的基础上继续屏蔽画廊。\n\n标题屏蔽项:排除标题含有该关键字的画廊。\n\n上传者屏蔽项:排除该上传者上传的画廊。\n\n标签屏蔽项:排除包含该标签的画廊,这会使获取画廊列表花费更多时间。\n\n标签组屏蔽项:排除包含该标签组的画廊,这会使获取画廊列表花费更多时间。 设置图案保护 @@ -452,8 +450,8 @@ 显示翻译后的标签而非原始文字(需花费时间来下载数据文件) 补充翻译(由 EhTagTranslator 提供) https://github.com/Mapaler/EhTagTranslator/wiki - 过滤(已失效) - 请使用 EHentai 网站提供的过滤系统。查看 EHentai 设置 与 我的标签 + 屏蔽画廊 + 根据标题、上传者、标签屏蔽画廊 移动网络警告 阅读 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index c6fe2dfb9..22ed36ce6 100755 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -229,8 +229,9 @@ 移除收藏 添加收藏失敗 移除收藏失敗 - 添加上傳者過濾項“%s”? - 已添加過濾項 + 遮蔽上傳者“%s”? + 遮蔽標籤“%s”? + 已新增遮蔽項 根本把持不住 @@ -347,21 +348,18 @@ 清除所有閲讀歷史? - 過濾 - 這裏是過濾列表 + 屏蔽畫廊 + 這裏是屏蔽列表 標題 上傳者 標籤 標籤組 - 刪除標題過濾項“%s”? - 刪除上傳者過濾項“%s”? - 刪除標籤過濾項“%s”? - 刪除過濾項“%s”? + 刪除屏蔽項“%s”? 提示 - 添加過濾項 + 添加屏蔽項 查看定義 - 過濾項文本 - 標題過濾項:排除標題含有該關鍵字的畫廊。\n\n上傳者過濾項:排除該上傳者上傳的畫廊。\n\n標籤過濾項:排除包含該標籤的畫廊,這會使獲取畫廊列表花費更多時間。\n\n標籤組過濾項:排除包含該標籤組的畫廊,這會使獲取畫廊列表花費更多時間。 + 屏蔽項文本 + 該屏蔽系統會在 EHentai 網站屏蔽系統的基礎上繼續屏蔽畫廊。\n\n標題屏蔽項:排除標題含有該關鍵字的畫廊。\n\n上傳者屏蔽項:排除該上傳者上傳的畫廊。\n\n標籤屏蔽項:排除包含該標籤的畫廊,這會使獲取畫廊列表花費更多時間。\n\n標籤組屏蔽項:排除包含該標籤組的畫廊,這會使獲取畫廊列表花費更多時間。 設置圖案保護 @@ -451,8 +449,8 @@ 顯示翻譯後的標籤而非原始文字(需花費時間來下載數據文件) 補充翻譯(由 EhTagTranslator 提供) https://github.com/Mapaler/EhTagTranslator/wiki - 過濾(已失效) - 請使用 EHentai 網站提供的過濾系統。查看 EHentai 設置 與 我的標籤 + 屏蔽畫廊 + 根據標題、上傳者、標籤屏蔽畫廊 移動網絡警告 閲讀 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ab44cf90f..fd69ce061 100755 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -141,7 +141,7 @@ 指定標籤 啟用進階選項 - 一般搜尋:就是搜尋。\n\n訂閱搜素:在訂閱中搜索。\n\n指定上傳者:列出該上傳者上傳的畫廊。其他選項會被忽略。\n\n指定標籤:列出含有該標籤的畫廊。其他選項會被忽略。 + 一般搜尋:就是搜尋。\n\n訂閱搜素:在訂閱中搜索。\n\n指定上傳者:列出該上傳者上傳的圖庫。其他選項會被忽略。\n\n指定標籤:列出含有該標籤的圖庫。其他選項會被忽略。 搜尋圖庫 搜尋圖庫的標籤 @@ -229,7 +229,7 @@ 從收藏中移除 無法新增至收藏 無法從收藏中移除 - 把上傳者“%s”加入濾除列表? + 把上傳者“%s”加入濾除列表? 已經新增篩選條件 @@ -347,21 +347,18 @@ 清除所有歷史紀錄? - 篩選器 - 篩選列表將會顯示在這裡 + 遮蔽圖庫 + 這裡是遮蔽列表 標題 上傳者 標籤 - 標籤命名空間 - 要將標題篩選項目“%s”移除嗎? - 要將上傳者篩選項目“%s”移除嗎? - 要將標籤篩選項目“%s”移除嗎? - 要將篩選項目“%s”嗎? + 標籤組 + 刪除遮蔽項“%s”? 提示 - 新增篩選條件 + 新增遮蔽項 檢視定義 - 篩選文字 - 標題篩選:排除標題含有該關鍵字的圖庫。\n\n上傳者篩選:排除該上傳者上傳的圖庫。\n\n標籤篩選:排除包含該標籤的圖庫,這會使獲取圖庫列表花費更多時間。\n\n標籤命名空間篩選:排除包含該標籤命名空間(標籤標題)的圖庫,這會使獲取圖庫列表花費更多時間。 + 遮蔽項文字 + 該遮蔽系統會在 EHentai 網站遮蔽系統的基礎上繼續遮蔽圖庫。\n\n標題遮蔽項:排除標題含有該關鍵字的圖庫。\n\n上傳者遮蔽項:排除該上傳者上傳的圖庫。\n\n標籤遮蔽項:排除包含該標籤的圖庫,這會使獲取圖庫列表花費更多時間。\n\n標籤組遮蔽項:排除包含該標籤組的圖庫,這會使獲取圖庫列表花費更多時間。 設定圖形解鎖 @@ -451,8 +448,8 @@ 顯示翻譯後的標籤而非原始文字(需花費時間來下載資料檔案) 補充翻譯(由 EhTagTranslator 提供) https://github.com/Mapaler/EhTagTranslator/wiki - 篩選(已失效) - 請使用 EHentai 網站提供的過濾系統。檢視 EHentai 設定 與 我的標籤 + 遮蔽圖庫 + 根據標題、上傳者、標籤遮蔽圖庫 行動數據警告 閱讀 @@ -696,6 +693,6 @@ 隱私 不允許螢幕擷取 啟用後,將無法對本程式進行螢幕擷取,同時,將不會在系統任務切換器中顯示該程式的預覽內容\n\n重新啟動本程式以套用此變更 - 收藏畫廊 + 收藏圖庫 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6c082606a..c2a2c5426 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -272,8 +272,9 @@ Removed from favorites Failed to add to favorites Failed to remove from favorites - Add the uploader \"%s\" to filter list? - Filter added + Block the uploader \"%s\"? + Block the tag \"%s\"? + Blocker added MASTERPIECE @@ -391,21 +392,18 @@ Clear all history? - Filter - Filters will be shown here + Block gallery + Blockers will be shown here Title Uploader Tag Tag namespace - Delete title filter \"%s\"? - Delete uploader filter \"%s\"? - Delete tag filter \"%s\"? - Delete filter \"%s\"? + Delete blocker \"%s\"? Tip - Add filter + Add blocker Show definition - Filter text - Title Filter: exclude the gallery whose title contains the word.\n\nUploader Filter: exclude the gallery which was uploaded by the uploader.\n\nTag Filter: exclude the gallery which contain the tag, it takes more time to get gallery list.\n\nTag Namespace Filter: exclude the gallery which contain the tag namespace, it takes more time to get gallery list. + Blocker text + This blocking system filters the result of EHentai website blocking system.\n\nTitle Blocker: exclude the gallery whose title contains the word.\n\nUploader Blocker: exclude the gallery which was uploaded by the uploader.\n\nTag Blocker: exclude the gallery which contain the tag, it takes more time to get gallery list.\n\nTag Namespace Blocker: exclude the gallery which contain the tag namespace, it takes more time to get gallery list. Set pattern protection @@ -495,8 +493,8 @@ Show tag translations instead of the original text (It takes time to download the data file) Placeholder https://placeholder - Filter (Invalid) - Please use the filter system provided by EHentai website. Check EHentai settings and My tags + Block gallery + Block gallery by title, uploader and tags Cellular network warning Read