mirror of
https://github.com/YunoHost/apps.git
synced 2024-09-03 20:06:07 +02:00
Merge branch 'master' into master
This commit is contained in:
commit
6fbf3afbf3
12 changed files with 981 additions and 226 deletions
91
apps.toml
91
apps.toml
|
@ -132,7 +132,7 @@ url = "https://github.com/YunoHost-Apps/alltube_ynh"
|
||||||
[ampache]
|
[ampache]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "multimedia"
|
category = "multimedia"
|
||||||
level = 6
|
level = 8
|
||||||
potential_alternative_to = [ "Deezer", "SoundCloud", "Spotify" ]
|
potential_alternative_to = [ "Deezer", "SoundCloud", "Spotify" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "music" ]
|
subtags = [ "music" ]
|
||||||
|
@ -202,7 +202,7 @@ url = "https://github.com/YunoHost-Apps/backdrop_ynh"
|
||||||
[baikal]
|
[baikal]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "synchronization"
|
category = "synchronization"
|
||||||
level = 8
|
level = 6
|
||||||
potential_alternative_to = [ "Microsoft Outlook" ]
|
potential_alternative_to = [ "Microsoft Outlook" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "calendar", "contacts" ]
|
subtags = [ "calendar", "contacts" ]
|
||||||
|
@ -245,7 +245,7 @@ added_date = 1674232499 # 2023/01/20
|
||||||
antifeatures = [ "deprecated-software" ]
|
antifeatures = [ "deprecated-software" ]
|
||||||
category = "publishing"
|
category = "publishing"
|
||||||
deprecated_date = 1717071136 # 2024/05/30
|
deprecated_date = 1717071136 # 2024/05/30
|
||||||
level = 7
|
level = 6
|
||||||
potential_alternative_to = [ "Blogger", "Coldfusion", "Wix" ]
|
potential_alternative_to = [ "Blogger", "Coldfusion", "Wix" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "blog" ]
|
subtags = [ "blog" ]
|
||||||
|
@ -343,7 +343,7 @@ url = "https://github.com/YunoHost-Apps/cachet_ynh"
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "productivity_and_management"
|
category = "productivity_and_management"
|
||||||
level = 0
|
level = 0
|
||||||
state = "working"
|
state = "notworking"
|
||||||
subtags = [ "accounting", "business_and_ngos" ]
|
subtags = [ "accounting", "business_and_ngos" ]
|
||||||
url = "https://github.com/Yunohost-Apps/caerp_ynh"
|
url = "https://github.com/Yunohost-Apps/caerp_ynh"
|
||||||
|
|
||||||
|
@ -368,7 +368,7 @@ url = "https://github.com/YunoHost-Apps/calibreweb_ynh"
|
||||||
[castopod]
|
[castopod]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "multimedia"
|
category = "multimedia"
|
||||||
level = 6
|
level = 8
|
||||||
potential_alternative_to = [ "Anchor", "Apple Podcasts", "Audible", "Deezer", "SoundCloud", "Spotify" ]
|
potential_alternative_to = [ "Anchor", "Apple Podcasts", "Audible", "Deezer", "SoundCloud", "Spotify" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/castopod_ynh"
|
url = "https://github.com/YunoHost-Apps/castopod_ynh"
|
||||||
|
@ -407,7 +407,7 @@ url = "https://github.com/YunoHost-Apps/cheky_ynh"
|
||||||
[chitchatter]
|
[chitchatter]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "communication"
|
category = "communication"
|
||||||
level = 8
|
level = 6
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "chat" ]
|
subtags = [ "chat" ]
|
||||||
url = "https://github.com/YunoHost-Apps/chitchatter_ynh"
|
url = "https://github.com/YunoHost-Apps/chitchatter_ynh"
|
||||||
|
@ -443,7 +443,7 @@ url = "https://github.com/YunoHost-Apps/chyrplite_ynh"
|
||||||
[cinny]
|
[cinny]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "communication"
|
category = "communication"
|
||||||
level = 8
|
level = 1
|
||||||
potential_alternative_to = [ "Discord", "Facebook Messenger", "Signal", "Skype", "Telegram", "Whatsapp" ]
|
potential_alternative_to = [ "Discord", "Facebook Messenger", "Signal", "Skype", "Telegram", "Whatsapp" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "chat" ]
|
subtags = [ "chat" ]
|
||||||
|
@ -543,7 +543,7 @@ url = "https://github.com/YunoHost-Apps/concrete5_ynh"
|
||||||
[conduit]
|
[conduit]
|
||||||
added_date = 1691780437 # 2023/08/11
|
added_date = 1691780437 # 2023/08/11
|
||||||
category = "communication"
|
category = "communication"
|
||||||
level = 7
|
level = 8
|
||||||
potential_alternative_to = [ "Discord", "Facebook Messenger", "Signal", "Skype", "Telegram", "Whatsapp" ]
|
potential_alternative_to = [ "Discord", "Facebook Messenger", "Signal", "Skype", "Telegram", "Whatsapp" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "chat" ]
|
subtags = [ "chat" ]
|
||||||
|
@ -570,7 +570,7 @@ url = "https://github.com/YunoHost-Apps/cops_ynh"
|
||||||
[coturn]
|
[coturn]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "system_tools"
|
category = "system_tools"
|
||||||
level = 6
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "network" ]
|
subtags = [ "network" ]
|
||||||
url = "https://github.com/YunoHost-Apps/coturn_ynh"
|
url = "https://github.com/YunoHost-Apps/coturn_ynh"
|
||||||
|
@ -614,7 +614,7 @@ url = "https://github.com/YunoHost-Apps/crabfit_ynh"
|
||||||
[cryptpad]
|
[cryptpad]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "office"
|
category = "office"
|
||||||
level = 6
|
level = 8
|
||||||
potential_alternative_to = [ "Google Docs" ]
|
potential_alternative_to = [ "Google Docs" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "text" ]
|
subtags = [ "text" ]
|
||||||
|
@ -689,7 +689,7 @@ url = "https://github.com/YunoHost-Apps/dendrite_ynh"
|
||||||
[dex]
|
[dex]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "system_tools"
|
category = "system_tools"
|
||||||
level = 6
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "network" ]
|
subtags = [ "network" ]
|
||||||
url = "https://github.com/YunoHost-Apps/dex_ynh"
|
url = "https://github.com/YunoHost-Apps/dex_ynh"
|
||||||
|
@ -724,7 +724,7 @@ url = "https://github.com/YunoHost-Apps/diaspora_ynh"
|
||||||
[digiscreen]
|
[digiscreen]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "wat"
|
category = "wat"
|
||||||
level = 6
|
level = 7
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/digiscreen_ynh"
|
url = "https://github.com/YunoHost-Apps/digiscreen_ynh"
|
||||||
|
|
||||||
|
@ -810,7 +810,7 @@ url = "https://github.com/YunoHost-Apps/django-for-runners_ynh"
|
||||||
[django-fritzconnection]
|
[django-fritzconnection]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "system_tools"
|
category = "system_tools"
|
||||||
level = 3
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "network" ]
|
subtags = [ "network" ]
|
||||||
url = "https://github.com/YunoHost-Apps/django-fritzconnection_ynh"
|
url = "https://github.com/YunoHost-Apps/django-fritzconnection_ynh"
|
||||||
|
@ -851,7 +851,7 @@ url = "https://github.com/YunoHost-Apps/dolibarr_ynh"
|
||||||
[domoticz]
|
[domoticz]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "iot"
|
category = "iot"
|
||||||
level = 6
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/domoticz_ynh"
|
url = "https://github.com/YunoHost-Apps/domoticz_ynh"
|
||||||
|
|
||||||
|
@ -905,6 +905,13 @@ level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/duniter_ynh"
|
url = "https://github.com/YunoHost-Apps/duniter_ynh"
|
||||||
|
|
||||||
|
[dynamicqrcode]
|
||||||
|
added_date = 1721508308 # 2024/07/20
|
||||||
|
category = "small_utilities"
|
||||||
|
level = 7
|
||||||
|
state = "working"
|
||||||
|
url = "https://github.com/YunoHost-Apps/dynamicqrcode_ynh"
|
||||||
|
|
||||||
[easyappointments]
|
[easyappointments]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "productivity_and_management"
|
category = "productivity_and_management"
|
||||||
|
@ -917,7 +924,7 @@ url = "https://github.com/YunoHost-Apps/easyappointments_ynh"
|
||||||
[elabftw]
|
[elabftw]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "productivity_and_management"
|
category = "productivity_and_management"
|
||||||
level = 8
|
level = 6
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/elabftw_ynh"
|
url = "https://github.com/YunoHost-Apps/elabftw_ynh"
|
||||||
|
|
||||||
|
@ -1030,7 +1037,7 @@ url = "https://github.com/YunoHost-Apps/ethercalc_ynh"
|
||||||
[etherpad]
|
[etherpad]
|
||||||
added_date = 1694300530 # 2023/09/09
|
added_date = 1694300530 # 2023/09/09
|
||||||
category = "office"
|
category = "office"
|
||||||
level = 6
|
level = 7
|
||||||
potential_alternative_to = [ "G Suite", "Google Docs", "Microsoft Office", "Microsoft Word", "Office 365" ]
|
potential_alternative_to = [ "G Suite", "Google Docs", "Microsoft Office", "Microsoft Word", "Office 365" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "text" ]
|
subtags = [ "text" ]
|
||||||
|
@ -1266,7 +1273,7 @@ url = "https://github.com/YunoHost-Apps/funkwhale_ynh"
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "communication"
|
category = "communication"
|
||||||
level = 8
|
level = 8
|
||||||
potential_alternative_to = [ "Skype", "Zoom" ]
|
potential_alternative_to = [ "BigBlueButton", "Skype", "Zoom" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "meeting" ]
|
subtags = [ "meeting" ]
|
||||||
url = "https://github.com/YunoHost-Apps/galene_ynh"
|
url = "https://github.com/YunoHost-Apps/galene_ynh"
|
||||||
|
@ -1324,7 +1331,7 @@ url = "https://github.com/YunoHost-Apps/getsimple_ynh"
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
antifeatures = [ "arbitrary-limitations" ]
|
antifeatures = [ "arbitrary-limitations" ]
|
||||||
category = "publishing"
|
category = "publishing"
|
||||||
level = 6
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "website" ]
|
subtags = [ "website" ]
|
||||||
url = "https://github.com/YunoHost-Apps/ghost_ynh"
|
url = "https://github.com/YunoHost-Apps/ghost_ynh"
|
||||||
|
@ -1350,7 +1357,7 @@ url = "https://github.com/YunoHost-Apps/gitlab_ynh"
|
||||||
[gitlab-runner]
|
[gitlab-runner]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "dev"
|
category = "dev"
|
||||||
level = 8
|
level = 6
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "forge" ]
|
subtags = [ "forge" ]
|
||||||
url = "https://github.com/YunoHost-Apps/gitlab-runner_ynh"
|
url = "https://github.com/YunoHost-Apps/gitlab-runner_ynh"
|
||||||
|
@ -1389,7 +1396,7 @@ url = "https://github.com/YunoHost-Apps/glowingbear_ynh"
|
||||||
[glpi]
|
[glpi]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "productivity_and_management"
|
category = "productivity_and_management"
|
||||||
level = 6
|
level = 8
|
||||||
potential_alternative_to = [ "Cherwell", "Freshdesk", "Ivanti", "Peregrine Systems (AssetCenter)", "Remedy (BMC Software)", "ServiceNow" ]
|
potential_alternative_to = [ "Cherwell", "Freshdesk", "Ivanti", "Peregrine Systems (AssetCenter)", "Remedy (BMC Software)", "ServiceNow" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "task" ]
|
subtags = [ "task" ]
|
||||||
|
@ -1691,7 +1698,7 @@ url = "https://github.com/YunoHost-Apps/indexhibit_ynh"
|
||||||
added_date = 1691920584 # 2023/08/13
|
added_date = 1691920584 # 2023/08/13
|
||||||
branch = "main"
|
branch = "main"
|
||||||
category = "system_tools"
|
category = "system_tools"
|
||||||
level = 7
|
level = 6
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "db", "monitoring" ]
|
subtags = [ "db", "monitoring" ]
|
||||||
url = "https://github.com/YunoHost-Apps/influxdb_v2_ynh"
|
url = "https://github.com/YunoHost-Apps/influxdb_v2_ynh"
|
||||||
|
@ -1750,7 +1757,7 @@ added_date = 1674232499 # 2023/01/20
|
||||||
antifeatures = [ "deprecated-software", "package-not-maintained" ]
|
antifeatures = [ "deprecated-software", "package-not-maintained" ]
|
||||||
category = "communication"
|
category = "communication"
|
||||||
deprecated_date = 1714590228 # 2024/05/01
|
deprecated_date = 1714590228 # 2024/05/01
|
||||||
level = 7
|
level = 6
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "chat" ]
|
subtags = [ "chat" ]
|
||||||
url = "https://github.com/YunoHost-Apps/jappix_ynh"
|
url = "https://github.com/YunoHost-Apps/jappix_ynh"
|
||||||
|
@ -1909,7 +1916,7 @@ url = "https://github.com/YunoHost-Apps/kodi_ynh"
|
||||||
[koel]
|
[koel]
|
||||||
added_date = 1694978602 # 2023/09/17
|
added_date = 1694978602 # 2023/09/17
|
||||||
category = "multimedia"
|
category = "multimedia"
|
||||||
level = 7
|
level = 8
|
||||||
potential_alternative_to = [ "Airsonic", "Deezer", "SoundCloud", "Spotify" ]
|
potential_alternative_to = [ "Airsonic", "Deezer", "SoundCloud", "Spotify" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "music" ]
|
subtags = [ "music" ]
|
||||||
|
@ -2208,7 +2215,7 @@ url = "https://github.com/YunoHost-Apps/mantis_ynh"
|
||||||
[mastodon]
|
[mastodon]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "social_media"
|
category = "social_media"
|
||||||
level = 6
|
level = 8
|
||||||
potential_alternative_to = [ "X" ]
|
potential_alternative_to = [ "X" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "microblogging" ]
|
subtags = [ "microblogging" ]
|
||||||
|
@ -2226,7 +2233,7 @@ url = "https://github.com/YunoHost-Apps/matomo_ynh"
|
||||||
[matrix-appservice-irc]
|
[matrix-appservice-irc]
|
||||||
added_date = 1675621561 # 2023/02/05
|
added_date = 1675621561 # 2023/02/05
|
||||||
category = "communication"
|
category = "communication"
|
||||||
level = 7
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "chat" ]
|
subtags = [ "chat" ]
|
||||||
url = "https://github.com/YunoHost-Apps/matrix-appservice-irc_ynh"
|
url = "https://github.com/YunoHost-Apps/matrix-appservice-irc_ynh"
|
||||||
|
@ -2298,7 +2305,7 @@ url = "https://github.com/YunoHost-Apps/mautrix_telegram_ynh"
|
||||||
[mautrix_whatsapp]
|
[mautrix_whatsapp]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "communication"
|
category = "communication"
|
||||||
level = 8
|
level = 6
|
||||||
potential_alternative_to = [ "Whatsapp" ]
|
potential_alternative_to = [ "Whatsapp" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "chat" ]
|
subtags = [ "chat" ]
|
||||||
|
@ -2339,7 +2346,7 @@ url = "https://github.com/YunoHost-Apps/microbin_ynh"
|
||||||
[microblogpub]
|
[microblogpub]
|
||||||
added_date = 1717921017 # 2024/06/09
|
added_date = 1717921017 # 2024/06/09
|
||||||
category = "social_media"
|
category = "social_media"
|
||||||
level = 6
|
level = 7
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "microblogging" ]
|
subtags = [ "microblogging" ]
|
||||||
url = "https://github.com/YunoHost-Apps/microblogpub_ynh"
|
url = "https://github.com/YunoHost-Apps/microblogpub_ynh"
|
||||||
|
@ -2486,7 +2493,7 @@ url = "https://github.com/YunoHost-Apps/motioneye_ynh"
|
||||||
[movim]
|
[movim]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "social_media"
|
category = "social_media"
|
||||||
level = 6
|
level = 8
|
||||||
potential_alternative_to = [ "Facebook Messenger", "Facebook", "MSN" ]
|
potential_alternative_to = [ "Facebook Messenger", "Facebook", "MSN" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "microblogging" ]
|
subtags = [ "microblogging" ]
|
||||||
|
@ -2575,7 +2582,7 @@ url = "https://github.com/YunoHost-Apps/mytinytodo_ynh"
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
antifeatures = [ "not-totally-free-upstream" ]
|
antifeatures = [ "not-totally-free-upstream" ]
|
||||||
category = "iot"
|
category = "iot"
|
||||||
level = 6
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/n8n_ynh"
|
url = "https://github.com/YunoHost-Apps/n8n_ynh"
|
||||||
|
|
||||||
|
@ -2701,7 +2708,7 @@ url = "https://github.com/YunoHost-Apps/olivetin_ynh"
|
||||||
[ombi]
|
[ombi]
|
||||||
added_date = 1696432145 # 2023/10/04
|
added_date = 1696432145 # 2023/10/04
|
||||||
category = "multimedia"
|
category = "multimedia"
|
||||||
level = 7
|
level = 6
|
||||||
potential_alternative_to = [ "Netflix", "Plex" ]
|
potential_alternative_to = [ "Netflix", "Plex" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "mediacenter" ]
|
subtags = [ "mediacenter" ]
|
||||||
|
@ -2738,7 +2745,7 @@ added_date = 1674232499 # 2023/01/20
|
||||||
antifeatures = [ "deprecated-software" ]
|
antifeatures = [ "deprecated-software" ]
|
||||||
category = "office"
|
category = "office"
|
||||||
deprecated_date = 1708403676 # 2024/02/20
|
deprecated_date = 1708403676 # 2024/02/20
|
||||||
level = 7
|
level = 6
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "text" ]
|
subtags = [ "text" ]
|
||||||
url = "https://github.com/YunoHost-Apps/opennote_ynh"
|
url = "https://github.com/YunoHost-Apps/opennote_ynh"
|
||||||
|
@ -2836,7 +2843,7 @@ url = "https://github.com/YunoHost-Apps/owncast-emojiwall_ynh"
|
||||||
[owncloud]
|
[owncloud]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "synchronization"
|
category = "synchronization"
|
||||||
level = 7
|
level = 8
|
||||||
potential_alternative_to = [ "Apple iCloud", "Dropbox", "Google Drive", "Microsoft OneDrive" ]
|
potential_alternative_to = [ "Apple iCloud", "Dropbox", "Google Drive", "Microsoft OneDrive" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "files" ]
|
subtags = [ "files" ]
|
||||||
|
@ -2886,7 +2893,7 @@ url = "https://github.com/YunoHost-Apps/paperless-ngx_ynh"
|
||||||
[peertube]
|
[peertube]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "social_media"
|
category = "social_media"
|
||||||
level = 6
|
level = 8
|
||||||
potential_alternative_to = [ "Dailymotion", "Twitch", "Vimeo", "YouTube" ]
|
potential_alternative_to = [ "Dailymotion", "Twitch", "Vimeo", "YouTube" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "videos" ]
|
subtags = [ "videos" ]
|
||||||
|
@ -2896,7 +2903,7 @@ url = "https://github.com/YunoHost-Apps/peertube_ynh"
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
antifeatures = [ "not-totally-free-upstream" ]
|
antifeatures = [ "not-totally-free-upstream" ]
|
||||||
category = "social_media"
|
category = "social_media"
|
||||||
level = 7
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "videos" ]
|
subtags = [ "videos" ]
|
||||||
url = "https://github.com/YunoHost-Apps/peertube-search-index_ynh"
|
url = "https://github.com/YunoHost-Apps/peertube-search-index_ynh"
|
||||||
|
@ -2920,7 +2927,7 @@ url = "https://github.com/YunoHost-Apps/pelican_ynh"
|
||||||
[penpot]
|
[penpot]
|
||||||
added_date = 1708540527 # 2024/02/21
|
added_date = 1708540527 # 2024/02/21
|
||||||
category = "dev"
|
category = "dev"
|
||||||
level = 6
|
level = 7
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "design" ]
|
subtags = [ "design" ]
|
||||||
url = "https://github.com/YunoHost-Apps/penpot_ynh"
|
url = "https://github.com/YunoHost-Apps/penpot_ynh"
|
||||||
|
@ -3212,7 +3219,7 @@ url = "https://github.com/YunoHost-Apps/prometheus_ynh"
|
||||||
[prosody]
|
[prosody]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "communication"
|
category = "communication"
|
||||||
level = 8
|
level = 0
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/prosody_ynh"
|
url = "https://github.com/YunoHost-Apps/prosody_ynh"
|
||||||
|
|
||||||
|
@ -3702,7 +3709,7 @@ url = "https://github.com/YunoHost-Apps/snappymail_ynh"
|
||||||
[snipeit]
|
[snipeit]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "productivity_and_management"
|
category = "productivity_and_management"
|
||||||
level = 6
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "business_and_ngos" ]
|
subtags = [ "business_and_ngos" ]
|
||||||
url = "https://github.com/YunoHost-Apps/snipeit_ynh"
|
url = "https://github.com/YunoHost-Apps/snipeit_ynh"
|
||||||
|
@ -3780,7 +3787,7 @@ url = "https://github.com/YunoHost-Apps/squid3_ynh"
|
||||||
[ssbroom]
|
[ssbroom]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "communication"
|
category = "communication"
|
||||||
level = 7
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/ssbroom_ynh"
|
url = "https://github.com/YunoHost-Apps/ssbroom_ynh"
|
||||||
|
|
||||||
|
@ -3886,7 +3893,7 @@ url = "https://github.com/YunoHost-Apps/syncthing_ynh"
|
||||||
[tandoor]
|
[tandoor]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "small_utilities"
|
category = "small_utilities"
|
||||||
level = 6
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/tandoor_ynh"
|
url = "https://github.com/YunoHost-Apps/tandoor_ynh"
|
||||||
|
|
||||||
|
@ -3986,7 +3993,7 @@ url = "https://github.com/YunoHost-Apps/tinyfilemanager_ynh"
|
||||||
[tldraw]
|
[tldraw]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "office"
|
category = "office"
|
||||||
level = 6
|
level = 8
|
||||||
potential_alternative_to = [ "Lucidchart" ]
|
potential_alternative_to = [ "Lucidchart" ]
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "draw" ]
|
subtags = [ "draw" ]
|
||||||
|
@ -4175,7 +4182,7 @@ url = "https://github.com/YunoHost-Apps/vikunja_ynh"
|
||||||
[vore]
|
[vore]
|
||||||
added_date = 1690540859 # 2023/07/28
|
added_date = 1690540859 # 2023/07/28
|
||||||
category = "reading"
|
category = "reading"
|
||||||
level = 7
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
subtags = [ "rssreader" ]
|
subtags = [ "rssreader" ]
|
||||||
url = "https://github.com/YunoHost-Apps/vore_ynh"
|
url = "https://github.com/YunoHost-Apps/vore_ynh"
|
||||||
|
@ -4511,7 +4518,7 @@ url = "https://github.com/YunoHost-Apps/zusam_ynh"
|
||||||
[zwave-js-ui]
|
[zwave-js-ui]
|
||||||
added_date = 1674232499 # 2023/01/20
|
added_date = 1674232499 # 2023/01/20
|
||||||
category = "iot"
|
category = "iot"
|
||||||
level = 6
|
level = 8
|
||||||
state = "working"
|
state = "working"
|
||||||
url = "https://github.com/YunoHost-Apps/zwave-js-ui_ynh"
|
url = "https://github.com/YunoHost-Apps/zwave-js-ui_ynh"
|
||||||
|
|
||||||
|
|
BIN
logos/dynamicqrcode.png
Normal file
BIN
logos/dynamicqrcode.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
|
@ -1,6 +1,6 @@
|
||||||
Babel==2.14.0
|
Babel==2.14.0
|
||||||
blinker==1.8.1
|
blinker==1.8.1
|
||||||
certifi==2024.2.2
|
certifi==2024.7.4
|
||||||
cffi==1.16.0
|
cffi==1.16.0
|
||||||
charset-normalizer==3.3.2
|
charset-normalizer==3.3.2
|
||||||
click==8.1.7
|
click==8.1.7
|
||||||
|
|
Binary file not shown.
|
@ -8,24 +8,26 @@ msgstr ""
|
||||||
"Project-Id-Version: PROJECT VERSION\n"
|
"Project-Id-Version: PROJECT VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2024-06-21 14:11+0200\n"
|
"POT-Creation-Date: 2024-06-21 14:11+0200\n"
|
||||||
"PO-Revision-Date: 2024-02-21 06:06+0100\n"
|
"PO-Revision-Date: 2024-07-28 12:54+0000\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: cjdw <cjdw@users.noreply.translate.yunohost.org>\n"
|
||||||
"Language-Team: id <LL@li.org>\n"
|
"Language-Team: Indonesian <https://translate.yunohost.org/projects/yunohost/"
|
||||||
|
"apps/id/>\n"
|
||||||
"Language: id\n"
|
"Language: id\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
"X-Generator: Weblate 5.4.3\n"
|
||||||
"Generated-By: Babel 2.14.0\n"
|
"Generated-By: Babel 2.14.0\n"
|
||||||
|
|
||||||
#: app.py:179
|
#: app.py:179
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "App %(app_id)s not found"
|
msgid "App %(app_id)s not found"
|
||||||
msgstr ""
|
msgstr "Aplikasi %(app_id)s tidak ditemukan"
|
||||||
|
|
||||||
#: app.py:182
|
#: app.py:182
|
||||||
msgid "You must be logged in to be able to star an app"
|
msgid "You must be logged in to be able to star an app"
|
||||||
msgstr ""
|
msgstr "Anda harus masuk untuk dapat memberi bintang pada aplikasi"
|
||||||
|
|
||||||
#: app.py:184 app.py:229 app.py:634 templates/wishlist_add.html:33
|
#: app.py:184 app.py:229 app.py:634 templates/wishlist_add.html:33
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -35,70 +37,82 @@ msgid ""
|
||||||
"least 5 topics, reading at least 30 posts, and spending at least 10 minutes "
|
"least 5 topics, reading at least 30 posts, and spending at least 10 minutes "
|
||||||
"reading posts."
|
"reading posts."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Perhatikan bahwa, karena berbagai penyalahgunaan, kami membatasi login di "
|
||||||
|
"toko aplikasi hanya untuk pengguna 'trust level 1'.<br/><br/>'Trust level 1' "
|
||||||
|
"dapat diperoleh setelah berinteraksi minimal dengan forum, dan lebih khusus "
|
||||||
|
"lagi: memasuki minimal 5 topik, membaca minimal 30 postingan, dan "
|
||||||
|
"menghabiskan minimal 10 menit membaca postingan."
|
||||||
|
|
||||||
#: app.py:227
|
#: app.py:227
|
||||||
msgid "You must be logged in to submit an app to the wishlist"
|
msgid "You must be logged in to submit an app to the wishlist"
|
||||||
msgstr ""
|
msgstr "Anda harus masuk untuk mengajukan aplikasi ke dalam daftar keinginan"
|
||||||
|
|
||||||
#: app.py:242
|
#: app.py:242
|
||||||
msgid "Invalid CSRF token, please refresh the page and try again"
|
msgid "Invalid CSRF token, please refresh the page and try again"
|
||||||
msgstr ""
|
msgstr "Token CSRF tidak valid, silakan memuat ulang halaman dan coba lagi"
|
||||||
|
|
||||||
#: app.py:280
|
#: app.py:280
|
||||||
msgid ""
|
msgid ""
|
||||||
"Proposing wishlist additions is limited to once every 15 days per user. "
|
"Proposing wishlist additions is limited to once every 15 days per user. "
|
||||||
"Please try again in a few days."
|
"Please try again in a few days."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Pengajuan penambahan daftar keinginan dibatasi setiap 15 hari sekali per "
|
||||||
|
"pengguna. Silakan mencoba lagi dalam beberapa hari."
|
||||||
|
|
||||||
#: app.py:284
|
#: app.py:284
|
||||||
msgid "App name should be at least 3 characters"
|
msgid "App name should be at least 3 characters"
|
||||||
msgstr ""
|
msgstr "Nama aplikasi minimal harus 3 karakter"
|
||||||
|
|
||||||
#: app.py:285
|
#: app.py:285
|
||||||
msgid "App name should be less than 30 characters"
|
msgid "App name should be less than 30 characters"
|
||||||
msgstr ""
|
msgstr "Nama aplikasi harus kurang dari 30 karakter"
|
||||||
|
|
||||||
#: app.py:288
|
#: app.py:288
|
||||||
msgid "App description should be at least 5 characters"
|
msgid "App description should be at least 5 characters"
|
||||||
msgstr ""
|
msgstr "Deskripsi aplikasi minimal harus 5 karakter"
|
||||||
|
|
||||||
#: app.py:292
|
#: app.py:292
|
||||||
msgid "App description should be less than 100 characters"
|
msgid "App description should be less than 100 characters"
|
||||||
msgstr ""
|
msgstr "Deskripsi aplikasi harus kurang dari 100 karakter"
|
||||||
|
|
||||||
#: app.py:296
|
#: app.py:296
|
||||||
msgid "Upstream code repo URL should be at least 10 characters"
|
msgid "Upstream code repo URL should be at least 10 characters"
|
||||||
msgstr ""
|
msgstr "URL depot kode hulu minimal harus 10 karakter"
|
||||||
|
|
||||||
#: app.py:300
|
#: app.py:300
|
||||||
msgid "Upstream code repo URL should be less than 150 characters"
|
msgid "Upstream code repo URL should be less than 150 characters"
|
||||||
msgstr ""
|
msgstr "URL depot kode hulu harus kurang dari 150 karakter"
|
||||||
|
|
||||||
#: app.py:304
|
#: app.py:304
|
||||||
msgid "License URL should be at least 10 characters"
|
msgid "License URL should be at least 10 characters"
|
||||||
msgstr ""
|
msgstr "URL lisensi minimal harus 10 karakter"
|
||||||
|
|
||||||
#: app.py:308
|
#: app.py:308
|
||||||
msgid "License URL should be less than 250 characters"
|
msgid "License URL should be less than 250 characters"
|
||||||
msgstr ""
|
msgstr "URL lisensi harus kurang dari 250 karakter"
|
||||||
|
|
||||||
#: app.py:310
|
#: app.py:310
|
||||||
msgid "Website URL should be less than 150 characters"
|
msgid "Website URL should be less than 150 characters"
|
||||||
msgstr ""
|
msgstr "URL situs web harus kurang dari 150 karakter"
|
||||||
|
|
||||||
#: app.py:313
|
#: app.py:313
|
||||||
msgid "App name contains special characters"
|
msgid "App name contains special characters"
|
||||||
msgstr ""
|
msgstr "Nama aplikasi berisi karakter khusus"
|
||||||
|
|
||||||
#: app.py:320
|
#: app.py:320
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please focus on what the app does, without using marketing, fuzzy terms, or "
|
"Please focus on what the app does, without using marketing, fuzzy terms, or "
|
||||||
"repeating that the app is 'free' and 'self-hostable'."
|
"repeating that the app is 'free' and 'self-hostable'."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Harap fokus pada apa yang dilakukan aplikasi, tanpa menggunakan pemasaran, "
|
||||||
|
"istilah yang tidak jelas, atau mengulangi bahwa aplikasi tersebut 'gratis' "
|
||||||
|
"dan 'dapat dihosting sendiri'."
|
||||||
|
|
||||||
#: app.py:330
|
#: app.py:330
|
||||||
msgid "No need to repeat the name of the app. Focus on what the app does."
|
msgid "No need to repeat the name of the app. Focus on what the app does."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Tidak perlu mengulang nama aplikasinya. Fokus pada apa yang dilakukan "
|
||||||
|
"aplikasi."
|
||||||
|
|
||||||
#: app.py:360
|
#: app.py:360
|
||||||
#, python-format
|
#, python-format
|
||||||
|
@ -106,6 +120,9 @@ msgid ""
|
||||||
"An entry with the name %(slug)s already exists in the wishlist, instead, you "
|
"An entry with the name %(slug)s already exists in the wishlist, instead, you "
|
||||||
"can <a href='%(url)s'>add a star to the app to show your interest</a>."
|
"can <a href='%(url)s'>add a star to the app to show your interest</a>."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Entri dengan nama %(slug)s sudah ada di dalam daftar keinginan, sebagai "
|
||||||
|
"gantinya, Anda dapat <a href='%(url)s'>menambahkan bintang pada aplikasi "
|
||||||
|
"untuk menunjukkan minat Anda</a>."
|
||||||
|
|
||||||
#: app.py:375
|
#: app.py:375
|
||||||
#, python-format
|
#, python-format
|
||||||
|
@ -113,6 +130,8 @@ msgid ""
|
||||||
"An app with the name %(slug)s already exists in the catalog, <a "
|
"An app with the name %(slug)s already exists in the catalog, <a "
|
||||||
"href='%(url)s'>you can see its page here</a>."
|
"href='%(url)s'>you can see its page here</a>."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Aplikasi dengan nama %(slug)s sudah ada di dalam katalog, <a href='%(url)"
|
||||||
|
"s'>Anda dapat melihat halamannya di sini</a>."
|
||||||
|
|
||||||
#: app.py:400
|
#: app.py:400
|
||||||
#, python-format
|
#, python-format
|
||||||
|
@ -121,6 +140,9 @@ msgid ""
|
||||||
"there's already <a href='%(url)s'>a waiting PR for this app</a>? Else, "
|
"there's already <a href='%(url)s'>a waiting PR for this app</a>? Else, "
|
||||||
"please report the issue to the YunoHost team."
|
"please report the issue to the YunoHost team."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Gagal membuat permintaan penarikan untuk menambahkan aplikasi ke dalam "
|
||||||
|
"daftar keinginan… Mungkin sudah ada <a href='%(url)s'>PR yang menunggu untuk "
|
||||||
|
"aplikasi ini</a>? Jika tidak, silakan melaporkan isu ini kepada tim YunoHost."
|
||||||
|
|
||||||
#: app.py:450
|
#: app.py:450
|
||||||
#, python-format
|
#, python-format
|
||||||
|
@ -129,15 +151,18 @@ msgid ""
|
||||||
"by the YunoHost team. You can track progress here: <a href='%(url)s'>"
|
"by the YunoHost team. You can track progress here: <a href='%(url)s'>"
|
||||||
"%(url)s</a>"
|
"%(url)s</a>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Aplikasi yang Anda usulkan telah berhasil dikirimkan. Seharusnya sekarang "
|
||||||
|
"sedang divalidasi oleh tim YunoHost. Anda dapat melacak kemajuannya di sini: "
|
||||||
|
"<a href='%(url)s'>%(url)s</a>"
|
||||||
|
|
||||||
#: app.py:632
|
#: app.py:632
|
||||||
msgid "Unfortunately, login was denied."
|
msgid "Unfortunately, login was denied."
|
||||||
msgstr ""
|
msgstr "Sayangnya, login ditolak."
|
||||||
|
|
||||||
#: templates/app.html:10 templates/catalog.html:23
|
#: templates/app.html:10 templates/catalog.html:23
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Logo for %(app)s"
|
msgid "Logo for %(app)s"
|
||||||
msgstr ""
|
msgstr "Logo untuk %(app)s"
|
||||||
|
|
||||||
#: templates/app.html:30 templates/app.html:31 templates/catalog.html:41
|
#: templates/app.html:30 templates/app.html:31 templates/catalog.html:41
|
||||||
#: templates/catalog.html:42
|
#: templates/catalog.html:42
|
||||||
|
@ -145,6 +170,8 @@ msgid ""
|
||||||
"This app is currently flagged as broken because it failed our automatic "
|
"This app is currently flagged as broken because it failed our automatic "
|
||||||
"tests."
|
"tests."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Aplikasi ini sekarang ditandai sebagai rusak karena gagal dalam pengujian "
|
||||||
|
"otomatis kami."
|
||||||
|
|
||||||
#: templates/app.html:30 templates/app.html:31 templates/catalog.html:41
|
#: templates/app.html:30 templates/app.html:31 templates/catalog.html:41
|
||||||
#: templates/catalog.html:42 templates/catalog.html:172
|
#: templates/catalog.html:42 templates/catalog.html:172
|
||||||
|
@ -152,6 +179,8 @@ msgid ""
|
||||||
"This is usually a temporary situation which requires packagers to fix "
|
"This is usually a temporary situation which requires packagers to fix "
|
||||||
"something in the app."
|
"something in the app."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Biasanya ini hanya situasi sementara yang mengharuskan pembuat paket "
|
||||||
|
"memperbaiki sesuatu di dalam aplikasinya."
|
||||||
|
|
||||||
#: templates/app.html:37 templates/app.html:38 templates/catalog.html:46
|
#: templates/app.html:37 templates/app.html:38 templates/catalog.html:46
|
||||||
#: templates/catalog.html:47
|
#: templates/catalog.html:47
|
||||||
|
@ -159,138 +188,143 @@ msgid ""
|
||||||
"This app has been good quality according to our automatic tests over at "
|
"This app has been good quality according to our automatic tests over at "
|
||||||
"least one year."
|
"least one year."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Aplikasi ini memiliki kualitas yang baik menurut pengujian otomatis kami "
|
||||||
|
"setidaknya selama setahun."
|
||||||
|
|
||||||
#: templates/app.html:81
|
#: templates/app.html:81
|
||||||
msgid "Try the demo"
|
msgid "Try the demo"
|
||||||
msgstr ""
|
msgstr "Coba demonstrasinya"
|
||||||
|
|
||||||
#: templates/app.html:82
|
#: templates/app.html:82
|
||||||
msgid "Demo"
|
msgid "Demo"
|
||||||
msgstr ""
|
msgstr "Demonstrasi"
|
||||||
|
|
||||||
#: templates/app.html:85
|
#: templates/app.html:85
|
||||||
msgid "Install with YunoHost"
|
msgid "Install with YunoHost"
|
||||||
msgstr ""
|
msgstr "Instal dengan YunoHost"
|
||||||
|
|
||||||
#: templates/app.html:93
|
#: templates/app.html:93
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Current version: %(version)s"
|
msgid "Current version: %(version)s"
|
||||||
msgstr ""
|
msgstr "Versi saat ini: %(version)s"
|
||||||
|
|
||||||
#: templates/app.html:95
|
#: templates/app.html:95
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Potential alternative to: %(alternatives)s"
|
msgid "Potential alternative to: %(alternatives)s"
|
||||||
msgstr ""
|
msgstr "Berpotensi alternatif dari: %(alternatives)s"
|
||||||
|
|
||||||
#: templates/app.html:101
|
#: templates/app.html:101
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Screenshot for %(app)s"
|
msgid "Screenshot for %(app)s"
|
||||||
msgstr ""
|
msgstr "Tangkapan layar pada %(app)s"
|
||||||
|
|
||||||
#: templates/app.html:106
|
#: templates/app.html:106
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"This app is only compatible with these specific architectures: %(archs)s"
|
"This app is only compatible with these specific architectures: %(archs)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Aplikasi ini hanya kompatibel dengan arsitektur khusus berikut ini: %(archs)s"
|
||||||
|
|
||||||
#: templates/app.html:112
|
#: templates/app.html:112
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "This app requires an unusual amount of RAM to install: %(ram)s"
|
msgid "This app requires an unusual amount of RAM to install: %(ram)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Aplikasi ini membutuhkan jumlah RAM yang tidak biasa agar bisa dipasang: "
|
||||||
|
"%(ram)s"
|
||||||
|
|
||||||
#: templates/app.html:118
|
#: templates/app.html:118
|
||||||
msgid "Important infos before installing"
|
msgid "Important infos before installing"
|
||||||
msgstr ""
|
msgstr "Informasi penting sebelum memasang"
|
||||||
|
|
||||||
#: templates/app.html:124
|
#: templates/app.html:124
|
||||||
msgid "Antifeatures"
|
msgid "Antifeatures"
|
||||||
msgstr ""
|
msgstr "Antifitur"
|
||||||
|
|
||||||
#: templates/app.html:125
|
#: templates/app.html:125
|
||||||
msgid "(This app has features you may not like)"
|
msgid "(This app has features you may not like)"
|
||||||
msgstr ""
|
msgstr "(Aplikasi ini memiliki fitur yang mungkin tidak Anda sukai)"
|
||||||
|
|
||||||
#: templates/app.html:136
|
#: templates/app.html:136
|
||||||
msgid "Useful links"
|
msgid "Useful links"
|
||||||
msgstr ""
|
msgstr "Tautan yang bermanfaat"
|
||||||
|
|
||||||
#: templates/app.html:139
|
#: templates/app.html:139
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "App license: %(license)s"
|
msgid "App license: %(license)s"
|
||||||
msgstr ""
|
msgstr "Lisensi aplikasi: %(license)s"
|
||||||
|
|
||||||
#: templates/app.html:140
|
#: templates/app.html:140
|
||||||
msgid " Official website"
|
msgid " Official website"
|
||||||
msgstr ""
|
msgstr " Situs web resmi"
|
||||||
|
|
||||||
#: templates/app.html:141
|
#: templates/app.html:141
|
||||||
msgid "Official admin documentation"
|
msgid "Official admin documentation"
|
||||||
msgstr ""
|
msgstr "Dokumentasi admin resmi"
|
||||||
|
|
||||||
#: templates/app.html:142
|
#: templates/app.html:142
|
||||||
msgid "Official user documentation"
|
msgid "Official user documentation"
|
||||||
msgstr ""
|
msgstr "Dokumentasi Pengguna Resmi"
|
||||||
|
|
||||||
#: templates/app.html:143
|
#: templates/app.html:143
|
||||||
msgid "Official code repository"
|
msgid "Official code repository"
|
||||||
msgstr ""
|
msgstr "Depot kode resmi"
|
||||||
|
|
||||||
#: templates/app.html:144
|
#: templates/app.html:144
|
||||||
msgid "YunoHost package repository"
|
msgid "YunoHost package repository"
|
||||||
msgstr ""
|
msgstr "Depot paket YunoHost"
|
||||||
|
|
||||||
#: templates/app.html:145
|
#: templates/app.html:145
|
||||||
msgid "YunoHost package license"
|
msgid "YunoHost package license"
|
||||||
msgstr ""
|
msgstr "Lisensi paket YunoHost"
|
||||||
|
|
||||||
#: templates/base.html:11
|
#: templates/base.html:11
|
||||||
msgid "YunoHost app store"
|
msgid "YunoHost app store"
|
||||||
msgstr ""
|
msgstr "Toko aplikasi Yunohost"
|
||||||
|
|
||||||
#: templates/base.html:31 templates/base.html:163 templates/index.html:3
|
#: templates/base.html:31 templates/base.html:163 templates/index.html:3
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr ""
|
msgstr "Rumah"
|
||||||
|
|
||||||
#: templates/base.html:40 templates/base.html:172 templates/dash.html:83
|
#: templates/base.html:40 templates/base.html:172 templates/dash.html:83
|
||||||
msgid "Catalog"
|
msgid "Catalog"
|
||||||
msgstr ""
|
msgstr "Katalog"
|
||||||
|
|
||||||
#: templates/base.html:46 templates/base.html:181
|
#: templates/base.html:46 templates/base.html:181
|
||||||
msgid "Wishlist"
|
msgid "Wishlist"
|
||||||
msgstr ""
|
msgstr "Daftar Keinginan"
|
||||||
|
|
||||||
#: templates/base.html:52
|
#: templates/base.html:52
|
||||||
msgid "Packaging dashboard"
|
msgid "Packaging dashboard"
|
||||||
msgstr ""
|
msgstr "Dasbor paket"
|
||||||
|
|
||||||
#: templates/base.html:57
|
#: templates/base.html:57
|
||||||
msgid "Charts & history"
|
msgid "Charts & history"
|
||||||
msgstr ""
|
msgstr "Grafik & rIwayat"
|
||||||
|
|
||||||
#: templates/base.html:71 templates/base.html:191
|
#: templates/base.html:71 templates/base.html:191
|
||||||
msgid "YunoHost documentation"
|
msgid "YunoHost documentation"
|
||||||
msgstr ""
|
msgstr "Dokumentasi YunoHost"
|
||||||
|
|
||||||
#: templates/base.html:79 templates/base.html:80
|
#: templates/base.html:79 templates/base.html:80
|
||||||
msgid "Toggle light/dark mode"
|
msgid "Toggle light/dark mode"
|
||||||
msgstr ""
|
msgstr "Beralih ke mode terang/gelap"
|
||||||
|
|
||||||
#: templates/base.html:88 templates/base.html:201
|
#: templates/base.html:88 templates/base.html:201
|
||||||
msgid "Login using YunoHost's forum"
|
msgid "Login using YunoHost's forum"
|
||||||
msgstr ""
|
msgstr "Masuk melalui forum YunoHost"
|
||||||
|
|
||||||
#: templates/base.html:120 templates/base.html:129 templates/base.html:229
|
#: templates/base.html:120 templates/base.html:129 templates/base.html:229
|
||||||
#: templates/base.html:238
|
#: templates/base.html:238
|
||||||
msgid "Packaging boards"
|
msgid "Packaging boards"
|
||||||
msgstr ""
|
msgstr "Papan pengemasan"
|
||||||
|
|
||||||
#: templates/base.html:136 templates/base.html:246
|
#: templates/base.html:136 templates/base.html:246
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr ""
|
msgstr "Keluar"
|
||||||
|
|
||||||
#: templates/base.html:149
|
#: templates/base.html:149
|
||||||
msgid "Toggle menu"
|
msgid "Toggle menu"
|
||||||
msgstr ""
|
msgstr "Beralih menu"
|
||||||
|
|
||||||
#: templates/base.html:264
|
#: templates/base.html:264
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -299,176 +333,183 @@ msgid ""
|
||||||
"palletsprojects.com'>Flask</a> and <a class='text-blue-800 dark:text-"
|
"palletsprojects.com'>Flask</a> and <a class='text-blue-800 dark:text-"
|
||||||
"blue-400' href='https://tailwindcss.com/'>TailwindCSS</a>"
|
"blue-400' href='https://tailwindcss.com/'>TailwindCSS</a>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Dibuat dengan <i class='text-red-500 fa fa-heart-o' aria-label='love'></i> "
|
||||||
|
"menggunakan <a class='text-blue-800 dark:text-blue-400' href='https://flask."
|
||||||
|
"palletsprojects.com'>Flask</a> dan <a class='text-blue-800 dark:text-blue-"
|
||||||
|
"400' href='https://tailwindcss.com/'>TailwindCSS</a>"
|
||||||
|
|
||||||
#: templates/base.html:265
|
#: templates/base.html:265
|
||||||
msgid "Source"
|
msgid "Source"
|
||||||
msgstr ""
|
msgstr "Sumber"
|
||||||
|
|
||||||
#: templates/base.html:266
|
#: templates/base.html:266
|
||||||
msgid "Terms of Services"
|
msgid "Terms of Services"
|
||||||
msgstr ""
|
msgstr "Ketentuan Layanan"
|
||||||
|
|
||||||
#: templates/catalog.html:77 templates/catalog.html:82
|
#: templates/catalog.html:77 templates/catalog.html:82
|
||||||
msgid "Application Catalog"
|
msgid "Application Catalog"
|
||||||
msgstr ""
|
msgstr "Katalog Aplikasi"
|
||||||
|
|
||||||
#: templates/catalog.html:88 templates/wishlist.html:16
|
#: templates/catalog.html:88 templates/wishlist.html:16
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr "Cari"
|
||||||
|
|
||||||
#: templates/catalog.html:93 templates/wishlist.html:21
|
#: templates/catalog.html:93 templates/wishlist.html:21
|
||||||
msgid "Search for…"
|
msgid "Search for…"
|
||||||
msgstr ""
|
msgstr "Mencari…"
|
||||||
|
|
||||||
#: templates/catalog.html:109
|
#: templates/catalog.html:109
|
||||||
msgid "All apps"
|
msgid "All apps"
|
||||||
msgstr ""
|
msgstr "Semua aplikasi"
|
||||||
|
|
||||||
#: templates/catalog.html:119 templates/dash.html:36 templates/wishlist.html:39
|
#: templates/catalog.html:119 templates/dash.html:36 templates/wishlist.html:39
|
||||||
msgid "Sort by"
|
msgid "Sort by"
|
||||||
msgstr ""
|
msgstr "Sortir dengan"
|
||||||
|
|
||||||
#: templates/catalog.html:125 templates/wishlist.html:45
|
#: templates/catalog.html:125 templates/wishlist.html:45
|
||||||
#: templates/wishlist.html:78
|
#: templates/wishlist.html:78
|
||||||
msgid "Popularity"
|
msgid "Popularity"
|
||||||
msgstr ""
|
msgstr "Popularitas"
|
||||||
|
|
||||||
#: templates/catalog.html:126
|
#: templates/catalog.html:126
|
||||||
msgid "Newest"
|
msgid "Newest"
|
||||||
msgstr ""
|
msgstr "Terbaru"
|
||||||
|
|
||||||
#: templates/catalog.html:127 templates/dash.html:42 templates/wishlist.html:46
|
#: templates/catalog.html:127 templates/dash.html:42 templates/wishlist.html:46
|
||||||
msgid "Alphabetical"
|
msgid "Alphabetical"
|
||||||
msgstr ""
|
msgstr "Alfabetis"
|
||||||
|
|
||||||
#: templates/catalog.html:130 templates/dash.html:64 templates/wishlist.html:49
|
#: templates/catalog.html:130 templates/dash.html:64 templates/wishlist.html:49
|
||||||
msgid "Requires to be logged-in"
|
msgid "Requires to be logged-in"
|
||||||
msgstr ""
|
msgstr "Harus masuk terlebih dahulu"
|
||||||
|
|
||||||
#: templates/catalog.html:132 templates/catalog.html:141 templates/dash.html:66
|
#: templates/catalog.html:132 templates/catalog.html:141 templates/dash.html:66
|
||||||
#: templates/dash.html:75 templates/wishlist.html:51 templates/wishlist.html:60
|
#: templates/dash.html:75 templates/wishlist.html:51 templates/wishlist.html:60
|
||||||
msgid "Show only apps you starred"
|
msgid "Show only apps you starred"
|
||||||
msgstr ""
|
msgstr "Hanya menampilkan aplikasi yang Anda bintangi"
|
||||||
|
|
||||||
#: templates/catalog.html:157 templates/wishlist.html:154
|
#: templates/catalog.html:157 templates/wishlist.html:154
|
||||||
msgid "No results found."
|
msgid "No results found."
|
||||||
msgstr ""
|
msgstr "Tidak ada hasil yang ditemukan."
|
||||||
|
|
||||||
#: templates/catalog.html:160
|
#: templates/catalog.html:160
|
||||||
msgid "Not finding what you are looking for?"
|
msgid "Not finding what you are looking for?"
|
||||||
msgstr ""
|
msgstr "Tidak menemukan apa yang Anda cari?"
|
||||||
|
|
||||||
#: templates/catalog.html:161
|
#: templates/catalog.html:161
|
||||||
msgid "Checkout the wishlist!"
|
msgid "Checkout the wishlist!"
|
||||||
msgstr ""
|
msgstr "Lihatlah daftar keinginan!"
|
||||||
|
|
||||||
#: templates/catalog.html:168
|
#: templates/catalog.html:168
|
||||||
msgid "Applications currently flagged as broken"
|
msgid "Applications currently flagged as broken"
|
||||||
msgstr ""
|
msgstr "Saat ini aplikasi ditandai sebagai rusak"
|
||||||
|
|
||||||
#: templates/catalog.html:171
|
#: templates/catalog.html:171
|
||||||
msgid "These are apps which failed our automatic tests."
|
msgid "These are apps which failed our automatic tests."
|
||||||
msgstr ""
|
msgstr "Ini adalah aplikasi yang gagal dalam pengujian otomatis kami."
|
||||||
|
|
||||||
#: templates/catalog.html:186
|
#: templates/catalog.html:186
|
||||||
msgid "Deprecated applications"
|
msgid "Deprecated applications"
|
||||||
msgstr ""
|
msgstr "Aplikasi yang kedaluwarsa"
|
||||||
|
|
||||||
#: templates/catalog.html:189
|
#: templates/catalog.html:189
|
||||||
msgid "These are apps who are not maintained anymore."
|
msgid "These are apps who are not maintained anymore."
|
||||||
msgstr ""
|
msgstr "Ini adalah aplikasi yang tidak terawat."
|
||||||
|
|
||||||
#: templates/catalog.html:190
|
#: templates/catalog.html:190
|
||||||
msgid ""
|
msgid ""
|
||||||
"This means that the developer will no longer update them. We strongly advise "
|
"This means that the developer will no longer update them. We strongly advise "
|
||||||
"against their installation and advise users to find alternatives."
|
"against their installation and advise users to find alternatives."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Artinya pengembang tidak akan memperbaruinya lagi. Kami sangat menyarankan "
|
||||||
|
"agar tidak memasangnya dan menyarankan pengguna untuk mencari alternatif "
|
||||||
|
"lain."
|
||||||
|
|
||||||
#: templates/charts.html:5
|
#: templates/charts.html:5
|
||||||
msgid "Apps quality level from automatic tests"
|
msgid "Apps quality level from automatic tests"
|
||||||
msgstr ""
|
msgstr "Tingkat kualitas aplikasi dari pengujian otomatis"
|
||||||
|
|
||||||
#: templates/charts.html:9
|
#: templates/charts.html:9
|
||||||
msgid "Apps quality level history"
|
msgid "Apps quality level history"
|
||||||
msgstr ""
|
msgstr "Riwayat tingkat kualitas aplikasi"
|
||||||
|
|
||||||
#: templates/charts.html:15
|
#: templates/charts.html:15
|
||||||
msgid "History"
|
msgid "History"
|
||||||
msgstr ""
|
msgstr "Riwayat"
|
||||||
|
|
||||||
#: templates/charts.html:27
|
#: templates/charts.html:27
|
||||||
msgid "Added"
|
msgid "Added"
|
||||||
msgstr ""
|
msgstr "Ditambahkan"
|
||||||
|
|
||||||
#: templates/charts.html:33
|
#: templates/charts.html:33
|
||||||
msgid "Repaired"
|
msgid "Repaired"
|
||||||
msgstr ""
|
msgstr "Diperbaiki"
|
||||||
|
|
||||||
#: templates/charts.html:39
|
#: templates/charts.html:39
|
||||||
msgid "Broke"
|
msgid "Broke"
|
||||||
msgstr ""
|
msgstr "Rusak"
|
||||||
|
|
||||||
#: templates/charts.html:45
|
#: templates/charts.html:45
|
||||||
msgid "Removed"
|
msgid "Removed"
|
||||||
msgstr ""
|
msgstr "Disingkirkan"
|
||||||
|
|
||||||
#: templates/charts.html:93
|
#: templates/charts.html:93
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr ""
|
msgstr "Tidak diketahui"
|
||||||
|
|
||||||
#: templates/charts.html:94
|
#: templates/charts.html:94
|
||||||
msgid "Level 0"
|
msgid "Level 0"
|
||||||
msgstr ""
|
msgstr "Tingkat 0"
|
||||||
|
|
||||||
#: templates/charts.html:95
|
#: templates/charts.html:95
|
||||||
msgid "Level 1"
|
msgid "Level 1"
|
||||||
msgstr ""
|
msgstr "Tingkat 1"
|
||||||
|
|
||||||
#: templates/charts.html:96
|
#: templates/charts.html:96
|
||||||
msgid "Level 2"
|
msgid "Level 2"
|
||||||
msgstr ""
|
msgstr "Tingkat 2"
|
||||||
|
|
||||||
#: templates/charts.html:97
|
#: templates/charts.html:97
|
||||||
msgid "Level 3"
|
msgid "Level 3"
|
||||||
msgstr ""
|
msgstr "Tingkat 3"
|
||||||
|
|
||||||
#: templates/charts.html:98
|
#: templates/charts.html:98
|
||||||
msgid "Level 4"
|
msgid "Level 4"
|
||||||
msgstr ""
|
msgstr "Tingkat 4"
|
||||||
|
|
||||||
#: templates/charts.html:99
|
#: templates/charts.html:99
|
||||||
msgid "Level 5"
|
msgid "Level 5"
|
||||||
msgstr ""
|
msgstr "Tingkat 5"
|
||||||
|
|
||||||
#: templates/charts.html:100
|
#: templates/charts.html:100
|
||||||
msgid "Level 6"
|
msgid "Level 6"
|
||||||
msgstr ""
|
msgstr "Tingkat 6"
|
||||||
|
|
||||||
#: templates/charts.html:101
|
#: templates/charts.html:101
|
||||||
msgid "Level 7"
|
msgid "Level 7"
|
||||||
msgstr ""
|
msgstr "Tingkat 7"
|
||||||
|
|
||||||
#: templates/charts.html:102
|
#: templates/charts.html:102
|
||||||
msgid "Level 8"
|
msgid "Level 8"
|
||||||
msgstr ""
|
msgstr "Tingkat 8"
|
||||||
|
|
||||||
#: templates/charts.html:122
|
#: templates/charts.html:122
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Level %(level)s:"
|
msgid "Level %(level)s:"
|
||||||
msgstr ""
|
msgstr "Tingkat %(level)s:"
|
||||||
|
|
||||||
#: templates/charts.html:122
|
#: templates/charts.html:122
|
||||||
msgid "Total:"
|
msgid "Total:"
|
||||||
msgstr ""
|
msgstr "Jumlah:"
|
||||||
|
|
||||||
#: templates/charts.html:123
|
#: templates/charts.html:123
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Level %(level)s"
|
msgid "Level %(level)s"
|
||||||
msgstr ""
|
msgstr "Tingkat %(level)s"
|
||||||
|
|
||||||
#: templates/dash.html:3 templates/dash.html:9
|
#: templates/dash.html:3 templates/dash.html:9
|
||||||
msgid "App packaging dashboard"
|
msgid "App packaging dashboard"
|
||||||
msgstr ""
|
msgstr "Dasbor pengemasan aplikasi"
|
||||||
|
|
||||||
#: templates/dash.html:11
|
#: templates/dash.html:11
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -479,171 +520,184 @@ msgid ""
|
||||||
"documentation</a> and come say hi to us on the <a class='text-blue-500' "
|
"documentation</a> and come say hi to us on the <a class='text-blue-500' "
|
||||||
"href='https://yunohost.org/chat_rooms'>app packaging chatroom</a>!"
|
"href='https://yunohost.org/chat_rooms'>app packaging chatroom</a>!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Di sini adalah tempat para pengemas dapat memantau status pengujian otomatis "
|
||||||
|
"(CI) dan permintaan penarikan umum yang sedang berlangsung di semua "
|
||||||
|
"aplikasi. Jika Anda ingin memulai pengemasan aplikasi di YunoHost, silakan "
|
||||||
|
"periksa <a class='text-blue-500' href='https://yunohost.org/"
|
||||||
|
"packaging_apps'>dokumentasi pengemasan</a> dan sapa kami di <a class='text-"
|
||||||
|
"blue-500' href='https://yunohost.org/chat_rooms'>ruang obrolan pengemasan "
|
||||||
|
"aplikasi</a>!"
|
||||||
|
|
||||||
#: templates/dash.html:18
|
#: templates/dash.html:18
|
||||||
msgid "Filter"
|
msgid "Filter"
|
||||||
msgstr ""
|
msgstr "Filter"
|
||||||
|
|
||||||
#: templates/dash.html:24
|
#: templates/dash.html:24
|
||||||
msgid "(None)"
|
msgid "(None)"
|
||||||
msgstr ""
|
msgstr "(Kosong)"
|
||||||
|
|
||||||
#: templates/dash.html:25
|
#: templates/dash.html:25
|
||||||
msgid "Regressions on main CI"
|
msgid "Regressions on main CI"
|
||||||
msgstr ""
|
msgstr "Regresi pada CI utama"
|
||||||
|
|
||||||
#: templates/dash.html:26
|
#: templates/dash.html:26
|
||||||
msgid "Broken / low quality apps"
|
msgid "Broken / low quality apps"
|
||||||
msgstr ""
|
msgstr "Aplikasi rusak / kualitas rendah"
|
||||||
|
|
||||||
#: templates/dash.html:27
|
#: templates/dash.html:27
|
||||||
msgid "Outdated tests on main CI"
|
msgid "Outdated tests on main CI"
|
||||||
msgstr ""
|
msgstr "Tes pada CI utama kedaluwarsa"
|
||||||
|
|
||||||
#: templates/dash.html:28
|
#: templates/dash.html:28
|
||||||
msgid "Major regressions on Bookworm CI"
|
msgid "Major regressions on Bookworm CI"
|
||||||
msgstr ""
|
msgstr "Regresi besar pada CI Bookworm"
|
||||||
|
|
||||||
#: templates/dash.html:29
|
#: templates/dash.html:29
|
||||||
msgid "Apps with testings PRs"
|
msgid "Apps with testings PRs"
|
||||||
msgstr ""
|
msgstr "Aplikasi dengan pengujian pada PR"
|
||||||
|
|
||||||
#: templates/dash.html:30
|
#: templates/dash.html:30
|
||||||
msgid "Apps with autoupdate PRs"
|
msgid "Apps with autoupdate PRs"
|
||||||
msgstr ""
|
msgstr "Aplikasi dengan pembaruan otomatis pada PR"
|
||||||
|
|
||||||
#: templates/dash.html:31
|
#: templates/dash.html:31
|
||||||
msgid "Apps with issues"
|
msgid "Apps with issues"
|
||||||
msgstr ""
|
msgstr "Aplikasi disertai dengan isu"
|
||||||
|
|
||||||
#: templates/dash.html:32
|
#: templates/dash.html:32
|
||||||
msgid "Packaging v1 apps"
|
msgid "Packaging v1 apps"
|
||||||
msgstr ""
|
msgstr "Mengemas aplikasi v1"
|
||||||
|
|
||||||
#: templates/dash.html:43
|
#: templates/dash.html:43
|
||||||
msgid "Quality level"
|
msgid "Quality level"
|
||||||
msgstr ""
|
msgstr "Tingkat kualitas"
|
||||||
|
|
||||||
#: templates/dash.html:44 templates/dash.html:214
|
#: templates/dash.html:44 templates/dash.html:214
|
||||||
msgid "Popularity stars"
|
msgid "Popularity stars"
|
||||||
msgstr ""
|
msgstr "Bintang popularitas"
|
||||||
|
|
||||||
#: templates/dash.html:45
|
#: templates/dash.html:45
|
||||||
msgid "Last update on main/master branch"
|
msgid "Last update on main/master branch"
|
||||||
msgstr ""
|
msgstr "Pembaruan terakhir pada cabang main/master"
|
||||||
|
|
||||||
#: templates/dash.html:46
|
#: templates/dash.html:46
|
||||||
msgid "Last update on testing branch"
|
msgid "Last update on testing branch"
|
||||||
msgstr ""
|
msgstr "Pembaruan terakhir pada cabang testing"
|
||||||
|
|
||||||
#: templates/dash.html:47
|
#: templates/dash.html:47
|
||||||
msgid "Issues number"
|
msgid "Issues number"
|
||||||
msgstr ""
|
msgstr "nomor isu"
|
||||||
|
|
||||||
#: templates/dash.html:53 templates/dash.html:62
|
#: templates/dash.html:53 templates/dash.html:62
|
||||||
msgid "Hide deprecated/unmaintained apps"
|
msgid "Hide deprecated/unmaintained apps"
|
||||||
msgstr ""
|
msgstr "Sembunyikan aplikasi kedaluwarsa/tidak dirawat"
|
||||||
|
|
||||||
#: templates/dash.html:82
|
#: templates/dash.html:82
|
||||||
msgid "App"
|
msgid "App"
|
||||||
msgstr ""
|
msgstr "Aplikasi"
|
||||||
|
|
||||||
#: templates/dash.html:84
|
#: templates/dash.html:84
|
||||||
msgid "Main CI"
|
msgid "Main CI"
|
||||||
msgstr ""
|
msgstr "CI utama"
|
||||||
|
|
||||||
#: templates/dash.html:85
|
#: templates/dash.html:85
|
||||||
msgid "Bookworm CI"
|
msgid "Bookworm CI"
|
||||||
msgstr ""
|
msgstr "CI bookworm"
|
||||||
|
|
||||||
#: templates/dash.html:86
|
#: templates/dash.html:86
|
||||||
msgid "Testing PR"
|
msgid "Testing PR"
|
||||||
msgstr ""
|
msgstr "PR testing"
|
||||||
|
|
||||||
#: templates/dash.html:87
|
#: templates/dash.html:87
|
||||||
msgid "Autoupdate PR"
|
msgid "Autoupdate PR"
|
||||||
msgstr ""
|
msgstr "PR autoupdate"
|
||||||
|
|
||||||
#: templates/dash.html:88
|
#: templates/dash.html:88
|
||||||
msgid "Issues"
|
msgid "Issues"
|
||||||
msgstr ""
|
msgstr "Isu"
|
||||||
|
|
||||||
#: templates/dash.html:128 templates/dash.html:146 templates/dash.html:165
|
#: templates/dash.html:128 templates/dash.html:146 templates/dash.html:165
|
||||||
msgid "Broken"
|
msgid "Broken"
|
||||||
msgstr ""
|
msgstr "Rusak"
|
||||||
|
|
||||||
#: templates/dash.html:130 templates/dash.html:148 templates/dash.html:167
|
#: templates/dash.html:130 templates/dash.html:148 templates/dash.html:167
|
||||||
msgid "Low quality"
|
msgid "Low quality"
|
||||||
msgstr ""
|
msgstr "Kualitas rendah"
|
||||||
|
|
||||||
#: templates/dash.html:142 templates/dash.html:161
|
#: templates/dash.html:142 templates/dash.html:161
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Outdated test (%(days)s days ago)"
|
msgid "Outdated test (%(days)s days ago)"
|
||||||
msgstr ""
|
msgstr "Tes kedaluwarsa (%(days)s hari lalu)"
|
||||||
|
|
||||||
#: templates/dash.html:184 templates/dash.html:199
|
#: templates/dash.html:184 templates/dash.html:199
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Inactive (%(days)s days ago)"
|
msgid "Inactive (%(days)s days ago)"
|
||||||
msgstr ""
|
msgstr "Tidak aktif (%(days)s hari lalu)"
|
||||||
|
|
||||||
#: templates/dash.html:218
|
#: templates/dash.html:218
|
||||||
msgid "Packaging v1"
|
msgid "Packaging v1"
|
||||||
msgstr ""
|
msgstr "Kemasan v1"
|
||||||
|
|
||||||
#: templates/dash.html:221
|
#: templates/dash.html:221
|
||||||
msgid "Deprecated"
|
msgid "Deprecated"
|
||||||
msgstr ""
|
msgstr "Kedaluwarsa"
|
||||||
|
|
||||||
#: templates/dash.html:224
|
#: templates/dash.html:224
|
||||||
msgid "Not maintained"
|
msgid "Not maintained"
|
||||||
msgstr ""
|
msgstr "Tidak dirawat"
|
||||||
|
|
||||||
#: templates/dash.html:238
|
#: templates/dash.html:238
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Last data update %(time)s ago"
|
msgid "Last data update %(time)s ago"
|
||||||
msgstr ""
|
msgstr "Pembaruan data terakhir %(time)s yang lalu"
|
||||||
|
|
||||||
#: templates/index.html:10
|
#: templates/index.html:10
|
||||||
msgid "Application Store"
|
msgid "Application Store"
|
||||||
msgstr ""
|
msgstr "Toko Aplikasi"
|
||||||
|
|
||||||
#: templates/index.html:21
|
#: templates/index.html:21
|
||||||
msgid "Browse all applications"
|
msgid "Browse all applications"
|
||||||
msgstr ""
|
msgstr "Telusuri semua aplikasi"
|
||||||
|
|
||||||
#: templates/wishlist.html:33 templates/wishlist_add.html:3
|
#: templates/wishlist.html:33 templates/wishlist_add.html:3
|
||||||
msgid "Suggest an app"
|
msgid "Suggest an app"
|
||||||
msgstr ""
|
msgstr "Sarankan sebuah aplikasi"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:8
|
#: templates/wishlist_add.html:8
|
||||||
msgid "Suggest an application to be added to YunoHost's catalog"
|
msgid "Suggest an application to be added to YunoHost's catalog"
|
||||||
msgstr ""
|
msgstr "Sarankan sebuah aplikasi agar ditambahkan ke katalog YunoHost"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:29
|
#: templates/wishlist_add.html:29
|
||||||
msgid "You must first login to be allowed to submit an app to the wishlist"
|
msgid "You must first login to be allowed to submit an app to the wishlist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"pertama-tama Anda harus masuk terlebih dahulu agar dapat mengajukan aplikasi "
|
||||||
|
"ke dalam daftar keinginan"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:40
|
#: templates/wishlist_add.html:40
|
||||||
msgid "Due to abuses, only one proposal every 15 days per user is allowed."
|
msgid "Due to abuses, only one proposal every 15 days per user is allowed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Karena penyalahgunaan, hanya satu proposal setiap 15 hari per pengguna yang "
|
||||||
|
"diizinkan."
|
||||||
|
|
||||||
#: templates/wishlist_add.html:43
|
#: templates/wishlist_add.html:43
|
||||||
msgid ""
|
msgid ""
|
||||||
"Reviewing those proposals is tiring for volunteers, please don't yolo-send "
|
"Reviewing those proposals is tiring for volunteers, please don't yolo-send "
|
||||||
"every random nerdy stuff you find on the Internet."
|
"every random nerdy stuff you find on the Internet."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Meninjau proposal tersebut melelahkan bagi para sukarelawan, mohon jangan "
|
||||||
|
"mengirimkan hal-hal aneh yang Anda temukan di Internet secara acak."
|
||||||
|
|
||||||
#: templates/wishlist.html:71 templates/wishlist_add.html:61
|
#: templates/wishlist.html:71 templates/wishlist_add.html:61
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr ""
|
msgstr "Nama"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:64
|
#: templates/wishlist_add.html:64
|
||||||
msgid "App's description"
|
msgid "App's description"
|
||||||
msgstr ""
|
msgstr "Deskripsi aplikasi"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:66
|
#: templates/wishlist_add.html:66
|
||||||
msgid "Please be concise and focus on what the app does."
|
msgid "Please be concise and focus on what the app does."
|
||||||
msgstr ""
|
msgstr "Harap lebih singkat dan fokus pada fungsi aplikasi."
|
||||||
|
|
||||||
#: templates/wishlist_add.html:66
|
#: templates/wishlist_add.html:66
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -652,38 +706,48 @@ msgid ""
|
||||||
"marketing stuff like 'the most', or vague properties like 'easy', 'simple', "
|
"marketing stuff like 'the most', or vague properties like 'easy', 'simple', "
|
||||||
"'lightweight'."
|
"'lightweight'."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Tidak perlu mengulangi kata-kata '[Aplikasi] adalah …'. Tidak perlu "
|
||||||
|
"menyatakan bahwa aplikasi tersebut gratis/sumber-terbuka atau di-hosting "
|
||||||
|
"sendiri (jika tidak, aplikasi itu tidak akan dikemas di YunoHost). Hindari "
|
||||||
|
"promosi seperti 'paling', atau properti yang tidak jelas seperti 'mudah', "
|
||||||
|
"'sederhana', 'ringan'."
|
||||||
|
|
||||||
#: templates/wishlist_add.html:68
|
#: templates/wishlist_add.html:68
|
||||||
msgid "Project code repository"
|
msgid "Project code repository"
|
||||||
msgstr ""
|
msgstr "Depot kode proyek"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:71
|
#: templates/wishlist_add.html:71
|
||||||
msgid "Link to the project's LICENSE"
|
msgid "Link to the project's LICENSE"
|
||||||
msgstr ""
|
msgstr "Tautan ke LICENSE proyek"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:73
|
#: templates/wishlist_add.html:73
|
||||||
msgid ""
|
msgid ""
|
||||||
"The YunoHost project will only package free/open-source software (with "
|
"The YunoHost project will only package free/open-source software (with "
|
||||||
"possible case-by-case exceptions for apps which are not-totally-free)"
|
"possible case-by-case exceptions for apps which are not-totally-free)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Proyek YunoHost hanya akan mengemas perangkat lunak gratis/sumber-terbuka ("
|
||||||
|
"dengan kemungkinan pengecualian kasus per kasus pada aplikasi yang tidak "
|
||||||
|
"sepenuhnya gratis)"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:75
|
#: templates/wishlist_add.html:75
|
||||||
msgid "Project website"
|
msgid "Project website"
|
||||||
msgstr ""
|
msgstr "Website proyek"
|
||||||
|
|
||||||
#: templates/wishlist_add.html:77
|
#: templates/wishlist_add.html:77
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please *do not* just copy-paste the code repository URL. If the project has "
|
"Please *do not* just copy-paste the code repository URL. If the project has "
|
||||||
"no proper website, then leave the field empty."
|
"no proper website, then leave the field empty."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Harap *jangan* hanya menyalin-tempel URL depot kode. Jika proyek tidak "
|
||||||
|
"memiliki situs web yang tepat, biarkan kolom tersebut kosong."
|
||||||
|
|
||||||
#: templates/wishlist_add.html:84
|
#: templates/wishlist_add.html:84
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr "Kirim"
|
||||||
|
|
||||||
#: templates/wishlist.html:3 templates/wishlist.html:8
|
#: templates/wishlist.html:3 templates/wishlist.html:8
|
||||||
msgid "Application Wishlist"
|
msgid "Application Wishlist"
|
||||||
msgstr ""
|
msgstr "Daftar Keinginan Aplikasi"
|
||||||
|
|
||||||
#: templates/wishlist.html:10
|
#: templates/wishlist.html:10
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -694,19 +758,25 @@ msgid ""
|
||||||
"to integrate it, and is merely a source of inspiration for packaging "
|
"to integrate it, and is merely a source of inspiration for packaging "
|
||||||
"volunteers."
|
"volunteers."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Daftar keinginan adalah tempat orang-orang dapat secara kolektif menyarankan "
|
||||||
|
"dan memilih agar aplikasi-aplikasi tersebut dikemas dan disediakan dalam "
|
||||||
|
"katalog aplikasi resmi YunoHost. Namun, fakta bahwa aplikasi yang tercantum "
|
||||||
|
"di sini tidak dapat diartikan sebagai fakta bahwa proyek YunoHost berencana "
|
||||||
|
"untuk mengintegrasikannya, dan hanya menjadi sumber inspirasi bagi para "
|
||||||
|
"relawan pengemasan."
|
||||||
|
|
||||||
#: templates/wishlist.html:74
|
#: templates/wishlist.html:74
|
||||||
msgid "Description"
|
msgid "Description"
|
||||||
msgstr ""
|
msgstr "Deskripsi"
|
||||||
|
|
||||||
#: templates/wishlist.html:102 templates/wishlist.html:103
|
#: templates/wishlist.html:102 templates/wishlist.html:103
|
||||||
msgid "Official website"
|
msgid "Official website"
|
||||||
msgstr ""
|
msgstr "Website resmi"
|
||||||
|
|
||||||
#: templates/wishlist.html:115 templates/wishlist.html:116
|
#: templates/wishlist.html:115 templates/wishlist.html:116
|
||||||
msgid "Code repository"
|
msgid "Code repository"
|
||||||
msgstr ""
|
msgstr "Depot kode"
|
||||||
|
|
||||||
#: templates/wishlist.html:129 templates/wishlist.html:130
|
#: templates/wishlist.html:129 templates/wishlist.html:130
|
||||||
msgid "Star this app"
|
msgid "Star this app"
|
||||||
msgstr ""
|
msgstr "Bintangi aplikasi ini"
|
||||||
|
|
|
@ -241,9 +241,10 @@ class AppAutoUpdater:
|
||||||
if source == "main":
|
if source == "main":
|
||||||
main_version = version
|
main_version = version
|
||||||
branch_name = f"ci-auto-update-{version}"
|
branch_name = f"ci-auto-update-{version}"
|
||||||
pr_title = commit_msg = f"Upgrade to v{version}"
|
pr_title = f"Upgrade to v{version}"
|
||||||
if msg:
|
|
||||||
commit_msg += f"\n{msg}"
|
if msg:
|
||||||
|
commit_msg += f"\n- `{source}` v{version}: {msg}"
|
||||||
|
|
||||||
self.repo.manifest_raw = self.replace_version_and_asset_in_manifest(
|
self.repo.manifest_raw = self.replace_version_and_asset_in_manifest(
|
||||||
self.repo.manifest_raw,
|
self.repo.manifest_raw,
|
||||||
|
@ -256,6 +257,11 @@ class AppAutoUpdater:
|
||||||
if state == State.up_to_date:
|
if state == State.up_to_date:
|
||||||
return (State.up_to_date, "", "", "")
|
return (State.up_to_date, "", "", "")
|
||||||
|
|
||||||
|
if main_version == "":
|
||||||
|
self.repo.manifest_raw = self.bump_version(
|
||||||
|
self.repo.manifest_raw, self.current_version, bump_ynh_level=True
|
||||||
|
)
|
||||||
|
|
||||||
if edit:
|
if edit:
|
||||||
self.repo.edit_manifest(self.repo.manifest_raw)
|
self.repo.edit_manifest(self.repo.manifest_raw)
|
||||||
|
|
||||||
|
@ -385,7 +391,7 @@ class AppAutoUpdater:
|
||||||
f"Unknown update strategy '{strategy}' for '{name}', expected one of {STRATEGIES}"
|
f"Unknown update strategy '{strategy}' for '{name}', expected one of {STRATEGIES}"
|
||||||
)
|
)
|
||||||
|
|
||||||
result = self.get_latest_version_and_asset(strategy, asset, autoupdate)
|
result = self.get_latest_version_and_asset(strategy, asset, infos)
|
||||||
if result is None:
|
if result is None:
|
||||||
return None
|
return None
|
||||||
new_version, assets, more_info = result
|
new_version, assets, more_info = result
|
||||||
|
@ -452,8 +458,9 @@ class AppAutoUpdater:
|
||||||
return next(iter(matching_assets.items()))
|
return next(iter(matching_assets.items()))
|
||||||
|
|
||||||
def get_latest_version_and_asset(
|
def get_latest_version_and_asset(
|
||||||
self, strategy: str, asset: Union[str, dict], autoupdate
|
self, strategy: str, asset: Union[str, dict], infos: dict[str, Any]
|
||||||
) -> Optional[tuple[str, Union[str, dict[str, str]], str]]:
|
) -> Optional[tuple[str, Union[str, dict[str, str]], str]]:
|
||||||
|
autoupdate = infos.get("autoupdate")
|
||||||
upstream = autoupdate.get("upstream", self.main_upstream).strip("/")
|
upstream = autoupdate.get("upstream", self.main_upstream).strip("/")
|
||||||
version_re = autoupdate.get("version_regex", None)
|
version_re = autoupdate.get("version_regex", None)
|
||||||
allow_prereleases = autoupdate.get("allow_prereleases", False)
|
allow_prereleases = autoupdate.get("allow_prereleases", False)
|
||||||
|
@ -496,6 +503,11 @@ class AppAutoUpdater:
|
||||||
latest_assets = latest_release["tarball_url"]
|
latest_assets = latest_release["tarball_url"]
|
||||||
# get the release changelog link
|
# get the release changelog link
|
||||||
latest_release_html_url = latest_release["html_url"]
|
latest_release_html_url = latest_release["html_url"]
|
||||||
|
if latest_release_html_url is None or latest_release_html_url == "":
|
||||||
|
latest_release_html_url = api.changelog_for_ref(
|
||||||
|
latest_version_orig, "", RefType.releases
|
||||||
|
)
|
||||||
|
|
||||||
if asset == "tarball":
|
if asset == "tarball":
|
||||||
latest_tarball = api.url_for_ref(latest_version_orig, RefType.tags)
|
latest_tarball = api.url_for_ref(latest_version_orig, RefType.tags)
|
||||||
return latest_version, latest_tarball, latest_release_html_url
|
return latest_version, latest_tarball, latest_release_html_url
|
||||||
|
@ -533,7 +545,11 @@ class AppAutoUpdater:
|
||||||
tags, self.app_id, version_re
|
tags, self.app_id, version_re
|
||||||
)
|
)
|
||||||
latest_tarball = api.url_for_ref(latest_version_orig, RefType.tags)
|
latest_tarball = api.url_for_ref(latest_version_orig, RefType.tags)
|
||||||
return latest_version, latest_tarball, ""
|
return (
|
||||||
|
latest_version,
|
||||||
|
latest_tarball,
|
||||||
|
api.changelog_for_ref(latest_version, "", RefType.tags),
|
||||||
|
)
|
||||||
|
|
||||||
if revision_type == "commit":
|
if revision_type == "commit":
|
||||||
if self.latest_commit_weekly and datetime.now().weekday() != 0:
|
if self.latest_commit_weekly and datetime.now().weekday() != 0:
|
||||||
|
@ -552,7 +568,23 @@ class AppAutoUpdater:
|
||||||
)
|
)
|
||||||
version_format = autoupdate.get("force_version", "%Y.%m.%d")
|
version_format = autoupdate.get("force_version", "%Y.%m.%d")
|
||||||
latest_version = latest_commit_date.strftime(version_format)
|
latest_version = latest_commit_date.strftime(version_format)
|
||||||
return latest_version, latest_tarball, ""
|
return (
|
||||||
|
latest_version,
|
||||||
|
latest_tarball,
|
||||||
|
api.changelog_for_ref(
|
||||||
|
latest_commit["sha"], self.get_old_ref(infos), RefType.commits
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_old_ref(infos: dict[str, Any]) -> str:
|
||||||
|
regex = r".*[\/-]([a-f0-9]+)\."
|
||||||
|
if isinstance(infos["url"], str):
|
||||||
|
return re.match(regex, infos["url"]).group(1)
|
||||||
|
if isinstance(infos["url"], dict):
|
||||||
|
for _, url in infos["url"]:
|
||||||
|
return re.match(regex, url).group(1)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def replace_version_and_asset_in_manifest(
|
def replace_version_and_asset_in_manifest(
|
||||||
|
@ -580,19 +612,34 @@ class AppAutoUpdater:
|
||||||
]
|
]
|
||||||
|
|
||||||
if is_main:
|
if is_main:
|
||||||
|
content = self.bump_version(content, new_version)
|
||||||
def repl(m: re.Match) -> str:
|
|
||||||
return m.group(1) + new_version + '~ynh1"'
|
|
||||||
|
|
||||||
content = re.sub(
|
|
||||||
r"(\s*version\s*=\s*[\"\'])([^~\"\']+)(\~ynh\d+[\"\'])", repl, content
|
|
||||||
)
|
|
||||||
|
|
||||||
for old, new in replacements:
|
for old, new in replacements:
|
||||||
content = content.replace(old, new)
|
content = content.replace(old, new)
|
||||||
|
|
||||||
return content
|
return content
|
||||||
|
|
||||||
|
def bump_version(
|
||||||
|
self, content: str, new_version: str, bump_ynh_level: bool = False
|
||||||
|
) -> str:
|
||||||
|
ynh_level = 1
|
||||||
|
if bump_ynh_level:
|
||||||
|
ynh_level = (
|
||||||
|
int(
|
||||||
|
re.search(
|
||||||
|
r"\s*version\s*=\s*[\"\'][^~\"\']+~ynh(\d+)[\"\']", content
|
||||||
|
).group(1)
|
||||||
|
)
|
||||||
|
+ 1
|
||||||
|
)
|
||||||
|
|
||||||
|
def repl(m: re.Match) -> str:
|
||||||
|
return m.group(1) + new_version + f'~ynh{ynh_level}"'
|
||||||
|
|
||||||
|
return re.sub(
|
||||||
|
r"(\s*version\s*=\s*[\"\'])([^~\"\']+)(~ynh\d+[\"\'])", repl, content
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def paste_on_haste(data):
|
def paste_on_haste(data):
|
||||||
# NB: we hardcode this here and can't use the yunopaste command
|
# NB: we hardcode this here and can't use the yunopaste command
|
||||||
|
|
|
@ -2,4 +2,3 @@ requests
|
||||||
PyGithub
|
PyGithub
|
||||||
toml
|
toml
|
||||||
tqdm
|
tqdm
|
||||||
GitPython
|
|
|
@ -10,6 +10,7 @@ import requests
|
||||||
class RefType(Enum):
|
class RefType(Enum):
|
||||||
tags = 1
|
tags = 1
|
||||||
commits = 2
|
commits = 2
|
||||||
|
releases = 3
|
||||||
|
|
||||||
|
|
||||||
class GithubAPI:
|
class GithubAPI:
|
||||||
|
@ -41,13 +42,20 @@ class GithubAPI:
|
||||||
|
|
||||||
def url_for_ref(self, ref: str, ref_type: RefType) -> str:
|
def url_for_ref(self, ref: str, ref_type: RefType) -> str:
|
||||||
"""Get a URL for a ref."""
|
"""Get a URL for a ref."""
|
||||||
if ref_type == RefType.tags:
|
if ref_type == RefType.tags or ref_type == RefType.releases:
|
||||||
return f"{self.upstream}/archive/refs/tags/{ref}.tar.gz"
|
return f"{self.upstream}/archive/refs/tags/{ref}.tar.gz"
|
||||||
elif ref_type == RefType.commits:
|
elif ref_type == RefType.commits:
|
||||||
return f"{self.upstream}/archive/{ref}.tar.gz"
|
return f"{self.upstream}/archive/{ref}.tar.gz"
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def changelog_for_ref(self, new_ref: str, old_ref: str, ref_type: RefType) -> str:
|
||||||
|
"""Get a changelog for a ref."""
|
||||||
|
if ref_type == RefType.commits:
|
||||||
|
return f"{self.upstream}/compare/{old_ref}...{new_ref}"
|
||||||
|
else:
|
||||||
|
return f"{self.upstream}/releases/tag/{new_ref}"
|
||||||
|
|
||||||
|
|
||||||
class GitlabAPI:
|
class GitlabAPI:
|
||||||
def __init__(self, upstream: str):
|
def __init__(self, upstream: str):
|
||||||
|
@ -135,11 +143,24 @@ class GitlabAPI:
|
||||||
|
|
||||||
return retval
|
return retval
|
||||||
|
|
||||||
def url_for_ref(self, ref: str, ref_type: RefType) -> str:
|
def url_for_ref(self, ref: str, _: RefType) -> str:
|
||||||
name = self.project_path.split("/")[-1]
|
name = self.project_path.split("/")[-1]
|
||||||
clean_ref = ref.replace("/", "-")
|
clean_ref = ref.replace("/", "-")
|
||||||
return f"{self.forge_root}/{self.project_path}/-/archive/{ref}/{name}-{clean_ref}.tar.bz2"
|
return f"{self.forge_root}/{self.project_path}/-/archive/{ref}/{name}-{clean_ref}.tar.bz2"
|
||||||
|
|
||||||
|
def changelog_for_ref(self, new_ref: str, old_ref: str, ref_type: RefType) -> str:
|
||||||
|
"""Get a changelog for a ref."""
|
||||||
|
if ref_type == RefType.commits:
|
||||||
|
return (
|
||||||
|
f"{self.forge_root}/{self.project_path}/-/compare/{old_ref}...{new_ref}"
|
||||||
|
)
|
||||||
|
elif ref_type == RefType.tags:
|
||||||
|
return f"{self.forge_root}/{self.project_path}/-/tags/{new_ref}"
|
||||||
|
elif ref_type == RefType.releases:
|
||||||
|
return f"{self.forge_root}/{self.project_path}/-/releases/{new_ref}"
|
||||||
|
else:
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
class GiteaForgejoAPI:
|
class GiteaForgejoAPI:
|
||||||
def __init__(self, upstream: str):
|
def __init__(self, upstream: str):
|
||||||
|
@ -173,6 +194,15 @@ class GiteaForgejoAPI:
|
||||||
"""Get a list of releases for project."""
|
"""Get a list of releases for project."""
|
||||||
return self.internal_api(f"repos/{self.project_path}/releases")
|
return self.internal_api(f"repos/{self.project_path}/releases")
|
||||||
|
|
||||||
def url_for_ref(self, ref: str, ref_type: RefType) -> str:
|
def url_for_ref(self, ref: str, _: RefType) -> str:
|
||||||
"""Get a URL for a ref."""
|
"""Get a URL for a ref."""
|
||||||
return f"{self.forge_root}/{self.project_path}/archive/{ref}.tar.gz"
|
return f"{self.forge_root}/{self.project_path}/archive/{ref}.tar.gz"
|
||||||
|
|
||||||
|
def changelog_for_ref(self, new_ref: str, old_ref: str, ref_type: RefType) -> str:
|
||||||
|
"""Get a changelog for a ref."""
|
||||||
|
if ref_type == RefType.commits:
|
||||||
|
return (
|
||||||
|
f"{self.forge_root}/{self.project_path}/compare/{old_ref}...{new_ref}"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return f"{self.forge_root}/{self.project_path}/releases/tag/{new_ref}"
|
||||||
|
|
557
tools/helpers2.1/convert_to_helpers_2.1.py
Normal file
557
tools/helpers2.1/convert_to_helpers_2.1.py
Normal file
|
@ -0,0 +1,557 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def cleanup():
|
||||||
|
|
||||||
|
comment_blocks_to_cleanup = [
|
||||||
|
r"#=+\s*\n# GENERIC START\S*\s*\n#=+\s*\n# IMPORT GENERIC HELPERS\n#=+\s*\n",
|
||||||
|
r"#=+\s*\n# EXPERIMENTAL HELPERS\s*\n#=+\s*\n",
|
||||||
|
r"#=+\s*\n# FUTURE OFFICIAL HELPERS\s*\n#=+\s*\n",
|
||||||
|
r"#=+\s*\n# PERSONAL HELPERS\s*\n#=+\s*\n",
|
||||||
|
r"#=+\s*\n# GENERIC FINALIZATION\s*\n",
|
||||||
|
r"#=+\s*\n# GENERIC FINALISATION\s*\n",
|
||||||
|
r"#=+\s*\n# STANDARD MODIFICATIONS\s*\n",
|
||||||
|
r"#=+\s*\n# STANDARD UPGRADE STEPS\s*\n",
|
||||||
|
r"#=+\s*\n# SPECIFIC UPGRADE\s*\n",
|
||||||
|
r"#=+\s*\n# CHECK VERSION\s*\n#=+\s*\n",
|
||||||
|
r"#=+\s*\n# DECLARE DATA AND CONF FILES TO BACKUP\s*\n#=+\s*\n",
|
||||||
|
]
|
||||||
|
|
||||||
|
removememaybes = [
|
||||||
|
"ynh_legacy_permissions_exists",
|
||||||
|
"ynh_legacy_permissions_delete_all",
|
||||||
|
"ynh_webpath_available",
|
||||||
|
"ynh_webpath_register",
|
||||||
|
"ynh_psql_test_if_first_run",
|
||||||
|
"ynh_backup_before_upgrade",
|
||||||
|
"ynh_restore_upgradebackup",
|
||||||
|
"ynh_find_port",
|
||||||
|
"ynh_port_available",
|
||||||
|
"ynh_require_ram",
|
||||||
|
"--ignore_swap",
|
||||||
|
"--only_swap",
|
||||||
|
"ynh_print_log",
|
||||||
|
"ynh_print_OFF",
|
||||||
|
"ynh_print_ON",
|
||||||
|
"local legacy_args",
|
||||||
|
"ynh_abort_if_errors",
|
||||||
|
"ynh_clean_setup",
|
||||||
|
]
|
||||||
|
|
||||||
|
replaces = [
|
||||||
|
# Unecessary exec_warn_less
|
||||||
|
(r"ynh_exec_warn_less ynh_secure_remove", "ynh_secure_remove"),
|
||||||
|
(r"ynh_exec_warn_less ynh_systemd_action", "ynh_systemctl"),
|
||||||
|
(r"ynh_exec_warn_less ynh_install_nodejs", "ynh_install_nodejs"),
|
||||||
|
(r"ynh_exec_warn_less ynh_install_go", "ynh_install_go"),
|
||||||
|
(r"ynh_exec_warn_less ynh_install_ruby", "ynh_install_ruby"),
|
||||||
|
(r"ynh_exec_warn_less ynh_composer_exec", "ynh_composer_exec"),
|
||||||
|
(r"ynh_exec_warn_less ynh_install_composer", "ynh_install_composer"),
|
||||||
|
# Setting get/set
|
||||||
|
(r" ?--app=? ?\"?\$app\"?", ""),
|
||||||
|
# Misc
|
||||||
|
(r"ynh_validate_ip4", "ynh_validate_ip --family=4"),
|
||||||
|
(r"ynh_validate_ip4", "ynh_validate_ip --family=6"),
|
||||||
|
(r"\$\(ynh_get_debian_release\)", "$YNH_DEBIAN_VERSION"),
|
||||||
|
(r"ynh_read_manifest --manifest\S*", "ynh_read_manifest"),
|
||||||
|
(r"--manifest_key", "--key"),
|
||||||
|
(r"COMMON VARIABLES\s*$", "COMMON VARIABLES AND CUSTOM HELPERS"),
|
||||||
|
(r"ynh_string_random ([0-9])", "ynh_string_random --length=\\1"),
|
||||||
|
(
|
||||||
|
r"ynh_backup_if_checksum_is_different --file=?",
|
||||||
|
"ynh_backup_if_checksum_is_different ",
|
||||||
|
),
|
||||||
|
(r"ynh_store_file_checksum --file=?", "ynh_store_file_checksum "),
|
||||||
|
(r"ynh_delete_file_checksum --file=?", "ynh_delete_file_checksum "),
|
||||||
|
(r"\[\[?.*PACKAGE_CHECK_EXEC.*eq.*1.*\]\]?", "ynh_in_ci_tests"),
|
||||||
|
(r"\[\[?.*PACKAGE_CHECK_EXEC.*=.*1.*\]\]?", "ynh_in_ci_tests"),
|
||||||
|
(r"\[\[?.*PACKAGE_CHECK_EXEC.*ne.*1.*\]\]?", "! ynh_in_ci_tests"),
|
||||||
|
(r"\[\[?.*PACKAGE_CHECK_EXEC.*eq.*0.*\]\]?", "! ynh_in_ci_tests"),
|
||||||
|
(r"\[\[?.*PACKAGE_CHECK_EXEC.*ne.*0.*\]\]?", "ynh_in_ci_tests"),
|
||||||
|
# ynh_setup_source
|
||||||
|
(r"--full_replace=1", "--full_replace"),
|
||||||
|
(r"sources/patches", "patches"),
|
||||||
|
(r"sources/extra_files/app", "sources"),
|
||||||
|
(r"sources/extra_files", "sources"),
|
||||||
|
(
|
||||||
|
r"((chmod|chown).*\"?\$install_dir\"?)\s*$",
|
||||||
|
"#REMOVEME? Assuming the install dir is setup using ynh_setup_source, the proper chmod/chowns are now already applied and it shouldn't be necessary to tweak perms | \\1",
|
||||||
|
),
|
||||||
|
# Logging
|
||||||
|
(r"ynh_print_err", "ynh_print_warn"),
|
||||||
|
(r"ynh_exec_quiet ?", ""),
|
||||||
|
(r"ynh_exec_fully_quiet ?", ""),
|
||||||
|
(r"ynh_exec_warn_less", "ynh_hide_warnings"),
|
||||||
|
(r"--message=?", ""),
|
||||||
|
(r"--time ", ""),
|
||||||
|
(r"--last", ""),
|
||||||
|
(r"\s*--weight=?\S*", ""),
|
||||||
|
# rm
|
||||||
|
(r"ynh_secure_remove( --file=?)? ?", "ynh_safe_rm "),
|
||||||
|
# Conf / templating
|
||||||
|
(r"__NAME__", "__APP__"),
|
||||||
|
(r"__NAMETOCHANGE__", "__APP__"),
|
||||||
|
(r"ynh_render_template", "ynh_config_add --jinja"),
|
||||||
|
(r"ynh_add_config", "ynh_config_add"),
|
||||||
|
(r'--template="../conf/', '--template="'),
|
||||||
|
(r"ynh_replace_vars --file=", "ynh_replace_vars "),
|
||||||
|
(r"ynh_replace_vars", "_ynh_replace_vars"),
|
||||||
|
(
|
||||||
|
r"((chmod|chown)\s[^-+].*\"?(\$install_dir\"?/.*(config|.env|settings|credentials)\S*|\$data_dir\"?/\S+|/etc/(sudoers.d|cron.d|\$app)\"?/\S+|\$(config|cron_path)\"?))",
|
||||||
|
"#REMOVEME? Assuming the file is setup using ynh_config_add, the proper chmod/chowns are now already applied and it shouldn't be necessary to tweak perms | \\1",
|
||||||
|
),
|
||||||
|
# Upgrade stuff
|
||||||
|
(
|
||||||
|
r"ynh_compare_current_package_version.*lt.*version\s?=?\"?([0-9\.]+~ynh[0-9])\"?",
|
||||||
|
"ynh_app_upgrading_from_version_before \\1",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"ynh_compare_current_package_version.*le.*version\s?=?\"?([0-9\.]+~ynh[0-9])\"?",
|
||||||
|
"ynh_app_upgrading_from_version_before_or_equal_to \\1",
|
||||||
|
),
|
||||||
|
(r"upgrade_type=\S*", ""),
|
||||||
|
(
|
||||||
|
r'if \[\s+"?\$upgrade_type"?\s+==\s+"?UPGRADE_APP"? \]',
|
||||||
|
"# FIXME: this is still supported but the recommendation is now to *always* re-setup the app sources wether or not the upstream sources changed\nif ynh_app_upstream_version_changed",
|
||||||
|
),
|
||||||
|
# Backup/store
|
||||||
|
(r"ynh_restore\s*$", "ynh_restore_everything"),
|
||||||
|
# -> Specific trick to remove the --not_mandatory here, but replace it with || true for the other occurences
|
||||||
|
(r'ynh_restore_file --origin_path="\$data_dir" \S*', 'ynh_restore "$data_dir"'),
|
||||||
|
(r"ynh_restore_file", "ynh_restore"),
|
||||||
|
(r"--src_path=?", ""),
|
||||||
|
(r"--origin_path=?", ""),
|
||||||
|
(r"--is_big\S*", ""),
|
||||||
|
(r"--not_mandatory", "|| true"),
|
||||||
|
# Fail2ban
|
||||||
|
(r"--max_retry=\S*", ""),
|
||||||
|
(r"--ports\S*", ""),
|
||||||
|
(r"ynh_add_fail2ban_config --use_template", "ynh_config_add_fail2ban"),
|
||||||
|
(r"ynh_add_fail2ban_config", "ynh_config_add_fail2ban"),
|
||||||
|
(r"ynh_remove_fail2ban_config", "ynh_config_remove_fail2ban"),
|
||||||
|
# MySQL/Postgresql
|
||||||
|
(r"ynh_mysql_dump_db \S*\$db_name\"?\s", "ynh_mysql_dump_db "),
|
||||||
|
(r"ynh_psql_dump_db \S*\$db_name\"?\s", "ynh_psql_dump_db "),
|
||||||
|
(r"ynh_mysql_connect_as [^<\\]*\s", "ynh_mysql_db_shell "),
|
||||||
|
(r"ynh_psql_connect_as [^<\\]*\s", "ynh_psql_db_shell "),
|
||||||
|
(r"ynh_mysql_execute_as_root --sql=?", "ynh_mysql_db_shell <<< "),
|
||||||
|
(r"ynh_psql_execute_as_root --sql=?", "ynh_psql_db_shell <<< "),
|
||||||
|
(r'ynh_mysql_execute_as_root "', 'ynh_mysql_db_shell <<< "'),
|
||||||
|
(r'ynh_psql_execute_as_root "', 'ynh_psql_db_shell <<< "'),
|
||||||
|
(r"ynh_mysql_execute_as_root '", "ynh_mysql_db_shell <<< '"),
|
||||||
|
(r"ynh_psql_execute_as_root '", "ynh_psql_db_shell <<< '"),
|
||||||
|
(r"ynh_psql_execute_as_root --database=?", "ynh_psql_db_shell "),
|
||||||
|
(r"ynh_mysql_execute_as_root --database=?", "ynh_psql_db_shell "),
|
||||||
|
(r"--sql=", "<<< "),
|
||||||
|
(
|
||||||
|
r"ynh_mysql_execute_file_as_root --database=\"?(\S+)\"? --file=\"?(\S+)\"?",
|
||||||
|
'ynh_mysql_db_shell "\\1" < "\\2"',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"ynh_mysql_execute_file_as_root --file=\"?(\S+)\"? --database=\"?(\S+)\"?",
|
||||||
|
'ynh_mysql_db_shell "\\2" < "\\1"',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"ynh_psql_execute_file_as_root --database=\"?(\S+)\"? --file=\"?(\S+)\"?",
|
||||||
|
'ynh_psql_db_shell "\\1" < "\\2"',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"ynh_psql_execute_file_as_root --file=\"?(\S+)\"? --database=\"?(\S+)\"?",
|
||||||
|
'ynh_psql_db_shell "\\2" < "\\1"',
|
||||||
|
),
|
||||||
|
(r'sql_db_shell "?\$db_name"?', "sql_db_shell "),
|
||||||
|
(r'--database="?\$db_name"?', ""),
|
||||||
|
(r'--database="?\$app"?', ""),
|
||||||
|
(r"ynh_mysql_setup_db", "# FIXMEhelpers2.1 ynh_mysql_create_db"),
|
||||||
|
(
|
||||||
|
r"ynh_mysql_remove_db",
|
||||||
|
"# FIXMEhelpers2.1 ynh_mysql_drop_db && ynh_mysql_drop_user",
|
||||||
|
),
|
||||||
|
(r"ynh_psql_setup_db", "# FIXMEhelpers2.1 ynh_psql_create_db"),
|
||||||
|
(
|
||||||
|
r"ynh_psql_remove_db",
|
||||||
|
"# FIXMEhelpers2.1 ynh_psql_drop_db && ynh_psql_drop_user",
|
||||||
|
),
|
||||||
|
# PHP / composer
|
||||||
|
(r" ?--phpversion=\S*", ""),
|
||||||
|
(r" ?--composerversion=\S*", ""),
|
||||||
|
(r" ?--usage=\S*", ""),
|
||||||
|
(r" ?--footprint=\S*", ""),
|
||||||
|
(
|
||||||
|
r"--group=www-data",
|
||||||
|
"# FIXMEhelpers2.1 : --group=www-data to be replaced with php_group=www-data to be added in _common.sh",
|
||||||
|
),
|
||||||
|
(r"YNH_COMPOSER_VERSION=", "composer_version="),
|
||||||
|
(r' --workdir="\$install_dir"', ""),
|
||||||
|
(r"--workdir=\$install_dir ", ""),
|
||||||
|
(
|
||||||
|
r"--workdir",
|
||||||
|
"# FIXMEhelpers2.1 (replace with composer_workdir=... prior to calling this helper, default is $intall_dir) --workdir",
|
||||||
|
),
|
||||||
|
(r"phpversion", "php_version"),
|
||||||
|
(r"PHPVERSION", "PHP_VERSION"),
|
||||||
|
(r"ynh_add_fpm_config", "ynh_config_add_phpfpm"),
|
||||||
|
(r"ynh_remove_fpm_config", "ynh_config_remove_phpfpm"),
|
||||||
|
(
|
||||||
|
r"ynh_install_composer",
|
||||||
|
"ynh_composer_install\nynh_composer_exec install --no-dev ",
|
||||||
|
),
|
||||||
|
(r'--install_args="?([^"]+)"?(\s|$)', "\\1\\2"),
|
||||||
|
(r'--commands="([^"]+)"(\s|$)', "\\1\\2"),
|
||||||
|
(
|
||||||
|
r"(^fpm_usage=)",
|
||||||
|
"#REMOVEME? Everything about fpm_usage is removed in helpers2.1... | \\1",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(^.*\$fpm_usage)",
|
||||||
|
"#REMOVEME? Everything about fpm_usage is removed in helpers2.1... | \\1",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(^fpm_footprint=)",
|
||||||
|
"#REMOVEME? Everything about fpm_footprint is removed in helpers2.1... | \\1",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(^.*\$fpm_footprint)",
|
||||||
|
"#REMOVEME? Everything about fpm_footprint is removed in helpers2.1... | \\1",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(^set__fpm_footprint)",
|
||||||
|
"#REMOVEME? Everything about fpm_footprint is removed in helpers2.1... | \\1",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(^fpm_free_footprint=)",
|
||||||
|
"#REMOVEME? Everything about fpm_free_footprint is removed in helpers2.1... | \\1",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(^.*\$fpm_free_footprint)",
|
||||||
|
"#REMOVEME? Everything about fpm_free_footprint is removed in helpers2.1... | \\1",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(^set__fpm_free_footprint)",
|
||||||
|
"#REMOVEME? Everything about fpm_free_footprint is removed in helpers2.1... | \\1",
|
||||||
|
),
|
||||||
|
# Nodejs
|
||||||
|
(r'"?\$?ynh_node"?', "node"),
|
||||||
|
(r"NODEJS_VERSION=", "nodejs_version="),
|
||||||
|
(r"ynh_install_nodejs \S*", "ynh_nodejs_install"),
|
||||||
|
(r"ynh_install_nodejs", "ynh_nodejs_install"),
|
||||||
|
(r"ynh_remove_nodejs", "ynh_nodejs_remove"),
|
||||||
|
(r"ynh_use_nodejs", ""),
|
||||||
|
(r'"?\$ynh_node_load_PATH"?', ""),
|
||||||
|
(r'"?\$ynh_node_load_path"?', ""),
|
||||||
|
(r'"?\$?ynh_npm"?', "npm"),
|
||||||
|
(r"(export )?COREPACK_ENABLE_DOWNLOAD_PROMPT=0", ""),
|
||||||
|
(r"env\s+npm", "npm"),
|
||||||
|
(r"env\s+pnpm", "pnpm"),
|
||||||
|
(r"env\s+yarn", "yarn"),
|
||||||
|
(r"env\s+corepack", "corepack"),
|
||||||
|
# Ruby
|
||||||
|
(r'"?\$?ynh_ruby"?', "ruby"),
|
||||||
|
(r'"?\$?ynh_gem"?', "gem"),
|
||||||
|
(r"RUBY_VERSION=", "ruby_version="),
|
||||||
|
(r"ynh_install_ruby \S*", "ynh_ruby_install"),
|
||||||
|
(r"ynh_install_ruby", "ynh_ruby_install"),
|
||||||
|
(r"ynh_remove_ruby", "ynh_ruby_remove"),
|
||||||
|
(r"ynh_use_ruby", ""),
|
||||||
|
(r'"?\$ynh_ruby_load_PATH"?', ""),
|
||||||
|
(r'"?\$ynh_ruby_load_path"?', ""),
|
||||||
|
# Go
|
||||||
|
(r"^\s*GO_VERSION=", "go_version="),
|
||||||
|
(r'"?\$?ynh_go"?', "go"),
|
||||||
|
(r"ynh_install_go \S*", "ynh_go_install"),
|
||||||
|
(r"ynh_install_go", "ynh_go_install"),
|
||||||
|
(r"ynh_remove_go", "ynh_go_remove"),
|
||||||
|
(r"ynh_use_go", ""),
|
||||||
|
# Mongodb
|
||||||
|
(r"YNH_MONGO_VERSION", "mongo_version"),
|
||||||
|
(r"ynh_install_mongo \S*", "ynh_install_mongo"),
|
||||||
|
(r" --eval", ""),
|
||||||
|
# ynh_replace_string
|
||||||
|
(r"ynh_replace_string", "ynh_replace"),
|
||||||
|
(r"ynh_replace_special_string", "ynh_replace_regex"),
|
||||||
|
(r"--match_string", "--match"),
|
||||||
|
(r"--replace_string", "--replace"),
|
||||||
|
(r"--target_file", "--file"),
|
||||||
|
(
|
||||||
|
r"(ynh_replace ('|\"))",
|
||||||
|
"# FIXMEhelpers2.1: ynh_replace used with positional args. Please add the keywords: --match=, --replace=, --file=\n\\1",
|
||||||
|
),
|
||||||
|
# Nginx
|
||||||
|
(r"ynh_add_nginx_config", "ynh_config_add_nginx"),
|
||||||
|
(r"ynh_remove_nginx_config", "ynh_config_remove_nginx"),
|
||||||
|
(r"ynh_change_url_nginx_config", "ynh_config_change_url_nginx"),
|
||||||
|
# Systemd
|
||||||
|
(r'--log_path="/var/log/\$app/\$app.log"', ""),
|
||||||
|
(r'--service="?\$app"?(\s|$)', "\\1"),
|
||||||
|
(r"--service_name", "--service"),
|
||||||
|
(r"--line_match", "--wait_until"),
|
||||||
|
(r' --template="systemd.service"', ""),
|
||||||
|
(r"ynh_add_systemd_config", "ynh_config_add_systemd"),
|
||||||
|
(r"ynh_remove_systemd_config --service=?", "ynh_config_remove_systemd"),
|
||||||
|
(r"ynh_remove_systemd_config", "ynh_config_remove_systemd"),
|
||||||
|
(r"ynh_systemd_action", "ynh_systemctl"),
|
||||||
|
# Logrotate
|
||||||
|
(r"ynh_use_logrotate", "ynh_config_add_logrotate"),
|
||||||
|
(r"ynh_remove_logrotate", "ynh_config_remove_logrotate"),
|
||||||
|
(r"--specific_user\S*", ""),
|
||||||
|
(r"--logfile=?", ""),
|
||||||
|
(r" ?--non-?append", ""),
|
||||||
|
(
|
||||||
|
r"((chmod|chown).*\"?/var/log/\"?\$app)",
|
||||||
|
"#REMOVEME? Assuming ynh_config_add_logrotate is called, the proper chmod/chowns are now already applied and it shouldn't be necessary to tweak perms | \\1",
|
||||||
|
),
|
||||||
|
# Apt
|
||||||
|
(r"ynh_package_is_installed (--package=)?", "_ynh_apt_package_is_installed"),
|
||||||
|
(r"ynh_package_version (--package=)?", "_ynh_apt_package_version"),
|
||||||
|
(r"ynh_package_install", "_ynh_apt_install"),
|
||||||
|
(
|
||||||
|
r"ynh_install_extra_app_dependencies",
|
||||||
|
"ynh_apt_install_dependencies_from_extra_repository",
|
||||||
|
),
|
||||||
|
(r"ynh_install_app_dependencies", "ynh_apt_install_dependencies"),
|
||||||
|
(r"ynh_remove_app_dependencies", "ynh_apt_remove_dependencies"),
|
||||||
|
(r"ynh_package_autopurge", "_ynh_apt autoremove --purge"),
|
||||||
|
# Exec as / sudo
|
||||||
|
(r'ynh_exec_as "?\$app"?( env)?', "ynh_exec_as_app"),
|
||||||
|
(r'sudo -u "?\$app"?( env)?', "ynh_exec_as_app"),
|
||||||
|
# Cringy messages?
|
||||||
|
("Modifying a config file...", "Updating configuration..."),
|
||||||
|
("Updating a configuration file...", "Updating configuration..."),
|
||||||
|
("Adding a configuration file...", "Adding $app's configuration..."),
|
||||||
|
(
|
||||||
|
"Restoring the systemd configuration...",
|
||||||
|
"Restoring $app's systemd service...",
|
||||||
|
),
|
||||||
|
("Configuring a systemd service...", "Configuring $app's systemd service..."),
|
||||||
|
("Stopping a systemd service...", "Stopping $app's systemd service..."),
|
||||||
|
("Starting a systemd service...", "Starting $app's systemd service..."),
|
||||||
|
# Recommend ynh_app_setting_set_default
|
||||||
|
(
|
||||||
|
r"( *if \[.*-z.*:-}.*\].*\n?.*then\n\s+(\S+)=(.+)\n\s+ynh_app_setting_set.*\n\s*fi\n)",
|
||||||
|
"# FIXMEhelpers2.1: maybe replace with: ynh_app_setting_set_default --key=\\2 --value=\\3\n\\1",
|
||||||
|
),
|
||||||
|
# Trailing spaces
|
||||||
|
(r"\s+$", "\n"),
|
||||||
|
]
|
||||||
|
|
||||||
|
replaces = [
|
||||||
|
(re.compile(pattern, flags=re.M), replace) for pattern, replace in replaces
|
||||||
|
]
|
||||||
|
comment_blocks_to_cleanup = [
|
||||||
|
re.compile(pattern, flags=re.M) for pattern in comment_blocks_to_cleanup
|
||||||
|
]
|
||||||
|
|
||||||
|
for s in [
|
||||||
|
"_common.sh",
|
||||||
|
"install",
|
||||||
|
"remove",
|
||||||
|
"upgrade",
|
||||||
|
"backup",
|
||||||
|
"restore",
|
||||||
|
"change_url",
|
||||||
|
"config",
|
||||||
|
]:
|
||||||
|
|
||||||
|
script = f"scripts/{s}"
|
||||||
|
|
||||||
|
if not os.path.exists(script):
|
||||||
|
continue
|
||||||
|
|
||||||
|
content = open(script).read()
|
||||||
|
|
||||||
|
if s == "remove":
|
||||||
|
content = re.sub(
|
||||||
|
r"(ynh_secure_remove .*/var/log/\$app.*)",
|
||||||
|
r"#REMOVEME? (Apps should not remove their log dir during remove ... this should only happen if --purge is used, and be handled by the core...) \1",
|
||||||
|
content,
|
||||||
|
)
|
||||||
|
|
||||||
|
for pattern in comment_blocks_to_cleanup:
|
||||||
|
content = pattern.sub("", content)
|
||||||
|
|
||||||
|
for pattern, replace in replaces:
|
||||||
|
content = pattern.sub(replace, content)
|
||||||
|
|
||||||
|
for remove in removememaybes:
|
||||||
|
content = content.replace(remove, r"#REMOVEME? " + remove)
|
||||||
|
|
||||||
|
open(script, "w").write(content)
|
||||||
|
|
||||||
|
# Specific PHP FPM conf patch
|
||||||
|
if os.path.exists("conf/extra_php-fpm.conf"):
|
||||||
|
|
||||||
|
content = open("conf/extra_php-fpm.conf").read()
|
||||||
|
|
||||||
|
pattern_upload_max_filesize = r"\nphp_\S*\[upload_max_filesize\] = (\S*)"
|
||||||
|
pattern_post_max_size = r"\nphp_\S*\[post_max_size\] = (\S*)"
|
||||||
|
pattern_memory_limit = r"\nphp_\S*\[memory_limit\] = (\S*)"
|
||||||
|
|
||||||
|
upload_max_filesize = re.findall(pattern_upload_max_filesize, "\n" + content)
|
||||||
|
memory_limit = re.findall(pattern_memory_limit, "\n" + content)
|
||||||
|
|
||||||
|
if memory_limit:
|
||||||
|
content = re.sub(pattern_memory_limit, "", content)
|
||||||
|
memory_limit = memory_limit[0]
|
||||||
|
install = open("scripts/install").read()
|
||||||
|
install = re.sub(
|
||||||
|
"(source /usr/share/yunohost/helpers)",
|
||||||
|
"\\1\n\nynh_app_setting_set --key=php_memory_limit --value="
|
||||||
|
+ memory_limit,
|
||||||
|
install,
|
||||||
|
)
|
||||||
|
open("scripts/install", "w").write(install)
|
||||||
|
upgrade = open("scripts/upgrade").read()
|
||||||
|
upgrade = re.sub(
|
||||||
|
"(source /usr/share/yunohost/helpers)",
|
||||||
|
"\\1\n\nynh_app_setting_set_default --key=php_memory_limit --value="
|
||||||
|
+ memory_limit,
|
||||||
|
upgrade,
|
||||||
|
)
|
||||||
|
open("scripts/upgrade", "w").write(upgrade)
|
||||||
|
|
||||||
|
if upload_max_filesize:
|
||||||
|
content = re.sub(pattern_upload_max_filesize, "", content)
|
||||||
|
content = re.sub(pattern_post_max_size, "", content)
|
||||||
|
|
||||||
|
upload_max_filesize = upload_max_filesize[0]
|
||||||
|
if upload_max_filesize != "50M":
|
||||||
|
install = open("scripts/install").read()
|
||||||
|
install = re.sub(
|
||||||
|
"(source /usr/share/yunohost/helpers)",
|
||||||
|
"\\1\n\nynh_app_setting_set --key=php_upload_max_filesize --value="
|
||||||
|
+ upload_max_filesize,
|
||||||
|
install,
|
||||||
|
)
|
||||||
|
open("scripts/install", "w").write(install)
|
||||||
|
upgrade = open("scripts/upgrade").read()
|
||||||
|
upgrade = re.sub(
|
||||||
|
"(source /usr/share/yunohost/helpers)",
|
||||||
|
"\\1\n\nynh_app_setting_set_default --key=php_upload_max_filesize --value="
|
||||||
|
+ upload_max_filesize,
|
||||||
|
upgrade,
|
||||||
|
)
|
||||||
|
open("scripts/upgrade", "w").write(upgrade)
|
||||||
|
|
||||||
|
new_conf_is_empty = all(
|
||||||
|
line.strip() == "" or line.strip()[0] == ";" for line in content.split("\n")
|
||||||
|
)
|
||||||
|
if new_conf_is_empty:
|
||||||
|
os.system("git rm --quiet -f conf/extra_php-fpm.conf")
|
||||||
|
else:
|
||||||
|
open("conf/extra_php-fpm.conf", "w").write(content)
|
||||||
|
|
||||||
|
conf_replaces = [
|
||||||
|
(r"__NAME__", "__APP__"),
|
||||||
|
(r"__NAMETOCHANGE__", "__APP__"),
|
||||||
|
(r"__USER__", "__APP__"),
|
||||||
|
("__YNH_NODE__", "__NODEJS_DIR__/node"),
|
||||||
|
("__YNH_NPM__", "__NODEJS_DIR__/npm"),
|
||||||
|
("__YNH_NODE_LOAD_PATH__", "PATH=__PATH_WITH_NODEJS__"),
|
||||||
|
("__YNH_RUBY_LOAD_PATH__", "PATH=__PATH_WITH_RUBY__"),
|
||||||
|
("__YNH_GO_LOAD_PATH__", "PATH=__PATH_WITH_GO__"),
|
||||||
|
("__YNH_RUBY__", "__RUBY_DIR__/ruby"),
|
||||||
|
("__PHPVERSION__", "__PHP_VERSION__"),
|
||||||
|
]
|
||||||
|
|
||||||
|
for currentpath, folders, files in os.walk("conf"):
|
||||||
|
for file in files:
|
||||||
|
path = os.path.join(currentpath, file)
|
||||||
|
try:
|
||||||
|
content = open(path).read()
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
# Not text?
|
||||||
|
continue
|
||||||
|
for pattern, replace in conf_replaces:
|
||||||
|
content = content.replace(pattern, replace)
|
||||||
|
|
||||||
|
open(path, "w").write(content)
|
||||||
|
|
||||||
|
git_cmds = [
|
||||||
|
"git rm --quiet sources/extra_files/*/.gitignore 2>/dev/null",
|
||||||
|
"git rm --quiet sources/patches/.gitignore 2>/dev/null",
|
||||||
|
"git mv sources/extra_files/* sources/ 2>/dev/null",
|
||||||
|
"git mv sources/app/* sources/ 2>/dev/null",
|
||||||
|
"git mv sources/patches patches/ 2>/dev/null",
|
||||||
|
"test -e conf/app.sh && git rm --quiet conf/app.src",
|
||||||
|
"test -e check_process && git rm --quiet check_process",
|
||||||
|
"test -e scripts/actions && git rm -rf --quiet scripts/actions",
|
||||||
|
"test -e config_panel.json && git rm --quiet config_panel.json",
|
||||||
|
"test -e config_panel.toml.example && git rm --quiet config_panel.toml.example",
|
||||||
|
"git rm $(find ./ -name .DS_Store) 2>/dev/null",
|
||||||
|
r"grep -q '\*\~' .gitignore 2>/dev/null || echo '*~' >> .gitignore",
|
||||||
|
r"grep -q '\*.sw\[op\]' .gitignore || echo '*.sw[op]' >> .gitignore",
|
||||||
|
r"grep -q '\.DS_Store' .gitignore || echo '.DS_Store' >> .gitignore",
|
||||||
|
"git add .gitignore",
|
||||||
|
]
|
||||||
|
|
||||||
|
for cmd in git_cmds:
|
||||||
|
os.system(cmd)
|
||||||
|
|
||||||
|
# If there's a config panel but the only options are the stupid php usage/footprint stuff
|
||||||
|
if (
|
||||||
|
os.path.exists("config_panel.toml")
|
||||||
|
and os.system(
|
||||||
|
r"grep -oE '^\s*\[\S+\.\S+\.\S+]' config_panel.toml | grep -qv php_fpm_config"
|
||||||
|
)
|
||||||
|
!= 0
|
||||||
|
):
|
||||||
|
os.system("git rm --quiet -f config_panel.toml")
|
||||||
|
os.system("git rm --quiet -f scripts/config")
|
||||||
|
|
||||||
|
# Remove scripts/config if no config panel ... most of the time this is only the example config script :|
|
||||||
|
if os.path.exists("scripts/config") and not os.path.exists("config_panel.toml"):
|
||||||
|
os.system("git rm --quiet -f scripts/config")
|
||||||
|
|
||||||
|
webapp_serving_raw_assets_probably = False
|
||||||
|
if os.path.exists("conf/nginx.conf"):
|
||||||
|
nginx_conf = open("conf/nginx.conf").read()
|
||||||
|
if "alias " in nginx_conf or "root " in nginx_conf:
|
||||||
|
webapp_serving_raw_assets_probably = True
|
||||||
|
|
||||||
|
if os.path.isdir("patches"):
|
||||||
|
for file in os.listdir("patches"):
|
||||||
|
if "-" not in file:
|
||||||
|
continue
|
||||||
|
source_name, patch_name = file.split("-", 1)
|
||||||
|
if source_name == "app":
|
||||||
|
source_name = "main"
|
||||||
|
os.system(f"mkdir -p 'patches/{source_name}'")
|
||||||
|
os.system(f"git mv patches/{file} patches/{source_name}/{patch_name}")
|
||||||
|
|
||||||
|
# Add helpers_version = '2.1' after yunohost requirement in manifest
|
||||||
|
raw_manifest = open("manifest.toml", "r").read()
|
||||||
|
if "helpers_version" not in raw_manifest:
|
||||||
|
raw_manifest = re.sub(
|
||||||
|
"(yunohost = .*)", '\\1\nhelpers_version = "2.1"', raw_manifest
|
||||||
|
)
|
||||||
|
raw_manifest = re.sub(
|
||||||
|
r'yunohost = ">= 11\..*"', 'yunohost = ">= 11.2.18"', raw_manifest
|
||||||
|
)
|
||||||
|
if webapp_serving_raw_assets_probably:
|
||||||
|
raw_manifest = re.sub(
|
||||||
|
r"( *)\[resources.install_dir\]",
|
||||||
|
'\\1[resources.install_dir]\n\\1group = "www-data:r-x"',
|
||||||
|
raw_manifest,
|
||||||
|
)
|
||||||
|
|
||||||
|
open("manifest.toml", "w").write(raw_manifest)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Attempt to automatically apply changes to use YunoHost helpers v2.1 on a v2 app"
|
||||||
|
)
|
||||||
|
parser.add_argument("app_path", help="Path to the app to convert")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if not os.path.exists(args.app_path + "/manifest.toml"):
|
||||||
|
raise Exception("There is no manifest.toml. Is this really an app directory ?")
|
||||||
|
|
||||||
|
os.chdir(args.app_path)
|
||||||
|
|
||||||
|
cleanup()
|
BIN
tools/readme_generator/translations/id/LC_MESSAGES/messages.mo
Normal file
BIN
tools/readme_generator/translations/id/LC_MESSAGES/messages.mo
Normal file
Binary file not shown.
|
@ -8,23 +8,26 @@ msgstr ""
|
||||||
"Project-Id-Version: PROJECT VERSION\n"
|
"Project-Id-Version: PROJECT VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2024-03-31 19:33+0200\n"
|
"POT-Creation-Date: 2024-03-31 19:33+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: 2024-07-27 02:54+0000\n"
|
||||||
"Last-Translator: Automatically generated\n"
|
"Last-Translator: cjdw <cjdw@users.noreply.translate.yunohost.org>\n"
|
||||||
"Language-Team: none\n"
|
"Language-Team: Indonesian <https://translate.yunohost.org/projects/yunohost/"
|
||||||
|
"readme-generator/id/>\n"
|
||||||
"Language: id\n"
|
"Language: id\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
"X-Generator: Weblate 5.4.3\n"
|
||||||
"Generated-By: Babel 2.14.0\n"
|
"Generated-By: Babel 2.14.0\n"
|
||||||
|
|
||||||
#: templates/ALL_README.md.j2:11
|
#: templates/ALL_README.md.j2:11
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Read the README in %(language)s"
|
msgid "Read the README in %(language)s"
|
||||||
msgstr ""
|
msgstr "Baca README dalam bahasa %(language)s"
|
||||||
|
|
||||||
#: templates/README.md.j2:2
|
#: templates/README.md.j2:2
|
||||||
msgid "Packaging an app, starting from this example"
|
msgid "Packaging an app, starting from this example"
|
||||||
msgstr ""
|
msgstr "Memaket satu aplikasi, dimulai dari contoh ini"
|
||||||
|
|
||||||
#: templates/README.md.j2:4
|
#: templates/README.md.j2:4
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -32,32 +35,41 @@ msgid ""
|
||||||
"github.com/new?template_name=example_ynh&template_owner=YunoHost) button on "
|
"github.com/new?template_name=example_ynh&template_owner=YunoHost) button on "
|
||||||
"the Github repo"
|
"the Github repo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Salin aplikasi ini sebelum mengerjakannya, menggunakan tombol ['Gunakan "
|
||||||
|
"templat ini'](https://github.com/"
|
||||||
|
"new?template_name=example_ynh&template_owner=YunoHost) di repo Github"
|
||||||
|
|
||||||
#: templates/README.md.j2:5
|
#: templates/README.md.j2:5
|
||||||
msgid "Edit the `manifest.toml` with app specific info"
|
msgid "Edit the `manifest.toml` with app specific info"
|
||||||
msgstr ""
|
msgstr "Edit `manifest.toml` dengan info khas aplikasi"
|
||||||
|
|
||||||
#: templates/README.md.j2:6
|
#: templates/README.md.j2:6
|
||||||
msgid ""
|
msgid ""
|
||||||
"Edit the `install`, `upgrade`, `remove`, `backup` and `restore` scripts, and "
|
"Edit the `install`, `upgrade`, `remove`, `backup` and `restore` scripts, and "
|
||||||
"any relevant conf files in `conf/`"
|
"any relevant conf files in `conf/`"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Edit skrip `install`, `upgrade`, `remove`, `backup` and `restore`, dan "
|
||||||
|
"setiap berkas conf yang relevan dalam `conf/`"
|
||||||
|
|
||||||
#: templates/README.md.j2:7
|
#: templates/README.md.j2:7
|
||||||
msgid ""
|
msgid ""
|
||||||
"Using the [script helpers documentation](https://yunohost.org/"
|
"Using the [script helpers documentation](https://yunohost.org/"
|
||||||
"packaging_apps_helpers)"
|
"packaging_apps_helpers)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Menggunakan [dokumentasi pembantu skrip](https://yunohost.org/"
|
||||||
|
"packaging_apps_helpers)"
|
||||||
|
|
||||||
#: templates/README.md.j2:8
|
#: templates/README.md.j2:8
|
||||||
msgid ""
|
msgid ""
|
||||||
"Edit the `change_url` and `config` scripts too, or remove them if you have "
|
"Edit the `change_url` and `config` scripts too, or remove them if you have "
|
||||||
"no use of them"
|
"no use of them"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Juga edit skrip `change_url` dan `config`, atau singkirkan mereka bila Anda "
|
||||||
|
"sudah tidak memerlukannya"
|
||||||
|
|
||||||
#: templates/README.md.j2:9
|
#: templates/README.md.j2:9
|
||||||
msgid "Add a `LICENSE` file for the package."
|
msgid "Add a `LICENSE` file for the package."
|
||||||
msgstr ""
|
msgstr "Tambah berkas `LICENSE` pada paket."
|
||||||
|
|
||||||
#: templates/README.md.j2:10
|
#: templates/README.md.j2:10
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -66,18 +78,26 @@ msgid ""
|
||||||
"published with and you can choose it freely! (If you don't know which to "
|
"published with and you can choose it freely! (If you don't know which to "
|
||||||
"choose, we recommend [the AGPL-3](https://www.gnu.org/licenses/agpl-3.0.txt))"
|
"choose, we recommend [the AGPL-3](https://www.gnu.org/licenses/agpl-3.0.txt))"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"NB: berkas `LICENSE` ini tidak dimaksudkan untuk selalu sama dengan aplikasi "
|
||||||
|
"hulu - hanya LICENSE yang Anda inginkan untuk menerbitkan kode paket ini dan "
|
||||||
|
"Anda bisa bebas memilihnya! (Bila Anda tidak tahu mana yang harus dipilih, "
|
||||||
|
"kami sarankan [the AGPL-3](https://www.gnu.org/licenses/agpl-3.0.txt))"
|
||||||
|
|
||||||
#: templates/README.md.j2:11
|
#: templates/README.md.j2:11
|
||||||
msgid ""
|
msgid ""
|
||||||
"Edit files under the `doc/` directory ([see the page about documenting "
|
"Edit files under the `doc/` directory ([see the page about documenting "
|
||||||
"packages](https://yunohost.org/packaging_app_doc))"
|
"packages](https://yunohost.org/packaging_app_doc))"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Edit berkas di bawah direktori `doc/` ([lihat halaman mengenai "
|
||||||
|
"mendokumentasikan paket](https://yunohost.org/packaging_app_doc))"
|
||||||
|
|
||||||
#: templates/README.md.j2:12
|
#: templates/README.md.j2:12
|
||||||
msgid ""
|
msgid ""
|
||||||
"The `README.md` files are to be automatically generated by <https://github."
|
"The `README.md` files are to be automatically generated by <https://github."
|
||||||
"com/YunoHost/apps/tree/master/tools/readme_generator>"
|
"com/YunoHost/apps/tree/master/tools/readme_generator>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Berkas `README.md` akan dibuat secara otomatis oleh <https://github.com/"
|
||||||
|
"YunoHost/apps/tree/master/tools/readme_generator>"
|
||||||
|
|
||||||
#: templates/README.md.j2:18
|
#: templates/README.md.j2:18
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -85,32 +105,35 @@ msgid ""
|
||||||
"YunoHost/apps/tree/master/tools/readme_generator>\n"
|
"YunoHost/apps/tree/master/tools/readme_generator>\n"
|
||||||
"It shall NOT be edited by hand."
|
"It shall NOT be edited by hand."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"N.B.: README ini dibuat secara otomatis oleh <https://github.com/YunoHost/"
|
||||||
|
"apps/tree/master/tools/readme_generator>\n"
|
||||||
|
"Ini TIDAK boleh diedit dengan tangan."
|
||||||
|
|
||||||
#: templates/README.md.j2:22
|
#: templates/README.md.j2:22
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%(application_name)s for YunoHost"
|
msgid "%(application_name)s for YunoHost"
|
||||||
msgstr ""
|
msgstr "%(application_name)s untuk YunoHost"
|
||||||
|
|
||||||
#: templates/README.md.j2:24
|
#: templates/README.md.j2:24
|
||||||
msgid "Integration level"
|
msgid "Integration level"
|
||||||
msgstr ""
|
msgstr "Tingkat integrasi"
|
||||||
|
|
||||||
#: templates/README.md.j2:24
|
#: templates/README.md.j2:24
|
||||||
msgid "Working status"
|
msgid "Working status"
|
||||||
msgstr ""
|
msgstr "Status kerja"
|
||||||
|
|
||||||
#: templates/README.md.j2:24
|
#: templates/README.md.j2:24
|
||||||
msgid "Maintenance status"
|
msgid "Maintenance status"
|
||||||
msgstr ""
|
msgstr "Status pemeliharaan"
|
||||||
|
|
||||||
#: templates/README.md.j2:26
|
#: templates/README.md.j2:26
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Install %(application_name)s with YunoHost"
|
msgid "Install %(application_name)s with YunoHost"
|
||||||
msgstr ""
|
msgstr "Pasang %(application_name)s dengan YunoHost"
|
||||||
|
|
||||||
#: templates/README.md.j2:28
|
#: templates/README.md.j2:28
|
||||||
msgid "Read this README in other languages."
|
msgid "Read this README in other languages."
|
||||||
msgstr ""
|
msgstr "Baca README ini dengan bahasa yang lain."
|
||||||
|
|
||||||
#: templates/README.md.j2:30
|
#: templates/README.md.j2:30
|
||||||
#, python-format
|
#, python-format
|
||||||
|
@ -118,73 +141,78 @@ msgid ""
|
||||||
"This package allows you to install %(application_name)s quickly and simply "
|
"This package allows you to install %(application_name)s quickly and simply "
|
||||||
"on a YunoHost server."
|
"on a YunoHost server."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Paket ini memperbolehkan Anda untuk memasang %(application_name)s secara "
|
||||||
|
"cepat dan mudah pada server YunoHost."
|
||||||
|
|
||||||
#: templates/README.md.j2:31
|
#: templates/README.md.j2:31
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you don't have YunoHost, please consult [the guide](https://yunohost.org/"
|
"If you don't have YunoHost, please consult [the guide](https://yunohost.org/"
|
||||||
"install) to learn how to install it."
|
"install) to learn how to install it."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Bila Anda tidak mempunyai YunoHost, silakan berkonsultasi dengan "
|
||||||
|
"[panduan](https://yunohost.org/install) untuk mempelajari bagaimana untuk "
|
||||||
|
"memasangnya."
|
||||||
|
|
||||||
#: templates/README.md.j2:33
|
#: templates/README.md.j2:33
|
||||||
msgid "Overview"
|
msgid "Overview"
|
||||||
msgstr ""
|
msgstr "Ringkasan"
|
||||||
|
|
||||||
#: templates/README.md.j2:37
|
#: templates/README.md.j2:37
|
||||||
msgid "Shipped version:"
|
msgid "Shipped version:"
|
||||||
msgstr ""
|
msgstr "Versi terkirim:"
|
||||||
|
|
||||||
#: templates/README.md.j2:41
|
#: templates/README.md.j2:41
|
||||||
msgid "Demo:"
|
msgid "Demo:"
|
||||||
msgstr ""
|
msgstr "Demo:"
|
||||||
|
|
||||||
#: templates/README.md.j2:45
|
#: templates/README.md.j2:45
|
||||||
msgid "Screenshots"
|
msgid "Screenshots"
|
||||||
msgstr ""
|
msgstr "Tangkapan Layar"
|
||||||
|
|
||||||
#: templates/README.md.j2:48
|
#: templates/README.md.j2:48
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Screenshot of %(application_name)s"
|
msgid "Screenshot of %(application_name)s"
|
||||||
msgstr ""
|
msgstr "Tangkapan Layar pada %(application_name)s"
|
||||||
|
|
||||||
#: templates/README.md.j2:53
|
#: templates/README.md.j2:53
|
||||||
msgid "Disclaimers / important information"
|
msgid "Disclaimers / important information"
|
||||||
msgstr ""
|
msgstr "Sangkalan / informasi penting"
|
||||||
|
|
||||||
#: templates/README.md.j2:59
|
#: templates/README.md.j2:59
|
||||||
msgid "Antifeatures"
|
msgid "Antifeatures"
|
||||||
msgstr ""
|
msgstr "Antifitur"
|
||||||
|
|
||||||
#: templates/README.md.j2:66
|
#: templates/README.md.j2:66
|
||||||
msgid "Documentation and resources"
|
msgid "Documentation and resources"
|
||||||
msgstr ""
|
msgstr "Dokumentasi dan sumber daya"
|
||||||
|
|
||||||
#: templates/README.md.j2:68
|
#: templates/README.md.j2:68
|
||||||
msgid "Official app website:"
|
msgid "Official app website:"
|
||||||
msgstr ""
|
msgstr "Website aplikasi resmi:"
|
||||||
|
|
||||||
#: templates/README.md.j2:70
|
#: templates/README.md.j2:70
|
||||||
msgid "Official user documentation:"
|
msgid "Official user documentation:"
|
||||||
msgstr ""
|
msgstr "Dokumentasi pengguna resmi:"
|
||||||
|
|
||||||
#: templates/README.md.j2:72
|
#: templates/README.md.j2:72
|
||||||
msgid "Official admin documentation:"
|
msgid "Official admin documentation:"
|
||||||
msgstr ""
|
msgstr "Dokumentasi admin resmi:"
|
||||||
|
|
||||||
#: templates/README.md.j2:74
|
#: templates/README.md.j2:74
|
||||||
msgid "Upstream app code repository:"
|
msgid "Upstream app code repository:"
|
||||||
msgstr ""
|
msgstr "Depot kode aplikasi hulu:"
|
||||||
|
|
||||||
#: templates/README.md.j2:76
|
#: templates/README.md.j2:76
|
||||||
msgid "YunoHost Store:"
|
msgid "YunoHost Store:"
|
||||||
msgstr ""
|
msgstr "Gudang YunoHost:"
|
||||||
|
|
||||||
#: templates/README.md.j2:77
|
#: templates/README.md.j2:77
|
||||||
msgid "Report a bug:"
|
msgid "Report a bug:"
|
||||||
msgstr ""
|
msgstr "Laporkan bug:"
|
||||||
|
|
||||||
#: templates/README.md.j2:79
|
#: templates/README.md.j2:79
|
||||||
msgid "Developer info"
|
msgid "Developer info"
|
||||||
msgstr ""
|
msgstr "Info developer"
|
||||||
|
|
||||||
#: templates/README.md.j2:81
|
#: templates/README.md.j2:81
|
||||||
#, python-format
|
#, python-format
|
||||||
|
@ -192,15 +220,16 @@ msgid ""
|
||||||
"Please send your pull request to the [`testing` branch]"
|
"Please send your pull request to the [`testing` branch]"
|
||||||
"(%(testing_branch_url)s)."
|
"(%(testing_branch_url)s)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Silakan kirim pull request ke [`testing` branch](%(testing_branch_url)s)."
|
||||||
|
|
||||||
#: templates/README.md.j2:83
|
#: templates/README.md.j2:83
|
||||||
msgid "To try the `testing` branch, please proceed like that:"
|
msgid "To try the `testing` branch, please proceed like that:"
|
||||||
msgstr ""
|
msgstr "Untuk mencoba branch `testing`, silakan dilanjutkan seperti:"
|
||||||
|
|
||||||
#: templates/README.md.j2:87
|
#: templates/README.md.j2:87
|
||||||
msgid "or"
|
msgid "or"
|
||||||
msgstr ""
|
msgstr "atau"
|
||||||
|
|
||||||
#: templates/README.md.j2:91
|
#: templates/README.md.j2:91
|
||||||
msgid "More info regarding app packaging:"
|
msgid "More info regarding app packaging:"
|
||||||
msgstr ""
|
msgstr "Info lebih lanjut mengenai pemaketan aplikasi:"
|
||||||
|
|
|
@ -497,6 +497,14 @@ upstream = "https://github.com/docker/distribution/"
|
||||||
website = ""
|
website = ""
|
||||||
added_date = 1695656621 # 2023/09/25
|
added_date = 1695656621 # 2023/09/25
|
||||||
|
|
||||||
|
|
||||||
|
[docmost]
|
||||||
|
name = "Docmost."
|
||||||
|
description = "Wiki and documentation software"
|
||||||
|
upstream = "https://github.com/docmost/docmost"
|
||||||
|
website = "https://docmost.com/"
|
||||||
|
added_date = 1721053354 # 2024/07/15
|
||||||
|
|
||||||
[docspell]
|
[docspell]
|
||||||
name = "Docspell"
|
name = "Docspell"
|
||||||
description = "Simple document organizer"
|
description = "Simple document organizer"
|
||||||
|
@ -787,6 +795,14 @@ upstream = "https://github.com/graphhopper/graphhopper"
|
||||||
website = "https://www.graphhopper.com/"
|
website = "https://www.graphhopper.com/"
|
||||||
added_date = 1695656621 # 2023/09/25
|
added_date = 1695656621 # 2023/09/25
|
||||||
|
|
||||||
|
|
||||||
|
[graylog]
|
||||||
|
name = "Graylog"
|
||||||
|
description = "log management platform"
|
||||||
|
upstream = "https://github.com/Graylog2/graylog2-server"
|
||||||
|
website = "https://www.graylog.org/"
|
||||||
|
added_date = 1721053741 # 2024/07/15
|
||||||
|
|
||||||
[greenlight]
|
[greenlight]
|
||||||
name = "Greenlight"
|
name = "Greenlight"
|
||||||
description = "A really simple end-user interface for your BigBlueButton server"
|
description = "A really simple end-user interface for your BigBlueButton server"
|
||||||
|
|
Loading…
Add table
Reference in a new issue