From ed91a449280733a9a429844a7c640a63ca5dc120 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 4 Jan 2026 23:31:07 +0200 Subject: [PATCH] feat(scripts): check translation coverage --- .gitignore | 1 + scripts/translation/.language-stats.json | 1944 ----------------- .../translation/check-translation-coverage.ts | 21 + scripts/translation/manage-readme.ts | 35 +- scripts/translation/utils.ts | 33 + 5 files changed, 59 insertions(+), 1975 deletions(-) delete mode 100644 scripts/translation/.language-stats.json create mode 100644 scripts/translation/check-translation-coverage.ts create mode 100644 scripts/translation/utils.ts diff --git a/.gitignore b/.gitignore index 1d82de1efe..4dd7bde624 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,4 @@ upload # docs site/ apps/*/coverage +scripts/translation/.language*.json \ No newline at end of file diff --git a/scripts/translation/.language-stats.json b/scripts/translation/.language-stats.json deleted file mode 100644 index 9c1befaa07..0000000000 --- a/scripts/translation/.language-stats.json +++ /dev/null @@ -1,1944 +0,0 @@ -{ - "count": 35, - "next": null, - "previous": null, - "results": [ - { - "language": { - "id": 31, - "code": "en", - "name": "English", - "plural": { - "id": 75, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "base", - "en_en", - "en_us", - "eng", - "enp", - "source" - ], - "direction": "ltr", - "population": 1728003224, - "web_url": "https://hosted.weblate.org/languages/en/", - "url": "https://hosted.weblate.org/api/languages/en/", - "statistics_url": "https://hosted.weblate.org/api/languages/en/statistics/" - }, - "language_code": "en", - "id": 1614608, - "filename": "docs/README.md", - "revision": "5c59039312ea3d3684cbb62748ea9249d1a06a6d,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/en/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/en/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/en/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/en/", - "is_template": true, - "is_source": true, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 16, - "failing_checks_words": 109, - "failing_checks_percent": 13.5, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:53:52.294489+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/en/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/en/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/en/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/en/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/en/units/" - }, - { - "language": { - "id": 186, - "code": "zh_Hans", - "name": "Chinese (Simplified Han script)", - "plural": { - "id": 57, - "source": 0, - "number": 1, - "formula": "0", - "type": 0 - }, - "aliases": [ - "chi", - "chinese", - "chinese_chs", - "chinese_zh", - "chs", - "cmn", - "cmn_hans", - "cn", - "schinese", - "zh", - "zh_chs", - "zh_cmn_hans", - "zh_cn", - "zh_hans_cn", - "zh_simplified", - "zhcn" - ], - "direction": "ltr", - "population": 1286444445, - "web_url": "https://hosted.weblate.org/languages/zh_Hans/", - "url": "https://hosted.weblate.org/api/languages/zh_Hans/", - "statistics_url": "https://hosted.weblate.org/api/languages/zh_Hans/statistics/" - }, - "language_code": "ZH_CN", - "id": 1614681, - "filename": "docs/README-ZH_CN.md", - "revision": "1830b2144a971d78896812027ac33f2348a4c513,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/zh_Hans/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/zh_Hans/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/zh_Hans/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hans/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:14.143896+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hans/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hans/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hans/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hans/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hans/units/" - }, - { - "language": { - "id": 185, - "code": "zh_Hant", - "name": "Chinese (Traditional Han script)", - "plural": { - "id": 734, - "source": 0, - "number": 1, - "formula": "0", - "type": 0 - }, - "aliases": [ - "cht", - "cmn_hant", - "tchinese", - "zh_cht", - "zh_cmn_hant", - "zh_hant@zh", - "zh_hant_tw", - "zh_traditional", - "zh_tw", - "zho", - "zhtw" - ], - "direction": "ltr", - "population": 39078482, - "web_url": "https://hosted.weblate.org/languages/zh_Hant/", - "url": "https://hosted.weblate.org/api/languages/zh_Hant/", - "statistics_url": "https://hosted.weblate.org/api/languages/zh_Hant/statistics/" - }, - "language_code": "ZH_TW", - "id": 1614682, - "filename": "docs/README-ZH_TW.md", - "revision": "2021df9f07639e22a8f4c0b2ec293180e9417519,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/zh_Hant/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/zh_Hant/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/zh_Hant/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hant/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:14.334553+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hant/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hant/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hant/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hant/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/zh_Hant/units/" - }, - { - "language": { - "id": 103, - "code": "es", - "name": "Spanish", - "plural": { - "id": 291, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "es_es", - "es_la", - "esp", - "spa" - ], - "direction": "ltr", - "population": 507161083, - "web_url": "https://hosted.weblate.org/languages/es/", - "url": "https://hosted.weblate.org/api/languages/es/", - "statistics_url": "https://hosted.weblate.org/api/languages/es/statistics/" - }, - "language_code": "es", - "id": 1614683, - "filename": "docs/README-es.md", - "revision": "75f6c28eecc5ae7af9c151e1b2fae9581286f2a1,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/es/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/es/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/es/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/es/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:15.458107+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/es/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/es/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/es/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/es/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/es/units/" - }, - { - "language": { - "id": 86, - "code": "it", - "name": "Italian", - "plural": { - "id": 146, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "it_it", - "ita", - "ita_it" - ], - "direction": "ltr", - "population": 70475318, - "web_url": "https://hosted.weblate.org/languages/it/", - "url": "https://hosted.weblate.org/api/languages/it/", - "statistics_url": "https://hosted.weblate.org/api/languages/it/statistics/" - }, - "language_code": "it", - "id": 1614684, - "filename": "docs/README-it.md", - "revision": "2ddb0025430cee98d7f3c03d2267cdb8f4af5bcf,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/it/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/it/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/it/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/it/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:16.673093+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/it/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/it/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/it/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/it/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/it/units/" - }, - { - "language": { - "id": 49, - "code": "ja", - "name": "Japanese", - "plural": { - "id": 148, - "source": 0, - "number": 1, - "formula": "0", - "type": 0 - }, - "aliases": [ - "ja_ja", - "ja_jp", - "jp", - "jp_jpn", - "jpn", - "jpn_jp" - ], - "direction": "ltr", - "population": 117608755, - "web_url": "https://hosted.weblate.org/languages/ja/", - "url": "https://hosted.weblate.org/api/languages/ja/", - "statistics_url": "https://hosted.weblate.org/api/languages/ja/statistics/" - }, - "language_code": "ja", - "id": 1614685, - "filename": "docs/README-ja.md", - "revision": "fd2c1fa546f569a20a7fa451837504787e0ed095,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/ja/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/ja/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/ja/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/ja/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:16.823524+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/ja/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/ja/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/ja/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ja/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ja/units/" - }, - { - "language": { - "id": 38, - "code": "ro", - "name": "Romanian", - "plural": { - "id": 251, - "source": 0, - "number": 3, - "formula": "n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2", - "type": 2 - }, - "aliases": [ - "mol", - "ro_ro", - "ron", - "rum" - ], - "direction": "ltr", - "population": 20043506, - "web_url": "https://hosted.weblate.org/languages/ro/", - "url": "https://hosted.weblate.org/api/languages/ro/", - "statistics_url": "https://hosted.weblate.org/api/languages/ro/statistics/" - }, - "language_code": "ro", - "id": 1614686, - "filename": "docs/README-ro.md", - "revision": "6f672b32dbfedf2f57a710a62c11c5b753e9dc1d,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/ro/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/ro/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/ro/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/ro/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 1, - "failing_checks_words": 2, - "failing_checks_percent": 0.8, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:18.461356+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/ro/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/ro/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/ro/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ro/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ro/units/" - }, - { - "language": { - "id": 36, - "code": "ru", - "name": "Russian", - "plural": { - "id": 255, - "source": 0, - "number": 3, - "formula": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", - "type": 22 - }, - "aliases": [ - "ru_r", - "ru_rr", - "ru_ru", - "rus" - ], - "direction": "ltr", - "population": 193610712, - "web_url": "https://hosted.weblate.org/languages/ru/", - "url": "https://hosted.weblate.org/api/languages/ru/", - "statistics_url": "https://hosted.weblate.org/api/languages/ru/statistics/" - }, - "language_code": "ru", - "id": 1614687, - "filename": "docs/README-ru.md", - "revision": "ce4750e0fd84f5b51f46a81f008d7249d876f203,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/ru/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/ru/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/ru/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/ru/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 78, - "translated_words": 640, - "translated_percent": 66.1, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 2, - "failing_checks_words": 7, - "failing_checks_percent": 1.6, - "have_suggestion": 2, - "have_comment": 0, - "last_change": "2025-12-08T10:55:18.631436+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/ru/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/ru/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/ru/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ru/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ru/units/" - }, - { - "language": { - "id": 12, - "code": "tr", - "name": "Turkish", - "plural": { - "id": 323, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "tr_tr", - "trk", - "tur" - ], - "direction": "ltr", - "population": 82419542, - "web_url": "https://hosted.weblate.org/languages/tr/", - "url": "https://hosted.weblate.org/api/languages/tr/", - "statistics_url": "https://hosted.weblate.org/api/languages/tr/statistics/" - }, - "language_code": "tr", - "id": 1614699, - "filename": "docs/README-tr.md", - "revision": "1b33459e924d5b3e8398f08f4d46d7256a59abf9,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/tr/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/tr/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/tr/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/tr/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 11, - "translated_words": 97, - "translated_percent": 9.3, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 1, - "have_comment": 0, - "last_change": "2025-12-08T10:55:19.281339+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/tr/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/tr/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/tr/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/tr/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/tr/units/" - }, - { - "language": { - "id": 23, - "code": "pt_BR", - "name": "Portuguese (Brazil)", - "plural": { - "id": 246, - "source": 0, - "number": 2, - "formula": "n > 1", - "type": 1 - }, - "aliases": [ - "bp", - "braz_por", - "por_br", - "portuguese_br", - "ptb" - ], - "direction": "ltr", - "population": 200247320, - "web_url": "https://hosted.weblate.org/languages/pt_BR/", - "url": "https://hosted.weblate.org/api/languages/pt_BR/", - "statistics_url": "https://hosted.weblate.org/api/languages/pt_BR/statistics/" - }, - "language_code": "pt_BR", - "id": 1614700, - "filename": "docs/README-pt_BR.md", - "revision": "88f2a4bbdb291cb85fbb65130d2a15c78a6fd8e5,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/pt_BR/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/pt_BR/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/pt_BR/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/pt_BR/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 0, - "translated_words": 0, - "translated_percent": 0, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:18.291539+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt_BR/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt_BR/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt_BR/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt_BR/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt_BR/units/" - }, - { - "language": { - "id": 24, - "code": "de", - "name": "German", - "plural": { - "id": 104, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "de_de", - "deu", - "deu_de", - "ger" - ], - "direction": "ltr", - "population": 141873196, - "web_url": "https://hosted.weblate.org/languages/de/", - "url": "https://hosted.weblate.org/api/languages/de/", - "statistics_url": "https://hosted.weblate.org/api/languages/de/statistics/" - }, - "language_code": "de", - "id": 1614701, - "filename": "docs/README-de.md", - "revision": "9ac27b9025f2b4530290bf14b68b64f20b6bdcf0,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/de/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/de/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/de/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/de/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 2, - "failing_checks_words": 4, - "failing_checks_percent": 1.6, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:14.982190+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/de/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/de/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/de/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/de/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/de/units/" - }, - { - "language": { - "id": 29, - "code": "el", - "name": "Greek", - "plural": { - "id": 108, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "el_gr", - "ell", - "gr", - "gre" - ], - "direction": "ltr", - "population": 12249401, - "web_url": "https://hosted.weblate.org/languages/el/", - "url": "https://hosted.weblate.org/api/languages/el/", - "statistics_url": "https://hosted.weblate.org/api/languages/el/statistics/" - }, - "language_code": "el", - "id": 1614702, - "filename": "docs/README-el.md", - "revision": "bc3eeb0d043038c93ba51939188657e38f5cf366,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/el/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/el/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/el/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/el/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:15.136428+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/el/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/el/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/el/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/el/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/el/units/" - }, - { - "language": { - "id": 42, - "code": "uk", - "name": "Ukrainian", - "plural": { - "id": 327, - "source": 0, - "number": 3, - "formula": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", - "type": 22 - }, - "aliases": [ - "ua", - "ua_ua", - "uk_ua", - "uk_uk", - "ukr" - ], - "direction": "ltr", - "population": 24080585, - "web_url": "https://hosted.weblate.org/languages/uk/", - "url": "https://hosted.weblate.org/api/languages/uk/", - "statistics_url": "https://hosted.weblate.org/api/languages/uk/statistics/" - }, - "language_code": "uk", - "id": 1614703, - "filename": "docs/README-uk.md", - "revision": "a7578bd58f4beaf3a2594563865667833e124567,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/uk/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/uk/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/uk/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/uk/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 38, - "translated_words": 303, - "translated_percent": 32.2, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:19.440960+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/uk/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/uk/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/uk/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/uk/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/uk/units/" - }, - { - "language": { - "id": 53, - "code": "ca", - "name": "Catalan", - "plural": { - "id": 46, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "ca_ca", - "ca_es", - "ca_ps", - "cat" - ], - "direction": "ltr", - "population": 8218781, - "web_url": "https://hosted.weblate.org/languages/ca/", - "url": "https://hosted.weblate.org/api/languages/ca/", - "statistics_url": "https://hosted.weblate.org/api/languages/ca/statistics/" - }, - "language_code": "ca", - "id": 1614704, - "filename": "docs/README-ca.md", - "revision": "301e382cce216c34394bed5d0e5167bdae144f70,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/ca/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/ca/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/ca/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/ca/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 2, - "translated_words": 35, - "translated_percent": 1.6, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:14.660609+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/ca/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/ca/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/ca/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ca/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ca/units/" - }, - { - "language": { - "id": 56, - "code": "cs", - "name": "Czech", - "plural": { - "id": 68, - "source": 0, - "number": 3, - "formula": "(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2", - "type": 22 - }, - "aliases": [ - "ces", - "cs_cs", - "cs_cz", - "csy", - "cz", - "cze" - ], - "direction": "ltr", - "population": 13236057, - "web_url": "https://hosted.weblate.org/languages/cs/", - "url": "https://hosted.weblate.org/api/languages/cs/", - "statistics_url": "https://hosted.weblate.org/api/languages/cs/statistics/" - }, - "language_code": "cs", - "id": 1614705, - "filename": "docs/README-cs.md", - "revision": "ee6855faacd6887ca42429ab852ac4c404a840c4,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/cs/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/cs/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/cs/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/cs/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 43, - "translated_words": 339, - "translated_percent": 36.4, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:14.819508+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/cs/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/cs/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/cs/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/cs/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/cs/units/" - }, - { - "language": { - "id": 58, - "code": "pt", - "name": "Portuguese", - "plural": { - "id": 245, - "source": 0, - "number": 2, - "formula": "n > 1", - "type": 1 - }, - "aliases": [ - "por", - "por_pt", - "pt_pt", - "ptg" - ], - "direction": "ltr", - "population": 249463918, - "web_url": "https://hosted.weblate.org/languages/pt/", - "url": "https://hosted.weblate.org/api/languages/pt/", - "statistics_url": "https://hosted.weblate.org/api/languages/pt/statistics/" - }, - "language_code": "pt", - "id": 1614706, - "filename": "docs/README-pt.md", - "revision": "b3a9f45b8e23cb6378cd3dfa15691918eeed5a84,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/pt/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/pt/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/pt/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/pt/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 6, - "translated_words": 35, - "translated_percent": 5, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:18.156718+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/pt/units/" - }, - { - "language": { - "id": 60, - "code": "vi", - "name": "Vietnamese", - "plural": { - "id": 337, - "source": 0, - "number": 1, - "formula": "0", - "type": 0 - }, - "aliases": [ - "vi_vn", - "vie", - "vn" - ], - "direction": "ltr", - "population": 92370781, - "web_url": "https://hosted.weblate.org/languages/vi/", - "url": "https://hosted.weblate.org/api/languages/vi/", - "statistics_url": "https://hosted.weblate.org/api/languages/vi/statistics/" - }, - "language_code": "vi", - "id": 1614707, - "filename": "docs/README-vi.md", - "revision": "8a4fdf64dff418ae10af3faf26f8042fcad589aa,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/vi/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/vi/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/vi/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/vi/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 66, - "translated_words": 563, - "translated_percent": 55.9, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 1, - "failing_checks_words": 3, - "failing_checks_percent": 0.8, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:19.594969+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/vi/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/vi/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/vi/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/vi/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/vi/units/" - }, - { - "language": { - "id": 64, - "code": "hr", - "name": "Croatian", - "plural": { - "id": 66, - "source": 0, - "number": 3, - "formula": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", - "type": 22 - }, - "aliases": [ - "hr_hr", - "hrv", - "scr" - ], - "direction": "ltr", - "population": 6790797, - "web_url": "https://hosted.weblate.org/languages/hr/", - "url": "https://hosted.weblate.org/api/languages/hr/", - "statistics_url": "https://hosted.weblate.org/api/languages/hr/statistics/" - }, - "language_code": "hr", - "id": 1614708, - "filename": "docs/README-hr.md", - "revision": "88f2a4bbdb291cb85fbb65130d2a15c78a6fd8e5,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/hr/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/hr/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/hr/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/hr/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 0, - "translated_words": 0, - "translated_percent": 0, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:16.211016+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/hr/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/hr/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/hr/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/hr/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/hr/units/" - }, - { - "language": { - "id": 66, - "code": "hu", - "name": "Hungarian", - "plural": { - "id": 136, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "hu_hu", - "hun" - ], - "direction": "ltr", - "population": 12313191, - "web_url": "https://hosted.weblate.org/languages/hu/", - "url": "https://hosted.weblate.org/api/languages/hu/", - "statistics_url": "https://hosted.weblate.org/api/languages/hu/statistics/" - }, - "language_code": "hu", - "id": 1614709, - "filename": "docs/README-hu.md", - "revision": "3301310befda08a5b5c45ef8770827e1fcec1e0a,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/hu/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/hu/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/hu/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/hu/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 32, - "translated_words": 254, - "translated_percent": 27.1, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 2, - "failing_checks_words": 23, - "failing_checks_percent": 1.6, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:16.360860+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/hu/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/hu/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/hu/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/hu/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/hu/units/" - }, - { - "language": { - "id": 78, - "code": "pl", - "name": "Polish", - "plural": { - "id": 244, - "source": 0, - "number": 3, - "formula": "n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", - "type": 22 - }, - "aliases": [ - "pl_pl", - "plk", - "pol" - ], - "direction": "ltr", - "population": 41500500, - "web_url": "https://hosted.weblate.org/languages/pl/", - "url": "https://hosted.weblate.org/api/languages/pl/", - "statistics_url": "https://hosted.weblate.org/api/languages/pl/statistics/" - }, - "language_code": "pl", - "id": 1614710, - "filename": "docs/README-pl.md", - "revision": "46d6992a6c40344d26bd6b6a8601d44d41c1e88d,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/pl/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/pl/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/pl/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/pl/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 8, - "translated_words": 79, - "translated_percent": 6.7, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 16, - "have_comment": 0, - "last_change": "2025-12-08T10:55:18.019340+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/pl/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/pl/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/pl/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/pl/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/pl/units/" - }, - { - "language": { - "id": 88, - "code": "ar", - "name": "Arabic", - "plural": { - "id": 10, - "source": 0, - "number": 6, - "formula": "n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5", - "type": 3 - }, - "aliases": [ - "ar_aa", - "ar_ar", - "ara", - "arb" - ], - "direction": "rtl", - "population": 378792526, - "web_url": "https://hosted.weblate.org/languages/ar/", - "url": "https://hosted.weblate.org/api/languages/ar/", - "statistics_url": "https://hosted.weblate.org/api/languages/ar/statistics/" - }, - "language_code": "ar", - "id": 1614711, - "filename": "docs/README-ar.md", - "revision": "f4f63c8ac28ec0a962ebc0dfb568043877a094b6,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/ar/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/ar/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/ar/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/ar/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 32, - "translated_words": 75, - "translated_percent": 27.1, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:14.504235+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/ar/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/ar/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/ar/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ar/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ar/units/" - }, - { - "language": { - "id": 96, - "code": "nl", - "name": "Dutch", - "plural": { - "id": 73, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "dut", - "nl_nl", - "nld" - ], - "direction": "ltr", - "population": 32854898, - "web_url": "https://hosted.weblate.org/languages/nl/", - "url": "https://hosted.weblate.org/api/languages/nl/", - "statistics_url": "https://hosted.weblate.org/api/languages/nl/statistics/" - }, - "language_code": "nl", - "id": 1614712, - "filename": "docs/README-nl.md", - "revision": "fe2bf72bab1d531f2a689f0c5cd73946f968d421,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/nl/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/nl/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/nl/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/nl/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 31, - "translated_words": 249, - "translated_percent": 26.2, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 1, - "failing_checks_words": 9, - "failing_checks_percent": 0.8, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:17.883033+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/nl/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/nl/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/nl/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/nl/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/nl/units/" - }, - { - "language": { - "id": 105, - "code": "fr", - "name": "French", - "plural": { - "id": 93, - "source": 0, - "number": 2, - "formula": "n > 1", - "type": 1 - }, - "aliases": [ - "fr_fr", - "fra", - "fra_fr", - "fre" - ], - "direction": "ltr", - "population": 332956350, - "web_url": "https://hosted.weblate.org/languages/fr/", - "url": "https://hosted.weblate.org/api/languages/fr/", - "statistics_url": "https://hosted.weblate.org/api/languages/fr/statistics/" - }, - "language_code": "fr", - "id": 1614713, - "filename": "docs/README-fr.md", - "revision": "172740086a99f1b4e08438d444c2d51d2dda1f3a,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/fr/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/fr/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/fr/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/fr/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 118, - "translated_words": 1110, - "translated_percent": 100, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:15.910510+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/fr/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/fr/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/fr/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/fr/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/fr/units/" - }, - { - "language": { - "id": 108, - "code": "fa", - "name": "Persian", - "plural": { - "id": 241, - "source": 0, - "number": 2, - "formula": "n > 1", - "type": 1 - }, - "aliases": [ - "fa_ir", - "fas", - "fas_ir", - "per", - "pes" - ], - "direction": "rtl", - "population": 89208445, - "web_url": "https://hosted.weblate.org/languages/fa/", - "url": "https://hosted.weblate.org/api/languages/fa/", - "statistics_url": "https://hosted.weblate.org/api/languages/fa/statistics/" - }, - "language_code": "fa", - "id": 1614714, - "filename": "docs/README-fa.md", - "revision": "aa651f065af16732537b53874185968a62595e28,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/fa/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/fa/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/fa/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/fa/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 19, - "translated_words": 131, - "translated_percent": 16.1, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 2, - "failing_checks_words": 29, - "failing_checks_percent": 1.6, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:15.622121+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/fa/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/fa/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/fa/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/fa/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/fa/units/" - }, - { - "language": { - "id": 110, - "code": "fi", - "name": "Finnish", - "plural": { - "id": 89, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "fi_fi", - "fin", - "fin_fi" - ], - "direction": "ltr", - "population": 5789395, - "web_url": "https://hosted.weblate.org/languages/fi/", - "url": "https://hosted.weblate.org/api/languages/fi/", - "statistics_url": "https://hosted.weblate.org/api/languages/fi/statistics/" - }, - "language_code": "fi", - "id": 1614715, - "filename": "docs/README-fi.md", - "revision": "88f2a4bbdb291cb85fbb65130d2a15c78a6fd8e5,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/fi/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/fi/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/fi/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/fi/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 0, - "translated_words": 0, - "translated_percent": 0, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:15.762968+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/fi/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/fi/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/fi/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/fi/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/fi/units/" - }, - { - "language": { - "id": 114, - "code": "sr", - "name": "Serbian", - "plural": { - "id": 268, - "source": 0, - "number": 3, - "formula": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2", - "type": 22 - }, - "aliases": [ - "rs", - "scc", - "sr_cs", - "sr_rs", - "srp" - ], - "direction": "ltr", - "population": 7189403, - "web_url": "https://hosted.weblate.org/languages/sr/", - "url": "https://hosted.weblate.org/api/languages/sr/", - "statistics_url": "https://hosted.weblate.org/api/languages/sr/statistics/" - }, - "language_code": "sr", - "id": 1614716, - "filename": "docs/README-sr.md", - "revision": "88f2a4bbdb291cb85fbb65130d2a15c78a6fd8e5,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/sr/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/sr/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/sr/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/sr/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 0, - "translated_words": 0, - "translated_percent": 0, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:18.942066+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/sr/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/sr/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/sr/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/sr/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/sr/units/" - }, - { - "language": { - "id": 116, - "code": "ko", - "name": "Korean", - "plural": { - "id": 165, - "source": 0, - "number": 1, - "formula": "0", - "type": 0 - }, - "aliases": [ - "ko_ko", - "ko_kr", - "kor", - "kor_kr" - ], - "direction": "ltr", - "population": 79278717, - "web_url": "https://hosted.weblate.org/languages/ko/", - "url": "https://hosted.weblate.org/api/languages/ko/", - "statistics_url": "https://hosted.weblate.org/api/languages/ko/statistics/" - }, - "language_code": "ko", - "id": 1614717, - "filename": "docs/README-ko.md", - "revision": "99560c99007f00159d560c5870c09d5cbb586e9c,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/ko/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/ko/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/ko/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/ko/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 43, - "translated_words": 310, - "translated_percent": 36.4, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 1, - "have_comment": 0, - "last_change": "2025-12-08T10:55:17.293720+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/ko/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/ko/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/ko/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ko/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/ko/units/" - }, - { - "language": { - "id": 124, - "code": "sl", - "name": "Slovenian", - "plural": { - "id": 280, - "source": 0, - "number": 4, - "formula": "n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3", - "type": 6 - }, - "aliases": [ - "sl_si", - "sl_sl", - "slv" - ], - "direction": "ltr", - "population": 1967012, - "web_url": "https://hosted.weblate.org/languages/sl/", - "url": "https://hosted.weblate.org/api/languages/sl/", - "statistics_url": "https://hosted.weblate.org/api/languages/sl/statistics/" - }, - "language_code": "sl", - "id": 1614718, - "filename": "docs/README-sl.md", - "revision": "88f2a4bbdb291cb85fbb65130d2a15c78a6fd8e5,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/sl/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/sl/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/sl/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/sl/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 0, - "translated_words": 0, - "translated_percent": 0, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:18.790431+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/sl/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/sl/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/sl/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/sl/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/sl/units/" - }, - { - "language": { - "id": 449, - "code": "nb_NO", - "name": "Norwegian Bokmål", - "plural": { - "id": 447, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "nb", - "nb_nb", - "no", - "no_nb", - "no_no", - "nob", - "nor", - "norwegian" - ], - "direction": "ltr", - "population": 5509730, - "web_url": "https://hosted.weblate.org/languages/nb_NO/", - "url": "https://hosted.weblate.org/api/languages/nb_NO/", - "statistics_url": "https://hosted.weblate.org/api/languages/nb_NO/statistics/" - }, - "language_code": "nb_NO", - "id": 1614719, - "filename": "docs/README-nb_NO.md", - "revision": "88f2a4bbdb291cb85fbb65130d2a15c78a6fd8e5,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/nb_NO/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/nb_NO/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/nb_NO/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/nb_NO/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 0, - "translated_words": 0, - "translated_percent": 0, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:17.749374+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/nb_NO/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/nb_NO/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/nb_NO/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/nb_NO/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/nb_NO/units/" - }, - { - "language": { - "id": 4429, - "code": "md", - "name": "md (generated)", - "plural": { - "id": 5665, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [], - "direction": "ltr", - "population": 0, - "web_url": "https://hosted.weblate.org/languages/md/", - "url": "https://hosted.weblate.org/api/languages/md/", - "statistics_url": "https://hosted.weblate.org/api/languages/md/statistics/" - }, - "language_code": "md", - "id": 1614720, - "filename": "docs/README-md.md", - "revision": "88f2a4bbdb291cb85fbb65130d2a15c78a6fd8e5,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/md/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/md/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/md/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/md/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 0, - "translated_words": 0, - "translated_percent": 0, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:17.448478+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/md/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/md/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/md/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/md/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/md/units/" - }, - { - "language": { - "id": 93, - "code": "id", - "name": "Indonesian", - "plural": { - "id": 141, - "source": 0, - "number": 1, - "formula": "0", - "type": 0 - }, - "aliases": [ - "id_id", - "in", - "in_id", - "ind" - ], - "direction": "ltr", - "population": 180519583, - "web_url": "https://hosted.weblate.org/languages/id/", - "url": "https://hosted.weblate.org/api/languages/id/", - "statistics_url": "https://hosted.weblate.org/api/languages/id/statistics/" - }, - "language_code": "id", - "id": 1615855, - "filename": "docs/README-id.md", - "revision": "1eeae4bf7459369c91c3d4e042de77931146c2e0,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/id/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/id/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/id/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/id/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 22, - "translated_words": 151, - "translated_percent": 18.6, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:16.508985+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/id/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/id/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/id/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/id/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/id/units/" - }, - { - "language": { - "id": 107, - "code": "sv", - "name": "Swedish", - "plural": { - "id": 301, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "sv_se", - "sve", - "swe", - "swe_se" - ], - "direction": "ltr", - "population": 13338376, - "web_url": "https://hosted.weblate.org/languages/sv/", - "url": "https://hosted.weblate.org/api/languages/sv/", - "statistics_url": "https://hosted.weblate.org/api/languages/sv/statistics/" - }, - "language_code": "sv", - "id": 1616650, - "filename": "docs/README-sv.md", - "revision": "6a71fb69bdb7eaf995dbdad69fe1691bbe24e38f,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/sv/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/sv/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/sv/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/sv/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 5, - "translated_words": 33, - "translated_percent": 4.2, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:19.117945+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/sv/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/sv/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/sv/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/sv/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/sv/units/" - }, - { - "language": { - "id": 67, - "code": "hi", - "name": "Hindi", - "plural": { - "id": 134, - "source": 0, - "number": 2, - "formula": "n > 1", - "type": 1 - }, - "aliases": [ - "hi_in", - "hin" - ], - "direction": "ltr", - "population": 580318483, - "web_url": "https://hosted.weblate.org/languages/hi/", - "url": "https://hosted.weblate.org/api/languages/hi/", - "statistics_url": "https://hosted.weblate.org/api/languages/hi/statistics/" - }, - "language_code": "hi", - "id": 1618799, - "filename": "docs/README-hi.md", - "revision": "a2707d32944aa74ea74f3fc593c7c96c73ca97f9,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/hi/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/hi/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/hi/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/hi/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 1, - "translated_words": 2, - "translated_percent": 0.8, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:16.061819+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/hi/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/hi/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/hi/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/hi/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/hi/units/" - }, - { - "language": { - "id": 80, - "code": "mr", - "name": "Marathi", - "plural": { - "id": 198, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "mar", - "mr_in" - ], - "direction": "ltr", - "population": 98639100, - "web_url": "https://hosted.weblate.org/languages/mr/", - "url": "https://hosted.weblate.org/api/languages/mr/", - "statistics_url": "https://hosted.weblate.org/api/languages/mr/statistics/" - }, - "language_code": "mr", - "id": 1618804, - "filename": "docs/README-mr.md", - "revision": "88f2a4bbdb291cb85fbb65130d2a15c78a6fd8e5,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/mr/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/mr/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/mr/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/mr/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 0, - "translated_words": 0, - "translated_percent": 0, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 0, - "failing_checks_words": 0, - "failing_checks_percent": 0, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:17.599588+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/mr/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/mr/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/mr/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/mr/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/mr/units/" - }, - { - "language": { - "id": 62, - "code": "en_GB", - "name": "English (United Kingdom)", - "plural": { - "id": 81, - "source": 0, - "number": 2, - "formula": "n != 1", - "type": 1 - }, - "aliases": [ - "eng_gb", - "english_uk" - ], - "direction": "ltr", - "population": 67089918, - "web_url": "https://hosted.weblate.org/languages/en_GB/", - "url": "https://hosted.weblate.org/api/languages/en_GB/", - "statistics_url": "https://hosted.weblate.org/api/languages/en_GB/statistics/" - }, - "language_code": "en_GB", - "id": 1627399, - "filename": "docs/README-en_GB.md", - "revision": "d8785285843cae2328d45313715b8f2d5c0efc09,5c59039312ea3d3684cbb62748ea9249d1a06a6d", - "web_url": "https://hosted.weblate.org/projects/trilium/readme/en_GB/", - "share_url": "https://hosted.weblate.org/engage/trilium/-/en_GB/", - "translate_url": "https://hosted.weblate.org/translate/trilium/readme/en_GB/", - "url": "https://hosted.weblate.org/api/translations/trilium/readme/en_GB/", - "is_template": false, - "is_source": false, - "total": 118, - "total_words": 1110, - "translated": 1, - "translated_words": 6, - "translated_percent": 0.8, - "fuzzy": 0, - "fuzzy_words": 0, - "fuzzy_percent": 0, - "failing_checks": 1, - "failing_checks_words": 42, - "failing_checks_percent": 0.8, - "have_suggestion": 0, - "have_comment": 0, - "last_change": "2025-12-08T10:55:15.298351+01:00", - "last_author": null, - "repository_url": "https://hosted.weblate.org/api/translations/trilium/readme/en_GB/repository/", - "file_url": "https://hosted.weblate.org/api/translations/trilium/readme/en_GB/file/", - "statistics_url": "https://hosted.weblate.org/api/translations/trilium/readme/en_GB/statistics/", - "changes_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/en_GB/changes/", - "units_list_url": "https://hosted.weblate.org/api/translations/trilium/readme/en_GB/units/" - } - ] -} \ No newline at end of file diff --git a/scripts/translation/check-translation-coverage.ts b/scripts/translation/check-translation-coverage.ts new file mode 100644 index 0000000000..57ae4a57e4 --- /dev/null +++ b/scripts/translation/check-translation-coverage.ts @@ -0,0 +1,21 @@ +import { LOCALES } from "../../packages/commons/src/lib/i18n"; +import { getLanguageStats } from "./utils"; + +async function main() { + const languageStats = await getLanguageStats("client"); + const localeIdsWithCoverage = languageStats.results + .filter(language => language.translated_percent > 50) + .map(language => language.language_code); + + for (const localeId of localeIdsWithCoverage) { + const locale = LOCALES.find(l => l.id === localeId); + if (!locale) { + console.error(`Locale not found for id: ${localeId}`); + process.exit(1); + } + } + + console.log("Translation coverage check passed."); +} + +main(); diff --git a/scripts/translation/manage-readme.ts b/scripts/translation/manage-readme.ts index f5a3104b46..ba406f835e 100644 --- a/scripts/translation/manage-readme.ts +++ b/scripts/translation/manage-readme.ts @@ -1,42 +1,15 @@ -import { readFile, stat, writeFile, } from "fs/promises"; +import { readFile, writeFile } from "fs/promises"; import { join } from "path"; +import { getLanguageStats } from "./utils"; + const scriptDir = __dirname; const rootDir = join(scriptDir, "../.."); const docsDir = join(rootDir, "docs"); -async function getLanguageStats() { - const cacheFile = join(scriptDir, ".language-stats.json"); - - // Try to read from the cache. - try { - const cacheStats = await stat(cacheFile); - const now = new Date(); - const oneDay = 24 * 60 * 60 * 1000; // milliseconds - if (cacheStats.mtimeMs < now.getTime() + oneDay) { - console.log("Reading language stats from cache."); - return JSON.parse(await readFile(cacheFile, "utf-8")); - } - } catch (e) { - if (!(e && typeof e === "object" && "code" in e && e.code === "ENOENT")) { - throw e; - } - } - - // Make the request - console.log("Reading language stats from Weblate API."); - const request = await fetch("https://hosted.weblate.org/api/components/trilium/readme/translations/"); - const stats = JSON.parse(await request.text()); - - // Update the cache - await writeFile(cacheFile, JSON.stringify(stats, null, 4)); - - return stats; -} - async function rewriteLanguageBar(readme: string) { // Filter languages by their availability. - const languageStats = await getLanguageStats(); + const languageStats = await getLanguageStats("readme"); const languagesWithCoverage: any[] = languageStats.results.filter(language => language.translated_percent > 75); const languageLinks = languagesWithCoverage .map(language => `[${language.language.name}](./${language.filename})`) diff --git a/scripts/translation/utils.ts b/scripts/translation/utils.ts new file mode 100644 index 0000000000..6683edc080 --- /dev/null +++ b/scripts/translation/utils.ts @@ -0,0 +1,33 @@ +import { readFile, stat,writeFile } from "fs/promises"; +import { join } from "path"; + +const scriptDir = __dirname; + +export async function getLanguageStats(project: "readme" | "client") { + const cacheFile = join(scriptDir, `.language-stats-${project}.json`); + + // Try to read from the cache. + try { + const cacheStats = await stat(cacheFile); + const now = new Date(); + const oneDay = 24 * 60 * 60 * 1000; // milliseconds + if (cacheStats.mtimeMs < now.getTime() + oneDay) { + console.log("Reading language stats from cache."); + return JSON.parse(await readFile(cacheFile, "utf-8")); + } + } catch (e) { + if (!(e && typeof e === "object" && "code" in e && e.code === "ENOENT")) { + throw e; + } + } + + // Make the request + console.log("Reading language stats from Weblate API."); + const request = await fetch(`https://hosted.weblate.org/api/components/trilium/${project}/translations/`); + const stats = JSON.parse(await request.text()); + + // Update the cache + await writeFile(cacheFile, JSON.stringify(stats, null, 4)); + + return stats; +}