Browse Source

Add more unicity criteria based on title and/or content (#7789)

* Add more unicity criteria based on title and/or content
https://github.com/FreshRSS/FreshRSS/discussions/7788

* More
Alexandre Alapetite 8 months ago
parent
commit
1f8273803f

+ 6 - 0
app/Models/Feed.php

@@ -661,6 +661,12 @@ class FreshRSS_Feed extends Minz_Model {
 			'sha1:link_published'               => sha1($item->get_permalink() . $item->get_date('U')),
 			'sha1:link_published_title'         => sha1($item->get_permalink() . $item->get_date('U') . $item->get_title()),
 			'sha1:link_published_title_content' => sha1($item->get_permalink() . $item->get_date('U') . $item->get_title() . $item->get_content()),
+			'sha1:title'                        => sha1($item->get_title() ?? ''),
+			'sha1:title_published'              => sha1($item->get_title() . $item->get_date('U')),
+			'sha1:title_published_content'      => sha1($item->get_title() . $item->get_date('U') . $item->get_content()),
+			'sha1:content'                      => sha1($item->get_content() ?? ''),
+			'sha1:content_published'            => sha1($item->get_content() . $item->get_date('U')),
+			'sha1:published'                    => sha1((string)($item->get_date('U') ?? '')),
 			default => $entryId,
 		};
 

+ 6 - 0
app/i18n/cs/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'Adresa URL kanálu',
 		'useragent' => 'Nastavte uživatelský agent pro načítání tohoto kanálu',

+ 6 - 0
app/i18n/de/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant für defekte Feeds.<br />⚠️ Änderungen werden Duplikate erzeugen.',
 			'id' => 'Standard ID (Standardeinstellung)',
 			'link' => 'Link',	// IGNORE
+			'sha1:content' => 'Inhalt',
+			'sha1:content_published' => 'Inhalt + Datum',
 			'sha1:link_published' => 'Link + Datum',
 			'sha1:link_published_title' => 'Link + Datum + Titel',
 			'sha1:link_published_title_content' => 'Link + Datum + Titel + Inhalt',
+			'sha1:published' => 'Datum',
+			'sha1:title' => 'Titel',
+			'sha1:title_published' => 'Titel + Datum',
+			'sha1:title_published_content' => 'Titel + Datum + Inhalt',
 		),
 		'url' => 'Feed-URL',
 		'useragent' => 'Browser User Agent für den Abruf des Feeds verwenden',

+ 6 - 0
app/i18n/el/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'Feed URL',	// TODO
 		'useragent' => 'Set the user agent for fetching this feed',	// TODO

+ 6 - 0
app/i18n/en-us/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// IGNORE
 			'id' => 'Standard ID (default)',	// IGNORE
 			'link' => 'Link',	// IGNORE
+			'sha1:content' => 'Content',	// IGNORE
+			'sha1:content_published' => 'Content + Date',	// IGNORE
 			'sha1:link_published' => 'Link + Date',	// IGNORE
 			'sha1:link_published_title' => 'Link + Date + Title',	// IGNORE
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// IGNORE
+			'sha1:published' => 'Date',	// IGNORE
+			'sha1:title' => 'Title',	// IGNORE
+			'sha1:title_published' => 'Title + Date',	// IGNORE
+			'sha1:title_published_content' => 'Title + Date + Content',	// IGNORE
 		),
 		'url' => 'Feed URL',	// IGNORE
 		'useragent' => 'Set the user agent for fetching this feed',	// IGNORE

+ 2 - 2
app/i18n/en/admin.php

@@ -116,7 +116,7 @@ return array(
 		'description' => 'Description',
 		'disabled' => 'Disabled',
 		'empty_list' => 'There are no installed extensions',
-		'empty_list_help' => 'Check the logs to determine the reason behind the empty extension list.',	// TODO
+		'empty_list_help' => 'Check the logs to determine the reason behind the empty extension list.',
 		'enabled' => 'Enabled',
 		'latest' => 'Installed',
 		'name' => 'Name',
@@ -148,7 +148,7 @@ return array(
 		'main_stream' => 'Main stream',
 		'no_idle' => 'There are no idle feeds!',
 		'number_entries' => '%d articles',
-		'overview' => 'Overview',	// TODO
+		'overview' => 'Overview',
 		'percent_of_total' => '% of total',
 		'repartition' => 'Articles repartition: %s',
 		'status_favorites' => 'Favourites',

+ 2 - 2
app/i18n/en/conf.php

@@ -149,8 +149,8 @@ return array(
 			'tags' => 'Display by label',
 			'type' => 'Type',
 		),
-		'get_A' => 'Show all feeds, also those shown in their category',	// TODO
-		'get_Z' => 'Show all feeds, also archived ones',	// TODO
+		'get_A' => 'Show all feeds, also those shown in their category',
+		'get_Z' => 'Show all feeds, also archived ones',
 		'get_all' => 'Display all articles',
 		'get_all_labels' => 'Display articles with any label',
 		'get_category' => 'Display “%s” category',

+ 1 - 1
app/i18n/en/gen.php

@@ -16,7 +16,7 @@ return array(
 		'add' => 'Add',
 		'back_to_rss_feeds' => '← Go back to your RSS feeds',
 		'cancel' => 'Cancel',
-		'close' => 'Close',	// TODO
+		'close' => 'Close',
 		'create' => 'Create',
 		'delete_all_feeds' => 'Delete all feeds',
 		'delete_errored_feeds' => 'Delete feeds with errors',

+ 6 - 6
app/i18n/en/index.php

@@ -16,13 +16,13 @@ return array(
 		'agpl3' => '<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL 3</a>',
 		'bug_reports' => array(
 			'environment_information' => array(
-				'_' => 'System information',	// TODO
-				'browser' => 'Browser',	// TODO
-				'database' => 'Database',	// TODO
-				'server_software' => 'Server software',	// TODO
+				'_' => 'System information',
+				'browser' => 'Browser',
+				'database' => 'Database',
+				'server_software' => 'Server software',
 				'version_curl' => 'cURL version',
-				'version_frss' => 'FreshRSS version',	// TODO
-				'version_php' => 'PHP version',	// TODO
+				'version_frss' => 'FreshRSS version',
+				'version_php' => 'PHP version',
 			),
 		),
 		'bugs_reports' => 'Bug reports',

+ 9 - 3
app/i18n/en/sub.php

@@ -237,13 +237,19 @@ return array(
 		'ttl' => 'Do not automatically refresh more often than',
 		'unicityCriteria' => array(
 			'_' => 'Article unicity criteria',
-			'forced' => '<span title="Block the unicity criteria, even when the feed has duplicate articles">forced</span>',	// TODO
-			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
+			'forced' => '<span title="Block the unicity criteria, even when the feed has duplicate articles">forced</span>',
+			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',
 			'id' => 'Standard ID (default)',
 			'link' => 'Link',
+			'sha1:content' => 'Content',
+			'sha1:content_published' => 'Content + Date',
 			'sha1:link_published' => 'Link + Date',
 			'sha1:link_published_title' => 'Link + Date + Title',
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',
+			'sha1:published' => 'Date',
+			'sha1:title' => 'Title',
+			'sha1:title_published' => 'Title + Date',
+			'sha1:title_published_content' => 'Title + Date + Content',
 		),
 		'url' => 'Feed URL',
 		'useragent' => 'Set the user agent for fetching this feed',
@@ -255,7 +261,7 @@ return array(
 	'import_export' => array(
 		'export' => array(
 			'_' => 'Export',
-			'sqlite' => 'Download user database as SQLite',	// TODO
+			'sqlite' => 'Download user database as SQLite',
 		),
 		'export_labelled' => 'Export your labelled articles',
 		'export_opml' => 'Export list of feeds (OPML)',

+ 6 - 0
app/i18n/es/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevante para fuentes inválidas.<br />⚠️ Cambiar la política creara duplicados.',
 			'id' => 'ID Estándar (por defecto)',
 			'link' => 'Link',	// IGNORE
+			'sha1:content' => 'Contenido',
+			'sha1:content_published' => 'Contenido + Fecha',
 			'sha1:link_published' => 'Link + Fecha',
 			'sha1:link_published_title' => 'Link + Fecha + Título',
 			'sha1:link_published_title_content' => 'Link + Fecha + Título + Contenido',
+			'sha1:published' => 'Fecha',
+			'sha1:title' => 'Título',
+			'sha1:title_published' => 'Título + Fecha',
+			'sha1:title_published_content' => 'Título + Fecha + Contenido',
 		),
 		'url' => 'URL de la fuente',
 		'useragent' => 'Selecciona el agente de usuario por recuperar la fuente',

+ 6 - 0
app/i18n/fa/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => ' URL فید',
 		'useragent' => ' عامل کاربر را برای واکشی این فید تنظیم کنید',

+ 6 - 0
app/i18n/fi/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Olennainen virheellisille syötteille.<br />⚠️ Käytännön muuttaminen luo kaksoiskappaleita.',
 			'id' => 'Perustunnus (oletus)',
 			'link' => 'Linkki',
+			'sha1:content' => 'Sisältö',
+			'sha1:content_published' => 'Sisältö + päiväys',
 			'sha1:link_published' => 'Linkki + päiväys',
 			'sha1:link_published_title' => 'Linkki + päiväys + otsikko',
 			'sha1:link_published_title_content' => 'Linkki + päiväys + otsikko + sisältö',
+			'sha1:published' => 'Päiväys',
+			'sha1:title' => 'Otsikko',
+			'sha1:title_published' => 'Otsikko + päiväys',
+			'sha1:title_published_content' => 'Otsikko + päiväys + sisältö',
 		),
 		'url' => 'Syötteen URL-osoite',
 		'useragent' => 'Määritä syötteen noutamiseen käytettävä käyttäjäagentti',

+ 6 - 0
app/i18n/fr/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Utile pour les flux invalides.<br />⚠️ Changer le critère peut créer des doublons.',
 			'id' => 'ID standard (défaut)',
 			'link' => 'Lien',
+			'sha1:content' => 'Contenu',
+			'sha1:content_published' => 'Contenu + Date',
 			'sha1:link_published' => 'Lien + Date',
 			'sha1:link_published_title' => 'Lien + Date + Titre',
 			'sha1:link_published_title_content' => 'Lien + Date + Titre + Contenu',
+			'sha1:published' => 'Date',	// IGNORE
+			'sha1:title' => 'Titre',
+			'sha1:title_published' => 'Titre + Date',
+			'sha1:title_published_content' => 'Titre + Date + Contenu',
 		),
 		'url' => 'URL du flux',
 		'useragent' => 'Sélectionner l’agent utilisateur pour télécharger ce flux',

+ 6 - 0
app/i18n/he/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'הזנה URL',
 		'useragent' => 'Set the user agent for fetching this feed',	// TODO

+ 7 - 1
app/i18n/hu/sub.php

@@ -240,10 +240,16 @@ return array(
 			'forced' => '<span title="Blokkolja az egységességi feltételeket, még akkor is, ha a hírcsatorna ismétlődő cikkeket tartalmaz">kényszerít</span>',
 			'help' => 'Érvénytelen hírforrásokra vonatkozik.<br />⚠️ A házirend módosítása duplikációkat fog létrehozni.',
 			'id' => 'Standard ID (alapértelmezés)',
-			'link' => 'Link',	// TODO
+			'link' => 'Link',	// IGNORE
+			'sha1:content' => 'Tartalom',
+			'sha1:content_published' => 'Tartalom + Dátum',
 			'sha1:link_published' => 'Link + Dátum',
 			'sha1:link_published_title' => 'Link + Dátum + Cím',
 			'sha1:link_published_title_content' => 'Link + Dátum + Cím + Tartalom',
+			'sha1:published' => 'Dátum',
+			'sha1:title' => 'Cím',
+			'sha1:title_published' => 'Cím + Dátum',
+			'sha1:title_published_content' => 'Cím + Dátum + Tartalom',
 		),
 		'url' => 'Hírforrás URL',
 		'useragent' => 'Állíts be egy user agent-et ehhez a hírforráshoz',

+ 6 - 0
app/i18n/id/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevan untuk umpan yang tidak valid.<br />⚠️ Mengubah ini akan membuat artikel duplikat.',
 			'id' => 'ID standar (baku)',
 			'link' => 'Tautan',
+			'sha1:content' => 'Konten',
+			'sha1:content_published' => 'Konten + Tanggal',
 			'sha1:link_published' => 'Tautan + Tanggal',
 			'sha1:link_published_title' => 'Tautan + Tanggal + Judul',
 			'sha1:link_published_title_content' => 'Tautan + Tanggal + Judul + Konten',
+			'sha1:published' => 'Tanggal',
+			'sha1:title' => 'Judul',
+			'sha1:title_published' => 'Judul + Tanggal',
+			'sha1:title_published_content' => 'Judul + Tanggal + Konten',
 		),
 		'url' => 'URL umpan',
 		'useragent' => 'Atur UA (user agent) untuk mengambil umpan ini',

+ 6 - 0
app/i18n/it/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Rilevante per i feed non validi.<br />⚠️ La modifica del criterio creerà dei duplicati.',
 			'id' => 'Standard ID (default)',	// IGNORE
 			'link' => 'Link',	// IGNORE
+			'sha1:content' => 'Contenuto',
+			'sha1:content_published' => 'Contenuto + Data',
 			'sha1:link_published' => 'Link + Data',
 			'sha1:link_published_title' => 'Link + Data + Titolo',
 			'sha1:link_published_title_content' => 'Link + Data + Titolo + Contenuto',
+			'sha1:published' => 'Data',
+			'sha1:title' => 'Titolo',
+			'sha1:title_published' => 'Titolo + Data',
+			'sha1:title_published_content' => 'Titolo + Data + Contenuto',
 		),
 		'url' => 'URL del feed',
 		'useragent' => 'Imposta lo user agent per recuperare questo feed',

+ 6 - 0
app/i18n/ja/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => '不正なフィードに対処します。<br />⚠️ ポリシーを変更すると重複が発生します。',
 			'id' => '標準的なID (デフォルト)',
 			'link' => 'リンク',
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'リンク + 日付',
 			'sha1:link_published_title' => 'リンク + 日付 + タイトル',
 			'sha1:link_published_title_content' => 'リンク + 日付 + タイトル + コンテンツ',
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'フィードのURL',
 		'useragent' => 'フィードを取得するときのユーザーエージェント',

+ 6 - 0
app/i18n/ko/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => '피드 URL',
 		'useragent' => '이 피드를 가져올 때 사용할 유저 에이전트 설정',

+ 6 - 0
app/i18n/lv/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'Barotnes URL',
 		'useragent' => 'Lietotāja aģenta iestatīšana šīs barotnes iegūšanai',

+ 6 - 0
app/i18n/nl/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'Feed-url',
 		'useragent' => 'Stelt de useragent in om deze feed op te halen',

+ 6 - 0
app/i18n/oc/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'Flux URL',
 		'useragent' => 'Definir un user agent per recuperar aqueste flux',

+ 6 - 0
app/i18n/pl/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Istotne dla niezgodnych kanałów.<br />⚠️ Wprowadzenie zmian w polityce utworzy duplikaty.',
 			'id' => 'standardowe ID (domyślne)',
 			'link' => 'odnośnik',
+			'sha1:content' => 'zawartość',
+			'sha1:content_published' => 'zawartość + data',
 			'sha1:link_published' => 'odnośnik + data',
 			'sha1:link_published_title' => 'odnośnik + data + tytuł',
 			'sha1:link_published_title_content' => 'odnośnik + data + tytuł + zawartość',
+			'sha1:published' => 'data',
+			'sha1:title' => 'tytuł',
+			'sha1:title_published' => 'tytuł + data',
+			'sha1:title_published_content' => 'tytuł + data + zawartość',
 		),
 		'url' => 'Adres kanału',
 		'useragent' => 'Ciąg user agent używany podczas pobierania kanału',

+ 6 - 0
app/i18n/pt-br/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'URL do Feed',
 		'useragent' => 'Defina um usuário para buscar este feed',

+ 6 - 0
app/i18n/pt-pt/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'URL do Feed',
 		'useragent' => 'Defina um utilizador para pesquisar este feed',

+ 6 - 0
app/i18n/ru/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'URL ленты',
 		'useragent' => 'Указать юзерагент для извлечения лент',

+ 6 - 0
app/i18n/sk/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => 'Odkaz kanála',
 		'useragent' => 'Nastaviť používateľského agenta na sťahovanie tohto kanála',

+ 6 - 0
app/i18n/tr/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Geçersiz beslemeler için geçerlidir.<br />⚠️ Politikayı değiştirmek kopyalar oluşturur.',
 			'id' => 'Standart Kimlik (varsayılan)',
 			'link' => 'Bağlantı',
+			'sha1:content' => 'İçerik',
+			'sha1:content_published' => 'İçerik + Tarih',
 			'sha1:link_published' => 'Bağlantı + Tarih',
 			'sha1:link_published_title' => 'Bağlantı + Tarih + Başlık',
 			'sha1:link_published_title_content' => 'Bağlantı + Tarih + Başlık + İçerik',
+			'sha1:published' => 'Tarih',
+			'sha1:title' => 'Başlık',
+			'sha1:title_published' => 'Başlık + Tarih',
+			'sha1:title_published_content' => 'Başlık + Tarih + İçerik',
 		),
 		'url' => 'Besleme URL’si',
 		'useragent' => 'Bu beslemeyi almak için kullanıcı aracısını ayarlayın',

+ 6 - 0
app/i18n/zh-cn/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => '源地址',
 		'useragent' => '设置用于获取此源的 User Agent',

+ 6 - 0
app/i18n/zh-tw/sub.php

@@ -241,9 +241,15 @@ return array(
 			'help' => 'Relevant for invalid feeds.<br />⚠️ Changing the policy will create duplicates.',	// TODO
 			'id' => 'Standard ID (default)',	// TODO
 			'link' => 'Link',	// TODO
+			'sha1:content' => 'Content',	// TODO
+			'sha1:content_published' => 'Content + Date',	// TODO
 			'sha1:link_published' => 'Link + Date',	// TODO
 			'sha1:link_published_title' => 'Link + Date + Title',	// TODO
 			'sha1:link_published_title_content' => 'Link + Date + Title + Content',	// TODO
+			'sha1:published' => 'Date',	// TODO
+			'sha1:title' => 'Title',	// TODO
+			'sha1:title_published' => 'Title + Date',	// TODO
+			'sha1:title_published_content' => 'Title + Date + Content',	// TODO
 		),
 		'url' => '源地址',
 		'useragent' => '設置用於獲取此源的 User Agent',

+ 6 - 0
app/views/helpers/feed/update.phtml

@@ -143,6 +143,12 @@
 						<option value="sha1:link_published" <?= $unicityCriteria === 'sha1:link_published' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:link_published') ?></option>
 						<option value="sha1:link_published_title" <?= $unicityCriteria === 'sha1:link_published_title' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:link_published_title') ?></option>
 						<option value="sha1:link_published_title_content" <?= $unicityCriteria === 'sha1:link_published_title_content' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:link_published_title_content') ?></option>
+						<option value="sha1:title" <?= $unicityCriteria === 'sha1:title' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:title') ?></option>
+						<option value="sha1:title_published" <?= $unicityCriteria === 'sha1:title_published' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:title_published') ?></option>
+						<option value="sha1:title_published_content" <?= $unicityCriteria === 'sha1:title_published_content' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:title_published_content') ?></option>
+						<option value="sha1:content" <?= $unicityCriteria === 'sha1:content' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:content') ?></option>
+						<option value="sha1:content_published" <?= $unicityCriteria === 'sha1:content_published' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:content_published') ?></option>
+						<option value="sha1:published" <?= $unicityCriteria === 'sha1:published' ? 'selected="selected"' : '' ?>><?= _t('sub.feed.unicityCriteria.sha1:published') ?></option>
 					</select>
 					<label for="unicityCriteriaForced" class="inline">
 						<input type="checkbox" name="unicityCriteriaForced" id="unicityCriteriaForced" value="1"<?= $this->feed->attributeBoolean('unicityCriteriaForced') ? ' checked="checked"' : '' ?> />

+ 1 - 1
docs/i18n/flags/gen/fa.svg

@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="70" height="20">
 	<g fill="white" font-size="12" font-family="Verdana" text-anchor="middle">
 		<rect rx="3" width="70" height="20" fill="gold" />
-		<text x="34" y="14">🇮🇷 78%</text>
+		<text x="34" y="14">🇮🇷 77%</text>
 	</g>
 </svg>

+ 1 - 1
docs/i18n/flags/gen/lv.svg

@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="70" height="20">
 	<g fill="white" font-size="12" font-family="Verdana" text-anchor="middle">
 		<rect rx="3" width="70" height="20" fill="gold" />
-		<text x="34" y="14">🇱🇻 84%</text>
+		<text x="34" y="14">🇱🇻 83%</text>
 	</g>
 </svg>

+ 1 - 1
docs/i18n/flags/gen/nl.svg

@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="70" height="20">
 	<g fill="white" font-size="12" font-family="Verdana" text-anchor="middle">
 		<rect rx="3" width="70" height="20" fill="green" />
-		<text x="34" y="14">🇳🇱 92%</text>
+		<text x="34" y="14">🇳🇱 91%</text>
 	</g>
 </svg>

File diff suppressed because it is too large
+ 0 - 0
docs/i18n/flags/gen/oc.svg


+ 2 - 2
docs/i18n/flags/gen/pt-br.svg

@@ -1,7 +1,7 @@
 <!-- This file is automatically generated by `cli/check.translation.php -g` -->
 <svg xmlns="http://www.w3.org/2000/svg" width="70" height="20">
 	<g fill="white" font-size="12" font-family="Verdana" text-anchor="middle">
-		<rect rx="3" width="70" height="20" fill="green" />
-		<text x="34" y="14">🇧🇷 90%</text>
+		<rect rx="3" width="70" height="20" fill="gold" />
+		<text x="34" y="14">🇧🇷 89%</text>
 	</g>
 </svg>

+ 2 - 2
docs/i18n/flags/gen/pt-pt.svg

@@ -1,7 +1,7 @@
 <!-- This file is automatically generated by `cli/check.translation.php -g` -->
 <svg xmlns="http://www.w3.org/2000/svg" width="70" height="20">
 	<g fill="white" font-size="12" font-family="Verdana" text-anchor="middle">
-		<rect rx="3" width="70" height="20" fill="green" />
-		<text x="34" y="14">🇵🇹 90%</text>
+		<rect rx="3" width="70" height="20" fill="gold" />
+		<text x="34" y="14">🇵🇹 89%</text>
 	</g>
 </svg>

Some files were not shown because too many files changed in this diff