diff --git a/README.fr.md b/README.fr.md index 39daac0f2..84cc14285 100644 --- a/README.fr.md +++ b/README.fr.md @@ -1,12 +1,5 @@ [![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) [![uk](./docs/i18n/flags/gen/uk.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%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) @@ -14,7 +7,7 @@ FreshRSS est un agrégateur de flux RSS à auto-héberger. -Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable. +Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable, et [traduit](#internationalisation--20-langues-statut-des-traductions) en nombreuses langues. Il permet de gérer plusieurs utilisateurs, dispose d’un mode de lecture anonyme, et supporte les étiquettes personnalisées. Il y a une API pour les clients (mobiles), ainsi qu’une [interface en ligne de commande](cli/README.md). @@ -226,6 +219,42 @@ Le processus d’import/export à l’aide d’une base de données SQLite est u FreshRSS permet l’ajout d’extensions en plus des fonctionnalités natives. Voir le [dépôt dédié à ces extensions](https://github.com/FreshRSS/Extensions). +# Internationalisation : 20+ langues. Statut des traductions + + + + +| Langage | Progression | | +| - | - | - | +| Čeština (cs) | ■■■■■■■■・・ 88% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F) | +| Deutsch (de) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F) | +| Ελληνικά (el) | ■■・・・・・・・・ 22% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fel+%2F%28TODO%7CDIRTY%29%24%2F) | +| English (en) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen+%2F%28TODO%7CDIRTY%29%24%2F) | +| English (United States) (en-US) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen-us+%2F%28TODO%7CDIRTY%29%24%2F) | +| Español (es) | ■■■■■■■■■・ 91% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fes+%2F%28TODO%7CDIRTY%29%24%2F) | +| فارسی (fa) | ■■■■■■■■■・ 97% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F) | +| Suomi (fi) | ■■■■■■■■■・ 92% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffi+%2F%28TODO%7CDIRTY%29%24%2F) | +| Français (fr) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffr+%2F%28TODO%7CDIRTY%29%24%2F) | +| עברית (he) | ■■■■・・・・・・ 45% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F) | +| Magyar (hu) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F) | +| Bahasa Indonesia (id) | ■■■■■■■■■・ 97% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fid+%2F%28TODO%7CDIRTY%29%24%2F) | +| Italiano (it) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F) | +| 日本語 (ja) | ■■■■■■■■■・ 95% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) | +| 한국어 (ko) | ■■■■■■■■・・ 88% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) | +| Latviešu (lv) | ■■■■■■■■・・ 82% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) | +| Nederlands (nl) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) | +| Occitan (oc) | ■■■■■■■■・・ 81% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) | +| Polski (pl) | ■■■■■■■■■■ 100% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) | +| Português (Brasil) (pt-BR) | ■■■■■■■■・・ 88% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-br+%2F%28TODO%7CDIRTY%29%24%2F) | +| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 88% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-pt+%2F%28TODO%7CDIRTY%29%24%2F) | +| Русский (ru) | ■■■■■■■■・・ 88% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) | +| Slovenčina (sk) | ■■■■■■■■・・ 88% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) | +| Türkçe (tr) | ■■■■■■■■■・ 96% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) | +| Українська (uk) | ■■■■■■■■■・ 99% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) | +| 简体中文 (zh-CN) | ■■■■■■■■■・ 90% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-cn+%2F%28TODO%7CDIRTY%29%24%2F) | +| 正體中文 (zh-TW) | ■■■■■■■■・・ 88% | [contribuer](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-tw+%2F%28TODO%7CDIRTY%29%24%2F) | + + # APIs et applications natives diff --git a/README.md b/README.md index a24054a19..9db0748a0 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,5 @@ [![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) [![uk](./docs/i18n/flags/gen/uk.svg)](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%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) @@ -14,7 +7,7 @@ FreshRSS is a self-hosted RSS feed aggregator. -It is lightweight, easy to work with, powerful, and customizable. +It is lightweight, easy to work with, powerful, customizable, and has been [translated](#internationalization-20-languages-translation-progress) into many languages. It is a multi-user application with an anonymous reading mode. It supports custom tags. There is an API for (mobile) clients, and a [Command-Line Interface](cli/README.md). @@ -124,6 +117,42 @@ More detailed information about installation and server configuration can be fou FreshRSS supports further customizations by adding extensions on top of its core functionality. See the [repository dedicated to those extensions](https://github.com/FreshRSS/Extensions). +# Internationalization: 20+ languages. Translation progress + + + + +| Language | Progress | | +| - | - | - | +| Čeština (cs) | ■■■■■■■■・・ 88% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F) | +| Deutsch (de) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F) | +| Ελληνικά (el) | ■■・・・・・・・・ 22% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fel+%2F%28TODO%7CDIRTY%29%24%2F) | +| English (en) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen+%2F%28TODO%7CDIRTY%29%24%2F) | +| English (United States) (en-US) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen-us+%2F%28TODO%7CDIRTY%29%24%2F) | +| Español (es) | ■■■■■■■■■・ 91% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fes+%2F%28TODO%7CDIRTY%29%24%2F) | +| فارسی (fa) | ■■■■■■■■■・ 97% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F) | +| Suomi (fi) | ■■■■■■■■■・ 92% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffi+%2F%28TODO%7CDIRTY%29%24%2F) | +| Français (fr) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffr+%2F%28TODO%7CDIRTY%29%24%2F) | +| עברית (he) | ■■■■・・・・・・ 45% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F) | +| Magyar (hu) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F) | +| Bahasa Indonesia (id) | ■■■■■■■■■・ 97% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fid+%2F%28TODO%7CDIRTY%29%24%2F) | +| Italiano (it) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F) | +| 日本語 (ja) | ■■■■■■■■■・ 95% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F) | +| 한국어 (ko) | ■■■■■■■■・・ 88% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F) | +| Latviešu (lv) | ■■■■■■■■・・ 82% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F) | +| Nederlands (nl) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F) | +| Occitan (oc) | ■■■■■■■■・・ 81% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F) | +| Polski (pl) | ■■■■■■■■■■ 100% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F) | +| Português (Brasil) (pt-BR) | ■■■■■■■■・・ 88% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-br+%2F%28TODO%7CDIRTY%29%24%2F) | +| Português (Portugal) (pt-PT) | ■■■■■■■■・・ 88% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-pt+%2F%28TODO%7CDIRTY%29%24%2F) | +| Русский (ru) | ■■■■■■■■・・ 88% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F) | +| Slovenčina (sk) | ■■■■■■■■・・ 88% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F) | +| Türkçe (tr) | ■■■■■■■■■・ 96% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F) | +| Українська (uk) | ■■■■■■■■■・ 99% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fuk+%2F%28TODO%7CDIRTY%29%24%2F) | +| 简体中文 (zh-CN) | ■■■■■■■■■・ 90% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-cn+%2F%28TODO%7CDIRTY%29%24%2F) | +| 正體中文 (zh-TW) | ■■■■■■■■・・ 88% | [contribute](https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-tw+%2F%28TODO%7CDIRTY%29%24%2F) | + + # APIs & native apps diff --git a/app/i18n/cs/gen.php b/app/i18n/cs/gen.php index 15f6db117..c615008e4 100644 --- a/app/i18n/cs/gen.php +++ b/app/i18n/cs/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Včera', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇨🇿', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'O FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'týdnů', 'years' => 'let', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Známé základní stránky', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php index 1bb34e4fc..ea41d7b10 100644 --- a/app/i18n/de/gen.php +++ b/app/i18n/de/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Gestern', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇩🇪', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'Über FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'Wochen', 'years' => 'Jahre', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Known-Seite (https://withknown.com)', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/el/gen.php b/app/i18n/el/gen.php index 023ef8c49..35245ce7a 100644 --- a/app/i18n/el/gen.php +++ b/app/i18n/el/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Yesterday', // TODO ), 'dir' => 'ltr', // TODO - 'flag' => '🇬🇷', 'freshrss' => array( '_' => 'FreshRSS', // TODO 'about' => 'About FreshRSS', // TODO @@ -217,6 +216,11 @@ return array( 'weeks' => 'weeks', // TODO 'years' => 'years', // TODO ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Known based sites', // TODO 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/en-us/api.php b/app/i18n/en-us/api.php index 48ab908ea..3e1ba55ed 100644 --- a/app/i18n/en-us/api.php +++ b/app/i18n/en-us/api.php @@ -14,10 +14,10 @@ return array( 'information' => array( 'address' => 'Your API address:', // IGNORE 'output' => array( - 'encoding-support' => '⚠️ WARN: no %2F support, some clients might not work!', // TODO - 'invalid-configuration' => '⚠️ WARN: Probable invalid base URL in ./data/config.php', // TODO - 'pass' => '✔️ PASS', // TODO - 'unknown-error' => '❌ ', // TODO + 'encoding-support' => '⚠️ WARN: no %2F support, some clients might not work!', // IGNORE + 'invalid-configuration' => '⚠️ WARN: Probable invalid base URL in ./data/config.php', // IGNORE + 'pass' => '✔️ PASS', // IGNORE + 'unknown-error' => '❌ ', // IGNORE ), 'test' => array( 'fever' => 'Fever API configuration test:', // IGNORE diff --git a/app/i18n/en-us/gen.php b/app/i18n/en-us/gen.php index 85bfd0dbe..e4fb41e0d 100644 --- a/app/i18n/en-us/gen.php +++ b/app/i18n/en-us/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Yesterday', // IGNORE ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇺🇸', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'About FreshRSS', // IGNORE @@ -217,6 +216,11 @@ return array( 'weeks' => 'weeks', // IGNORE 'years' => 'years', // IGNORE ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Known based sites', // IGNORE 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php index 7c2f4229b..42beb0a03 100644 --- a/app/i18n/en/gen.php +++ b/app/i18n/en/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Yesterday', ), 'dir' => 'ltr', - 'flag' => '🇬🇧', 'freshrss' => array( '_' => 'FreshRSS', 'about' => 'About FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'weeks', 'years' => 'years', ), + 'readme' => array( + 'contribute' => 'contribute', + 'language' => 'Language', + 'translated' => 'Progress', + ), 'share' => array( 'Known' => 'Known based sites', 'archiveIS' => 'archive.is', diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php index dbe04ea5b..d16f2f07c 100644 --- a/app/i18n/es/gen.php +++ b/app/i18n/es/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Ayer', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇪🇸', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'Acerca de FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'semanas', 'years' => 'años', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Sitios basados en conocidos', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/fa/gen.php b/app/i18n/fa/gen.php index fe582f8d0..65ae9645a 100644 --- a/app/i18n/fa/gen.php +++ b/app/i18n/fa/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => ' دیروز', ), 'dir' => 'rtl', - 'flag' => '🇮🇷', 'freshrss' => array( '_' => ' FreshRSS', 'about' => 'درباره FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => ' هفته', 'years' => ' سال', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => ' سایت های مبتنی بر شناخته شده', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/fi/gen.php b/app/i18n/fi/gen.php index aad6458e3..eb1babb2d 100644 --- a/app/i18n/fi/gen.php +++ b/app/i18n/fi/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Eilen', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇫🇮', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'Tietoja FreshRSS-sovelluksesta', @@ -217,6 +216,11 @@ return array( 'weeks' => 'viikkoa', 'years' => 'vuotta', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Known-sivustot', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php index b3967379c..46dda0d5c 100644 --- a/app/i18n/fr/gen.php +++ b/app/i18n/fr/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Hier', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇫🇷', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'À propos de FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'semaines', 'years' => 'années', ), + 'readme' => array( + 'contribute' => 'contribuer', + 'language' => 'Langage', + 'translated' => 'Progression', + ), 'share' => array( 'Known' => 'Sites basés sur Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php index 55c706cfd..0da616b8e 100644 --- a/app/i18n/he/gen.php +++ b/app/i18n/he/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'אתמול', ), 'dir' => 'rtl', - 'flag' => '🇮🇱', 'freshrss' => array( '_' => 'FreshRSS', // TODO 'about' => 'אודות FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'weeks', // TODO 'years' => 'years', // TODO ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Known based sites', // TODO 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/hu/gen.php b/app/i18n/hu/gen.php index adccaf0b3..117a8e333 100644 --- a/app/i18n/hu/gen.php +++ b/app/i18n/hu/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Tegnap', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇭🇺', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'FreshRSS névjegy', @@ -217,6 +216,11 @@ return array( 'weeks' => 'hét', 'years' => 'év', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Ismert weboldalak', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/id/gen.php b/app/i18n/id/gen.php index e9ba0b3f5..19035c401 100644 --- a/app/i18n/id/gen.php +++ b/app/i18n/id/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Kemarin', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇮🇩', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'Tentang FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'minggu', 'years' => 'tahun', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Situs berbasis Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php index 7d4223800..b68a6cf3c 100644 --- a/app/i18n/it/gen.php +++ b/app/i18n/it/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Ieri', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇮🇹', 'freshrss' => array( '_' => 'Feed RSS Reader', 'about' => 'Informazioni', @@ -217,6 +216,11 @@ return array( 'weeks' => 'settimane', 'years' => 'anni', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Siti basati su Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/ja/gen.php b/app/i18n/ja/gen.php index 0c2d69936..d0a44b615 100644 --- a/app/i18n/ja/gen.php +++ b/app/i18n/ja/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => '昨日', ), 'dir' => 'ディレクトリ', - 'flag' => '🇯🇵', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'FreshRSSについて', @@ -217,6 +216,11 @@ return array( 'weeks' => '週間', 'years' => '年間', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'よく使われるサイト', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/ko/gen.php b/app/i18n/ko/gen.php index ce7ec12a5..683d7f1b2 100644 --- a/app/i18n/ko/gen.php +++ b/app/i18n/ko/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => '어제', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇰🇷', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => '정보', @@ -217,6 +216,11 @@ return array( 'weeks' => '주', 'years' => '년', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Known based sites', // IGNORE 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/lv/gen.php b/app/i18n/lv/gen.php index cdcc7aa8d..2752eaf47 100644 --- a/app/i18n/lv/gen.php +++ b/app/i18n/lv/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Vakar', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇱🇻', 'freshrss' => array( '_' => 'FreshRSS', // TODO 'about' => 'Par FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'nedēļas', 'years' => 'gadi', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Zināmas vietnes', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php index 8b4c029c4..191cbed94 100644 --- a/app/i18n/nl/gen.php +++ b/app/i18n/nl/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Gisteren', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇳🇱', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'Over FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'weken', 'years' => 'jaren', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Known-gebaseerde sites', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/oc/gen.php b/app/i18n/oc/gen.php index 15f649809..abe430a0a 100644 --- a/app/i18n/oc/gen.php +++ b/app/i18n/oc/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Ièr', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🏴󠁦󠁲󠁯󠁣󠁣󠁿', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'A prepaus de FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'setmanas', 'years' => 'ans', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Sites basats sus Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/pl/gen.php b/app/i18n/pl/gen.php index 59c0b6072..a35987c02 100644 --- a/app/i18n/pl/gen.php +++ b/app/i18n/pl/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Wczorajsze', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇵🇱', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'O oprogramowaniu FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'tygodnie', 'years' => 'lata', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Strony bazujące na usłudze Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php index d2ea1249a..b2d263554 100644 --- a/app/i18n/pt-br/gen.php +++ b/app/i18n/pt-br/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Ontem', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇧🇷', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'Sobre FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'semanas', 'years' => 'anos', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Sites no Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/pt-pt/gen.php b/app/i18n/pt-pt/gen.php index d3b611b62..705789dc5 100644 --- a/app/i18n/pt-pt/gen.php +++ b/app/i18n/pt-pt/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Ontem', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇵🇹', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'Sobre FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'semanas', 'years' => 'anos', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Sites no Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php index 846daa6f7..9a9459b19 100644 --- a/app/i18n/ru/gen.php +++ b/app/i18n/ru/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Вчера', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇷🇺', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'О FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'недель', 'years' => 'лет', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Сайты на Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/sk/gen.php b/app/i18n/sk/gen.php index 576e1cf9a..3e907404f 100644 --- a/app/i18n/sk/gen.php +++ b/app/i18n/sk/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Včera', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇸🇰', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'O FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'týždne', 'years' => 'roky', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Stránky založené na Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php index 834cee531..3b96ebd54 100644 --- a/app/i18n/tr/gen.php +++ b/app/i18n/tr/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Dün', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇹🇷', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'FreshRSS Hakkında', @@ -217,6 +216,11 @@ return array( 'weeks' => 'hafta', 'years' => 'yıl', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => 'Bilinen tabanlı siteler', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/uk/gen.php b/app/i18n/uk/gen.php index 91d681a2e..fd7eeca35 100644 --- a/app/i18n/uk/gen.php +++ b/app/i18n/uk/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => 'Вчора', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇺🇦', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => 'Про FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => 'тижд', 'years' => 'р.', ), + 'readme' => array( + 'contribute' => 'contribute', // TODO + 'language' => 'Language', // TODO + 'translated' => 'Progress', // TODO + ), 'share' => array( 'Known' => 'Сайти на Known', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php index dc307bd6e..71fdc1416 100644 --- a/app/i18n/zh-cn/gen.php +++ b/app/i18n/zh-cn/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => '昨天', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇨🇳', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => '关于 FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => '周', 'years' => '年', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => '基于 Known 的站点', 'archiveIS' => 'archive.is', // IGNORE diff --git a/app/i18n/zh-tw/gen.php b/app/i18n/zh-tw/gen.php index 1dd6182b6..24442f281 100644 --- a/app/i18n/zh-tw/gen.php +++ b/app/i18n/zh-tw/gen.php @@ -136,7 +136,6 @@ return array( 'yesterday' => '昨天', ), 'dir' => 'ltr', // IGNORE - 'flag' => '🇹🇼', 'freshrss' => array( '_' => 'FreshRSS', // IGNORE 'about' => '關於 FreshRSS', @@ -217,6 +216,11 @@ return array( 'weeks' => '週', 'years' => '年', ), + 'readme' => array( + 'contribute' => 'contribute', // IGNORE + 'language' => 'Language', // IGNORE + 'translated' => 'Progress', // IGNORE + ), 'share' => array( 'Known' => '基於 Known 的站點', 'archiveIS' => 'archive.is', // IGNORE diff --git a/cli/README.md b/cli/README.md index 4d6ba62fe..47f28a7f7 100644 --- a/cli/README.md +++ b/cli/README.md @@ -149,13 +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 --generate-readme ] +./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. +# -g, --generate-readme generate translation progress section in readme. ``` ## Note about cron diff --git a/cli/check.translation.php b/cli/check.translation.php index b4c7e6850..5c0873099 100755 --- a/cli/check.translation.php +++ b/cli/check.translation.php @@ -74,7 +74,22 @@ if ($cliOptions->displayReport) { } } -function writeToReadme(string $readmePath, string $markdownImgStr): void { +function writeToReadme(string $readmePath, string $markdownTable): void { + $language = explode('.', $readmePath)[1]; + // expecting `README.md` for `en` or `README.fr.md` for `fr` + if ($language === 'md') { + $language = 'en'; + } + Minz_Translate::init($language); + $placeholders = []; + if (preg_match_all('/__.*?__/', $markdownTable, $placeholders) === false) { + echo 'Error: Fail while matching translation placeholders', PHP_EOL; + exit(1); + } + foreach (array_unique($placeholders[0]) as $_ => $placeholder) { + $markdownTable = str_replace($placeholder, _t('gen.readme.' . substr($placeholder, 2, -2)), $markdownTable); + } + $readme = file_get_contents($readmePath); if ($readme === false) { echo 'Error: Unable to open ' . $readmePath, PHP_EOL; @@ -82,9 +97,9 @@ function writeToReadme(string $readmePath, string $markdownImgStr): void { } if (file_put_contents($readmePath, preg_replace('/(.*?)<\/translations>/s', << - + - $markdownImgStr + $markdownTable EOF, $readme)) === false) { @@ -94,90 +109,41 @@ function writeToReadme(string $readmePath, string $markdownImgStr): void { 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 = dirname(__DIR__) . '/docs/i18n/flags'; + $markdownTable = << $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); - } - } + $completed = intval($percentageInt / 10); + $uncompleted = intval(ceil((100 - $percentageInt) / 10)); + $progressBar = str_repeat('■', $completed) . str_repeat('・', $uncompleted); $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 dirname(__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; + // BCP 47 / ISO 3166: Uppercase the last (region) subtag if any (e.g. pt-pt -> pt-PT) + $bcp47 = $lang; + if (str_contains($bcp47, '-')) { + $parts = explode('-', $bcp47); + $parts[count($parts) - 1] = strtoupper($parts[count($parts) - 1]); + $bcp47 = implode('-', $parts); } - 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) "; + + $markdownTable .= '| ' . implode(' | ', [ + _t('gen.lang.' . $lang) . " ($bcp47)", + $progressBar . ' ' . $percentageInt . '%', + "[__contribute__]($ghSearchUrl)", + ]) . " |\n"; } // 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)); + writeToReadme($readmePath, rtrim($markdownTable)); } exit(); } @@ -233,7 +199,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. + -g, --generate-readme generate translation progress section in readme. HELP; exit(); diff --git a/docs/i18n/flags/README.md b/docs/i18n/flags/README.md deleted file mode 100644 index 10443f0d9..000000000 --- a/docs/i18n/flags/README.md +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 638de7e04..000000000 --- a/docs/i18n/flags/gen/cs.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇨🇿 88% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/de.svg b/docs/i18n/flags/gen/de.svg deleted file mode 100644 index 3d73ff3d1..000000000 --- a/docs/i18n/flags/gen/de.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇩🇪 99% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/el.svg b/docs/i18n/flags/gen/el.svg deleted file mode 100644 index 99d090aeb..000000000 --- a/docs/i18n/flags/gen/el.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇬🇷 22% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/en-us.svg b/docs/i18n/flags/gen/en-us.svg deleted file mode 100644 index 78a4b9076..000000000 --- a/docs/i18n/flags/gen/en-us.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇺🇸 99% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/en.svg b/docs/i18n/flags/gen/en.svg deleted file mode 100644 index 96dca892e..000000000 --- a/docs/i18n/flags/gen/en.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇬🇧 100% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/es.svg b/docs/i18n/flags/gen/es.svg deleted file mode 100644 index e9ed3f3e7..000000000 --- a/docs/i18n/flags/gen/es.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇪🇸 91% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/fa.svg b/docs/i18n/flags/gen/fa.svg deleted file mode 100644 index f9a273509..000000000 --- a/docs/i18n/flags/gen/fa.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇮🇷 97% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/fi.svg b/docs/i18n/flags/gen/fi.svg deleted file mode 100644 index 98ccc4e86..000000000 --- a/docs/i18n/flags/gen/fi.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇫🇮 92% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/fr.svg b/docs/i18n/flags/gen/fr.svg deleted file mode 100644 index 315726e5c..000000000 --- a/docs/i18n/flags/gen/fr.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇫🇷 100% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/he.svg b/docs/i18n/flags/gen/he.svg deleted file mode 100644 index ff45b2a3c..000000000 --- a/docs/i18n/flags/gen/he.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇮🇱 45% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/hu.svg b/docs/i18n/flags/gen/hu.svg deleted file mode 100644 index d09d601e5..000000000 --- a/docs/i18n/flags/gen/hu.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇭🇺 99% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/id.svg b/docs/i18n/flags/gen/id.svg deleted file mode 100644 index 16eb76b21..000000000 --- a/docs/i18n/flags/gen/id.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇮🇩 97% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/it.svg b/docs/i18n/flags/gen/it.svg deleted file mode 100644 index 8b62b3a77..000000000 --- a/docs/i18n/flags/gen/it.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇮🇹 96% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/ja.svg b/docs/i18n/flags/gen/ja.svg deleted file mode 100644 index 001a08553..000000000 --- a/docs/i18n/flags/gen/ja.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇯🇵 95% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/ko.svg b/docs/i18n/flags/gen/ko.svg deleted file mode 100644 index 9939c5484..000000000 --- a/docs/i18n/flags/gen/ko.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇰🇷 88% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/lv.svg b/docs/i18n/flags/gen/lv.svg deleted file mode 100644 index 9fabb834f..000000000 --- a/docs/i18n/flags/gen/lv.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇱🇻 82% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/nl.svg b/docs/i18n/flags/gen/nl.svg deleted file mode 100644 index b1330d183..000000000 --- a/docs/i18n/flags/gen/nl.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇳🇱 99% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/oc.svg b/docs/i18n/flags/gen/oc.svg deleted file mode 100644 index 950bc44b9..000000000 --- a/docs/i18n/flags/gen/oc.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - 81% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/pl.svg b/docs/i18n/flags/gen/pl.svg deleted file mode 100644 index 53c88bf8f..000000000 --- a/docs/i18n/flags/gen/pl.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇵🇱 100% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/pt-br.svg b/docs/i18n/flags/gen/pt-br.svg deleted file mode 100644 index 8e2c5e007..000000000 --- a/docs/i18n/flags/gen/pt-br.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇧🇷 88% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/pt-pt.svg b/docs/i18n/flags/gen/pt-pt.svg deleted file mode 100644 index 00718c072..000000000 --- a/docs/i18n/flags/gen/pt-pt.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇵🇹 88% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/ru.svg b/docs/i18n/flags/gen/ru.svg deleted file mode 100644 index 24766b4b2..000000000 --- a/docs/i18n/flags/gen/ru.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇷🇺 88% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/sk.svg b/docs/i18n/flags/gen/sk.svg deleted file mode 100644 index b0a410ce5..000000000 --- a/docs/i18n/flags/gen/sk.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇸🇰 88% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/tr.svg b/docs/i18n/flags/gen/tr.svg deleted file mode 100644 index bad76bc56..000000000 --- a/docs/i18n/flags/gen/tr.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇹🇷 96% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/uk.svg b/docs/i18n/flags/gen/uk.svg deleted file mode 100644 index 1b1a583ed..000000000 --- a/docs/i18n/flags/gen/uk.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇺🇦 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 deleted file mode 100644 index 27e539722..000000000 --- a/docs/i18n/flags/gen/zh-cn.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇨🇳 90% - - \ No newline at end of file diff --git a/docs/i18n/flags/gen/zh-tw.svg b/docs/i18n/flags/gen/zh-tw.svg deleted file mode 100644 index e171cdce4..000000000 --- a/docs/i18n/flags/gen/zh-tw.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - 🇹🇼 88% - - \ No newline at end of file diff --git a/docs/i18n/flags/oc.svg b/docs/i18n/flags/oc.svg deleted file mode 100644 index e7ddfed8e..000000000 --- a/docs/i18n/flags/oc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file