aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Inverle <inverle@proton.me> 2025-07-16 16:11:51 +0200
committerGravatar GitHub <noreply@github.com> 2025-07-16 16:11:51 +0200
commitf9a42adadec9acd259c205727c95bd6f376dfbc5 (patch)
treeb576ba4ac948466389de30487c506ae04dd71d24
parent5f61e426dc90b7b697a46da009af2fc88eed3ad0 (diff)
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>
-rw-r--r--.markdownlint.json2
-rw-r--r--README.fr.md7
-rw-r--r--README.md7
-rw-r--r--app/i18n/cs/conf.php2
-rw-r--r--app/i18n/cs/gen.php3
-rw-r--r--app/i18n/de/conf.php2
-rw-r--r--app/i18n/de/gen.php3
-rw-r--r--app/i18n/el/conf.php2
-rw-r--r--app/i18n/el/gen.php3
-rw-r--r--app/i18n/en-us/admin.php2
-rw-r--r--app/i18n/en-us/gen.php1
-rw-r--r--app/i18n/en-us/sub.php2
-rw-r--r--app/i18n/en/gen.php1
-rw-r--r--app/i18n/es/conf.php2
-rw-r--r--app/i18n/es/gen.php3
-rw-r--r--app/i18n/fa/gen.php3
-rw-r--r--app/i18n/fi/conf.php2
-rw-r--r--app/i18n/fi/gen.php3
-rw-r--r--app/i18n/fr/conf.php2
-rw-r--r--app/i18n/fr/gen.php3
-rw-r--r--app/i18n/he/conf.php2
-rw-r--r--app/i18n/he/gen.php3
-rwxr-xr-xapp/i18n/hu/gen.php1
-rw-r--r--app/i18n/id/gen.php15
-rw-r--r--app/i18n/it/gen.php1
-rw-r--r--app/i18n/ja/gen.php1
-rw-r--r--app/i18n/ko/conf.php2
-rw-r--r--app/i18n/ko/gen.php3
-rw-r--r--app/i18n/lv/conf.php2
-rw-r--r--app/i18n/lv/gen.php3
-rw-r--r--app/i18n/nl/conf.php2
-rw-r--r--app/i18n/nl/gen.php3
-rw-r--r--app/i18n/oc/conf.php2
-rw-r--r--app/i18n/oc/gen.php3
-rw-r--r--app/i18n/pl/gen.php1
-rw-r--r--app/i18n/pt-br/conf.php2
-rw-r--r--app/i18n/pt-br/gen.php3
-rw-r--r--app/i18n/pt-pt/conf.php2
-rw-r--r--app/i18n/pt-pt/gen.php3
-rw-r--r--app/i18n/ru/conf.php2
-rw-r--r--app/i18n/ru/gen.php3
-rw-r--r--app/i18n/sk/conf.php2
-rw-r--r--app/i18n/sk/gen.php3
-rw-r--r--app/i18n/tr/gen.php1
-rw-r--r--app/i18n/zh-cn/conf.php2
-rw-r--r--app/i18n/zh-cn/gen.php3
-rw-r--r--app/i18n/zh-tw/gen.php3
-rw-r--r--cli/README.md3
-rwxr-xr-xcli/check.translation.php113
-rw-r--r--cli/i18n/I18nCompletionValidator.php8
-rw-r--r--cli/i18n/I18nUsageValidator.php5
-rw-r--r--cli/i18n/I18nValidatorInterface.php2
-rw-r--r--composer.json2
-rw-r--r--docs/i18n/flags/README.md5
-rw-r--r--docs/i18n/flags/gen/cs.svg7
-rw-r--r--docs/i18n/flags/gen/de.svg7
-rw-r--r--docs/i18n/flags/gen/el.svg7
-rw-r--r--docs/i18n/flags/gen/en-us.svg7
-rw-r--r--docs/i18n/flags/gen/en.svg7
-rw-r--r--docs/i18n/flags/gen/es.svg7
-rw-r--r--docs/i18n/flags/gen/fa.svg7
-rw-r--r--docs/i18n/flags/gen/fi.svg7
-rw-r--r--docs/i18n/flags/gen/fr.svg7
-rw-r--r--docs/i18n/flags/gen/he.svg7
-rw-r--r--docs/i18n/flags/gen/hu.svg7
-rw-r--r--docs/i18n/flags/gen/id.svg7
-rw-r--r--docs/i18n/flags/gen/it.svg7
-rw-r--r--docs/i18n/flags/gen/ja.svg7
-rw-r--r--docs/i18n/flags/gen/ko.svg7
-rw-r--r--docs/i18n/flags/gen/lv.svg7
-rw-r--r--docs/i18n/flags/gen/nl.svg7
-rw-r--r--docs/i18n/flags/gen/oc.svg10
-rw-r--r--docs/i18n/flags/gen/pl.svg7
-rw-r--r--docs/i18n/flags/gen/pt-br.svg7
-rw-r--r--docs/i18n/flags/gen/pt-pt.svg7
-rw-r--r--docs/i18n/flags/gen/ru.svg7
-rw-r--r--docs/i18n/flags/gen/sk.svg7
-rw-r--r--docs/i18n/flags/gen/tr.svg7
-rw-r--r--docs/i18n/flags/gen/zh-cn.svg7
-rw-r--r--docs/i18n/flags/gen/zh-tw.svg7
-rw-r--r--docs/i18n/flags/oc.svg1
81 files changed, 402 insertions, 50 deletions
diff --git a/.markdownlint.json b/.markdownlint.json
index 05965131e..c071b6fa2 100644
--- a/.markdownlint.json
+++ b/.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
diff --git a/README.fr.md b/README.fr.md
index ffed7d3c8..ef3d30758 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -1,5 +1,12 @@
[![Dons Liberapay](https://img.shields.io/liberapay/receives/FreshRSS.svg?logo=liberapay)](https://liberapay.com/FreshRSS/donate)
+<translations>
+<!-- This section is automatically generated by `cli/check.translation.php -g` -->
+
+[![cs](./docs/i18n/flags/gen/cs.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F) [![de](./docs/i18n/flags/gen/de.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F) [![el](./docs/i18n/flags/gen/el.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fel+%2F%28TODO%7CDIRTY%29%24%2F) [![en](./docs/i18n/flags/gen/en.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen+%2F%28TODO%7CDIRTY%29%24%2F) [![en-us](./docs/i18n/flags/gen/en-us.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen-us+%2F%28TODO%7CDIRTY%29%24%2F) [![es](./docs/i18n/flags/gen/es.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fes+%2F%28TODO%7CDIRTY%29%24%2F) [![fa](./docs/i18n/flags/gen/fa.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F) [![fi](./docs/i18n/flags/gen/fi.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffi+%2F%28TODO%7CDIRTY%29%24%2F) [![fr](./docs/i18n/flags/gen/fr.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffr+%2F%28TODO%7CDIRTY%29%24%2F) [![he](./docs/i18n/flags/gen/he.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F) [![hu](./docs/i18n/flags/gen/hu.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F) [![id](./docs/i18n/flags/gen/id.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fid+%2F%28TODO%7CDIRTY%29%24%2F) [![it](./docs/i18n/flags/gen/it.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F) [![ja](./docs/i18n/flags/gen/ja.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) [![ko](./docs/i18n/flags/gen/ko.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) [![lv](./docs/i18n/flags/gen/lv.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) [![nl](./docs/i18n/flags/gen/nl.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) [![oc](./docs/i18n/flags/gen/oc.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) [![pl](./docs/i18n/flags/gen/pl.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) [![pt-br](./docs/i18n/flags/gen/pt-br.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-br+%2F%28TODO%7CDIRTY%29%24%2F) [![pt-pt](./docs/i18n/flags/gen/pt-pt.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-pt+%2F%28TODO%7CDIRTY%29%24%2F) [![ru](./docs/i18n/flags/gen/ru.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) [![sk](./docs/i18n/flags/gen/sk.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) [![tr](./docs/i18n/flags/gen/tr.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) [![zh-cn](./docs/i18n/flags/gen/zh-cn.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-cn+%2F%28TODO%7CDIRTY%29%24%2F) [![zh-tw](./docs/i18n/flags/gen/zh-tw.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-tw+%2F%28TODO%7CDIRTY%29%24%2F)
+
+</translations>
+
* Lire ce document sur [github.com/FreshRSS/FreshRSS/](https://github.com/FreshRSS/FreshRSS/blob/edge/README.md) pour avoir les images et liens corrects.
* [English version](README.md)
diff --git a/README.md b/README.md
index 6aec4bc7e..932e82c69 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,12 @@
[![Liberapay donations](https://img.shields.io/liberapay/receives/FreshRSS.svg?logo=liberapay)](https://liberapay.com/FreshRSS/donate)
+<translations>
+<!-- This section is automatically generated by `cli/check.translation.php -g` -->
+
+[![cs](./docs/i18n/flags/gen/cs.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F) [![de](./docs/i18n/flags/gen/de.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F) [![el](./docs/i18n/flags/gen/el.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fel+%2F%28TODO%7CDIRTY%29%24%2F) [![en](./docs/i18n/flags/gen/en.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen+%2F%28TODO%7CDIRTY%29%24%2F) [![en-us](./docs/i18n/flags/gen/en-us.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen-us+%2F%28TODO%7CDIRTY%29%24%2F) [![es](./docs/i18n/flags/gen/es.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fes+%2F%28TODO%7CDIRTY%29%24%2F) [![fa](./docs/i18n/flags/gen/fa.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F) [![fi](./docs/i18n/flags/gen/fi.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffi+%2F%28TODO%7CDIRTY%29%24%2F) [![fr](./docs/i18n/flags/gen/fr.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffr+%2F%28TODO%7CDIRTY%29%24%2F) [![he](./docs/i18n/flags/gen/he.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F) [![hu](./docs/i18n/flags/gen/hu.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F) [![id](./docs/i18n/flags/gen/id.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fid+%2F%28TODO%7CDIRTY%29%24%2F) [![it](./docs/i18n/flags/gen/it.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F) [![ja](./docs/i18n/flags/gen/ja.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) [![ko](./docs/i18n/flags/gen/ko.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) [![lv](./docs/i18n/flags/gen/lv.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) [![nl](./docs/i18n/flags/gen/nl.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) [![oc](./docs/i18n/flags/gen/oc.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) [![pl](./docs/i18n/flags/gen/pl.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) [![pt-br](./docs/i18n/flags/gen/pt-br.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-br+%2F%28TODO%7CDIRTY%29%24%2F) [![pt-pt](./docs/i18n/flags/gen/pt-pt.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-pt+%2F%28TODO%7CDIRTY%29%24%2F) [![ru](./docs/i18n/flags/gen/ru.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) [![sk](./docs/i18n/flags/gen/sk.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) [![tr](./docs/i18n/flags/gen/tr.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) [![zh-cn](./docs/i18n/flags/gen/zh-cn.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-cn+%2F%28TODO%7CDIRTY%29%24%2F) [![zh-tw](./docs/i18n/flags/gen/zh-tw.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-tw+%2F%28TODO%7CDIRTY%29%24%2F)
+
+</translations>
+
* Read this document on [github.com/FreshRSS/FreshRSS/](https://github.com/FreshRSS/FreshRSS/blob/edge/README.md) to get the correct links and pictures.
* [Version française](README.fr.md)
diff --git a/app/i18n/cs/conf.php b/app/i18n/cs/conf.php
index a87501d1f..6a49b1825 100644
--- a/app/i18n/cs/conf.php
+++ b/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',
diff --git a/app/i18n/cs/gen.php b/app/i18n/cs/gen.php
index 538f1cfc2..173b2c2d7 100644
--- a/app/i18n/cs/gen.php
+++ b/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
diff --git a/app/i18n/de/conf.php b/app/i18n/de/conf.php
index 239a9b99b..0f5257eb4 100644
--- a/app/i18n/de/conf.php
+++ b/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',
diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php
index 636cd846f..d21b1a25a 100644
--- a/app/i18n/de/gen.php
+++ b/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
diff --git a/app/i18n/el/conf.php b/app/i18n/el/conf.php
index 8d12dafa1..ecba2f008 100644
--- a/app/i18n/el/conf.php
+++ b/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
diff --git a/app/i18n/el/gen.php b/app/i18n/el/gen.php
index 1a87c6afc..5c9daf67b 100644
--- a/app/i18n/el/gen.php
+++ b/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
diff --git a/app/i18n/en-us/admin.php b/app/i18n/en-us/admin.php
index 512068b68..4eb5db860 100644
--- a/app/i18n/en-us/admin.php
+++ b/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
diff --git a/app/i18n/en-us/gen.php b/app/i18n/en-us/gen.php
index 4f6f318fc..b233595fe 100644
--- a/app/i18n/en-us/gen.php
+++ b/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
diff --git a/app/i18n/en-us/sub.php b/app/i18n/en-us/sub.php
index 4c0b42ab9..dc71cb859 100644
--- a/app/i18n/en-us/sub.php
+++ b/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
diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php
index 71940d3ee..0f3e5aff7 100644
--- a/app/i18n/en/gen.php
+++ b/app/i18n/en/gen.php
@@ -131,6 +131,7 @@ return array(
'yesterday' => 'Yesterday',
),
'dir' => 'ltr',
+ 'flag' => '🇬🇧',
'freshrss' => array(
'_' => 'FreshRSS',
'about' => 'About FreshRSS',
diff --git a/app/i18n/es/conf.php b/app/i18n/es/conf.php
index bba65aecc..a96380c75 100644
--- a/app/i18n/es/conf.php
+++ b/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',
diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php
index 0a20212a5..c7dae3b64 100644
--- a/app/i18n/es/gen.php
+++ b/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
diff --git a/app/i18n/fa/gen.php b/app/i18n/fa/gen.php
index d8c4dffff..bce9f38bc 100644
--- a/app/i18n/fa/gen.php
+++ b/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' => ' دیاسپورا*',
diff --git a/app/i18n/fi/conf.php b/app/i18n/fi/conf.php
index 178317f75..308153659 100644
--- a/app/i18n/fi/conf.php
+++ b/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',
diff --git a/app/i18n/fi/gen.php b/app/i18n/fi/gen.php
index e8f0dc63d..3860055ac 100644
--- a/app/i18n/fi/gen.php
+++ b/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
diff --git a/app/i18n/fr/conf.php b/app/i18n/fr/conf.php
index 3c11dec6d..5de8095f4 100644
--- a/app/i18n/fr/conf.php
+++ b/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',
diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php
index 091fdbd82..9706e57fc 100644
--- a/app/i18n/fr/gen.php
+++ b/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
diff --git a/app/i18n/he/conf.php b/app/i18n/he/conf.php
index 9147f4655..485967086 100644
--- a/app/i18n/he/conf.php
+++ b/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' => 'דואר אלקטרוני',
diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php
index 0ff5de054..7af4b4ce0 100644
--- a/app/i18n/he/gen.php
+++ b/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
diff --git a/app/i18n/hu/gen.php b/app/i18n/hu/gen.php
index e20e07a63..891ae3695 100755
--- a/app/i18n/hu/gen.php
+++ b/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',
diff --git a/app/i18n/id/gen.php b/app/i18n/id/gen.php
index d4a8dade4..eaee65687 100644
--- a/app/i18n/id/gen.php
+++ b/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',
diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php
index 39cd171dc..d2ed49ee4 100644
--- a/app/i18n/it/gen.php
+++ b/app/i18n/it/gen.php
@@ -131,6 +131,7 @@ return array(
'yesterday' => 'Ieri',
),
'dir' => 'ltr', // IGNORE
+ 'flag' => '🇮🇹',
'freshrss' => array(
'_' => 'Feed RSS Reader',
'about' => 'Informazioni',
diff --git a/app/i18n/ja/gen.php b/app/i18n/ja/gen.php
index c33042d71..bc494802c 100644
--- a/app/i18n/ja/gen.php
+++ b/app/i18n/ja/gen.php
@@ -131,6 +131,7 @@ return array(
'yesterday' => '昨日',
),
'dir' => 'ディレクトリ',
+ 'flag' => '🇯🇵',
'freshrss' => array(
'_' => 'FreshRSS', // IGNORE
'about' => 'FreshRSSについて',
diff --git a/app/i18n/ko/conf.php b/app/i18n/ko/conf.php
index 6f921e063..5bfb8a07d 100644
--- a/app/i18n/ko/conf.php
+++ b/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' => '메일',
diff --git a/app/i18n/ko/gen.php b/app/i18n/ko/gen.php
index 2cde96b94..b8f8318ba 100644
--- a/app/i18n/ko/gen.php
+++ b/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
diff --git a/app/i18n/lv/conf.php b/app/i18n/lv/conf.php
index 9916edb2b..57c5deeea 100644
--- a/app/i18n/lv/conf.php
+++ b/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',
diff --git a/app/i18n/lv/gen.php b/app/i18n/lv/gen.php
index 679f3bf79..61f06f610 100644
--- a/app/i18n/lv/gen.php
+++ b/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
diff --git a/app/i18n/nl/conf.php b/app/i18n/nl/conf.php
index 59a06e07b..09f0a9cc1 100644
--- a/app/i18n/nl/conf.php
+++ b/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
diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php
index 15f2365f0..351024019 100644
--- a/app/i18n/nl/gen.php
+++ b/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
diff --git a/app/i18n/oc/conf.php b/app/i18n/oc/conf.php
index 687910ac8..04e283b26 100644
--- a/app/i18n/oc/conf.php
+++ b/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',
diff --git a/app/i18n/oc/gen.php b/app/i18n/oc/gen.php
index 6ffcbbed8..3f5cdeb88 100644
--- a/app/i18n/oc/gen.php
+++ b/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
diff --git a/app/i18n/pl/gen.php b/app/i18n/pl/gen.php
index d6d497c39..f59926574 100644
--- a/app/i18n/pl/gen.php
+++ b/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',
diff --git a/app/i18n/pt-br/conf.php b/app/i18n/pt-br/conf.php
index 9b7302268..70416f45d 100644
--- a/app/i18n/pt-br/conf.php
+++ b/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',
diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php
index 1a4c9c116..4711146b2 100644
--- a/app/i18n/pt-br/gen.php
+++ b/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
diff --git a/app/i18n/pt-pt/conf.php b/app/i18n/pt-pt/conf.php
index 78a5875bb..1bbed5c09 100644
--- a/app/i18n/pt-pt/conf.php
+++ b/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',
diff --git a/app/i18n/pt-pt/gen.php b/app/i18n/pt-pt/gen.php
index d999d00c1..104b61636 100644
--- a/app/i18n/pt-pt/gen.php
+++ b/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
diff --git a/app/i18n/ru/conf.php b/app/i18n/ru/conf.php
index 786e9b68f..0010411c1 100644
--- a/app/i18n/ru/conf.php
+++ b/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' => 'Электронная почта',
diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php
index da95659f0..e11b1cdc4 100644
--- a/app/i18n/ru/gen.php
+++ b/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
diff --git a/app/i18n/sk/conf.php b/app/i18n/sk/conf.php
index aafc7e7fe..e806585b9 100644
--- a/app/i18n/sk/conf.php
+++ b/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
diff --git a/app/i18n/sk/gen.php b/app/i18n/sk/gen.php
index 8ff96a4ef..b8df72a16 100644
--- a/app/i18n/sk/gen.php
+++ b/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
diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php
index 3c9f15453..99ab450fb 100644
--- a/app/i18n/tr/gen.php
+++ b/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',
diff --git a/app/i18n/zh-cn/conf.php b/app/i18n/zh-cn/conf.php
index 456c62149..651e530d9 100644
--- a/app/i18n/zh-cn/conf.php
+++ b/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
diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php
index 9e85a8a00..a0ba4bab8 100644
--- a/app/i18n/zh-cn/gen.php
+++ b/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
diff --git a/app/i18n/zh-tw/gen.php b/app/i18n/zh-tw/gen.php
index 6f68e83e8..4b0e0feab 100644
--- a/app/i18n/zh-tw/gen.php
+++ b/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
diff --git a/cli/README.md b/cli/README.md
index 155c8938b..4d6ba62fe 100644
--- a/cli/README.md
+++ b/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
diff --git a/cli/check.translation.php b/cli/check.translation.php
index ebe665ef7..151a6084f 100755
--- a/cli/check.translation.php
+++ b/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();
diff --git a/cli/i18n/I18nCompletionValidator.php b/cli/i18n/I18nCompletionValidator.php
index 28f8abed8..5cdd1ba80 100644
--- a/cli/i18n/I18nCompletionValidator.php
+++ b/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]
diff --git a/cli/i18n/I18nUsageValidator.php b/cli/i18n/I18nUsageValidator.php
index 89c88d222..5551d2df7 100644
--- a/cli/i18n/I18nUsageValidator.php
+++ b/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;
}
diff --git a/cli/i18n/I18nValidatorInterface.php b/cli/i18n/I18nValidatorInterface.php
index 9266489f6..8c58f84cb 100644
--- a/cli/i18n/I18nValidatorInterface.php
+++ b/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;
}
diff --git a/composer.json b/composer.json
index 3336d9520..d2ae986ca 100644
--- a/composer.json
+++ b/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",
diff --git a/docs/i18n/flags/README.md b/docs/i18n/flags/README.md
new file mode 100644
index 000000000..10443f0d9
--- /dev/null
+++ b/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.
diff --git a/docs/i18n/flags/gen/cs.svg b/docs/i18n/flags/gen/cs.svg
new file mode 100644
index 000000000..03d106cd4
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/de.svg b/docs/i18n/flags/gen/de.svg
new file mode 100644
index 000000000..e159e6658
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/el.svg b/docs/i18n/flags/gen/el.svg
new file mode 100644
index 000000000..46a4486da
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/en-us.svg b/docs/i18n/flags/gen/en-us.svg
new file mode 100644
index 000000000..ba7f59f32
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/en.svg b/docs/i18n/flags/gen/en.svg
new file mode 100644
index 000000000..96dca892e
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/es.svg b/docs/i18n/flags/gen/es.svg
new file mode 100644
index 000000000..f534a65b9
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/fa.svg b/docs/i18n/flags/gen/fa.svg
new file mode 100644
index 000000000..022372f91
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/fi.svg b/docs/i18n/flags/gen/fi.svg
new file mode 100644
index 000000000..1265402b9
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/fr.svg b/docs/i18n/flags/gen/fr.svg
new file mode 100644
index 000000000..315726e5c
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/he.svg b/docs/i18n/flags/gen/he.svg
new file mode 100644
index 000000000..7f81280a5
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/hu.svg b/docs/i18n/flags/gen/hu.svg
new file mode 100644
index 000000000..6c78ec856
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/id.svg b/docs/i18n/flags/gen/id.svg
new file mode 100644
index 000000000..45745ee5e
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/it.svg b/docs/i18n/flags/gen/it.svg
new file mode 100644
index 000000000..b8aec2a54
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/ja.svg b/docs/i18n/flags/gen/ja.svg
new file mode 100644
index 000000000..41d996d46
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/ko.svg b/docs/i18n/flags/gen/ko.svg
new file mode 100644
index 000000000..48b9a42e1
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/lv.svg b/docs/i18n/flags/gen/lv.svg
new file mode 100644
index 000000000..0453d3f20
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/nl.svg b/docs/i18n/flags/gen/nl.svg
new file mode 100644
index 000000000..12479be4e
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/oc.svg b/docs/i18n/flags/gen/oc.svg
new file mode 100644
index 000000000..266d58770
--- /dev/null
+++ b/docs/i18n/flags/gen/oc.svg
@@ -0,0 +1,10 @@
+<!-- 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" />
+ <!-- embedded SVG -->
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 797.96 530.973" width="16" height="16" x="9" y="2"><path fill="#d4001c" d="M0 0h797.96v530.973H0z"/><g fill="#fddd00"><path d="m184.195 267 9.126 7.138c14.632 11.443 38.501 35.909 45.015 77.3l1.721 10.924 8.361-7.312c14.038-12.277 55.754-44.434 116.757-53.224-8.792 61.003-40.948 102.718-53.224 116.756l-7.313 8.361 10.924 1.721c41.392 6.515 65.857 30.383 77.301 45.015l7.137 9.126 7.138-9.126c11.443-14.632 35.908-38.5 77.3-45.015l10.924-1.721-7.313-8.361c-12.276-14.038-44.432-55.753-53.224-116.756 61.003 8.79 102.719 40.947 116.757 53.224l8.361 7.312 1.72-10.924c6.515-41.391 30.384-65.857 45.015-77.3l9.127-7.138-9.127-7.138c-14.631-11.443-38.5-35.908-45.015-77.299l-1.72-10.925-8.361 7.312c-14.038 12.277-55.754 44.434-116.757 53.225 8.792-61.003 40.948-102.719 53.224-116.756l7.313-8.362-10.924-1.72c-41.392-6.516-65.857-30.384-77.3-45.016L400 51.195l-7.137 9.126c-11.444 14.632-35.909 38.5-77.301 45.016l-10.924 1.72 7.313 8.362c12.276 14.037 44.432 55.753 53.224 116.756-61.003-8.791-102.719-40.948-116.757-53.225l-8.361-7.312-1.721 10.925c-6.514 41.391-30.383 65.856-45.015 77.299zm35.126 0c27.829-25.798 34.255-54.425 34.255-54.425 40.626 34.242 103.986 41.96 135.665 43.666-1.707-31.679-9.424-95.039-43.666-135.666 0 0 28.626-6.425 54.425-34.255 25.799 27.83 54.425 34.255 54.425 34.255-34.242 40.627-41.959 103.987-43.666 135.666 31.679-1.706 95.039-9.424 135.665-43.666 0 0 6.426 28.627 34.255 54.425-27.829 25.799-34.255 54.425-34.255 54.425-40.626-34.242-103.986-41.96-135.665-43.666 1.707 31.679 9.424 95.039 43.666 135.666 0 0-28.626 6.425-54.425 34.255-25.799-27.83-54.425-34.255-54.425-34.255 34.242-40.627 41.959-103.987 43.666-135.666-31.679 1.706-95.039 9.424-135.665 43.666 0 0-6.426-28.626-34.255-54.425"/><circle cx="176.775" cy="267" r="18"/><circle cx="237.575" cy="164.576" r="18"/><circle cx="237.575" cy="369.425" r="18"/><circle cx="297.576" cy="104.575" r="18"/><circle cx="297.576" cy="429.426" r="18"/><circle cx="400" cy="43.774" r="18"/><circle cx="400" cy="490.226" r="18"/><circle cx="502.424" cy="104.575" r="18"/><circle cx="502.424" cy="429.426" r="18"/><circle cx="562.425" cy="164.576" r="18"/><circle cx="562.425" cy="369.425" r="18"/><circle cx="623.226" cy="267" r="18"/></g></svg>
+ <!-- end of embedded SVG -->
+ <text x="43" y="14">84%</text>
+ </g>
+</svg> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/pl.svg b/docs/i18n/flags/gen/pl.svg
new file mode 100644
index 000000000..e0ac841df
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/pt-br.svg b/docs/i18n/flags/gen/pt-br.svg
new file mode 100644
index 000000000..076972ebd
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/pt-pt.svg b/docs/i18n/flags/gen/pt-pt.svg
new file mode 100644
index 000000000..e6363b435
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/ru.svg b/docs/i18n/flags/gen/ru.svg
new file mode 100644
index 000000000..e5e2e322e
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/sk.svg b/docs/i18n/flags/gen/sk.svg
new file mode 100644
index 000000000..04185a75b
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/tr.svg b/docs/i18n/flags/gen/tr.svg
new file mode 100644
index 000000000..f62f7d2f5
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/zh-cn.svg b/docs/i18n/flags/gen/zh-cn.svg
new file mode 100644
index 000000000..1b2a7b559
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/gen/zh-tw.svg b/docs/i18n/flags/gen/zh-tw.svg
new file mode 100644
index 000000000..c76459ef3
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/docs/i18n/flags/oc.svg b/docs/i18n/flags/oc.svg
new file mode 100644
index 000000000..e7ddfed8e
--- /dev/null
+++ b/docs/i18n/flags/oc.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="797.96" height="530.973" viewBox="0 0 797.96 530.973"><path fill="#d4001c" d="M0 0h797.96v530.973H0z"/><g fill="#fddd00"><path d="m184.195 267 9.126 7.138c14.632 11.443 38.501 35.909 45.015 77.3l1.721 10.924 8.361-7.312c14.038-12.277 55.754-44.434 116.757-53.224-8.792 61.003-40.948 102.718-53.224 116.756l-7.313 8.361 10.924 1.721c41.392 6.515 65.857 30.383 77.301 45.015l7.137 9.126 7.138-9.126c11.443-14.632 35.908-38.5 77.3-45.015l10.924-1.721-7.313-8.361c-12.276-14.038-44.432-55.753-53.224-116.756 61.003 8.79 102.719 40.947 116.757 53.224l8.361 7.312 1.72-10.924c6.515-41.391 30.384-65.857 45.015-77.3l9.127-7.138-9.127-7.138c-14.631-11.443-38.5-35.908-45.015-77.299l-1.72-10.925-8.361 7.312c-14.038 12.277-55.754 44.434-116.757 53.225 8.792-61.003 40.948-102.719 53.224-116.756l7.313-8.362-10.924-1.72c-41.392-6.516-65.857-30.384-77.3-45.016L400 51.195l-7.137 9.126c-11.444 14.632-35.909 38.5-77.301 45.016l-10.924 1.72 7.313 8.362c12.276 14.037 44.432 55.753 53.224 116.756-61.003-8.791-102.719-40.948-116.757-53.225l-8.361-7.312-1.721 10.925c-6.514 41.391-30.383 65.856-45.015 77.299zm35.126 0c27.829-25.798 34.255-54.425 34.255-54.425 40.626 34.242 103.986 41.96 135.665 43.666-1.707-31.679-9.424-95.039-43.666-135.666 0 0 28.626-6.425 54.425-34.255 25.799 27.83 54.425 34.255 54.425 34.255-34.242 40.627-41.959 103.987-43.666 135.666 31.679-1.706 95.039-9.424 135.665-43.666 0 0 6.426 28.627 34.255 54.425-27.829 25.799-34.255 54.425-34.255 54.425-40.626-34.242-103.986-41.96-135.665-43.666 1.707 31.679 9.424 95.039 43.666 135.666 0 0-28.626 6.425-54.425 34.255-25.799-27.83-54.425-34.255-54.425-34.255 34.242-40.627 41.959-103.987 43.666-135.666-31.679 1.706-95.039 9.424-135.665 43.666 0 0-6.426-28.626-34.255-54.425"/><circle cx="176.775" cy="267" r="18"/><circle cx="237.575" cy="164.576" r="18"/><circle cx="237.575" cy="369.425" r="18"/><circle cx="297.576" cy="104.575" r="18"/><circle cx="297.576" cy="429.426" r="18"/><circle cx="400" cy="43.774" r="18"/><circle cx="400" cy="490.226" r="18"/><circle cx="502.424" cy="104.575" r="18"/><circle cx="502.424" cy="429.426" r="18"/><circle cx="562.425" cy="164.576" r="18"/><circle cx="562.425" cy="369.425" r="18"/><circle cx="623.226" cy="267" r="18"/></g></svg> \ No newline at end of file