Explorar o código

Show translation status in README.md (#7715)

* Show translation status in README.md

* Fix colon

* markdownlint: Allow tag `<translations>`

* Use mostly Unicode flags instead

* Only `oc.svg` remains in an image format
* `check.translation.php` still supports `.png` even though there aren't any PNGs as of right now

* Fix CodeSniffer

* Attempt approach with generating local SVGs

* Fixes for local SVG approach

* Cleanup old code

* PHPStan fix

* Remove decimal precision from percentages

* Suggestions + better error messages

* codesniffer fix v2

* Revert `ghSearchUrl` change

* Generate readme

* Fix syntax highlight, maybe

* Regenerate

* Update help message

* Use existing translation files instead of .txt

* Add test against wrong Unicode flag

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Inverle hai 8 meses
pai
achega
f9a42adade
Modificáronse 81 ficheiros con 388 adicións e 50 borrados
  1. 1 1
      .markdownlint.json
  2. 3 0
      README.fr.md
  3. 3 0
      README.md
  4. 1 1
      app/i18n/cs/conf.php
  5. 2 1
      app/i18n/cs/gen.php
  6. 1 1
      app/i18n/de/conf.php
  7. 2 1
      app/i18n/de/gen.php
  8. 1 1
      app/i18n/el/conf.php
  9. 2 1
      app/i18n/el/gen.php
  10. 1 1
      app/i18n/en-us/admin.php
  11. 1 0
      app/i18n/en-us/gen.php
  12. 1 1
      app/i18n/en-us/sub.php
  13. 1 0
      app/i18n/en/gen.php
  14. 1 1
      app/i18n/es/conf.php
  15. 2 1
      app/i18n/es/gen.php
  16. 2 1
      app/i18n/fa/gen.php
  17. 1 1
      app/i18n/fi/conf.php
  18. 2 1
      app/i18n/fi/gen.php
  19. 1 1
      app/i18n/fr/conf.php
  20. 2 1
      app/i18n/fr/gen.php
  21. 1 1
      app/i18n/he/conf.php
  22. 2 1
      app/i18n/he/gen.php
  23. 1 0
      app/i18n/hu/gen.php
  24. 8 7
      app/i18n/id/gen.php
  25. 1 0
      app/i18n/it/gen.php
  26. 1 0
      app/i18n/ja/gen.php
  27. 1 1
      app/i18n/ko/conf.php
  28. 2 1
      app/i18n/ko/gen.php
  29. 1 1
      app/i18n/lv/conf.php
  30. 2 1
      app/i18n/lv/gen.php
  31. 1 1
      app/i18n/nl/conf.php
  32. 2 1
      app/i18n/nl/gen.php
  33. 1 1
      app/i18n/oc/conf.php
  34. 2 1
      app/i18n/oc/gen.php
  35. 1 0
      app/i18n/pl/gen.php
  36. 1 1
      app/i18n/pt-br/conf.php
  37. 2 1
      app/i18n/pt-br/gen.php
  38. 1 1
      app/i18n/pt-pt/conf.php
  39. 2 1
      app/i18n/pt-pt/gen.php
  40. 1 1
      app/i18n/ru/conf.php
  41. 2 1
      app/i18n/ru/gen.php
  42. 1 1
      app/i18n/sk/conf.php
  43. 2 1
      app/i18n/sk/gen.php
  44. 1 0
      app/i18n/tr/gen.php
  45. 1 1
      app/i18n/zh-cn/conf.php
  46. 2 1
      app/i18n/zh-cn/gen.php
  47. 2 1
      app/i18n/zh-tw/gen.php
  48. 2 1
      cli/README.md
  49. 113 0
      cli/check.translation.php
  50. 6 2
      cli/i18n/I18nCompletionValidator.php
  51. 4 1
      cli/i18n/I18nUsageValidator.php
  52. 1 1
      cli/i18n/I18nValidatorInterface.php
  53. 1 1
      composer.json
  54. 5 0
      docs/i18n/flags/README.md
  55. 7 0
      docs/i18n/flags/gen/cs.svg
  56. 7 0
      docs/i18n/flags/gen/de.svg
  57. 7 0
      docs/i18n/flags/gen/el.svg
  58. 7 0
      docs/i18n/flags/gen/en-us.svg
  59. 7 0
      docs/i18n/flags/gen/en.svg
  60. 7 0
      docs/i18n/flags/gen/es.svg
  61. 7 0
      docs/i18n/flags/gen/fa.svg
  62. 7 0
      docs/i18n/flags/gen/fi.svg
  63. 7 0
      docs/i18n/flags/gen/fr.svg
  64. 7 0
      docs/i18n/flags/gen/he.svg
  65. 7 0
      docs/i18n/flags/gen/hu.svg
  66. 7 0
      docs/i18n/flags/gen/id.svg
  67. 7 0
      docs/i18n/flags/gen/it.svg
  68. 7 0
      docs/i18n/flags/gen/ja.svg
  69. 7 0
      docs/i18n/flags/gen/ko.svg
  70. 7 0
      docs/i18n/flags/gen/lv.svg
  71. 7 0
      docs/i18n/flags/gen/nl.svg
  72. 5 0
      docs/i18n/flags/gen/oc.svg
  73. 7 0
      docs/i18n/flags/gen/pl.svg
  74. 7 0
      docs/i18n/flags/gen/pt-br.svg
  75. 7 0
      docs/i18n/flags/gen/pt-pt.svg
  76. 7 0
      docs/i18n/flags/gen/ru.svg
  77. 7 0
      docs/i18n/flags/gen/sk.svg
  78. 7 0
      docs/i18n/flags/gen/tr.svg
  79. 7 0
      docs/i18n/flags/gen/zh-cn.svg
  80. 7 0
      docs/i18n/flags/gen/zh-tw.svg
  81. 0 0
      docs/i18n/flags/oc.svg

+ 1 - 1
.markdownlint.json

@@ -6,7 +6,7 @@
 	"line-length": false,
 	"no-hard-tabs": false,
 	"no-inline-html": {
-		"allowed_elements": ["br", "img", "kbd"]
+		"allowed_elements": ["br", "img", "kbd", "translations"]
 	},
 	"no-multiple-blanks": {
 		"maximum": 2

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
README.fr.md


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
README.md


+ 1 - 1
app/i18n/cs/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Sdílení',
 		'add' => 'Přidat metodu sdílení',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Tato služba je zastaralá a bude ze služby FreshRSS odstraněna v <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Otevřete dokumentaci pro další informace" target="_blank">budoucím vydání</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'E-mail',

+ 2 - 1
app/i18n/cs/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Včera',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇨🇿',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'O FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Schránka',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/de/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Teilen',
 		'add' => 'Füge eine Teilen-Dienst hinzu',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Dieser Dienst ist veraltet und wir in einer <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Open documentation for more information" target="_blank">zukünftigen FreshRSS-Version</a> entfernt.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'E-Mail',

+ 2 - 1
app/i18n/de/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Gestern',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇩🇪',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'Über FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Zwischenablage',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/el/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Sharing',	// TODO
 		'add' => 'Add a sharing method',	// TODO
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'This service is deprecated and will be removed from FreshRSS in a <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Open documentation for more information" target="_blank">future release</a>.',	// TODO
 		'diaspora' => 'Diaspora*',	// TODO
 		'email' => 'Email',	// TODO

+ 2 - 1
app/i18n/el/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Yesterday',	// TODO
 	),
 	'dir' => 'ltr',	// TODO
+	'flag' => '🇬🇷',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// TODO
 		'about' => 'About FreshRSS',	// TODO
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// TODO
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Clipboard',	// TODO
 		'diaspora' => 'Diaspora*',	// TODO

+ 1 - 1
app/i18n/en-us/admin.php

@@ -116,7 +116,7 @@ return array(
 		'description' => 'Description',	// IGNORE
 		'disabled' => 'Disabled',	// IGNORE
 		'empty_list' => 'There are no installed extensions',	// IGNORE
-		'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.',	// IGNORE
 		'enabled' => 'Enabled',	// IGNORE
 		'latest' => 'Installed',	// IGNORE
 		'name' => 'Name',	// IGNORE

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

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Yesterday',	// IGNORE
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇺🇸',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'About FreshRSS',	// IGNORE

+ 1 - 1
app/i18n/en-us/sub.php

@@ -255,7 +255,7 @@ return array(
 	'import_export' => array(
 		'export' => array(
 			'_' => 'Export',	// IGNORE
-			'sqlite' => 'Download user database as SQLite',	// TODO
+			'sqlite' => 'Download user database as SQLite',	// IGNORE
 		),
 		'export_labelled' => 'Export your labeled articles',
 		'export_opml' => 'Export list of feeds (OPML)',	// IGNORE

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

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Yesterday',
 	),
 	'dir' => 'ltr',
+	'flag' => '🇬🇧',
 	'freshrss' => array(
 		'_' => 'FreshRSS',
 		'about' => 'About FreshRSS',

+ 1 - 1
app/i18n/es/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Compartir',
 		'add' => 'Agregar un método de uso compartido',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Este servicio está obsoleto y será removido de FreshRSS en un<a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Abrir la documentación para más información" target="_blank">futuro lanzamiento</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'Correo electrónico',

+ 2 - 1
app/i18n/es/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Ayer',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇪🇸',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'Acerca de FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Portapapeles',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 2 - 1
app/i18n/fa/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => ' دیروز',
 	),
 	'dir' => 'rtl',
+	'flag' => '🇮🇷',
 	'freshrss' => array(
 		'_' => ' FreshRSS',
 		'about' => 'درباره FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => ' archive.org',
 		'archivePH' => ' archive.ph',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => ' بافر',
 		'clipboard' => ' کلیپ بورد',
 		'diaspora' => ' دیاسپورا*',

+ 1 - 1
app/i18n/fi/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Jakaminen',
 		'add' => 'Lisää jakamistapa',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Tämä palvelu on vanhentunut, ja se poistetaan FreshRSS-sovelluksen <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Lisätietoja ohjeissa" target="_blank">tulevasta versiosta</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'Sähköposti',

+ 2 - 1
app/i18n/fi/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Eilen',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇫🇮',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'Tietoja FreshRSS-sovelluksesta',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Clipboard',	// IGNORE
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/fr/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Partage',
 		'add' => 'Ajouter une méthode de partage',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Ce service est obsolète et sera supprimé dans une <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Voir la documentation" target="_blank">prochaine version de FreshRSS</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'Courriel',

+ 2 - 1
app/i18n/fr/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Hier',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇫🇷',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'À propos de FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Presse-papier',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/he/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'שיתוף',
 		'add' => 'Add a sharing method',	// TODO
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'This service is deprecated and will be removed from FreshRSS in a <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Open documentation for more information" target="_blank">future release</a>.',	// TODO
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'דואר אלקטרוני',

+ 2 - 1
app/i18n/he/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'אתמול',
 	),
 	'dir' => 'rtl',
+	'flag' => '🇮🇱',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// TODO
 		'about' => 'אודות FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Clipboard',	// TODO
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 0
app/i18n/hu/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Tegnap',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇭🇺',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'FreshRSS névjegy',

+ 8 - 7
app/i18n/id/gen.php

@@ -72,7 +72,7 @@ return array(
 		),
 	),
 	'date' => array(
-		'Apr' => '\\A\\p\\r\\i\\l',	// TODO
+		'Apr' => '\\A\\p\\r\\i\\l',	// IGNORE
 		'Aug' => '\\A\\g\\u\\s\\t\\u\\s',
 		'Dec' => '\\D\\e\\s\\e\\m\\b\\e\\r',
 		'Feb' => '\\F\\e\\b\\r\\u\\a\\r\\i',
@@ -81,11 +81,11 @@ return array(
 		'Jun' => '\\J\\u\\n\\i',
 		'Mar' => '\\M\\a\\r\\e\\t',
 		'May' => '\\M\\e\\i',
-		'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',	// TODO
+		'Nov' => '\\N\\o\\v\\e\\m\\b\\e\\r',	// IGNORE
 		'Oct' => '\\O\\k\\t\\o\\b\\e\\r',
-		'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',	// TODO
-		'apr' => 'Apr.',	// TODO
-		'april' => 'April',	// TODO
+		'Sep' => '\\S\\e\\p\\t\\e\\m\\b\\e\\r',	// IGNORE
+		'apr' => 'Apr.',	// IGNORE
+		'april' => 'April',	// IGNORE
 		'aug' => 'Agu.',
 		'august' => 'Agustus',
 		'before_yesterday' => 'Sebelum kemarin',
@@ -117,12 +117,12 @@ return array(
 		'mon' => 'Bln',
 		'month' => 'bulan',
 		'nov' => 'Nov.',	// IGNORE
-		'november' => 'November',	// TODO
+		'november' => 'November',	// IGNORE
 		'oct' => 'Okt.',
 		'october' => 'Oktober',
 		'sat' => 'Sbt',
 		'sep' => 'Sept.',	// IGNORE
-		'september' => 'September',	// TODO
+		'september' => 'September',	// IGNORE
 		'sun' => 'Mng',
 		'thu' => 'Kms',
 		'today' => 'Hari ini',
@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Kemarin',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇮🇩',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'Tentang FreshRSS',

+ 1 - 0
app/i18n/it/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Ieri',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇮🇹',
 	'freshrss' => array(
 		'_' => 'Feed RSS Reader',
 		'about' => 'Informazioni',

+ 1 - 0
app/i18n/ja/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => '昨日',
 	),
 	'dir' => 'ディレクトリ',
+	'flag' => '🇯🇵',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'FreshRSSについて',

+ 1 - 1
app/i18n/ko/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => '공유',
 		'add' => '공유 방법 추가',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => '이 서비스는 더 이상 사용되지 않으며 <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="상세 정보 문서 열기" target="_blank">추후 릴리즈</a> FreshRSS에서 삭제 될 것 입니다.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => '메일',

+ 2 - 1
app/i18n/ko/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => '어제',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇰🇷',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => '정보',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => '클립보드',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/lv/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Dalīšanās',
 		'add' => 'Pievienojat dalīšanās metodi',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Šis pakalpojums ir novecojis un tiks noņemts no FreshRSS kādā <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Atvērt dokumentāciju, lai iegūtu vairāk informācijas" target="_blank">nākamajā versijā</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'E-pasts',

+ 2 - 1
app/i18n/lv/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Vakar',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇱🇻',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// TODO
 		'about' => 'Par FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Starpliktuve',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/nl/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Delen',
 		'add' => 'Deelmethode toevoegen',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Deze dienst is afgeschreven en zal uit FreshRSS worden verwijderd in een <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Open documentatie voor meer informatie" target="_blank">toekomstige versie</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'Email',	// IGNORE

+ 2 - 1
app/i18n/nl/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Gisteren',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇳🇱',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'Over FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Klembord',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/oc/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Partatge',
 		'add' => 'Ajustar un metòde de partatge',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Aqueste servici es obsolèt e serà tirat de la <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Dobrir la documentacion per mai d’informacions" target="_blank">futura version de FreshRSS</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'Corrièl',

+ 2 - 1
app/i18n/oc/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Ièr',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🏴󠁦󠁲󠁯󠁣󠁣󠁿',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'A prepaus de FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Quicha-papiers.',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 0
app/i18n/pl/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Wczorajsze',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇵🇱',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'O oprogramowaniu FreshRSS',

+ 1 - 1
app/i18n/pt-br/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Compartilhando',
 		'add' => 'Adicionar um método de compartilhamento',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Este serviço está obceloeto e será removido do FreshRSS <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Abra este documento para mais informações" target="_blank">em versões futuras</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'E-mail',

+ 2 - 1
app/i18n/pt-br/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Ontem',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇧🇷',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'Sobre FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Área de transferência',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/pt-pt/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Partilha',
 		'add' => 'Adicionar um método de partilha',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Este serviço está obceloeto e será removido do FreshRSS <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Abra este documento para mais informações" target="_blank">em versões futuras</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'E-mail',

+ 2 - 1
app/i18n/pt-pt/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Ontem',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇵🇹',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'Sobre FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Área de transferência',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/ru/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Обмен',
 		'add' => 'Добавить способ обмена',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Этот сервис устарел и будет удалён из FreshRSS в <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Открыть документацию для большей информации" target="_blank">будущем релизе</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'Электронная почта',

+ 2 - 1
app/i18n/ru/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Вчера',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇷🇺',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'О FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Буфер обмена',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 1
app/i18n/sk/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => 'Zdieľanie',
 		'add' => 'Pridať spôsob zdieľania',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => 'Táto služba nie je podporovaná a bude z FreshRSS odstránená v <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="Pre viac informácií otvorte dokumentáciu" target="_blank">budúcich verziách</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'E-mail',	// IGNORE

+ 2 - 1
app/i18n/sk/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Včera',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇸🇰',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'O FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => 'Schránka',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 1 - 0
app/i18n/tr/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => 'Dün',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇹🇷',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => 'FreshRSS Hakkında',

+ 1 - 1
app/i18n/zh-cn/conf.php

@@ -297,7 +297,7 @@ return array(
 	'sharing' => array(
 		'_' => '分享',
 		'add' => '添加分享方式',
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'deprecated' => '此功能已被废弃并会在未来的 FreshRSS 版本中移除,详情见 <a href="https://freshrss.github.io/FreshRSS/en/users/08_sharing_services.html" title="打开文档获更多信息" target="_blank">说明文档</a>.',
 		'diaspora' => 'Diaspora*',	// IGNORE
 		'email' => 'Email',	// IGNORE

+ 2 - 1
app/i18n/zh-cn/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => '昨天',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇨🇳',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => '关于 FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => '剪贴板',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 2 - 1
app/i18n/zh-tw/gen.php

@@ -131,6 +131,7 @@ return array(
 		'yesterday' => '昨天',
 	),
 	'dir' => 'ltr',	// IGNORE
+	'flag' => '🇹🇼',
 	'freshrss' => array(
 		'_' => 'FreshRSS',	// IGNORE
 		'about' => '關於 FreshRSS',
@@ -213,7 +214,7 @@ return array(
 		'archiveIS' => 'archive.is',	// IGNORE
 		'archiveORG' => 'archive.org',	// IGNORE
 		'archivePH' => 'archive.ph',	// IGNORE
-		'bluesky' => 'Bluesky',	// TODO
+		'bluesky' => 'Bluesky',	// IGNORE
 		'buffer' => 'Buffer',	// IGNORE
 		'clipboard' => '剪貼板',
 		'diaspora' => 'Diaspora*',	// IGNORE

+ 2 - 1
cli/README.md

@@ -149,12 +149,13 @@ cd /usr/share/FreshRSS
 # -r, --revert revert the action (only used with ignore action).
 # -o, --origin-language selects the origin language (only used with add language action).
 
-./cli/check-translation.php [ ---display-result --help --language fr --display-report ]
+./cli/check-translation.php [ ---display-result --help --language fr --display-report --generate-readme ]
 # Check if translation files have missing keys or missing translations.
 # -d, --display-result display results of check.
 # -h, --help display help text and exit.
 # -l, --language set the language check.
 # -r, --display-report display completion report.
+# -g, --generate-readme generate readme for translation status.
 ```
 
 ## Note about cron

+ 113 - 0
cli/check.translation.php

@@ -14,12 +14,14 @@ $cliOptions = new class extends CliOptionsParser {
 	public bool $displayResult;
 	public bool $help;
 	public bool $displayReport;
+	public bool $generateReadme;
 
 	public function __construct() {
 		$this->addOption('language', (new CliOption('language', 'l'))->typeOfArrayOfString());
 		$this->addOption('displayResult', (new CliOption('display-result', 'd'))->withValueNone());
 		$this->addOption('help', (new CliOption('help', 'h'))->withValueNone());
 		$this->addOption('displayReport', (new CliOption('display-report', 'r'))->withValueNone());
+		$this->addOption('generateReadme', (new CliOption('generate-readme', 'g'))->withValueNone());
 		parent::__construct();
 	}
 };
@@ -43,6 +45,7 @@ if (isset($cliOptions->language)) {
 $isValidated = true;
 $result = [];
 $report = [];
+$percentage = [];
 
 foreach ($languages as $language) {
 	if ($language === $i18nData::REFERENCE_LANGUAGE) {
@@ -53,6 +56,7 @@ foreach ($languages as $language) {
 	$isValidated = $i18nValidator->validate() && $isValidated;
 
 	$report[$language] = sprintf('%-5s - %s', $language, $i18nValidator->displayReport());
+	$percentage[$language] = $i18nValidator->displayReport(percentage_only: true);
 	$result[$language] = $i18nValidator->displayResult();
 }
 
@@ -70,6 +74,114 @@ if ($cliOptions->displayReport) {
 	}
 }
 
+function writeToReadme(string $readmePath, string $markdownImgStr): void {
+	$readme = file_get_contents($readmePath);
+	if ($readme === false) {
+		echo 'Error: Unable to open ' . $readmePath, PHP_EOL;
+		exit(1);
+	}
+	if (file_put_contents($readmePath, preg_replace('/<translations>(.*?)<\/translations>/s', <<<EOF
+	<translations>
+	<!-- This section is automatically generated by `cli/check.translation.php -g` -->
+
+	$markdownImgStr
+
+	</translations>
+	EOF, $readme)) === false) {
+		echo 'Error: Fail while writing to ' . $readmePath, PHP_EOL;
+		exit(1);
+	}
+	echo 'Successfully written translation status into ' . $readmePath, PHP_EOL;
+}
+
+function embedSvg(string $contents): string {
+	return preg_replace(
+		'/<svg\s+(?:(?:[^>]*?)(xmlns=["\'][^"\']+["\']))?(?:(?:[^>]*?)(viewBox=["\'][^"\']+["\']))?(?:[^>]*?)>/i',
+		'<svg \1 \2 width="16" height="16" x="9" y="2">',
+		$contents
+	) ?? '';
+}
+
+if ($cliOptions->generateReadme) {
+	$supportedFormats = ['txt', 'svg'];
+	$flagsDir = __DIR__ . '/../docs/i18n/flags';
+
+	$markdownImgStr = '';
+	foreach ($percentage as $lang => $value) {
+		$percentageInt = intval(rtrim($value, '%'));
+		$color = 'green';
+		if ($percentageInt < 90) {
+			$color = 'gold';
+		}
+		if ($percentageInt < 70) {
+			$color = 'darkred';
+		}
+		$svgFile = $flagsDir . '/' . $lang . '.svg';
+		$svg = '';
+		if (file_exists($svgFile)) {
+			$svg = file_get_contents($svgFile);
+			if ($svg === false) {
+				echo 'Error: Unable to open ' . $svgFile, PHP_EOL;
+				exit(1);
+			}
+		}
+
+		$ghSearchUrl = 'https://github.com/search?q=' . urlencode("repo:FreshRSS/FreshRSS path:app/i18n/$lang /(TODO|DIRTY)$/");
+		$genPath = $flagsDir . '/gen/' . $lang . '.svg';
+		$template = '<!-- This file is automatically generated by `cli/check.translation.php -g` -->' . "\n";
+
+		if ($svg === '') {
+			$i18nGen = include __DIR__ . "/../app/i18n/$lang/gen.php";
+			if (!is_array($i18nGen) || !is_string($i18nGen['flag'] ?? null)) {
+				echo 'Error: No Unicode flag found for language ' . $lang, PHP_EOL;
+				exit(1);
+			}
+			$unicodeFlag = $i18nGen['flag'];
+			if ($lang !== 'en' && $unicodeFlag === '🇬🇧') {
+				echo 'Error: Wrong Unicode flag for language ' . $lang, PHP_EOL;
+				exit(1);
+			}
+			$value = $unicodeFlag . ' ' . $percentageInt . '%';
+			$template .= <<<EOF
+			<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="$color" />
+					<text x="34" y="14">$value</text>
+				</g>
+			</svg>
+			EOF;
+		} else {
+			// An SVG file is available to override the Unicode flag
+			$value = $percentageInt . '%';
+			$contents = embedSvg($svg);
+			$template .= <<<EOF
+			<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="$color" />
+					<!-- embedded SVG -->
+					$contents
+					<!-- end of embedded SVG -->
+					<text x="43" y="14">$value</text>
+				</g>
+			</svg>
+			EOF;
+		}
+		if (file_put_contents($genPath, $template) === false) {
+			echo 'Error: Fail while writing to ' . $genPath, PHP_EOL;
+			exit(1);
+		}
+		$markdownImgStr .= "[![$lang](./docs/i18n/flags/gen/$lang.svg)]($ghSearchUrl) ";
+	}
+	// In case we're located in ./cli/
+	if (!file_exists('constants.php')) {
+		chdir('..');
+	}
+	foreach (array_merge(['README.md'], glob('README.*.md') ?: []) as $readmePath) {
+		writeToReadme($readmePath, rtrim($markdownImgStr));
+	}
+	exit();
+}
+
 if (!$isValidated) {
 	exit(1);
 }
@@ -121,6 +233,7 @@ DESCRIPTION
 	-h, --help		display this help and exit.
 	-l, --language=LANG	filter by LANG.
 	-r, --display-report	display completion report.
+	-g, --generate-readme	generate readme for translation status.
 
 HELP;
 	exit();

+ 6 - 2
cli/i18n/I18nCompletionValidator.php

@@ -20,14 +20,18 @@ class I18nCompletionValidator implements I18nValidatorInterface {
 	}
 
 	#[\Override]
-	public function displayReport(): string {
+	public function displayReport(bool $percentage_only = false): string {
 		if ($this->passEntries > $this->totalEntries) {
 			throw new \RuntimeException('The number of translated strings cannot be higher than the number of strings');
 		}
 		if ($this->totalEntries === 0) {
 			return 'There is no data.' . PHP_EOL;
 		}
-		return sprintf('Translation is %5.1f%% complete.', $this->passEntries / $this->totalEntries * 100) . PHP_EOL;
+		$percentage = sprintf('%5.1f%%', $this->passEntries / $this->totalEntries * 100);
+		if ($percentage_only) {
+			return trim($percentage);
+		}
+		return 'Translation is ' . $percentage . ' complete.' . PHP_EOL;
 	}
 
 	#[\Override]

+ 4 - 1
cli/i18n/I18nUsageValidator.php

@@ -20,13 +20,16 @@ class I18nUsageValidator implements I18nValidatorInterface {
 	}
 
 	#[\Override]
-	public function displayReport(): string {
+	public function displayReport(bool $percentage_only = false): string {
 		if ($this->failedEntries > $this->totalEntries) {
 			throw new \RuntimeException('The number of unused strings cannot be higher than the number of strings');
 		}
 		if ($this->totalEntries === 0) {
 			return 'There is no data.' . PHP_EOL;
 		}
+		if ($percentage_only) {
+			return '100%';
+		}
 		return sprintf('%5.1f%% of translation keys are unused.', $this->failedEntries / $this->totalEntries * 100) . PHP_EOL;
 	}
 

+ 1 - 1
cli/i18n/I18nValidatorInterface.php

@@ -14,6 +14,6 @@ interface I18nValidatorInterface {
 	/**
 	 * Display the validation report.
 	 */
-	public function displayReport(): string;
+	public function displayReport(bool $percentage_only = false): string;
 
 }

+ 1 - 1
composer.json

@@ -71,7 +71,7 @@
         "phpstan": "phpstan analyse .",
         "phpstan-next": "phpstan analyse -c phpstan-next.neon .",
         "phpunit": "phpunit --bootstrap ./tests/bootstrap.php --display-notices --display-phpunit-deprecations ./tests",
-        "translations": "cli/manipulate.translation.php -a format",
+        "translations": "cli/manipulate.translation.php -a format && cli/check.translation.php -g",
         "test": [
             "@php-lint",
             "@phtml-lint",

+ 5 - 0
docs/i18n/flags/README.md

@@ -0,0 +1,5 @@
+Used by [check.translation.php](../../../cli/check.translation.php)
+
+See also the translation key `gen.flag` for Unicode flags.
+
+Put an SVG here when the Unicode flag does not exist or does not have sufficient implementation support.

+ 7 - 0
docs/i18n/flags/gen/cs.svg

@@ -0,0 +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">🇨🇿 91%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/de.svg

@@ -0,0 +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">🇩🇪 96%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/el.svg

@@ -0,0 +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="darkred" />
+		<text x="34" y="14">🇬🇷 23%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/en-us.svg

@@ -0,0 +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">🇺🇸 100%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/en.svg

@@ -0,0 +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">🇬🇧 100%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/es.svg

@@ -0,0 +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">🇪🇸 94%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/fa.svg

@@ -0,0 +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="gold" />
+		<text x="34" y="14">🇮🇷 79%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/fi.svg

@@ -0,0 +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">🇫🇮 95%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/fr.svg

@@ -0,0 +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">🇫🇷 100%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/he.svg

@@ -0,0 +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="darkred" />
+		<text x="34" y="14">🇮🇱 46%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/hu.svg

@@ -0,0 +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">🇭🇺 98%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/id.svg

@@ -0,0 +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">🇮🇩 99%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/it.svg

@@ -0,0 +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">🇮🇹 99%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/ja.svg

@@ -0,0 +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">🇯🇵 98%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/ko.svg

@@ -0,0 +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">🇰🇷 91%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/lv.svg

@@ -0,0 +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="gold" />
+		<text x="34" y="14">🇱🇻 85%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/nl.svg

@@ -0,0 +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">🇳🇱 92%</text>
+	</g>
+</svg>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 5 - 0
docs/i18n/flags/gen/oc.svg


+ 7 - 0
docs/i18n/flags/gen/pl.svg

@@ -0,0 +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">🇵🇱 99%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/pt-br.svg

@@ -0,0 +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">🇧🇷 91%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/pt-pt.svg

@@ -0,0 +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">🇵🇹 91%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/ru.svg

@@ -0,0 +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">🇷🇺 91%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/sk.svg

@@ -0,0 +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">🇸🇰 91%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/tr.svg

@@ -0,0 +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">🇹🇷 99%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/zh-cn.svg

@@ -0,0 +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">🇨🇳 91%</text>
+	</g>
+</svg>

+ 7 - 0
docs/i18n/flags/gen/zh-tw.svg

@@ -0,0 +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">🇹🇼 91%</text>
+	</g>
+</svg>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
docs/i18n/flags/oc.svg


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio