From f9a42adadec9acd259c205727c95bd6f376dfbc5 Mon Sep 17 00:00:00 2001 From: Inverle Date: Wed, 16 Jul 2025 16:11:51 +0200 Subject: Show translation status in README.md (#7715) * Show translation status in README.md * Fix colon * markdownlint: Allow tag `` * 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 --- .markdownlint.json | 2 +- README.fr.md | 7 +++ README.md | 7 +++ app/i18n/cs/conf.php | 2 +- app/i18n/cs/gen.php | 3 +- app/i18n/de/conf.php | 2 +- app/i18n/de/gen.php | 3 +- app/i18n/el/conf.php | 2 +- app/i18n/el/gen.php | 3 +- app/i18n/en-us/admin.php | 2 +- app/i18n/en-us/gen.php | 1 + app/i18n/en-us/sub.php | 2 +- app/i18n/en/gen.php | 1 + app/i18n/es/conf.php | 2 +- app/i18n/es/gen.php | 3 +- app/i18n/fa/gen.php | 3 +- app/i18n/fi/conf.php | 2 +- app/i18n/fi/gen.php | 3 +- app/i18n/fr/conf.php | 2 +- app/i18n/fr/gen.php | 3 +- app/i18n/he/conf.php | 2 +- app/i18n/he/gen.php | 3 +- app/i18n/hu/gen.php | 1 + app/i18n/id/gen.php | 15 ++--- app/i18n/it/gen.php | 1 + app/i18n/ja/gen.php | 1 + app/i18n/ko/conf.php | 2 +- app/i18n/ko/gen.php | 3 +- app/i18n/lv/conf.php | 2 +- app/i18n/lv/gen.php | 3 +- app/i18n/nl/conf.php | 2 +- app/i18n/nl/gen.php | 3 +- app/i18n/oc/conf.php | 2 +- app/i18n/oc/gen.php | 3 +- app/i18n/pl/gen.php | 1 + app/i18n/pt-br/conf.php | 2 +- app/i18n/pt-br/gen.php | 3 +- app/i18n/pt-pt/conf.php | 2 +- app/i18n/pt-pt/gen.php | 3 +- app/i18n/ru/conf.php | 2 +- app/i18n/ru/gen.php | 3 +- app/i18n/sk/conf.php | 2 +- app/i18n/sk/gen.php | 3 +- app/i18n/tr/gen.php | 1 + app/i18n/zh-cn/conf.php | 2 +- app/i18n/zh-cn/gen.php | 3 +- app/i18n/zh-tw/gen.php | 3 +- cli/README.md | 3 +- cli/check.translation.php | 113 +++++++++++++++++++++++++++++++++++ cli/i18n/I18nCompletionValidator.php | 8 ++- cli/i18n/I18nUsageValidator.php | 5 +- cli/i18n/I18nValidatorInterface.php | 2 +- composer.json | 2 +- docs/i18n/flags/README.md | 5 ++ docs/i18n/flags/gen/cs.svg | 7 +++ docs/i18n/flags/gen/de.svg | 7 +++ docs/i18n/flags/gen/el.svg | 7 +++ docs/i18n/flags/gen/en-us.svg | 7 +++ docs/i18n/flags/gen/en.svg | 7 +++ docs/i18n/flags/gen/es.svg | 7 +++ docs/i18n/flags/gen/fa.svg | 7 +++ docs/i18n/flags/gen/fi.svg | 7 +++ docs/i18n/flags/gen/fr.svg | 7 +++ docs/i18n/flags/gen/he.svg | 7 +++ docs/i18n/flags/gen/hu.svg | 7 +++ docs/i18n/flags/gen/id.svg | 7 +++ docs/i18n/flags/gen/it.svg | 7 +++ docs/i18n/flags/gen/ja.svg | 7 +++ docs/i18n/flags/gen/ko.svg | 7 +++ docs/i18n/flags/gen/lv.svg | 7 +++ docs/i18n/flags/gen/nl.svg | 7 +++ docs/i18n/flags/gen/oc.svg | 10 ++++ docs/i18n/flags/gen/pl.svg | 7 +++ docs/i18n/flags/gen/pt-br.svg | 7 +++ docs/i18n/flags/gen/pt-pt.svg | 7 +++ docs/i18n/flags/gen/ru.svg | 7 +++ docs/i18n/flags/gen/sk.svg | 7 +++ docs/i18n/flags/gen/tr.svg | 7 +++ docs/i18n/flags/gen/zh-cn.svg | 7 +++ docs/i18n/flags/gen/zh-tw.svg | 7 +++ docs/i18n/flags/oc.svg | 1 + 81 files changed, 402 insertions(+), 50 deletions(-) create mode 100644 docs/i18n/flags/README.md create mode 100644 docs/i18n/flags/gen/cs.svg create mode 100644 docs/i18n/flags/gen/de.svg create mode 100644 docs/i18n/flags/gen/el.svg create mode 100644 docs/i18n/flags/gen/en-us.svg create mode 100644 docs/i18n/flags/gen/en.svg create mode 100644 docs/i18n/flags/gen/es.svg create mode 100644 docs/i18n/flags/gen/fa.svg create mode 100644 docs/i18n/flags/gen/fi.svg create mode 100644 docs/i18n/flags/gen/fr.svg create mode 100644 docs/i18n/flags/gen/he.svg create mode 100644 docs/i18n/flags/gen/hu.svg create mode 100644 docs/i18n/flags/gen/id.svg create mode 100644 docs/i18n/flags/gen/it.svg create mode 100644 docs/i18n/flags/gen/ja.svg create mode 100644 docs/i18n/flags/gen/ko.svg create mode 100644 docs/i18n/flags/gen/lv.svg create mode 100644 docs/i18n/flags/gen/nl.svg create mode 100644 docs/i18n/flags/gen/oc.svg create mode 100644 docs/i18n/flags/gen/pl.svg create mode 100644 docs/i18n/flags/gen/pt-br.svg create mode 100644 docs/i18n/flags/gen/pt-pt.svg create mode 100644 docs/i18n/flags/gen/ru.svg create mode 100644 docs/i18n/flags/gen/sk.svg create mode 100644 docs/i18n/flags/gen/tr.svg create mode 100644 docs/i18n/flags/gen/zh-cn.svg create mode 100644 docs/i18n/flags/gen/zh-tw.svg create mode 100644 docs/i18n/flags/oc.svg 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) + + + +[![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) + + + * 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) + + + +[![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) + + + * 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 budoucím vydání.', '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 zukünftigen FreshRSS-Version 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 future release.', // 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 unfuturo lanzamiento.', '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 tulevasta versiosta.', '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 prochaine version de FreshRSS.', '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 future release.', // 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' => '이 서비스는 더 이상 사용되지 않으며 추후 릴리즈 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ā nākamajā versijā.', '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 toekomstige versie.', '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 futura version de FreshRSS.', '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 em versões futuras.', '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 em versões futuras.', '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 в будущем релизе.', '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 budúcich verziách.', '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 版本中移除,详情见 说明文档.', '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>/s', << + + + $markdownImgStr + + + 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( + '/]*?)(xmlns=["\'][^"\']+["\']))?(?:(?:[^>]*?)(viewBox=["\'][^"\']+["\']))?(?:[^>]*?)>/i', + '', + $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 = '' . "\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 .= << + + + $value + + + EOF; + } else { + // An SVG file is available to override the Unicode flag + $value = $percentageInt . '%'; + $contents = embedSvg($svg); + $template .= << + + + + $contents + + $value + + + 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 @@ + + + + + 🇨🇿 91% + + \ 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 @@ + + + + + 🇩🇪 96% + + \ 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 @@ + + + + + 🇬🇷 23% + + \ 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 @@ + + + + + 🇺🇸 100% + + \ 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 @@ + + + + + 🇬🇧 100% + + \ 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 @@ + + + + + 🇪🇸 94% + + \ 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 @@ + + + + + 🇮🇷 79% + + \ 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 @@ + + + + + 🇫🇮 95% + + \ 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 @@ + + + + + 🇫🇷 100% + + \ 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 @@ + + + + + 🇮🇱 46% + + \ 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 @@ + + + + + 🇭🇺 98% + + \ 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 @@ + + + + + 🇮🇩 99% + + \ 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 @@ + + + + + 🇮🇹 99% + + \ 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 @@ + + + + + 🇯🇵 98% + + \ 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 @@ + + + + + 🇰🇷 91% + + \ 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 @@ + + + + + 🇱🇻 85% + + \ 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 @@ + + + + + 🇳🇱 92% + + \ 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 @@ + + + + + + + + 84% + + \ 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 @@ + + + + + 🇵🇱 99% + + \ 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 @@ + + + + + 🇧🇷 91% + + \ 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 @@ + + + + + 🇵🇹 91% + + \ 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 @@ + + + + + 🇷🇺 91% + + \ 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 @@ + + + + + 🇸🇰 91% + + \ 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 @@ + + + + + 🇹🇷 99% + + \ 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 @@ + + + + + 🇨🇳 91% + + \ 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 @@ + + + + + 🇹🇼 91% + + \ 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 @@ + \ No newline at end of file -- cgit v1.2.3