commit 979718e
Merge pull request 'master refresh' (#8) from grunfink/snac2:master into master Reviewed-on: https://codeberg.org/zen/snac2/pulls/8
37 files changed,
+3779,
-2324
+2,
-1
1@@ -1,2 +1,3 @@
2-*.o
3+**/*.o
4+tests/smtp
5 snac
M
Makefile
+10,
-4
1@@ -8,11 +8,16 @@ snac: snac.o main.o sandbox.o data.o http.o httpd.o webfinger.o \
2 activitypub.o html.o utils.o format.o upgrade.o mastoapi.o
3 $(CC) $(CFLAGS) -L$(PREFIX)/lib *.o -lcurl -lcrypto $(LDFLAGS) -pthread -o $@
4
5+test: tests/smtp
6+
7+tests/smtp: tests/smtp.o
8+ $(CC) $(CFLAGS) -L$(PREFIX)/lib $< -lcurl $(LDFLAGS) -o $@
9+
10 .c.o:
11- $(CC) $(CFLAGS) $(CPPFLAGS) -I$(PREFIX)/include -c $<
12+ $(CC) $(CFLAGS) $(CPPFLAGS) -I$(PREFIX)/include -c $< -o $@
13
14 clean:
15- rm -rf *.o *.core snac makefile.depend
16+ rm -rf *.o tests/*.o tests/smtp *.core snac makefile.depend
17
18 dep:
19 $(CC) -I$(PREFIX)/include -MM *.c > makefile.depend
20@@ -51,7 +56,7 @@ format.o: format.c xs.h xs_regex.h xs_mime.h xs_html.h xs_json.h \
21 xs_time.h xs_match.h snac.h http_codes.h
22 html.o: html.c xs.h xs_io.h xs_json.h xs_regex.h xs_set.h xs_openssl.h \
23 xs_time.h xs_mime.h xs_match.h xs_html.h xs_curl.h xs_unicode.h xs_url.h \
24- snac.h http_codes.h
25+ xs_random.h snac.h http_codes.h
26 http.o: http.c xs.h xs_io.h xs_openssl.h xs_curl.h xs_time.h xs_json.h \
27 snac.h http_codes.h
28 httpd.o: httpd.c xs.h xs_io.h xs_json.h xs_socket.h xs_unix_socket.h \
29@@ -66,7 +71,8 @@ sandbox.o: sandbox.c xs.h snac.h http_codes.h
30 snac.o: snac.c xs.h xs_hex.h xs_io.h xs_unicode_tbl.h xs_unicode.h \
31 xs_json.h xs_curl.h xs_openssl.h xs_socket.h xs_unix_socket.h xs_url.h \
32 xs_httpd.h xs_mime.h xs_regex.h xs_set.h xs_time.h xs_glob.h xs_random.h \
33- xs_match.h xs_fcgi.h xs_html.h xs_po.h snac.h http_codes.h
34+ xs_match.h xs_fcgi.h xs_html.h xs_po.h xs_webmention.h snac.h \
35+ http_codes.h
36 upgrade.o: upgrade.c xs.h xs_io.h xs_json.h xs_glob.h snac.h http_codes.h
37 utils.o: utils.c xs.h xs_io.h xs_json.h xs_time.h xs_openssl.h \
38 xs_random.h xs_glob.h xs_curl.h xs_regex.h snac.h http_codes.h
+3,
-2
1@@ -45,7 +45,7 @@ format.o: format.c xs.h xs_regex.h xs_mime.h xs_html.h xs_json.h \
2 xs_time.h xs_match.h snac.h http_codes.h
3 html.o: html.c xs.h xs_io.h xs_json.h xs_regex.h xs_set.h xs_openssl.h \
4 xs_time.h xs_mime.h xs_match.h xs_html.h xs_curl.h xs_unicode.h xs_url.h \
5- snac.h http_codes.h
6+ xs_random.h snac.h http_codes.h
7 http.o: http.c xs.h xs_io.h xs_openssl.h xs_curl.h xs_time.h xs_json.h \
8 snac.h http_codes.h
9 httpd.o: httpd.c xs.h xs_io.h xs_json.h xs_socket.h xs_unix_socket.h \
10@@ -60,7 +60,8 @@ sandbox.o: sandbox.c xs.h snac.h http_codes.h
11 snac.o: snac.c xs.h xs_hex.h xs_io.h xs_unicode_tbl.h xs_unicode.h \
12 xs_json.h xs_curl.h xs_openssl.h xs_socket.h xs_unix_socket.h xs_url.h \
13 xs_httpd.h xs_mime.h xs_regex.h xs_set.h xs_time.h xs_glob.h xs_random.h \
14- xs_match.h xs_fcgi.h xs_html.h xs_po.h snac.h http_codes.h
15+ xs_match.h xs_fcgi.h xs_html.h xs_po.h xs_webmention.h snac.h \
16+ http_codes.h
17 upgrade.o: upgrade.c xs.h xs_io.h xs_json.h xs_glob.h snac.h http_codes.h
18 utils.o: utils.c xs.h xs_io.h xs_json.h xs_time.h xs_openssl.h \
19 xs_random.h xs_glob.h xs_curl.h xs_regex.h snac.h http_codes.h
+42,
-2
1@@ -1,6 +1,46 @@
2 # Release Notes
3
4-## 2.74
5+## UNRELEASED
6+
7+The number of pending follow confirmations is shown next to the "people" link.
8+
9+Faster performance metrics (contributed by dandelions).
10+
11+Mastodon API: added follow confirmation endpoints.
12+
13+## 2.77 "Ugly Links Everywhere"
14+
15+As they look confusing in some platforms, links in content posts are no longer included as `Link` attachments.
16+
17+## 2.76
18+
19+Added Webmention support for links (Markdown-style or direct) written in a post.
20+
21+Added new command-line options for list maintenance.
22+
23+Display custom emoji in more places (contributed by dandelions).
24+
25+Mastodon API: fixed infinite scroll in many clients (thanks to cheeaun for giving me the clue), added `/api/v1/accounts/.../lists` endpoint (contributed by dandelions).
26+
27+Email notifications can now be sent via `libcurl` SMTP instead of spawning the `/usr/sbin/sendmail` program. To use this new feature, some additional server configuration is needed, see `snac(8)` (contributed by shtrophic).
28+
29+## 2.75 "Time Is On My Side"
30+
31+Added support for scheduled posts (for this to work correctly, users will have to set their time zone, see below).
32+
33+The user can now select a working time zone. This will be used to correctly parse the local date and time of a scheduled post.
34+
35+Fixed incorrect poll vote format, which was causing problems in platforms like GotoSocial.
36+
37+Mastodon API: added support for `/api/v1/instance/peers`.
38+
39+Added a new `snac-admin` helper script (contributed by shtrophic).
40+
41+In the web UI, posts are separated by the `<hr hidden>` tag; it's invisible in graphical browsers, but it separates post clearly in text-based browsers.
42+
43+Some Finnish, Spanish, Czech and Russian translation updates and fixes.
44+
45+## 2.74 "The Days of Nicole, the Fediverse Chick"
46
47 Added Spanish (default, Argentina and Uruguay) translation (contributed by gnemmi).
48
49@@ -22,7 +62,7 @@ Added Greek translation (contributed by uhuru).
50
51 Added Italian translation (contributed by anzu).
52
53-Mastodon API: added support for /api/v1/custom_emojis (contributed by violette).
54+Mastodon API: added support for `/api/v1/custom_emojis` (contributed by violette).
55
56 Improved Undo+Follow logic (contributed by rozenglass).
57
M
TODO.md
+17,
-7
1@@ -2,19 +2,21 @@
2
3 ## Open
4
5+It seems that Microsoft is planning to laminate Basic HTTP Auth, so make a plan, see https://codeberg.org/grunfink/snac2/issues/350
6+
7 Investigate the problem with boosts inside the same instance (see https://codeberg.org/grunfink/snac2/issues/214).
8
9 Editing / Updating a post does not index newly added hashtags.
10
11-Wrong level of message visibility when using the Mastodon API: https://codeberg.org/grunfink/snac2/issues/200#issuecomment-2351042
12-
13 Unfollowing guppe groups seems to work (http status of 200), but messages continue to arrive as if it didn't.
14
15 Important: deleting a follower should do more that just delete the object, see https://codeberg.org/grunfink/snac2/issues/43#issuecomment-956721
16
17 ## Wishlist
18
19-Each notification should show a link to the full thread, to see it in context.
20+Add account reporting.
21+
22+Add a list option to hide member posts from the main timeline, see https://codeberg.org/grunfink/snac2/issues/383
23
24 The instance timeline should also show boosts from users.
25
26@@ -30,14 +32,10 @@ Integrate "Added handling for International Domain Names" PR https://codeberg.or
27
28 Do something about Akkoma and Misskey's quoted replies (they use the `quoteUrl` field instead of `inReplyTo`).
29
30-Add a list of hashtags to drop.
31-
32 Take a look at crashes in the brittle Mastodon official app (crashes when hitting the reply button, crashes or 'ownVotes is null' errors when trying to show polls).
33
34 The 'history' pages are just monthly HTML snapshots of the local timeline. This is ok and cheap and easy, but is problematic if you e.g. intentionally delete a post because it will remain there in the history forever. If you activate local timeline purging, purged entries will remain in the history as 'ghosts', which may or may not be what the user wants.
35
36-The actual storage system wastes too much disk space (lots of small files that really consume 4k of storage). Consider alternatives.
37-
38 ## Closed
39
40 Start a TODO file (2022-08-25T10:07:44+0200).
41@@ -367,3 +365,15 @@ Add support for /authorize_interaction (whatever it is) (2025-01-16T14:45:28+010
42 Implement following of hashtags (this is not trivial) (2025-01-30T16:12:16+0100).
43
44 Add support for subscribing and posting to relays (see https://codeberg.org/grunfink/snac2/issues/216 for more information) (2025-01-30T16:12:34+0100).
45+
46+Wrong level of message visibility when using the Mastodon API: https://codeberg.org/grunfink/snac2/issues/200#issuecomment-2351042 (2025-03-23T15:44:35+0100).
47+
48+Each notification should show a link to the full thread, to see it in context (2025-03-23T15:44:50+0100).
49+
50+Add a list of hashtags to drop (2025-03-23T15:45:30+0100).
51+
52+The actual storage system wastes too much disk space (lots of small files that really consume 4k of storage). Consider alternatives (2025-03-23T15:46:02+0100).
53+
54+Add command-line tools for creating and manipulating lists (2025-04-18T10:04:41+0200).
55+
56+Do a [Webmention](https://www.w3.org/TR/webmention/) to every link written in a post (2025-05-04T11:16:21+0200).
+82,
-33
1@@ -11,6 +11,7 @@
2 #include "xs_set.h"
3 #include "xs_match.h"
4 #include "xs_unicode.h"
5+#include "xs_webmention.h"
6
7 #include "snac.h"
8
9@@ -34,7 +35,7 @@ const char *susie_cool =
10 "+ZcgN7wF7ZVihXkfSlWIVzIA6dbQzaygllpNuTX"
11 "ZmmFNlvxADX1+o0cUPMbAAAAAElFTkSuQmCC";
12
13-const char *susie_muertos =
14+const char *susie_muertos =
15 "iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQAAAAC"
16 "CEkxzAAAAV0lEQVQoz4XQsQ0AMQxCUW/A/lv+DT"
17 "ic6zGRolekIMyMELNp8PiCEw6Q4w4NoAt53IH5m"
18@@ -1044,17 +1045,21 @@ void notify(snac *snac, const char *type, const char *utype, const char *actor,
19
20 xs *subject = xs_fmt("snac notify for @%s@%s",
21 xs_dict_get(snac->config, "uid"), xs_dict_get(srv_config, "host"));
22- xs *from = xs_fmt("snac-daemon <snac-daemon@%s>", xs_dict_get(srv_config, "host"));
23+ xs *from = xs_fmt("<snac-daemon@%s>", xs_dict_get(srv_config, "host"));
24 xs *header = xs_fmt(
25- "From: %s\n"
26+ "From: snac-daemon %s\n"
27 "To: %s\n"
28 "Subject: %s\n"
29 "\n",
30 from, email, subject);
31
32- xs *email_body = xs_fmt("%s%s", header, body);
33+ xs *mailinfo = xs_dict_new();
34+ xs *bd = xs_fmt("%s%s", header, body);
35+ mailinfo = xs_dict_append(mailinfo, "from", from);
36+ mailinfo = xs_dict_append(mailinfo, "to", email);
37+ mailinfo = xs_dict_append(mailinfo, "body", bd);
38
39- enqueue_email(email_body, 0);
40+ enqueue_email(mailinfo, 0);
41 }
42
43 /* telegram */
44@@ -1327,6 +1332,10 @@ xs_dict *msg_actor(snac *snac)
45 msg = xs_dict_set(msg, "preferredUsername", snac->uid);
46 msg = xs_dict_set(msg, "published", xs_dict_get(snac->config, "published"));
47
48+ // this exists so we get the emoji tags from our name too.
49+ // and then we just throw away the result, because it's kinda useless to have markdown in the display name.
50+ xs *name_dummy = not_really_markdown(xs_dict_get(snac->config, "name"), NULL, &tags);
51+
52 xs *f_bio_2 = not_really_markdown(xs_dict_get(snac->config, "bio"), NULL, &tags);
53 f_bio = process_tags(snac, f_bio_2, &tags);
54 msg = xs_dict_set(msg, "summary", f_bio);
55@@ -2563,32 +2572,53 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
56 }
57
58
59-int send_email(const char *msg)
60-/* invoke sendmail with email headers and body in msg */
61+int send_email(const xs_dict *mailinfo)
62+/* invoke curl */
63 {
64- FILE *f;
65- int status;
66- int fds[2];
67- pid_t pid;
68- if (pipe(fds) == -1) return -1;
69- pid = vfork();
70- if (pid == -1) return -1;
71- else if (pid == 0) {
72- dup2(fds[0], 0);
73+ const char *url = xs_dict_get(srv_config, "smtp_url");
74+
75+ if (!xs_is_string(url) || *url == '\0') {
76+ /* revert back to old sendmail pipe behaviour */
77+ const char *msg = xs_dict_get(mailinfo, "body");
78+ FILE *f;
79+ int status;
80+ int fds[2];
81+ pid_t pid;
82+
83+ if (pipe(fds) == -1) return -1;
84+ pid = vfork();
85+ if (pid == -1) return -1;
86+ else if (pid == 0) {
87+ dup2(fds[0], 0);
88+ close(fds[0]);
89+ close(fds[1]);
90+ execl("/usr/sbin/sendmail", "sendmail", "-t", (char *) NULL);
91+ _exit(1);
92+ }
93 close(fds[0]);
94- close(fds[1]);
95- execl("/usr/sbin/sendmail", "sendmail", "-t", (char *) NULL);
96- _exit(1);
97- }
98- close(fds[0]);
99- if ((f = fdopen(fds[1], "w")) == NULL) {
100- close(fds[1]);
101- return -1;
102+ if ((f = fdopen(fds[1], "w")) == NULL) {
103+ close(fds[1]);
104+ return -1;
105+ }
106+ fprintf(f, "%s\n", msg);
107+ fclose(f);
108+ if (waitpid(pid, &status, 0) == -1) return -1;
109+ return status;
110 }
111- fprintf(f, "%s\n", msg);
112- fclose(f);
113- if (waitpid(pid, &status, 0) == -1) return -1;
114- return status;
115+
116+ const char
117+ *user = xs_dict_get(srv_config, "smtp_username"),
118+ *pass = xs_dict_get(srv_config, "smtp_password"),
119+ *from = xs_dict_get(mailinfo, "from"),
120+ *to = xs_dict_get(mailinfo, "to"),
121+ *body = xs_dict_get(mailinfo, "body");
122+
123+ if (url == NULL || *url == '\0')
124+ url = "smtp://localhost";
125+
126+ int smtp_port = parse_port(url, NULL);
127+
128+ return xs_smtp_request(url, user, pass, from, to, body, smtp_port == 465 || smtp_port == 587);
129 }
130
131
132@@ -2759,6 +2789,8 @@ int process_user_queue(snac *snac)
133 cnt++;
134 }
135
136+ scheduled_process(snac);
137+
138 return cnt;
139 }
140
141@@ -2859,7 +2891,7 @@ void process_queue_item(xs_dict *q_item)
142 else
143 if (strcmp(type, "email") == 0) {
144 /* send this email */
145- const xs_str *msg = xs_dict_get(q_item, "message");
146+ const xs_dict *msg = xs_dict_get(q_item, "message");
147 int retries = xs_number_get(xs_dict_get(q_item, "retries"));
148
149 if (!send_email(msg))
150@@ -2998,6 +3030,25 @@ void process_queue_item(xs_dict *q_item)
151 }
152 }
153 }
154+ else
155+ if (strcmp(type, "webmention") == 0) {
156+ const xs_dict *msg = xs_dict_get(q_item, "message");
157+ const char *source = xs_dict_get(msg, "id");
158+ const char *content = xs_dict_get(msg, "content");
159+
160+ if (xs_is_string(source) && xs_is_string(content)) {
161+ xs *links = xs_regex_select(content, "\"https?:/" "/[^\"]+");
162+ const char *link;
163+
164+ xs_list_foreach(links, link) {
165+ xs *target = xs_strip_chars_i(xs_dup(link), "\"");
166+
167+ int r = xs_webmention_send(source, target, USER_AGENT);
168+
169+ srv_debug(1, xs_fmt("webmention source=%s target=%s %d", source, target, r));
170+ }
171+ }
172+ }
173 else
174 srv_log(xs_fmt("unexpected q_item type '%s'", type));
175 }
176@@ -3153,8 +3204,7 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path,
177 int total = 0;
178
179 if (show_contact_metrics) {
180- xs *l = follower_list(&snac);
181- total = xs_list_len(l);
182+ total = follower_list_len(&snac);
183 }
184
185 xs *id = xs_fmt("%s/%s", snac.actor, p_path);
186@@ -3165,8 +3215,7 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path,
187 int total = 0;
188
189 if (show_contact_metrics) {
190- xs *l = following_list(&snac);
191- total = xs_list_len(l);
192+ total = following_list_len(&snac);
193 }
194
195 xs *id = xs_fmt("%s/%s", snac.actor, p_path);
M
data.c
+129,
-8
1@@ -282,6 +282,8 @@ int user_open(snac *user, const char *uid)
2 }
3 else
4 srv_log(xs_fmt("error parsing '%s'", cfg_file));
5+
6+ user->tz = xs_dict_get_def(user->config, "tz", "UTC");
7 }
8 else
9 srv_debug(2, xs_fmt("error opening '%s' %d", cfg_file, errno));
10@@ -1213,6 +1215,14 @@ int follower_check(snac *snac, const char *actor)
11 }
12
13
14+int follower_list_len(snac *snac)
15+/* returns the number of followers */
16+{
17+ xs *list = object_user_cache_list(snac, "followers", XS_ALL, 0);
18+ return xs_list_len(list);
19+}
20+
21+
22 xs_list *follower_list(snac *snac)
23 /* returns the list of followers */
24 {
25@@ -1333,6 +1343,16 @@ xs_list *pending_list(snac *user)
26 }
27
28
29+int pending_count(snac *user)
30+/* returns the number of pending follow confirmations */
31+{
32+ xs *spec = xs_fmt("%s/pending/""*.json", user->basedir);
33+ xs *l = xs_glob(spec, 0, 0);
34+
35+ return xs_list_len(l);
36+}
37+
38+
39 /** timeline **/
40
41 double timeline_mtime(snac *snac)
42@@ -1697,6 +1717,15 @@ int following_get(snac *snac, const char *actor, xs_dict **data)
43 }
44
45
46+int following_list_len(snac *snac)
47+/* returns number of people being followed */
48+{
49+ xs *spec = xs_fmt("%s/following/" "*_a.json", snac->basedir);
50+ xs *glist = xs_glob(spec, 0, 0);
51+ return xs_list_len(glist);
52+}
53+
54+
55 xs_list *following_list(snac *snac)
56 /* returns the list of people being followed */
57 {
58@@ -1929,6 +1958,70 @@ xs_list *draft_list(snac *user)
59 }
60
61
62+/** scheduled posts **/
63+
64+int is_scheduled(snac *user, const char *id)
65+/* returns true if this note is scheduled for future sending */
66+{
67+ return object_user_cache_in(user, id, "sched");
68+}
69+
70+
71+void schedule_del(snac *user, const char *id)
72+/* deletes an scheduled post */
73+{
74+ object_user_cache_del(user, id, "sched");
75+}
76+
77+
78+void schedule_add(snac *user, const char *id, const xs_dict *msg)
79+/* schedules this post for later */
80+{
81+ /* delete from the index, in case it was already there */
82+ schedule_del(user, id);
83+
84+ /* overwrite object */
85+ object_add_ow(id, msg);
86+
87+ /* [re]add to the index */
88+ object_user_cache_add(user, id, "sched");
89+}
90+
91+
92+xs_list *scheduled_list(snac *user)
93+/* return the list of scheduled posts */
94+{
95+ return object_user_cache_list(user, "sched", XS_ALL, 1);
96+}
97+
98+
99+void scheduled_process(snac *user)
100+/* processes the scheduled list, sending those ready to be sent */
101+{
102+ xs *posts = scheduled_list(user);
103+ const char *md5;
104+ xs *right_now = xs_str_utctime(0, ISO_DATE_SPEC);
105+
106+ xs_list_foreach(posts, md5) {
107+ xs *msg = NULL;
108+
109+ if (valid_status(object_get_by_md5(md5, &msg))) {
110+ if (strcmp(xs_dict_get(msg, "published"), right_now) < 0) {
111+ /* due date! */
112+ const char *id = xs_dict_get(msg, "id");
113+
114+ timeline_add(user, id, msg);
115+
116+ xs *c_msg = msg_create(user, msg);
117+ enqueue_message(user, c_msg);
118+
119+ schedule_del(user, id);
120+ }
121+ }
122+ }
123+}
124+
125+
126 /** hiding **/
127
128 xs_str *_hidden_fn(snac *snac, const char *id)
129@@ -2199,7 +2292,8 @@ xs_val *list_maint(snac *user, const char *list, int op)
130 xs *l2 = xs_split(v2, "/");
131
132 /* return [ list_id, list_title ] */
133- l = xs_list_append(l, xs_list_append(xs_list_new(), xs_list_get(l2, -1), title));
134+ xs *tmp_list = xs_list_append(xs_list_new(), xs_list_get(l2, -1), title);
135+ l = xs_list_append(l, tmp_list);
136 }
137 }
138 }
139@@ -2274,6 +2368,19 @@ xs_val *list_maint(snac *user, const char *list, int op)
140 }
141
142 break;
143+
144+ case 4: /** find list id by name **/
145+ if (xs_is_string(list)) {
146+ xs *lol = list_maint(user, NULL, 0);
147+ const xs_list *li;
148+
149+ xs_list_foreach(lol, li) {
150+ if (strcmp(list, xs_list_get(li, 1)) == 0) {
151+ l = xs_dup(xs_list_get(li, 0));
152+ break;
153+ }
154+ }
155+ }
156 }
157
158 return l;
159@@ -2325,7 +2432,7 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op
160 break;
161
162 case 1: /** append actor to list **/
163- if (actor_md5 != NULL) {
164+ if (xs_is_string(actor_md5) && xs_is_hex(actor_md5)) {
165 if (!index_in_md5(fn, actor_md5))
166 index_add_md5(fn, actor_md5);
167 }
168@@ -2333,7 +2440,7 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op
169 break;
170
171 case 2: /** delete actor from list **/
172- if (actor_md5 != NULL)
173+ if (xs_is_string(actor_md5) && xs_is_hex(actor_md5))
174 index_del_md5(fn, actor_md5);
175
176 break;
177@@ -2619,10 +2726,9 @@ xs_list *inbox_list(void)
178 xs_list *ibl = xs_list_new();
179 xs *spec = xs_fmt("%s/inbox/" "*", srv_basedir);
180 xs *files = xs_glob(spec, 0, 0);
181- xs_list *p = files;
182 const xs_val *v;
183
184- while (xs_list_iter(&p, &v)) {
185+ xs_list_foreach(files, v) {
186 FILE *f;
187
188 if ((f = fopen(v, "r")) != NULL) {
189@@ -2630,7 +2736,9 @@ xs_list *inbox_list(void)
190
191 if (line && *line) {
192 line = xs_strip_i(line);
193- ibl = xs_list_append(ibl, line);
194+
195+ if (!is_instance_blocked(line))
196+ ibl = xs_list_append(ibl, line);
197 }
198
199 fclose(f);
200@@ -3276,7 +3384,7 @@ void enqueue_output_by_actor(snac *snac, const xs_dict *msg,
201 }
202
203
204-void enqueue_email(const xs_str *msg, int retries)
205+void enqueue_email(const xs_dict *msg, int retries)
206 /* enqueues an email message to be sent */
207 {
208 xs *qmsg = _new_qmsg("email", msg, retries);
209@@ -3392,6 +3500,19 @@ void enqueue_actor_refresh(snac *user, const char *actor, int forward_secs)
210 }
211
212
213+void enqueue_webmention(const xs_dict *msg)
214+/* enqueues a webmention for the post */
215+{
216+ xs *qmsg = _new_qmsg("webmention", msg, 0);
217+ const char *ntid = xs_dict_get(qmsg, "ntid");
218+ xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid);
219+
220+ qmsg = _enqueue_put(fn, qmsg);
221+
222+ srv_debug(1, xs_fmt("enqueue_webmention"));
223+}
224+
225+
226 int was_question_voted(snac *user, const char *id)
227 /* returns true if the user voted in this poll */
228 {
229@@ -3696,7 +3817,7 @@ void purge_user(snac *snac)
230 _purge_user_subdir(snac, "public", pub_days);
231
232 const char *idxs[] = { "followers.idx", "private.idx", "public.idx",
233- "pinned.idx", "bookmark.idx", "draft.idx", NULL };
234+ "pinned.idx", "bookmark.idx", "draft.idx", "sched.idx", NULL };
235
236 for (n = 0; idxs[n]; n++) {
237 xs *idx = xs_fmt("%s/%s", snac->basedir, idxs[n]);
+15,
-0
1@@ -163,6 +163,9 @@ lists of accounts are never published).
2 .It Web interface language
3 If the administrator has installed any language file, it
4 can be selected here.
5+.It Time zone
6+The time zone the user is on (default: UTC). Only
7+used for scheduled posts.
8 .It Password
9 Write the same string in these two fields to change your
10 password. Don't write anything if you don't want to do this.
11@@ -347,6 +350,18 @@ Imports a Mastodon list of accounts to be blocked in CSV format. The
12 file must be stored inside the
13 .Pa import/
14 subdirectory of a user's directory inside the server base directory.
15+.It Cm lists Ar basedir Ar uid
16+Prints the name of the user created lists.
17+.It Cm list_members Ar basedir Ar uid Ar name
18+Prints the list of actors in the named list.
19+.It Cm create_list Ar basedir Ar uid Ar name
20+Creates a new list.
21+.It Cm delete_list Ar basedir Ar uid Ar name
22+Deletes an existing list.
23+.It Cm list_add Ar basedir Ar uid Ar name Ar account
24+Adds an account (by its @name@host handle or actor URL) to a list.
25+.It Cm list_del Ar basedir Ar uid Ar name Ar actor_url
26+Deletes an actor (by its actor URL) from a list.
27 .El
28 .Ss Migrating an account to/from Mastodon
29 See
+10,
-0
1@@ -267,6 +267,16 @@ The maximum number of attachments per post (default: 4).
2 .It Ic enable_svg
3 Since version 2.73, SVG image attachments are hidden by default; you can enable
4 them by setting this value to true.
5+.It Ic smtp_url
6+Since version 2.76, email notifications can be sent via direct connection to an
7+SMTP server instead of the traditional behaviour of piping the message to
8+.Pa /usr/sbin/sendmail .
9+Set this value to the SMTP url to be used for sending email notifications
10+(for example, smtp://localhost). It may include a port number if it's not running on
11+the usual one, like in smtp://mail.example.com:587.
12+.It Ic smtp_user
13+.It Ic smtp_password
14+To be filled if the SMTP server defined by the previous directive needs credentials.
15 .El
16 .Pp
17 You must restart the server to make effective these changes.
+51,
-0
1@@ -0,0 +1,51 @@
2+#!/usr/bin/env bash
3+##
4+## SNAC-ADMIN
5+## a simple script that is supposed to improve
6+## a snac admin's life, especially when snac
7+## is being run as a systemd.unit with
8+## DynamicUser=yes enabled.
9+## Please make sure to adjust SNAC_DIR
10+## down below according to your setup.
11+##
12+## USAGE
13+## snac-admin state
14+## snac-admin adduser rikkert
15+## snac-admin block example.org
16+## snac-admin verify_links lisa
17+## ...
18+##
19+## Author: @chris@social.shtrophic.net
20+##
21+## Released into the public domain
22+##
23+
24+set -e
25+
26+SNAC_PID=$(pidof snac)
27+SNAC_DIR=/var/lib/snac
28+
29+SNAC_VERB=$1
30+shift
31+
32+if [ -z $SNAC_PID ]; then
33+ echo "no such process" >&2
34+ exit 1
35+fi
36+
37+if [ $(id -u) -ne 0 ]; then
38+ echo "not root" >&2
39+ exit 1
40+fi
41+
42+if [ ! -d $SNAC_DIR ]; then
43+ echo "$SNAC_DIR is not a directory" >&2
44+ exit 1
45+fi
46+
47+if [ -z $SNAC_VERB ]; then
48+ echo "no arguments" >&2
49+ exit 1
50+fi
51+
52+nsenter -ae -S follow -G follow -t $SNAC_PID -- snac $SNAC_VERB $SNAC_DIR $@
M
format.c
+8,
-4
1@@ -154,8 +154,10 @@ static xs_str *format_line(const char *line, xs_list **attach)
2 xs *l = xs_split_n(w, "](", 1);
3
4 if (xs_list_len(l) == 2) {
5- xs *link = xs_fmt("<a href=\"%s\">%s</a>",
6- xs_list_get(l, 1), xs_list_get(l, 0));
7+ const char *name = xs_list_get(l, 0);
8+ const char *url = xs_list_get(l, 1);
9+
10+ xs *link = xs_fmt("<a href=\"%s\">%s</a>", url, name);
11
12 s = xs_str_cat(s, link);
13 }
14@@ -208,6 +210,7 @@ static xs_str *format_line(const char *line, xs_list **attach)
15 }
16 else
17 if (xs_str_in(v, ":/" "/") != -1) {
18+ /* direct URLs in the post body */
19 xs *u = xs_replace_i(xs_replace(v, "#", "#"), "@", "@");
20
21 xs *v2 = xs_strip_chars_i(xs_dup(u), ".,)");
22@@ -382,10 +385,11 @@ xs_str *not_really_markdown(const char *content, xs_list **attach, xs_list **tag
23 const char *k, *v;
24
25 while (xs_dict_next(d, &k, &v, &c)) {
26- const char *t = NULL;
27+ const char *t = xs_mime_by_ext(v);
28
29 /* is it an URL to an image? */
30- if (xs_startswith(v, "https:/" "/") && xs_startswith((t = xs_mime_by_ext(v)), "image/")) {
31+ if (xs_startswith(v, "https:/" "/") &&
32+ (xs_startswith(t, "image/") || strcmp(t, "application/octet-stream") == 0)) {
33 if (tag && xs_str_in(s, k) != -1) {
34 /* add the emoji to the tag list */
35 xs *e = xs_dict_new();
M
html.c
+289,
-71
1@@ -14,6 +14,7 @@
2 #include "xs_curl.h"
3 #include "xs_unicode.h"
4 #include "xs_url.h"
5+#include "xs_random.h"
6
7 #include "snac.h"
8
9@@ -68,10 +69,14 @@ xs_str *replace_shortnames(xs_str *s, const xs_list *tag, int ems, const char *p
10 }
11
12 xs *style = xs_fmt("height: %dem; width: %dem; vertical-align: middle;", ems, ems);
13+ xs *class = xs_fmt("snac-emoji snac-emoji-%d-em", ems);
14
15 const xs_dict *v;
16 int c = 0;
17
18+ xs_set rep_emoji;
19+ xs_set_init(&rep_emoji);
20+
21 while (xs_list_next(tag_list, &v, &c)) {
22 const char *t = xs_dict_get(v, "type");
23
24@@ -79,11 +84,21 @@ xs_str *replace_shortnames(xs_str *s, const xs_list *tag, int ems, const char *p
25 const char *n = xs_dict_get(v, "name");
26 const xs_dict *i = xs_dict_get(v, "icon");
27
28+ /* avoid repeated emojis (Misskey seems to return this) */
29+ if (xs_set_add(&rep_emoji, n) == 0)
30+ continue;
31+
32 if (xs_is_string(n) && xs_is_dict(i)) {
33 const char *u = xs_dict_get(i, "url");
34 const char *mt = xs_dict_get(i, "mediaType");
35
36- if (xs_is_string(u) && xs_is_string(mt)) {
37+ if (xs_is_string(u)) {
38+ // on akkoma instances mediaType is not present.
39+ // but we need to to know if the image is an svg or not.
40+ // for now, i just use the file extention, which may not be the most reliable...
41+ if (!xs_is_string(mt))
42+ mt = xs_mime_by_ext(u);
43+
44 if (strcmp(mt, "image/svg+xml") == 0 && !xs_is_true(xs_dict_get(srv_config, "enable_svg")))
45 s = xs_replace_i(s, n, "");
46 else {
47@@ -93,6 +108,8 @@ xs_str *replace_shortnames(xs_str *s, const xs_list *tag, int ems, const char *p
48 xs_html_attr("loading", "lazy"),
49 xs_html_attr("src", url),
50 xs_html_attr("alt", n),
51+ xs_html_attr("title", n),
52+ xs_html_attr("class", class),
53 xs_html_attr("style", style));
54
55 xs *s1 = xs_html_render(img);
56@@ -104,6 +121,8 @@ xs_str *replace_shortnames(xs_str *s, const xs_list *tag, int ems, const char *p
57 }
58 }
59 }
60+
61+ xs_set_free(&rep_emoji);
62 }
63
64 return s;
65@@ -125,6 +144,26 @@ xs_str *actor_name(xs_dict *actor, const char *proxy)
66 }
67
68
69+xs_str *format_text_with_emoji(snac *user, const char *text, int ems, const char *proxy)
70+/* needed when we have local text with no tags attached */
71+{
72+ xs *tags = xs_list_new();
73+ xs *name1 = not_really_markdown(text, NULL, &tags);
74+
75+ xs_str *name3;
76+ if (user) {
77+ xs *name2 = process_tags(user, name1, &tags);
78+ name3 = sanitize(name2);
79+ }
80+ else {
81+ name3 = sanitize(name1);
82+ name3 = xs_replace_i(name3, "<br>", "");
83+ }
84+
85+ return replace_shortnames(name3, tags, ems, proxy);
86+}
87+
88+
89 xs_html *html_actor_icon(snac *user, xs_dict *actor, const char *date,
90 const char *udate, const char *url, int priv,
91 int in_people, const char *proxy, const char *lang,
92@@ -177,7 +216,7 @@ xs_html *html_actor_icon(snac *user, xs_dict *actor, const char *date,
93 xs_html_attr("loading", "lazy"),
94 xs_html_attr("class", "snac-avatar"),
95 xs_html_attr("src", avatar),
96- xs_html_attr("alt", "")),
97+ xs_html_attr("alt", "[?]")),
98 xs_html_tag("a",
99 xs_html_attr("href", href),
100 xs_html_attr("class", "p-author h-card snac-author"),
101@@ -293,7 +332,8 @@ xs_html *html_actor_icon(snac *user, xs_dict *actor, const char *date,
102 }
103
104
105-xs_html *html_msg_icon(snac *user, const char *actor_id, const xs_dict *msg, const char *proxy, const char *md5)
106+xs_html *html_msg_icon(snac *user, const char *actor_id, const xs_dict *msg,
107+ const char *proxy, const char *md5, const char *lang)
108 {
109 xs *actor = NULL;
110 xs_html *actor_icon = NULL;
111@@ -302,7 +342,6 @@ xs_html *html_msg_icon(snac *user, const char *actor_id, const xs_dict *msg, con
112 const char *date = NULL;
113 const char *udate = NULL;
114 const char *url = NULL;
115- const char *lang = NULL;
116 int priv = 0;
117 const char *type = xs_dict_get(msg, "type");
118
119@@ -314,16 +353,6 @@ xs_html *html_msg_icon(snac *user, const char *actor_id, const xs_dict *msg, con
120 date = xs_dict_get(msg, "published");
121 udate = xs_dict_get(msg, "updated");
122
123- lang = xs_dict_get(msg, "contentMap");
124- if (xs_is_dict(lang)) {
125- const char *v;
126- int c = 0;
127-
128- xs_dict_next(lang, &lang, &v, &c);
129- }
130- else
131- lang = NULL;
132-
133 actor_icon = html_actor_icon(user, actor, date, udate, url, priv, 0, proxy, lang, md5);
134 }
135
136@@ -339,7 +368,7 @@ xs_html *html_note(snac *user, const char *summary,
137 const xs_val *mnt_only, const char *redir,
138 const char *in_reply_to, int poll,
139 const xs_list *att_files, const xs_list *att_alt_texts,
140- int is_draft)
141+ int is_draft, const char *published)
142 /* Yes, this is a FUCKTON of arguments and I'm a bit embarrased */
143 {
144 xs *action = xs_fmt("%s/admin/note", user->actor);
145@@ -429,6 +458,42 @@ xs_html *html_note(snac *user, const char *summary,
146 xs_html_attr("name", "is_draft"),
147 xs_html_attr(is_draft ? "checked" : "", NULL))));
148
149+ /* post date and time */
150+ xs *post_date = NULL;
151+ xs *post_time = NULL;
152+
153+ if (xs_is_string(published)) {
154+ time_t t = xs_parse_iso_date(published, 0);
155+
156+ if (t > 0) {
157+ post_date = xs_str_time(t, "%Y-%m-%d", 1);
158+ post_time = xs_str_time(t, "%H:%M:%S", 1);
159+ }
160+ }
161+
162+ if (edit_id == NULL || is_draft || is_scheduled(user, edit_id)) {
163+ xs *pdat = xs_fmt(L("Post date and time (timezone: %s):"), user->tz);
164+
165+ xs_html_add(form,
166+ xs_html_tag("p",
167+ xs_html_tag("details",
168+ xs_html_tag("summary",
169+ xs_html_text(L("Scheduled post..."))),
170+ xs_html_tag("p",
171+ xs_html_text(pdat),
172+ xs_html_sctag("br", NULL),
173+ xs_html_sctag("input",
174+ xs_html_attr("type", "date"),
175+ xs_html_attr("value", post_date ? post_date : ""),
176+ xs_html_attr("name", "post_date")),
177+ xs_html_text(" "),
178+ xs_html_sctag("input",
179+ xs_html_attr("type", "time"),
180+ xs_html_attr("value", post_time ? post_time : ""),
181+ xs_html_attr("step", "1"),
182+ xs_html_attr("name", "post_time"))))));
183+ }
184+
185 if (edit_id)
186 xs_html_add(form,
187 xs_html_sctag("input",
188@@ -746,11 +811,7 @@ xs_html *html_user_head(snac *user, const char *desc, const char *url)
189
190 /* show metrics in og:description? */
191 if (xs_is_true(xs_dict_get(user->config, "show_contact_metrics"))) {
192- xs *fwers = follower_list(user);
193- xs *fwing = following_list(user);
194-
195- xs *s1 = xs_fmt(L("%d following, %d followers"),
196- xs_list_len(fwing), xs_list_len(fwers));
197+ xs *s1 = xs_fmt(L("%d following, %d followers"), following_list_len(user), follower_list_len(user));
198
199 s1 = xs_str_cat(s1, " · ");
200
201@@ -848,7 +909,9 @@ static xs_html *html_user_body(snac *user, int read_only)
202 }
203 else {
204 int n_len = notify_new_num(user);
205+ int p_len = pending_count(user);
206 xs_html *notify_count = NULL;
207+ xs_html *pending_follow_count = NULL;
208
209 /* show the number of new notifications, if there are any */
210 if (n_len) {
211@@ -860,6 +923,15 @@ static xs_html *html_user_body(snac *user, int read_only)
212 else
213 notify_count = xs_html_text("");
214
215+ if (p_len) {
216+ xs *s = xs_fmt(" %d ", p_len);
217+ pending_follow_count = xs_html_tag("sup",
218+ xs_html_attr("style", "background-color: red; color: white;"),
219+ xs_html_text(s));
220+ }
221+ else
222+ pending_follow_count = xs_html_text("");
223+
224 xs *admin_url = xs_fmt("%s/admin", user->actor);
225 xs *notify_url = xs_fmt("%s/notifications", user->actor);
226 xs *people_url = xs_fmt("%s/people", user->actor);
227@@ -882,6 +954,7 @@ static xs_html *html_user_body(snac *user, int read_only)
228 xs_html_tag("a",
229 xs_html_attr("href", people_url),
230 xs_html_text(L("people"))),
231+ pending_follow_count,
232 xs_html_text(" - "),
233 xs_html_tag("a",
234 xs_html_attr("href", instance_url),
235@@ -922,10 +995,12 @@ static xs_html *html_user_body(snac *user, int read_only)
236 xs_dict_get(user->config, "uid"),
237 xs_dict_get(srv_config, "host"));
238
239+ xs *display_name = format_text_with_emoji(NULL, xs_dict_get(user->config, "name"), 1, proxy);
240+
241 xs_html_add(top_user,
242 xs_html_tag("p",
243 xs_html_attr("class", "p-name snac-top-user-name"),
244- xs_html_text(xs_dict_get(user->config, "name"))),
245+ xs_html_raw(display_name)),
246 xs_html_tag("p",
247 xs_html_attr("class", "snac-top-user-id"),
248 xs_html_text(handle)));
249@@ -953,16 +1028,11 @@ static xs_html *html_user_body(snac *user, int read_only)
250 }
251
252 if (read_only) {
253- xs *tags = xs_list_new();
254- xs *bio1 = not_really_markdown(xs_dict_get(user->config, "bio"), NULL, &tags);
255- xs *bio2 = process_tags(user, bio1, &tags);
256- xs *bio3 = sanitize(bio2);
257-
258- bio3 = replace_shortnames(bio3, tags, 2, proxy);
259+ xs *bio = format_text_with_emoji(user, xs_dict_get(user->config, "bio"), 2, proxy);
260
261 xs_html *top_user_bio = xs_html_tag("div",
262 xs_html_attr("class", "p-note snac-top-user-bio"),
263- xs_html_raw(bio3)); /* already sanitized */
264+ xs_html_raw(bio)); /* already sanitized */
265
266 xs_html_add(top_user,
267 top_user_bio);
268@@ -1082,11 +1152,7 @@ static xs_html *html_user_body(snac *user, int read_only)
269 }
270
271 if (xs_is_true(xs_dict_get(user->config, "show_contact_metrics"))) {
272- xs *fwers = follower_list(user);
273- xs *fwing = following_list(user);
274-
275- xs *s1 = xs_fmt(L("%d following, %d followers"),
276- xs_list_len(fwing), xs_list_len(fwers));
277+ xs *s1 = xs_fmt(L("%d following, %d followers"), following_list_len(user), follower_list_len(user));
278
279 xs_html_add(top_user,
280 xs_html_tag("p",
281@@ -1116,7 +1182,7 @@ xs_html *html_top_controls(snac *user)
282 NULL, NULL,
283 xs_stock(XSTYPE_FALSE), "",
284 xs_stock(XSTYPE_FALSE), NULL,
285- NULL, 1, NULL, NULL, 0),
286+ NULL, 1, NULL, NULL, 0, NULL),
287
288 /** operations **/
289 xs_html_tag("details",
290@@ -1270,6 +1336,27 @@ xs_html *html_top_controls(snac *user)
291 xs_html_attr("value", lang)));
292 }
293
294+ /* timezone */
295+ xs_html *tz_select = xs_html_tag("select",
296+ xs_html_attr("name", "tz"));
297+
298+ xs *tzs = xs_tz_list();
299+ const char *tz;
300+
301+ xs_list_foreach(tzs, tz) {
302+ if (strcmp(tz, user->tz) == 0)
303+ xs_html_add(tz_select,
304+ xs_html_tag("option",
305+ xs_html_text(tz),
306+ xs_html_attr("value", tz),
307+ xs_html_attr("selected", "selected")));
308+ else
309+ xs_html_add(tz_select,
310+ xs_html_tag("option",
311+ xs_html_text(tz),
312+ xs_html_attr("value", tz)));
313+ }
314+
315 xs *user_setup_action = xs_fmt("%s/admin/user-setup", user->actor);
316
317 xs_html_add(top_controls,
318@@ -1465,6 +1552,11 @@ xs_html *html_top_controls(snac *user)
319 xs_html_sctag("br", NULL),
320 lang_select),
321
322+ xs_html_tag("p",
323+ xs_html_text(L("Time zone:")),
324+ xs_html_sctag("br", NULL),
325+ tz_select),
326+
327 xs_html_tag("p",
328 xs_html_text(L("New password:")),
329 xs_html_sctag("br", NULL),
330@@ -1774,7 +1866,8 @@ xs_html *html_entry_controls(snac *user, const char *actor,
331 id, NULL,
332 xs_dict_get(msg, "sensitive"), xs_dict_get(msg, "summary"),
333 xs_stock(is_msg_public(msg) ? XSTYPE_FALSE : XSTYPE_TRUE), redir,
334- NULL, 0, att_files, att_alt_texts, is_draft(user, id))),
335+ NULL, 0, att_files, att_alt_texts, is_draft(user, id),
336+ xs_dict_get(msg, "published"))),
337 xs_html_tag("p", NULL));
338 }
339
340@@ -1793,7 +1886,7 @@ xs_html *html_entry_controls(snac *user, const char *actor,
341 NULL, NULL,
342 xs_dict_get(msg, "sensitive"), xs_dict_get(msg, "summary"),
343 xs_stock(is_msg_public(msg) ? XSTYPE_FALSE : XSTYPE_TRUE), redir,
344- id, 0, NULL, NULL, 0)),
345+ id, 0, NULL, NULL, 0, NULL)),
346 xs_html_tag("p", NULL));
347 }
348
349@@ -1840,6 +1933,15 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
350 return xs_html_tag("mark",
351 xs_html_text(L("Truncated (too deep)")));
352
353+ const char *lang = NULL;
354+ const xs_dict *cmap = xs_dict_get(msg, "contentMap");
355+ if (xs_is_dict(cmap)) {
356+ const char *dummy;
357+ int c = 0;
358+
359+ xs_dict_next(cmap, &lang, &dummy, &c);
360+ }
361+
362 if (strcmp(type, "Follow") == 0) {
363 return xs_html_tag("div",
364 xs_html_attr("class", "snac-post"),
365@@ -1848,7 +1950,7 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
366 xs_html_tag("div",
367 xs_html_attr("class", "snac-origin"),
368 xs_html_text(L("follows you"))),
369- html_msg_icon(read_only ? NULL : user, xs_dict_get(msg, "actor"), msg, proxy, NULL)));
370+ html_msg_icon(read_only ? NULL : user, xs_dict_get(msg, "actor"), msg, proxy, NULL, lang)));
371 }
372 else
373 if (!xs_match(type, POSTLIKE_OBJECT_TYPE)) {
374@@ -2029,13 +2131,17 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
375 }
376
377 xs_html_add(post_header,
378- html_msg_icon(read_only ? NULL : user, actor, msg, proxy, md5));
379+ html_msg_icon(read_only ? NULL : user, actor, msg, proxy, md5, lang));
380
381 /** post content **/
382
383 xs_html *snac_content_wrap = xs_html_tag("div",
384 xs_html_attr("class", "e-content snac-content"));
385
386+ if (xs_is_string(lang))
387+ xs_html_add(snac_content_wrap,
388+ xs_html_attr("lang", lang));
389+
390 xs_html_add(entry,
391 snac_content_wrap);
392
393@@ -2313,14 +2419,10 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
394 const char *o_href = xs_dict_get(a, "href");
395 const char *name = xs_dict_get(a, "name");
396
397- /* if this image is already in the post content, skip */
398+ /* if this URL is already in the post content, skip */
399 if (content && xs_str_in(content, o_href) != -1)
400 continue;
401
402- /* drop silently any attachment that may include JavaScript */
403- if (strcmp(type, "text/html") == 0)
404- continue;
405-
406 if (strcmp(type, "image/svg+xml") == 0 && !xs_is_true(xs_dict_get(srv_config, "enable_svg")))
407 continue;
408
409@@ -2396,13 +2498,19 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
410 name = NULL;
411 }
412 else {
413+ xs *d_href = xs_dup(o_href);
414+ if (strlen(d_href) > 64) {
415+ d_href[64] = '\0';
416+ d_href = xs_str_cat(d_href, "...");
417+ }
418+
419 xs_html_add(content_attachments,
420 xs_html_tag("p",
421 xs_html_tag("a",
422 xs_html_attr("href", o_href),
423 xs_html_text(L("Attachment")),
424 xs_html_text(": "),
425- xs_html_text(o_href))));
426+ xs_html_text(d_href))));
427
428 /* do not generate an Alt... */
429 name = NULL;
430@@ -2689,6 +2797,11 @@ xs_html *html_entry(snac *user, xs_dict *msg, int read_only,
431 }
432 }
433
434+ /* add an invisible hr, to help differentiate between posts in text browsers */
435+ xs_html_add(entry_top,
436+ xs_html_sctag("hr",
437+ xs_html_attr("hidden", NULL)));
438+
439 return entry_top;
440 }
441
442@@ -2830,6 +2943,18 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
443 xs_html_text(L("drafts")))));
444 }
445
446+ {
447+ /* show the list of scheduled posts */
448+ xs *url = xs_fmt("%s/sched", user->actor);
449+ xs_html_add(lol,
450+ xs_html_tag("li",
451+ xs_html_tag("a",
452+ xs_html_attr("href", url),
453+ xs_html_attr("class", "snac-list-link"),
454+ xs_html_attr("title", L("Scheduled posts")),
455+ xs_html_text(L("scheduled posts")))));
456+ }
457+
458 /* the list of followed hashtags */
459 const char *followed_hashtags = xs_dict_get(user->config, "followed_hashtags");
460
461@@ -3019,6 +3144,8 @@ xs_html *html_people_list(snac *user, xs_list *list, const char *header, const c
462 xs_html_tag("summary",
463 xs_html_text("..."))));
464
465+ xs *redir = xs_fmt("%s/people", user->actor);
466+
467 const char *actor_id;
468
469 xs_list_foreach(list, actor_id) {
470@@ -3040,6 +3167,7 @@ xs_html *html_people_list(snac *user, xs_list *list, const char *header, const c
471
472 if (!xs_is_null(c)) {
473 xs *sc = sanitize(c);
474+ sc = replace_shortnames(sc, xs_dict_get(actor, "tag"), 2, proxy);
475
476 xs_html *snac_content = xs_html_tag("div",
477 xs_html_attr("class", "snac-content"));
478@@ -3069,6 +3197,10 @@ xs_html *html_people_list(snac *user, xs_list *list, const char *header, const c
479 xs_html_attr("type", "hidden"),
480 xs_html_attr("name", "actor"),
481 xs_html_attr("value", actor_id)),
482+ xs_html_sctag("input",
483+ xs_html_attr("type", "hidden"),
484+ xs_html_attr("name", "hard-redir"),
485+ xs_html_attr("value", redir)),
486 xs_html_sctag("input",
487 xs_html_attr("type", "hidden"),
488 xs_html_attr("name", "actor-form"),
489@@ -3130,7 +3262,7 @@ xs_html *html_people_list(snac *user, xs_list *list, const char *header, const c
490 NULL, actor_id,
491 xs_stock(XSTYPE_FALSE), "",
492 xs_stock(XSTYPE_FALSE), NULL,
493- NULL, 0, NULL, NULL, 0),
494+ NULL, 0, NULL, NULL, 0, NULL),
495 xs_html_tag("p", NULL));
496
497 xs_html_add(snac_post, snac_controls);
498@@ -3257,7 +3389,8 @@ xs_str *html_notifications(snac *user, int skip, int show)
499 continue;
500
501 xs *a_name = actor_name(actor, proxy);
502- const char *label = type;
503+ xs *label_sanatized = sanitize(type);
504+ const char *label = label_sanatized;
505
506 if (strcmp(type, "Create") == 0)
507 label = L("Mention");
508@@ -3268,11 +3401,12 @@ xs_str *html_notifications(snac *user, int skip, int show)
509 if (strcmp(type, "Undo") == 0 && strcmp(utype, "Follow") == 0)
510 label = L("Unfollow");
511 else
512- if (strcmp(type, "EmojiReact") == 0) {
513+ if (strcmp(type, "EmojiReact") == 0 || strcmp(type, "Like") == 0) {
514 const char *content = xs_dict_get_path(noti, "msg.content");
515
516 if (xs_type(content) == XSTYPE_STRING) {
517- wrk = xs_fmt("%s (%s)", type, content);
518+ xs *emoji = replace_shortnames(xs_dup(content), xs_dict_get_path(noti, "msg.tag"), 1, proxy);
519+ wrk = xs_fmt("%s (%s️)", type, emoji);
520 label = wrk;
521 }
522 }
523@@ -3284,7 +3418,7 @@ xs_str *html_notifications(snac *user, int skip, int show)
524
525 xs_html *this_html_label = xs_html_container(
526 xs_html_tag("b",
527- xs_html_text(label),
528+ xs_html_raw(label),
529 xs_html_text(" by "),
530 xs_html_tag("a",
531 xs_html_attr("href", actor_id),
532@@ -3584,7 +3718,7 @@ int html_get_handler(const xs_dict *req, const char *q_path,
533
534 if (xs_is_true(xs_dict_get(srv_config, "strict_public_timelines")))
535 list = timeline_simple_list(&snac, "public", skip, show, &more);
536- else
537+ else
538 list = timeline_list(&snac, "public", skip, show, &more);
539
540 xs *pins = pinned_list(&snac);
541@@ -3879,6 +4013,21 @@ int html_get_handler(const xs_dict *req, const char *q_path,
542 }
543 }
544 else
545+ if (strcmp(p_path, "sched") == 0) { /** list of scheduled posts **/
546+ if (!login(&snac, req)) {
547+ *body = xs_dup(uid);
548+ status = HTTP_STATUS_UNAUTHORIZED;
549+ }
550+ else {
551+ xs *list = scheduled_list(&snac);
552+
553+ *body = html_timeline(&snac, list, 0, skip, show,
554+ 0, L("Scheduled posts"), "", 0, error);
555+ *b_size = strlen(*body);
556+ status = HTTP_STATUS_OK;
557+ }
558+ }
559+ else
560 if (xs_startswith(p_path, "list/")) { /** list timelines **/
561 if (!login(&snac, req)) {
562 *body = xs_dup(uid);
563@@ -4175,12 +4324,14 @@ int html_post_handler(const xs_dict *req, const char *q_path,
564 snac_debug(&snac, 1, xs_fmt("web action '%s' received", p_path));
565
566 /* post note */
567- const xs_str *content = xs_dict_get(p_vars, "content");
568- const xs_str *in_reply_to = xs_dict_get(p_vars, "in_reply_to");
569- const xs_str *to = xs_dict_get(p_vars, "to");
570- const xs_str *sensitive = xs_dict_get(p_vars, "sensitive");
571- const xs_str *summary = xs_dict_get(p_vars, "summary");
572- const xs_str *edit_id = xs_dict_get(p_vars, "edit_id");
573+ const char *content = xs_dict_get(p_vars, "content");
574+ const char *in_reply_to = xs_dict_get(p_vars, "in_reply_to");
575+ const char *to = xs_dict_get(p_vars, "to");
576+ const char *sensitive = xs_dict_get(p_vars, "sensitive");
577+ const char *summary = xs_dict_get(p_vars, "summary");
578+ const char *edit_id = xs_dict_get(p_vars, "edit_id");
579+ const char *post_date = xs_dict_get_def(p_vars, "post_date", "");
580+ const char *post_time = xs_dict_get_def(p_vars, "post_time", "");
581 int priv = !xs_is_null(xs_dict_get(p_vars, "mentioned_only"));
582 int store_as_draft = !xs_is_null(xs_dict_get(p_vars, "is_draft"));
583 xs *attach_list = xs_list_new();
584@@ -4210,9 +4361,12 @@ int html_post_handler(const xs_dict *req, const char *q_path,
585 const char *fn = xs_list_get(attach_file, 0);
586
587 if (xs_is_string(fn) && *fn != '\0') {
588- char *ext = strrchr(fn, '.');
589- xs *hash = xs_md5_hex(fn, strlen(fn));
590- xs *id = xs_fmt("%s%s", hash, ext);
591+ char rnd[32];
592+ xs_rnd_buf(rnd, sizeof(rnd));
593+
594+ const char *ext = strrchr(fn, '.');
595+ xs *hash = xs_md5_hex(rnd, strlen(rnd));
596+ xs *id = xs_fmt("post-%s%s", hash, ext ? ext : "");
597 xs *url = xs_fmt("%s/s/%s", snac.actor, id);
598 int fo = xs_number_get(xs_list_get(attach_file, 1));
599 int fs = xs_number_get(xs_list_get(attach_file, 2));
600@@ -4268,6 +4422,31 @@ int html_post_handler(const xs_dict *req, const char *q_path,
601 msg = xs_dict_set(msg, "summary", xs_is_null(summary) ? "..." : summary);
602 }
603
604+ if (xs_is_string(post_date) && *post_date) {
605+ xs *post_pubdate = xs_fmt("%sT%s", post_date,
606+ xs_is_string(post_time) && *post_time ? post_time : "00:00:00");
607+
608+ time_t t = xs_parse_iso_date(post_pubdate, 0);
609+
610+ if (t != 0) {
611+ t -= xs_tz_offset(snac.tz);
612+
613+ xs *iso_date = xs_str_iso_date(t);
614+ msg = xs_dict_set(msg, "published", iso_date);
615+
616+ snac_debug(&snac, 1, xs_fmt("Published date: [%s]", iso_date));
617+ }
618+ else
619+ snac_log(&snac, xs_fmt("Invalid post date: [%s]", post_pubdate));
620+ }
621+
622+ /* is the published date from the future? */
623+ int future_post = 0;
624+ xs *right_now = xs_str_utctime(0, ISO_DATE_SPEC);
625+
626+ if (strcmp(xs_dict_get(msg, "published"), right_now) > 0)
627+ future_post = 1;
628+
629 if (xs_is_null(edit_id)) {
630 /* new message */
631 const char *id = xs_dict_get(msg, "id");
632@@ -4275,6 +4454,10 @@ int html_post_handler(const xs_dict *req, const char *q_path,
633 if (store_as_draft) {
634 draft_add(&snac, id, msg);
635 }
636+ else
637+ if (future_post) {
638+ schedule_add(&snac, id, msg);
639+ }
640 else {
641 c_msg = msg_create(&snac, msg);
642 timeline_add(&snac, id, msg);
643@@ -4286,7 +4469,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
644
645 if (valid_status(object_get(edit_id, &p_msg))) {
646 /* copy relevant fields from previous version */
647- char *fields[] = { "id", "context", "url", "published",
648+ char *fields[] = { "id", "context", "url",
649 "to", "inReplyTo", NULL };
650 int n;
651
652@@ -4302,18 +4485,34 @@ int html_post_handler(const xs_dict *req, const char *q_path,
653 if (is_draft(&snac, edit_id)) {
654 /* message was previously a draft; it's a create activity */
655
656- /* set the published field to now */
657- xs *published = xs_str_utctime(0, ISO_DATE_SPEC);
658- msg = xs_dict_set(msg, "published", published);
659+ /* if the date is from the past, overwrite it with right_now */
660+ if (strcmp(xs_dict_get(msg, "published"), right_now) < 0) {
661+ snac_debug(&snac, 1, xs_fmt("setting draft ancient date to %s", right_now));
662+ msg = xs_dict_set(msg, "published", right_now);
663+ }
664
665 /* overwrite object */
666 object_add_ow(edit_id, msg);
667
668- c_msg = msg_create(&snac, msg);
669- timeline_add(&snac, edit_id, msg);
670+ if (future_post) {
671+ schedule_add(&snac, edit_id, msg);
672+ }
673+ else {
674+ c_msg = msg_create(&snac, msg);
675+ timeline_add(&snac, edit_id, msg);
676+ }
677+
678 draft_del(&snac, edit_id);
679 }
680+ else
681+ if (is_scheduled(&snac, edit_id)) {
682+ /* editing an scheduled post; just update it */
683+ schedule_add(&snac, edit_id, msg);
684+ }
685 else {
686+ /* ignore the (possibly changed) published date */
687+ msg = xs_dict_set(msg, "published", xs_dict_get(p_msg, "published"));
688+
689 /* set the updated field */
690 xs *updated = xs_str_utctime(0, ISO_DATE_SPEC);
691 msg = xs_dict_set(msg, "updated", updated);
692@@ -4329,8 +4528,10 @@ int html_post_handler(const xs_dict *req, const char *q_path,
693 snac_log(&snac, xs_fmt("cannot get object '%s' for editing", edit_id));
694 }
695
696- if (c_msg != NULL)
697+ if (c_msg != NULL) {
698 enqueue_message(&snac, c_msg);
699+ enqueue_webmention(msg);
700+ }
701
702 history_del(&snac, "timeline.html_");
703 }
704@@ -4397,6 +4598,9 @@ int html_post_handler(const xs_dict *req, const char *q_path,
705 if (strcmp(action, L("Hide")) == 0) { /** **/
706 if (is_draft(&snac, id))
707 draft_del(&snac, id);
708+ else
709+ if (is_scheduled(&snac, id))
710+ schedule_del(&snac, id);
711 else
712 hide(&snac, id);
713 }
714@@ -4493,6 +4697,8 @@ int html_post_handler(const xs_dict *req, const char *q_path,
715
716 draft_del(&snac, id);
717
718+ schedule_del(&snac, id);
719+
720 snac_log(&snac, xs_fmt("deleted entry %s", id));
721 }
722 }
723@@ -4613,6 +4819,8 @@ int html_post_handler(const xs_dict *req, const char *q_path,
724 snac.config = xs_dict_set(snac.config, "show_contact_metrics", xs_stock(XSTYPE_FALSE));
725 if ((v = xs_dict_get(p_vars, "web_ui_lang")) != NULL)
726 snac.config = xs_dict_set(snac.config, "lang", v);
727+ if ((v = xs_dict_get(p_vars, "tz")) != NULL)
728+ snac.config = xs_dict_set(snac.config, "tz", v);
729
730 snac.config = xs_dict_set(snac.config, "latitude", xs_dict_get_def(p_vars, "latitude", ""));
731 snac.config = xs_dict_set(snac.config, "longitude", xs_dict_get_def(p_vars, "longitude", ""));
732@@ -4636,7 +4844,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
733 if (xs_startswith(mimetype, "image/")) {
734 const char *ext = strrchr(fn, '.');
735 xs *hash = xs_md5_hex(fn, strlen(fn));
736- xs *id = xs_fmt("%s%s", hash, ext);
737+ xs *id = xs_fmt("%s-%s%s", uploads[n], hash, ext ? ext : "");
738 xs *url = xs_fmt("%s/s/%s", snac.actor, id);
739 int fo = xs_number_get(xs_list_get(uploaded_file, 1));
740 int fs = xs_number_get(xs_list_get(uploaded_file, 2));
741@@ -4705,6 +4913,9 @@ int html_post_handler(const xs_dict *req, const char *q_path,
742 /* set the option */
743 msg = xs_dict_append(msg, "name", v);
744
745+ /* delete the content */
746+ msg = xs_dict_del(msg, "content");
747+
748 xs *c_msg = msg_create(&snac, msg);
749
750 enqueue_message(&snac, c_msg);
751@@ -4793,12 +5004,19 @@ int html_post_handler(const xs_dict *req, const char *q_path,
752 }
753
754 if (status == HTTP_STATUS_SEE_OTHER) {
755- const char *redir = xs_dict_get(p_vars, "redir");
756+ const char *hard_redir = xs_dict_get(p_vars, "hard-redir");
757
758- if (xs_is_null(redir))
759- redir = "top";
760+ if (xs_is_string(hard_redir))
761+ *body = xs_dup(hard_redir);
762+ else {
763+ const char *redir = xs_dict_get(p_vars, "redir");
764+
765+ if (xs_is_null(redir))
766+ redir = "top";
767+
768+ *body = xs_fmt("%s/admin#%s", snac.actor, redir);
769+ }
770
771- *body = xs_fmt("%s/admin#%s", snac.actor, redir);
772 *b_size = strlen(*body);
773 }
774
M
httpd.c
+4,
-1
1@@ -139,6 +139,8 @@ static xs_str *greeting_html(void)
2 snac user;
3
4 if (strcmp(uid, "relay") && user_open(&user, uid)) {
5+ xs *formatted_name = format_text_with_emoji(NULL, xs_dict_get(user.config, "name"), 1, NULL);
6+
7 xs_html_add(ul,
8 xs_html_tag("li",
9 xs_html_tag("a",
10@@ -148,7 +150,7 @@ static xs_str *greeting_html(void)
11 xs_html_text("@"),
12 xs_html_text(host),
13 xs_html_text(" ("),
14- xs_html_text(xs_dict_get(user.config, "name")),
15+ xs_html_raw(formatted_name),
16 xs_html_text(")"))));
17
18 user_free(&user);
19@@ -554,6 +556,7 @@ void httpd_connection(FILE *f)
20
21 headers = xs_dict_append(headers, "access-control-allow-origin", "*");
22 headers = xs_dict_append(headers, "access-control-allow-headers", "*");
23+ headers = xs_dict_append(headers, "access-control-expose-headers", "Link");
24
25 /* disable any form of fucking JavaScript */
26 headers = xs_dict_append(headers, "Content-Security-Policy", "script-src ;");
M
main.c
+112,
-0
1@@ -59,6 +59,12 @@ int usage(void)
2 printf("import_csv {basedir} {uid} Imports data from CSV files\n");
3 printf("import_list {basedir} {uid} {file} Imports a Mastodon CSV list file\n");
4 printf("import_block_list {basedir} {uid} {file} Imports a Mastodon CSV block list file\n");
5+ printf("lists {basedir} {uid} Returns the names of the lists created by the user\n");
6+ printf("list_members {basedir} {uid} {name} Returns the list of accounts inside a list\n");
7+ printf("create_list {basedir} {uid} {name} Creates a new list\n");
8+ printf("delete_list {basedir} {uid} {name} Deletes an existing list\n");
9+ printf("list_add {basedir} {uid} {name} {acct} Adds an account (@user@host or actor url) to a list\n");
10+ printf("list_del {basedir} {uid} {name} {actor} Deletes an actor URL from a list\n");
11
12 return 1;
13 }
14@@ -282,9 +288,114 @@ int main(int argc, char *argv[])
15 return migrate_account(&snac);
16 }
17
18+ if (strcmp(cmd, "lists") == 0) { /** **/
19+ xs *lol = list_maint(&snac, NULL, 0);
20+ const xs_list *l;
21+
22+ xs_list_foreach(lol, l) {
23+ printf("%s (%s)\n", xs_list_get(l, 1), xs_list_get(l, 0));
24+ }
25+
26+ return 0;
27+ }
28+
29 if ((url = GET_ARGV()) == NULL)
30 return usage();
31
32+ if (strcmp(cmd, "list_members") == 0) { /** **/
33+ xs *lid = list_maint(&snac, url, 4);
34+
35+ if (lid != NULL) {
36+ xs *lcont = list_content(&snac, lid, NULL, 0);
37+ const char *md5;
38+
39+ xs_list_foreach(lcont, md5) {
40+ xs *actor = NULL;
41+
42+ if (valid_status(object_get_by_md5(md5, &actor))) {
43+ printf("%s (%s)\n", xs_dict_get(actor, "id"), xs_dict_get_def(actor, "preferredUsername", ""));
44+ }
45+ }
46+ }
47+ else
48+ fprintf(stderr, "Cannot find a list named '%s'\n", url);
49+
50+ return 0;
51+ }
52+
53+ if (strcmp(cmd, "create_list") == 0) { /** **/
54+ xs *lid = list_maint(&snac, url, 4);
55+
56+ if (lid == NULL) {
57+ xs *n_lid = list_maint(&snac, url, 1);
58+ printf("New list named '%s' created (%s)\n", url, n_lid);
59+ }
60+ else
61+ fprintf(stderr, "A list named '%s' already exist\n", url);
62+
63+ return 0;
64+ }
65+
66+ if (strcmp(cmd, "delete_list") == 0) { /** **/
67+ xs *lid = list_maint(&snac, url, 4);
68+
69+ if (lid != NULL) {
70+ list_maint(&snac, lid, 2);
71+ printf("List '%s' (%s) deleted\n", url, lid);
72+ }
73+ else
74+ fprintf(stderr, "Cannot find a list named '%s'\n", url);
75+
76+ return 0;
77+ }
78+
79+ if (strcmp(cmd, "list_add") == 0) { /** **/
80+ const char *account = GET_ARGV();
81+
82+ if (account != NULL) {
83+ xs *lid = list_maint(&snac, url, 4);
84+
85+ if (lid != NULL) {
86+ xs *actor = NULL;
87+ xs *uid = NULL;
88+
89+ if (valid_status(webfinger_request(account, &actor, &uid))) {
90+ xs *md5 = xs_md5_hex(actor, strlen(actor));
91+
92+ list_content(&snac, lid, md5, 1);
93+ printf("Actor %s (%s) added to list '%s' (%s)\n", actor, uid, url, lid);
94+ }
95+ else
96+ fprintf(stderr, "Cannot resolve account '%s'\n", account);
97+ }
98+ else
99+ fprintf(stderr, "Cannot find a list named '%s'\n", url);
100+
101+ }
102+
103+ return 0;
104+ }
105+
106+ if (strcmp(cmd, "list_del") == 0) { /** **/
107+ const char *account = GET_ARGV();
108+
109+ if (account != NULL) {
110+ xs *lid = list_maint(&snac, url, 4);
111+
112+ if (lid != NULL) {
113+ xs *md5 = xs_md5_hex(account, strlen(account));
114+
115+ list_content(&snac, lid, md5, 2);
116+ printf("Actor %s deleted from list '%s' (%s)\n", account, url, lid);
117+ }
118+ else
119+ fprintf(stderr, "Cannot find a list named '%s'\n", url);
120+
121+ }
122+
123+ return 0;
124+ }
125+
126 if (strcmp(cmd, "alias") == 0) { /** **/
127 xs *actor = NULL;
128 xs *uid = NULL;
129@@ -719,6 +830,7 @@ int main(int argc, char *argv[])
130 }
131
132 enqueue_message(&snac, c_msg);
133+ enqueue_webmention(msg);
134
135 timeline_add(&snac, xs_dict_get(msg, "id"), msg);
136
+178,
-42
1@@ -680,10 +680,10 @@ xs_dict *mastoapi_account(snac *logged, const xs_dict *actor)
2
3 /* does this user want to publish their contact metrics? */
4 if (xs_is_true(xs_dict_get(user.config, "show_contact_metrics"))) {
5- xs *fwing = following_list(&user);
6- xs *fwers = follower_list(&user);
7- xs *ni = xs_number_new(xs_list_len(fwing));
8- xs *ne = xs_number_new(xs_list_len(fwers));
9+ int fwing = following_list_len(&user);
10+ int fwers = follower_list_len(&user);
11+ xs *ni = xs_number_new(fwing);
12+ xs *ne = xs_number_new(fwers);
13
14 acct = xs_dict_append(acct, "followers_count", ne);
15 acct = xs_dict_append(acct, "following_count", ni);
16@@ -1223,7 +1223,10 @@ void credentials_get(char **body, char **ctype, int *status, snac snac)
17 acct = xs_dict_append(acct, "last_status_at", xs_dict_get(snac.config, "published"));
18 acct = xs_dict_append(acct, "note", xs_dict_get(snac.config, "bio"));
19 acct = xs_dict_append(acct, "url", snac.actor);
20- acct = xs_dict_append(acct, "locked", xs_stock(XSTYPE_FALSE));
21+
22+ acct = xs_dict_append(acct, "locked",
23+ xs_stock(xs_is_true(xs_dict_get(snac.config, "approve_followers")) ? XSTYPE_TRUE : XSTYPE_FALSE));
24+
25 acct = xs_dict_append(acct, "bot", xs_stock(xs_is_true(bot) ? XSTYPE_TRUE : XSTYPE_FALSE));
26 acct = xs_dict_append(acct, "emojis", xs_stock(XSTYPE_LIST));
27
28@@ -1306,10 +1309,10 @@ void credentials_get(char **body, char **ctype, int *status, snac snac)
29
30 /* does this user want to publish their contact metrics? */
31 if (xs_is_true(xs_dict_get(snac.config, "show_contact_metrics"))) {
32- xs *fwing = following_list(&snac);
33- xs *fwers = follower_list(&snac);
34- xs *ni = xs_number_new(xs_list_len(fwing));
35- xs *ne = xs_number_new(xs_list_len(fwers));
36+ int fwing = following_list_len(&snac);
37+ int fwers = follower_list_len(&snac);
38+ xs *ni = xs_number_new(fwing);
39+ xs *ne = xs_number_new(fwers);
40
41 acct = xs_dict_append(acct, "followers_count", ne);
42 acct = xs_dict_append(acct, "following_count", ni);
43@@ -1500,6 +1503,44 @@ xs_str *timeline_link_header(const char *endpoint, xs_list *timeline)
44 }
45
46
47+xs_list *mastoapi_account_lists(snac *user, const char *uid)
48+/* returns the list of list an user is in */
49+{
50+ xs_list *out = xs_list_new();
51+ xs *actor_md5 = NULL;
52+ xs *lol = list_maint(user, NULL, 0);
53+
54+ if (uid) {
55+ if (!xs_is_hex(uid))
56+ actor_md5 = xs_md5_hex(uid, strlen(uid));
57+ else
58+ actor_md5 = xs_dup(uid);
59+ }
60+
61+ const xs_list *li;
62+ xs_list_foreach(lol, li) {
63+ const char *list_id = xs_list_get(li, 0);
64+ const char *list_title = xs_list_get(li, 1);
65+ if (uid) {
66+ xs *users = list_content(user, list_id, NULL, 0);
67+ if (xs_list_in(users, actor_md5) == -1)
68+ continue;
69+ }
70+
71+ xs *d = xs_dict_new();
72+
73+ d = xs_dict_append(d, "id", list_id);
74+ d = xs_dict_append(d, "title", list_title);
75+ d = xs_dict_append(d, "replies_policy", "list");
76+ d = xs_dict_append(d, "exclusive", xs_stock(XSTYPE_FALSE));
77+
78+ out = xs_list_append(out, d);
79+ }
80+
81+ return out;
82+}
83+
84+
85 int mastoapi_get_handler(const xs_dict *req, const char *q_path,
86 char **body, int *b_size, char **ctype, xs_str **link)
87 {
88@@ -1723,6 +1764,10 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
89 if (strcmp(opt, "followers") == 0) {
90 out = xs_list_new();
91 }
92+ else
93+ if (strcmp(opt, "lists") == 0) {
94+ out = mastoapi_account_lists(&snac1, uid);
95+ }
96
97 user_free(&snac2);
98 }
99@@ -1744,6 +1789,10 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
100 /* implement empty response so apps like Tokodon don't show an error */
101 out = xs_list_new();
102 }
103+ else
104+ if (strcmp(opt, "lists") == 0) {
105+ out = mastoapi_account_lists(&snac1, uid);
106+ }
107 }
108 }
109
110@@ -1825,13 +1874,14 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
111 if (logged_in) {
112 xs *l = notify_list(&snac1, 0, 64);
113 xs *out = xs_list_new();
114- const xs_dict *v;
115+ const char *v;
116 const xs_list *excl = xs_dict_get(args, "exclude_types[]");
117+ const xs_list *incl = xs_dict_get(args, "types[]");
118 const char *min_id = xs_dict_get(args, "min_id");
119 const char *max_id = xs_dict_get(args, "max_id");
120 const char *limit = xs_dict_get(args, "limit");
121 int limit_count = 0;
122- if (!xs_is_null(limit)) {
123+ if (xs_is_string(limit)) {
124 limit_count = atoi(limit);
125 }
126
127@@ -1850,11 +1900,12 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
128 const char *utype = xs_dict_get(noti, "utype");
129 const char *objid = xs_dict_get(noti, "objid");
130 const char *id = xs_dict_get(noti, "id");
131+ const char *actid = xs_dict_get(noti, "actor");
132 xs *fid = xs_replace(id, ".", "");
133 xs *actor = NULL;
134 xs *entry = NULL;
135
136- if (!valid_status(actor_get(xs_dict_get(noti, "actor"), &actor)))
137+ if (!valid_status(actor_get(actid, &actor)))
138 continue;
139
140 if (objid != NULL && !valid_status(object_get(objid, &entry)))
141@@ -1895,7 +1946,11 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
142 continue;
143
144 /* excluded type? */
145- if (!xs_is_null(excl) && xs_list_in(excl, type) != -1)
146+ if (xs_is_list(excl) && xs_list_in(excl, type) != -1)
147+ continue;
148+
149+ /* included type? */
150+ if (xs_is_list(incl) && xs_list_in(incl, type) == -1)
151 continue;
152
153 xs *mn = xs_dict_new();
154@@ -1921,10 +1976,9 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
155 }
156
157 out = xs_list_append(out, mn);
158- if (!xs_is_null(limit)) {
159- if (--limit_count <= 0)
160- break;
161- }
162+
163+ if (--limit_count <= 0)
164+ break;
165 }
166
167 srv_debug(1, xs_fmt("mastoapi_notifications count %d", xs_list_len(out)));
168@@ -1975,21 +2029,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
169 else
170 if (strcmp(cmd, "/v1/lists") == 0) { /** list of lists **/
171 if (logged_in) {
172- xs *lol = list_maint(&snac1, NULL, 0);
173- xs *l = xs_list_new();
174- int c = 0;
175- const xs_list *li;
176-
177- while (xs_list_next(lol, &li, &c)) {
178- xs *d = xs_dict_new();
179-
180- d = xs_dict_append(d, "id", xs_list_get(li, 0));
181- d = xs_dict_append(d, "title", xs_list_get(li, 1));
182- d = xs_dict_append(d, "replies_policy", "list");
183- d = xs_dict_append(d, "exclusive", xs_stock(XSTYPE_FALSE));
184-
185- l = xs_list_append(l, d);
186- }
187+ xs *l = mastoapi_account_lists(&snac1, NULL);
188
189 *body = xs_json_dumps(l, 4);
190 *ctype = "application/json";
191@@ -2069,10 +2109,26 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
192 }
193 else
194 if (strcmp(cmd, "/v1/follow_requests") == 0) { /** **/
195- /* snac does not support optional follow confirmations */
196- *body = xs_dup("[]");
197- *ctype = "application/json";
198- status = HTTP_STATUS_OK;
199+ if (logged_in) {
200+ xs *pend = pending_list(&snac1);
201+ xs *resp = xs_list_new();
202+ const char *id;
203+
204+ xs_list_foreach(pend, id) {
205+ xs *actor = NULL;
206+
207+ if (valid_status(object_get(id, &actor))) {
208+ xs *acct = mastoapi_account(&snac1, actor);
209+
210+ if (acct)
211+ resp = xs_list_append(resp, acct);
212+ }
213+ }
214+
215+ *body = xs_json_dumps(resp, 4);
216+ *ctype = "application/json";
217+ status = HTTP_STATUS_OK;
218+ }
219 }
220 else
221 if (strcmp(cmd, "/v1/announcements") == 0) { /** **/
222@@ -2256,6 +2312,25 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
223 status = HTTP_STATUS_OK;
224 }
225 else
226+ if (strcmp(cmd, "/v1/instance/peers") == 0) { /** **/
227+ /* get the collected inbox list as the instances "this domain is aware of" */
228+ xs *list = inbox_list();
229+ xs *peers = xs_list_new();
230+ const char *inbox;
231+
232+ xs_list_foreach(list, inbox) {
233+ xs *l = xs_split(inbox, "/");
234+ const char *domain = xs_list_get(l, 2);
235+
236+ if (xs_is_string(domain))
237+ peers = xs_list_append(peers, domain);
238+ }
239+
240+ *body = xs_json_dumps(peers, 4);
241+ *ctype = "application/json";
242+ status = HTTP_STATUS_OK;
243+ }
244+ else
245 if (xs_startswith(cmd, "/v1/statuses/")) { /** **/
246 /* information about a status */
247 if (logged_in) {
248@@ -2707,14 +2782,24 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
249 msg = xs_dict_set(msg, "summary", summary);
250 }
251
252- /* store */
253- timeline_add(&snac, xs_dict_get(msg, "id"), msg);
254+ /* scheduled? */
255+ const char *scheduled_at = xs_dict_get(args, "scheduled_at");
256
257- /* 'Create' message */
258- xs *c_msg = msg_create(&snac, msg);
259- enqueue_message(&snac, c_msg);
260+ if (xs_is_string(scheduled_at) && *scheduled_at) {
261+ msg = xs_dict_set(msg, "published", scheduled_at);
262
263- timeline_touch(&snac);
264+ schedule_add(&snac, xs_dict_get(msg, "id"), msg);
265+ }
266+ else {
267+ /* store */
268+ timeline_add(&snac, xs_dict_get(msg, "id"), msg);
269+
270+ /* 'Create' message */
271+ xs *c_msg = msg_create(&snac, msg);
272+ enqueue_message(&snac, c_msg);
273+
274+ timeline_touch(&snac);
275+ }
276
277 /* convert to a mastodon status as a response code */
278 xs *st = mastoapi_status(&snac, msg);
279@@ -3159,6 +3244,57 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
280 *ctype = "application/json";
281 status = HTTP_STATUS_OK;
282 }
283+ else
284+ if (xs_startswith(cmd, "/v1/follow_requests")) { /** **/
285+ if (logged_in) {
286+ /* "authorize" or "reject" */
287+ xs *rel = NULL;
288+ xs *l = xs_split(cmd, "/");
289+ const char *md5 = xs_list_get(l, -2);
290+ const char *s_cmd = xs_list_get(l, -1);
291+
292+ if (xs_is_string(md5) && xs_is_string(s_cmd)) {
293+ xs *actor = NULL;
294+
295+ if (valid_status(object_get_by_md5(md5, &actor))) {
296+ const char *actor_id = xs_dict_get(actor, "id");
297+
298+ if (strcmp(s_cmd, "authorize") == 0) {
299+ xs *fwreq = pending_get(&snac, actor_id);
300+
301+ if (fwreq != NULL) {
302+ xs *reply = msg_accept(&snac, fwreq, actor_id);
303+
304+ enqueue_message(&snac, reply);
305+
306+ if (xs_is_null(xs_dict_get(fwreq, "published"))) {
307+ xs *date = xs_str_utctime(0, ISO_DATE_SPEC);
308+ fwreq = xs_dict_set(fwreq, "published", date);
309+ }
310+
311+ timeline_add(&snac, xs_dict_get(fwreq, "id"), fwreq);
312+
313+ follower_add(&snac, actor_id);
314+
315+ pending_del(&snac, actor_id);
316+ rel = mastoapi_relationship(&snac, md5);
317+ }
318+ }
319+ else
320+ if (strcmp(s_cmd, "reject") == 0) {
321+ pending_del(&snac, actor_id);
322+ rel = mastoapi_relationship(&snac, md5);
323+ }
324+ }
325+ }
326+
327+ if (rel != NULL) {
328+ *body = xs_json_dumps(rel, 4);
329+ *ctype = "application/json";
330+ status = HTTP_STATUS_OK;
331+ }
332+ }
333+ }
334 else
335 status = HTTP_STATUS_UNPROCESSABLE_CONTENT;
336
M
po/cs.po
+198,
-174
1@@ -8,673 +8,673 @@ msgstr ""
2 "Language: cs\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Citlivý obsah: "
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Varování k citlivému obsahu"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Pouze pro zmíněné osoby:"
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Odpovědět na (URL):"
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "Nesdílet, pouze uložit do rozepsaných"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Rozepsané:"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Přílohy..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "Soubor:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "Pro smazání přilohy vymažte toto pole"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "Popisek přílohy"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "Anketa..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "Možnosti ankety (jedna na řádek, max 8):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "Vyber jednu"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "Vyber více možností"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "Konec za 5 minut"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "Konec za 1 hodinu"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "Konec za 1 den"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr "Poslat"
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "Popisek stránky"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "Email administrátora"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "Účet adminitrátora"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "%d sledovaných, %d sledujících"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "soukromé"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "veřejné"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "upozornění"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "lidé"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "instance"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151 msgstr ""
152 "Vyhledejte příspěvek podle URL (regex), @uživatel@instance účtu, nebo #tagu"
153
154-#: html.c:898
155+#: html.c:946
156 msgid "Content search"
157 msgstr "Hledání obsahu"
158
159-#: html.c:1020
160+#: html.c:1068
161 msgid "verified link"
162 msgstr "ověřený odkaz"
163
164-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
165+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
166 msgid "Location: "
167 msgstr "Místo: "
168
169-#: html.c:1113
170+#: html.c:1161
171 msgid "New Post..."
172 msgstr "Nový příspěvek..."
173
174-#: html.c:1115
175+#: html.c:1163
176 msgid "What's on your mind?"
177 msgstr "Co se vám honí hlavou?"
178
179-#: html.c:1124
180+#: html.c:1172
181 msgid "Operations..."
182 msgstr "Operace..."
183
184-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
185+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
186 msgid "Follow"
187 msgstr "Sledovat"
188
189-#: html.c:1141
190+#: html.c:1189
191 msgid "(by URL or user@host)"
192 msgstr "(podle URL nebo @uživatel@instance)"
193
194-#: html.c:1156 html.c:1690 html.c:4364
195+#: html.c:1204 html.c:1764 html.c:4527
196 msgid "Boost"
197 msgstr "Boostit"
198
199-#: html.c:1158 html.c:1175
200+#: html.c:1206 html.c:1223
201 msgid "(by URL)"
202 msgstr "(podle URL)"
203
204-#: html.c:1173 html.c:1669 html.c:4355
205+#: html.c:1221 html.c:1743 html.c:4518
206 msgid "Like"
207 msgstr "Líbí"
208
209-#: html.c:1278
210+#: html.c:1347
211 msgid "User Settings..."
212 msgstr "Nastavení..."
213
214-#: html.c:1287
215+#: html.c:1356
216 msgid "Display name:"
217 msgstr "Jméno:"
218
219-#: html.c:1293
220+#: html.c:1362
221 msgid "Your name"
222 msgstr "Vaše jméno"
223
224-#: html.c:1295
225+#: html.c:1364
226 msgid "Avatar: "
227 msgstr "Avatar: "
228
229-#: html.c:1303
230+#: html.c:1372
231 msgid "Delete current avatar"
232 msgstr "Smazat současný avatar"
233
234-#: html.c:1305
235+#: html.c:1374
236 msgid "Header image (banner): "
237 msgstr "Obrázek v záhlaví profilu: "
238
239-#: html.c:1313
240+#: html.c:1382
241 msgid "Delete current header image"
242 msgstr "Smazat současný obrázek v záhlaví"
243
244-#: html.c:1315
245+#: html.c:1384
246 msgid "Bio:"
247 msgstr "Bio:"
248
249-#: html.c:1321
250+#: html.c:1390
251 msgid "Write about yourself here..."
252 msgstr "Napište sem něco o sobě..."
253
254-#: html.c:1330
255+#: html.c:1399
256 msgid "Always show sensitive content"
257 msgstr "Vždy zobrazit příspěvky s varováním o citlivém obsahu"
258
259-#: html.c:1332
260+#: html.c:1401
261 msgid "Email address for notifications:"
262 msgstr "Emailová adresa pro upozornění"
263
264-#: html.c:1340
265+#: html.c:1409
266 msgid "Telegram notifications (bot key and chat id):"
267 msgstr "Upozornění na Telegram (bot klíč a chat id):"
268
269-#: html.c:1354
270+#: html.c:1423
271 msgid "ntfy notifications (ntfy server and token):"
272 msgstr "ntfy notifikace (ntfy server a token):"
273
274-#: html.c:1368
275+#: html.c:1437
276 msgid "Maximum days to keep posts (0: server settings):"
277 msgstr "Životnost příspěvků ve dnech (0: nastavení serveru):"
278
279-#: html.c:1382
280+#: html.c:1451
281 msgid "Drop direct messages from people you don't follow"
282 msgstr "Zahodit soukromé zprávy od lidí, které nesledujete"
283
284-#: html.c:1391
285+#: html.c:1460
286 msgid "This account is a bot"
287 msgstr "Tenhle účet je robot"
288
289-#: html.c:1400
290+#: html.c:1469
291 msgid "Auto-boost all mentions to this account"
292 msgstr "Automaticky boostovat všechny zmíňky o tomto účtu"
293
294-#: html.c:1409
295+#: html.c:1478
296 msgid "This account is private (posts are not shown through the web)"
297 msgstr ""
298 "Tento účet je soukromý (příspěvky nejsou zobrazitelné napříč internetem)"
299
300-#: html.c:1419
301+#: html.c:1488
302 msgid "Collapse top threads by default"
303 msgstr "Zobrazovat vlákna složená"
304
305-#: html.c:1428
306+#: html.c:1497
307 msgid "Follow requests must be approved"
308 msgstr "Žádosti o sledování je nutno manuálně potvrdit"
309
310-#: html.c:1437
311+#: html.c:1506
312 msgid "Publish follower and following metrics"
313 msgstr "Zobraz údaje o počtu sledovaných a sledujících"
314
315-#: html.c:1439
316+#: html.c:1508
317 msgid "Current location:"
318 msgstr "Geolokace:"
319
320-#: html.c:1453
321+#: html.c:1522
322 msgid "Profile metadata (key=value pairs in each line):"
323 msgstr "Metadata profilu (klíč=hodnota na jeden řádek):"
324
325-#: html.c:1464
326+#: html.c:1533
327 msgid "Web interface language:"
328 msgstr "Jazyk rozhraní:"
329
330-#: html.c:1469
331+#: html.c:1543
332 msgid "New password:"
333 msgstr "Nové heslo:"
334
335-#: html.c:1476
336+#: html.c:1550
337 msgid "Repeat new password:"
338 msgstr "Zopakujte nové heslo:"
339
340-#: html.c:1486
341+#: html.c:1560
342 msgid "Update user info"
343 msgstr "Uložit"
344
345-#: html.c:1497
346+#: html.c:1571
347 msgid "Followed hashtags..."
348 msgstr "Sledované hashtagy..."
349
350-#: html.c:1499 html.c:1531
351+#: html.c:1573 html.c:1605
352 msgid "One hashtag per line"
353 msgstr "Jeden hashtag na řádek"
354
355-#: html.c:1520 html.c:1552
356+#: html.c:1594 html.c:1626
357 msgid "Update hashtags"
358 msgstr "Aktualizovat hashtagy"
359
360-#: html.c:1669
361+#: html.c:1743
362 msgid "Say you like this post"
363 msgstr "Dejte najevo, že se vám příspěvek líbí"
364
365-#: html.c:1674 html.c:4373
366+#: html.c:1748 html.c:4536
367 msgid "Unlike"
368 msgstr "Nelíbí"
369
370-#: html.c:1674
371+#: html.c:1748
372 msgid "Nah don't like it that much"
373 msgstr "Vlastně se mi to zas tak nelíbí"
374
375-#: html.c:1680 html.c:4505
376+#: html.c:1754 html.c:4673
377 msgid "Unpin"
378 msgstr "Odepnout"
379
380-#: html.c:1680
381+#: html.c:1754
382 msgid "Unpin this post from your timeline"
383 msgstr "Odepnout tento příspěvek z vaší osy"
384
385-#: html.c:1683 html.c:4500
386+#: html.c:1757 html.c:4668
387 msgid "Pin"
388 msgstr "Připnout"
389
390-#: html.c:1683
391+#: html.c:1757
392 msgid "Pin this post to the top of your timeline"
393 msgstr "Připnout tento příspěvěk na začátek vaší osy"
394
395-#: html.c:1690
396+#: html.c:1764
397 msgid "Announce this post to your followers"
398 msgstr "Ukázat tenhle příspěvek vašim sledujícím"
399
400-#: html.c:1695 html.c:4381
401+#: html.c:1769 html.c:4544
402 msgid "Unboost"
403 msgstr "Odboostit"
404
405-#: html.c:1695
406+#: html.c:1769
407 msgid "I regret I boosted this"
408 msgstr "Boostit to byl blbej nápad"
409
410-#: html.c:1701 html.c:4515
411+#: html.c:1775 html.c:4683
412 msgid "Unbookmark"
413 msgstr "Zahodit"
414
415-#: html.c:1701
416+#: html.c:1775
417 msgid "Delete this post from your bookmarks"
418 msgstr "Odstraň tenhle příspěvěk ze svých záložek"
419
420-#: html.c:1704 html.c:4510
421+#: html.c:1778 html.c:4678
422 msgid "Bookmark"
423 msgstr "Uložit"
424
425-#: html.c:1704
426+#: html.c:1778
427 msgid "Add this post to your bookmarks"
428 msgstr "Uložit tenhle příspěvek mezi záložky"
429
430-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
431+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
432 msgid "Unfollow"
433 msgstr "Přestat sledovat"
434
435-#: html.c:1710 html.c:3082
436+#: html.c:1784 html.c:3180
437 msgid "Stop following this user's activity"
438 msgstr "Přestat sledovat tohoto uživatele"
439
440-#: html.c:1714 html.c:3096
441+#: html.c:1788 html.c:3194
442 msgid "Start following this user's activity"
443 msgstr "Začít sledovat tohoto uživatele"
444
445-#: html.c:1720 html.c:4455
446+#: html.c:1794 html.c:4621
447 msgid "Unfollow Group"
448 msgstr "Přestat Sledovat Skupinu"
449
450-#: html.c:1721
451+#: html.c:1795
452 msgid "Stop following this group or channel"
453 msgstr "Přestat sledovat tuto skupinu nebo kanál"
454
455-#: html.c:1725 html.c:4442
456+#: html.c:1799 html.c:4608
457 msgid "Follow Group"
458 msgstr "Sledovat Skupinu"
459
460-#: html.c:1726
461+#: html.c:1800
462 msgid "Start following this group or channel"
463 msgstr "Začít sledovat tuto skupinu nebo kanál"
464
465-#: html.c:1731 html.c:3118 html.c:4389
466+#: html.c:1805 html.c:3216 html.c:4552
467 msgid "MUTE"
468 msgstr "ZTIŠIT"
469
470-#: html.c:1732
471+#: html.c:1806
472 msgid "Block any activity from this user forever"
473 msgstr "Jednou provždy zablokovat všechno od tohoto uživatele"
474
475-#: html.c:1737 html.c:3100 html.c:4472
476+#: html.c:1811 html.c:3198 html.c:4638
477 msgid "Delete"
478 msgstr "Smazat"
479
480-#: html.c:1737
481+#: html.c:1811
482 msgid "Delete this post"
483 msgstr "Smazat tento příspěvek"
484
485-#: html.c:1740 html.c:4397
486+#: html.c:1814 html.c:4560
487 msgid "Hide"
488 msgstr "Schovat"
489
490-#: html.c:1740
491+#: html.c:1814
492 msgid "Hide this post and its children"
493 msgstr "Schovat tento příspěvek a příspěvky pod ním"
494
495-#: html.c:1771
496+#: html.c:1845
497 msgid "Edit..."
498 msgstr "Editovat..."
499
500-#: html.c:1790
501+#: html.c:1865
502 msgid "Reply..."
503 msgstr "Odpovědět..."
504
505-#: html.c:1841
506+#: html.c:1916
507 msgid "Truncated (too deep)"
508 msgstr "Ořezáno (moc hluboké)"
509
510-#: html.c:1850
511+#: html.c:1925
512 msgid "follows you"
513 msgstr "sleduje vás"
514
515-#: html.c:1913
516+#: html.c:1988
517 msgid "Pinned"
518 msgstr "Připnuto"
519
520-#: html.c:1921
521+#: html.c:1996
522 msgid "Bookmarked"
523 msgstr "Zazáložkováno"
524
525-#: html.c:1929
526+#: html.c:2004
527 msgid "Poll"
528 msgstr "Anketa"
529
530-#: html.c:1936
531+#: html.c:2011
532 msgid "Voted"
533 msgstr "Odhlasováno"
534
535-#: html.c:1945
536+#: html.c:2020
537 msgid "Event"
538 msgstr "Událost"
539
540-#: html.c:1977 html.c:2006
541+#: html.c:2052 html.c:2081
542 msgid "boosted"
543 msgstr "boostuje"
544
545-#: html.c:2022
546+#: html.c:2097
547 msgid "in reply to"
548 msgstr "odpověď pro"
549
550-#: html.c:2073
551+#: html.c:2148
552 msgid " [SENSITIVE CONTENT]"
553 msgstr "[CITLIVÝ OBSAH]"
554
555-#: html.c:2250
556+#: html.c:2325
557 msgid "Vote"
558 msgstr "Hlasuj"
559
560-#: html.c:2260
561+#: html.c:2335
562 msgid "Closed"
563 msgstr "Uzavřeno"
564
565-#: html.c:2285
566+#: html.c:2360
567 msgid "Closes in"
568 msgstr "Končí za"
569
570-#: html.c:2366
571+#: html.c:2441
572 msgid "Video"
573 msgstr "Video"
574
575-#: html.c:2381
576+#: html.c:2456
577 msgid "Audio"
578 msgstr "Audio"
579
580-#: html.c:2403
581+#: html.c:2484
582 msgid "Attachment"
583 msgstr "Příloha"
584
585-#: html.c:2417
586+#: html.c:2498
587 msgid "Alt..."
588 msgstr "Popisek..."
589
590-#: html.c:2430
591+#: html.c:2511
592 msgid "Source channel or community"
593 msgstr ""
594
595-#: html.c:2524
596+#: html.c:2605
597 msgid "Time: "
598 msgstr "Čas:"
599
600-#: html.c:2605
601+#: html.c:2686
602 msgid "Older..."
603 msgstr "Starší..."
604
605-#: html.c:2702
606+#: html.c:2788
607 msgid "about this site"
608 msgstr "o této stránce"
609
610-#: html.c:2704
611+#: html.c:2790
612 msgid "powered by "
613 msgstr "pohání "
614
615-#: html.c:2769
616+#: html.c:2855
617 msgid "Dismiss"
618 msgstr "Zahodit"
619
620-#: html.c:2786
621+#: html.c:2872
622 #, c-format
623 msgid "Timeline for list '%s'"
624 msgstr "Časová osa pro seznam '%s'"
625
626-#: html.c:2805 html.c:3846
627+#: html.c:2891 html.c:3944
628 msgid "Pinned posts"
629 msgstr "Připnuté příspěvky"
630
631-#: html.c:2817 html.c:3861
632+#: html.c:2903 html.c:3959
633 msgid "Bookmarked posts"
634 msgstr "Záložky"
635
636-#: html.c:2829 html.c:3876
637+#: html.c:2915 html.c:3974
638 msgid "Post drafts"
639 msgstr "Rozepsané příspěky"
640
641-#: html.c:2888
642+#: html.c:2986
643 msgid "No more unseen posts"
644 msgstr "Nic víc nového"
645
646-#: html.c:2892 html.c:2992
647+#: html.c:2990 html.c:3090
648 msgid "Back to top"
649 msgstr "Zpátky nahoru"
650
651-#: html.c:2945
652+#: html.c:3043
653 msgid "History"
654 msgstr "Historie"
655
656-#: html.c:2997 html.c:3417
657+#: html.c:3095 html.c:3515
658 msgid "More..."
659 msgstr "Více..."
660
661-#: html.c:3086 html.c:4408
662+#: html.c:3184 html.c:4574
663 msgid "Unlimit"
664 msgstr "Povolit boosty"
665
666-#: html.c:3087
667+#: html.c:3185
668 msgid "Allow announces (boosts) from this user"
669 msgstr "Zobrazovat boosty od tohoto uživatele"
670
671-#: html.c:3090 html.c:4404
672+#: html.c:3188 html.c:4570
673 msgid "Limit"
674 msgstr "Skrýt boosty"
675
676-#: html.c:3091
677+#: html.c:3189
678 msgid "Block announces (boosts) from this user"
679 msgstr "Ztišit boosty od tohoto uživatele"
680
681-#: html.c:3100
682+#: html.c:3198
683 msgid "Delete this user"
684 msgstr "Smazat tohoto užiatele"
685
686-#: html.c:3105 html.c:4520
687+#: html.c:3203 html.c:4688
688 msgid "Approve"
689 msgstr "Schválit"
690
691-#: html.c:3106
692+#: html.c:3204
693 msgid "Approve this follow request"
694 msgstr "Schválit žádost o sledování"
695
696-#: html.c:3109 html.c:4544
697+#: html.c:3207 html.c:4712
698 msgid "Discard"
699 msgstr "Zahodit"
700
701-#: html.c:3109
702+#: html.c:3207
703 msgid "Discard this follow request"
704 msgstr "Zahodit žádost o sledování"
705
706-#: html.c:3114 html.c:4393
707+#: html.c:3212 html.c:4556
708 msgid "Unmute"
709 msgstr "Zrušit ztišení"
710
711-#: html.c:3115
712+#: html.c:3213
713 msgid "Stop blocking activities from this user"
714 msgstr "Přestat blokovat tohoto uživatele"
715
716-#: html.c:3119
717+#: html.c:3217
718 msgid "Block any activity from this user"
719 msgstr "Zablokovat všechno od tohoto uživatele"
720
721-#: html.c:3127
722+#: html.c:3225
723 msgid "Direct Message..."
724 msgstr "Soukomá zpráva..."
725
726-#: html.c:3162
727+#: html.c:3260
728 msgid "Pending follow confirmations"
729 msgstr "Dosud nepotvrzené žádosti o sledování"
730
731-#: html.c:3166
732+#: html.c:3264
733 msgid "People you follow"
734 msgstr "Lidé, které sledujete"
735
736-#: html.c:3167
737+#: html.c:3265
738 msgid "People that follow you"
739 msgstr "Lidé, kteří vás sledují"
740
741-#: html.c:3206
742+#: html.c:3304
743 msgid "Clear all"
744 msgstr "Smazat vše"
745
746-#: html.c:3263
747+#: html.c:3361
748 msgid "Mention"
749 msgstr "Zmínil vás"
750
751-#: html.c:3266
752+#: html.c:3364
753 msgid "Finished poll"
754 msgstr "Ukončená anketa"
755
756-#: html.c:3281
757+#: html.c:3379
758 msgid "Follow Request"
759 msgstr "Žádost o sledování"
760
761-#: html.c:3364
762+#: html.c:3462
763 msgid "Context"
764 msgstr "Kontext"
765
766-#: html.c:3375
767+#: html.c:3473
768 msgid "New"
769 msgstr "Nové"
770
771-#: html.c:3390
772+#: html.c:3488
773 msgid "Already seen"
774 msgstr "Zobrazeno dříve"
775
776-#: html.c:3405
777+#: html.c:3503
778 msgid "None"
779 msgstr "Nic"
780
781-#: html.c:3671
782+#: html.c:3769
783 #, c-format
784 msgid "Search results for account %s"
785 msgstr "Výsledky vyhledávání účtu %s"
786
787-#: html.c:3678
788+#: html.c:3776
789 #, c-format
790 msgid "Account %s not found"
791 msgstr "Účet %s nenalezen"
792
793-#: html.c:3709
794+#: html.c:3807
795 #, c-format
796 msgid "Search results for tag %s"
797 msgstr "Výsledky k tagu %s"
798
799-#: html.c:3709
800+#: html.c:3807
801 #, c-format
802 msgid "Nothing found for tag %s"
803 msgstr "Nic k tagu %s"
804
805-#: html.c:3725
806+#: html.c:3823
807 #, c-format
808 msgid "Search results for '%s' (may be more)"
809 msgstr "Výsledky vyhledávání pro '%s' (může toho být víc)"
810
811-#: html.c:3728
812+#: html.c:3826
813 #, c-format
814 msgid "Search results for '%s'"
815 msgstr "Výsledky vyhledávání pro '%s'"
816
817-#: html.c:3731
818+#: html.c:3829
819 #, c-format
820 msgid "No more matches for '%s'"
821 msgstr "Nic víc pro '%s'"
822
823-#: html.c:3733
824+#: html.c:3831
825 #, c-format
826 msgid "Nothing found for '%s'"
827 msgstr "Žádný výsledek pro '%s'"
828
829-#: html.c:3831
830+#: html.c:3929
831 msgid "Showing instance timeline"
832 msgstr "Časová osa místní instance"
833
834-#: html.c:3899
835+#: html.c:4012
836 #, c-format
837 msgid "Showing timeline for list '%s'"
838 msgstr "Časová osa pro seznam '%s'"
839@@ -688,15 +688,15 @@ msgstr "Výsledky vyhledávání tagu #%s"
840 msgid "Recent posts by users in this instance"
841 msgstr "Nedávné příspěvky od uživatelů této instance"
842
843-#: html.c:1529
844+#: html.c:1603
845 msgid "Blocked hashtags..."
846 msgstr "Blokované hashtagy..."
847
848-#: html.c:420
849+#: html.c:432
850 msgid "Optional URL to reply to"
851 msgstr "URL adresa příspěvku, na který odpovědět"
852
853-#: html.c:527
854+#: html.c:575
855 msgid ""
856 "Option 1...\n"
857 "Option 2...\n"
858@@ -708,30 +708,54 @@ msgstr ""
859 "Možnost 3...\n"
860 "..."
861
862-#: html.c:1346
863+#: html.c:1415
864 msgid "Bot API key"
865 msgstr "API klíč Bota"
866
867-#: html.c:1352
868+#: html.c:1421
869 msgid "Chat id"
870 msgstr "Chat id"
871
872-#: html.c:1360
873+#: html.c:1429
874 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
875 msgstr "ntfy server - celá URL adresa (např: https://ntfy.sh/VaseTema)"
876
877-#: html.c:1366
878+#: html.c:1435
879 msgid "ntfy token - if needed"
880 msgstr "ntfy token - pokud je zapotřebí"
881
882-#: html.c:2806
883+#: html.c:2892
884 msgid "pinned"
885 msgstr "připnuté"
886
887-#: html.c:2818
888+#: html.c:2904
889 msgid "bookmarks"
890 msgstr "záložky"
891
892-#: html.c:2830
893+#: html.c:2916
894 msgid "drafts"
895 msgstr "rozepsané"
896+
897+#: html.c:464
898+msgid "Scheduled post..."
899+msgstr "Naplánovat příspěvek..."
900+
901+msgid "Post date and time:"
902+msgstr "Den a čas:"
903+
904+#: html.c:2927 html.c:3989
905+msgid "Scheduled posts"
906+msgstr "Naplánované příspěvky"
907+
908+#: html.c:2928
909+msgid "scheduled posts"
910+msgstr "naplánované příspěvky"
911+
912+#: html.c:458
913+#, c-format
914+msgid "Post date and time (timezone: %s):"
915+msgstr "Den a čas (časové pásmo: %s)"
916+
917+#: html.c:1538
918+msgid "Time zone:"
919+msgstr "Časové pásmo:"
+198,
-174
1@@ -14,120 +14,120 @@ msgstr ""
2 "Content-Transfer-Encoding: 8bit\n"
3 "X-Generator: Poedit 3.5\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Ευαίσθητο περιεχόμενο: "
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Περιγραφή ευαίσθητου περιεχομένου"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Μόνο για αναφερόμενα άτομα: "
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Απάντηση σε (URL): "
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "Μη δημοσιεύσεις, αλλά αποθήκευσε σαν προσχέδιο"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Προσχέδιο:"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Επισυνάψεις..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "Αρχείο:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "Καθάρισε αυτό το πεδίο για να διαγράψεις την επισύναψη"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "Περιγραφή επισύναψης"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "Δημοσκόπηση..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "Επιλογές δημοσκόπησης (μία ανά σειρά, μέχρι 8):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "Μία επιλογή"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "Πολλαπλές επιλογές"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "Τελειώνει σε 5 λεπτά"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "Τελειώνει σε 1 ώρα"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "Τελειώνει σε 1 ημέρα"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr "Δημοσίευση"
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "Περιγραφή ιστότοπου"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "Email διαχειριστή"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "Διαχειριστής"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "%d ακολουθείτε, %d ακόλουθοι"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "ιδιωτικό"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "δημόσιο"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "ειδοποιήσεις"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "άνθρωποι"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "διακομιστής"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151@@ -135,554 +135,554 @@ msgstr ""
152 "Αναζήτηση δημοσιεύσεων με URL ή περιεχόμενο (κανονική έκφραση), "
153 "@χρήστης@διακομιστής, ή #ετικέτα"
154
155-#: html.c:898
156+#: html.c:946
157 msgid "Content search"
158 msgstr "Αναζήτηση περιεχομένου"
159
160-#: html.c:1020
161+#: html.c:1068
162 msgid "verified link"
163 msgstr "πιστοποιημένος σύνδεσμος"
164
165-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
166+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
167 msgid "Location: "
168 msgstr "Τοποθεσία: "
169
170-#: html.c:1113
171+#: html.c:1161
172 msgid "New Post..."
173 msgstr "Νέα Δημοσίευση..."
174
175-#: html.c:1115
176+#: html.c:1163
177 msgid "What's on your mind?"
178 msgstr "Τι έχεις στο μυαλό σου;"
179
180-#: html.c:1124
181+#: html.c:1172
182 msgid "Operations..."
183 msgstr "Λειτουργίες..."
184
185-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
186+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
187 msgid "Follow"
188 msgstr "Ακολούθησε"
189
190-#: html.c:1141
191+#: html.c:1189
192 msgid "(by URL or user@host)"
193 msgstr "(με URL ή user@host)"
194
195-#: html.c:1156 html.c:1690 html.c:4364
196+#: html.c:1204 html.c:1764 html.c:4527
197 msgid "Boost"
198 msgstr "Ενίσχυση"
199
200-#: html.c:1158 html.c:1175
201+#: html.c:1206 html.c:1223
202 msgid "(by URL)"
203 msgstr "(από URL)"
204
205-#: html.c:1173 html.c:1669 html.c:4355
206+#: html.c:1221 html.c:1743 html.c:4518
207 msgid "Like"
208 msgstr "Μου αρέσει"
209
210-#: html.c:1278
211+#: html.c:1347
212 msgid "User Settings..."
213 msgstr "Ρυθμίσεις Χρήστη..."
214
215-#: html.c:1287
216+#: html.c:1356
217 msgid "Display name:"
218 msgstr "Προβαλλόμενο όνομα:"
219
220-#: html.c:1293
221+#: html.c:1362
222 msgid "Your name"
223 msgstr "Το όνομα σου"
224
225-#: html.c:1295
226+#: html.c:1364
227 msgid "Avatar: "
228 msgstr "Εικόνα προφίλ: "
229
230-#: html.c:1303
231+#: html.c:1372
232 msgid "Delete current avatar"
233 msgstr "Διαγραφή τρέχουσας εικόνας προφίλ"
234
235-#: html.c:1305
236+#: html.c:1374
237 msgid "Header image (banner): "
238 msgstr "Εικόνα κεφαλίδας (banner): "
239
240-#: html.c:1313
241+#: html.c:1382
242 msgid "Delete current header image"
243 msgstr "Διαγραφή τρέχουσας εικόνας κεφαλίδας"
244
245-#: html.c:1315
246+#: html.c:1384
247 msgid "Bio:"
248 msgstr "Βιογραφικό:"
249
250-#: html.c:1321
251+#: html.c:1390
252 msgid "Write about yourself here..."
253 msgstr "Γράψε για τον εαυτό σου εδώ..."
254
255-#: html.c:1330
256+#: html.c:1399
257 msgid "Always show sensitive content"
258 msgstr "Πάντα πρόβαλε ευαίσθητο περιεχόμενο"
259
260-#: html.c:1332
261+#: html.c:1401
262 msgid "Email address for notifications:"
263 msgstr "Διεύθυνση email για ειδοποιήσεις:"
264
265-#: html.c:1340
266+#: html.c:1409
267 msgid "Telegram notifications (bot key and chat id):"
268 msgstr "Ειδοποιήσεις Telegram (κλειδί bot και chat id):"
269
270-#: html.c:1354
271+#: html.c:1423
272 msgid "ntfy notifications (ntfy server and token):"
273 msgstr "ειδοποιήσεις ntfy (διακομιστής ntfy και token):"
274
275-#: html.c:1368
276+#: html.c:1437
277 msgid "Maximum days to keep posts (0: server settings):"
278 msgstr "Διατήρηση δημοσιεύσεων για ημέρες (0: ρυθμίσεις διακομιστή):"
279
280-#: html.c:1382
281+#: html.c:1451
282 msgid "Drop direct messages from people you don't follow"
283 msgstr "Απόρριψη άμεσων μηνυμάτων από άτομα που δεν ακολουθείτε"
284
285-#: html.c:1391
286+#: html.c:1460
287 msgid "This account is a bot"
288 msgstr "Αυτός ο λογαριασμός είναι αυτοματοποιημένος (bot)"
289
290-#: html.c:1400
291+#: html.c:1469
292 msgid "Auto-boost all mentions to this account"
293 msgstr "Αυτόματη ενίσχυση όλων των αναφορών σε αυτό το λογαριασμό"
294
295-#: html.c:1409
296+#: html.c:1478
297 msgid "This account is private (posts are not shown through the web)"
298 msgstr ""
299 "Αυτός ο λογαριασμός είναι ιδιωτικός (οι δημοσιεύσεις δεν εμφανίζονται στο "
300 "διαδίκτυο)"
301
302-#: html.c:1419
303+#: html.c:1488
304 msgid "Collapse top threads by default"
305 msgstr "Αναδίπλωση κορυφαίων συζητήσεων εξ'ορισμού"
306
307-#: html.c:1428
308+#: html.c:1497
309 msgid "Follow requests must be approved"
310 msgstr "Τα αιτήματα ακόλουθων πρέπει να εγκρίνονται"
311
312-#: html.c:1437
313+#: html.c:1506
314 msgid "Publish follower and following metrics"
315 msgstr "Δημοσίευση στατιστικών ακόλουθων και ακολουθούμενων"
316
317-#: html.c:1439
318+#: html.c:1508
319 msgid "Current location:"
320 msgstr "Τρέχουσα τοποθεσία:"
321
322-#: html.c:1453
323+#: html.c:1522
324 msgid "Profile metadata (key=value pairs in each line):"
325 msgstr "Μεταστοιχεία προφίλ (κλειδί=τιμή ζευγάρια σε κάθε γραμμή):"
326
327-#: html.c:1464
328+#: html.c:1533
329 msgid "Web interface language:"
330 msgstr "Γλώσσα περιβάλλοντος web:"
331
332-#: html.c:1469
333+#: html.c:1543
334 msgid "New password:"
335 msgstr "Νέος κωδικός:"
336
337-#: html.c:1476
338+#: html.c:1550
339 msgid "Repeat new password:"
340 msgstr "Επανάληψη νέου κωδικού:"
341
342-#: html.c:1486
343+#: html.c:1560
344 msgid "Update user info"
345 msgstr "Ενημέρωση στοιχείων χρήστη"
346
347-#: html.c:1497
348+#: html.c:1571
349 msgid "Followed hashtags..."
350 msgstr "Ετικέτες που ακολουθείτε..."
351
352-#: html.c:1499 html.c:1531
353+#: html.c:1573 html.c:1605
354 msgid "One hashtag per line"
355 msgstr "Μία ετικέτα ανά γραμμή"
356
357-#: html.c:1520 html.c:1552
358+#: html.c:1594 html.c:1626
359 msgid "Update hashtags"
360 msgstr "Ενημέρωση ετικετών"
361
362-#: html.c:1669
363+#: html.c:1743
364 msgid "Say you like this post"
365 msgstr "Ανάφερε ότι σου αρέσει αυτή η δημοσίευση"
366
367-#: html.c:1674 html.c:4373
368+#: html.c:1748 html.c:4536
369 msgid "Unlike"
370 msgstr "Αναίρεση μου αρέσει"
371
372-#: html.c:1674
373+#: html.c:1748
374 msgid "Nah don't like it that much"
375 msgstr "Μπα δεν μ' αρέσει τόσο"
376
377-#: html.c:1680 html.c:4505
378+#: html.c:1754 html.c:4673
379 msgid "Unpin"
380 msgstr "Ξεκαρφίτσωμα"
381
382-#: html.c:1680
383+#: html.c:1754
384 msgid "Unpin this post from your timeline"
385 msgstr "Ξεκαρφίτσωμα αυτής της δημοσίευσης από τη ροή σας"
386
387-#: html.c:1683 html.c:4500
388+#: html.c:1757 html.c:4668
389 msgid "Pin"
390 msgstr "Καρφίτσωμα"
391
392-#: html.c:1683
393+#: html.c:1757
394 msgid "Pin this post to the top of your timeline"
395 msgstr "Καρφίτσωμα αυτής της δημοσίευσης στη κορυφή της ροής σας"
396
397-#: html.c:1690
398+#: html.c:1764
399 msgid "Announce this post to your followers"
400 msgstr "Ανακοίνωση αυτής της δημοσίευσης στους ακόλουθους σας"
401
402-#: html.c:1695 html.c:4381
403+#: html.c:1769 html.c:4544
404 msgid "Unboost"
405 msgstr "Αφαίρεση ενίσχυσης"
406
407-#: html.c:1695
408+#: html.c:1769
409 msgid "I regret I boosted this"
410 msgstr "Μετάνιωσα που το ενίσχυσα"
411
412-#: html.c:1701 html.c:4515
413+#: html.c:1775 html.c:4683
414 msgid "Unbookmark"
415 msgstr "Αφαίρεση σελιδοδείκτη"
416
417-#: html.c:1701
418+#: html.c:1775
419 msgid "Delete this post from your bookmarks"
420 msgstr "Διαγραφή αυτής της δημοσίευσης από τους σελιδοδείκτες σου"
421
422-#: html.c:1704 html.c:4510
423+#: html.c:1778 html.c:4678
424 msgid "Bookmark"
425 msgstr "Εισαγωγή σελιδοδείκτη"
426
427-#: html.c:1704
428+#: html.c:1778
429 msgid "Add this post to your bookmarks"
430 msgstr "Προσθήκη αυτής της δημοσίευσης στους σελιδοδείκτες σου"
431
432-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
433+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
434 msgid "Unfollow"
435 msgstr "Αναίρεση ακολουθίας"
436
437-#: html.c:1710 html.c:3082
438+#: html.c:1784 html.c:3180
439 msgid "Stop following this user's activity"
440 msgstr "Σταμάτα να ακολουθείς τη δραστηριότητα αυτού του χρήστη"
441
442-#: html.c:1714 html.c:3096
443+#: html.c:1788 html.c:3194
444 msgid "Start following this user's activity"
445 msgstr "Ξεκίνα να ακολουθείς τη δραστηριότητα αυτού του χρήστη"
446
447-#: html.c:1720 html.c:4455
448+#: html.c:1794 html.c:4621
449 msgid "Unfollow Group"
450 msgstr "Αναίρεση ακολουθίας ομάδας"
451
452-#: html.c:1721
453+#: html.c:1795
454 msgid "Stop following this group or channel"
455 msgstr "Σταμάτα να ακολουθείς αυτή την ομάδα ή κανάλι"
456
457-#: html.c:1725 html.c:4442
458+#: html.c:1799 html.c:4608
459 msgid "Follow Group"
460 msgstr "Ακολούθησε την Ομάδα"
461
462-#: html.c:1726
463+#: html.c:1800
464 msgid "Start following this group or channel"
465 msgstr "Ξεκίνα να ακολουθείς αυτή την ομάδα ή κανάλι"
466
467-#: html.c:1731 html.c:3118 html.c:4389
468+#: html.c:1805 html.c:3216 html.c:4552
469 msgid "MUTE"
470 msgstr "ΣΙΓΑΣΗ"
471
472-#: html.c:1732
473+#: html.c:1806
474 msgid "Block any activity from this user forever"
475 msgstr "Αποκλεισμός οποιασδήποτε δραστηριότητας από αυτόν τον χρήστη για πάντα"
476
477-#: html.c:1737 html.c:3100 html.c:4472
478+#: html.c:1811 html.c:3198 html.c:4638
479 msgid "Delete"
480 msgstr "Διαγραφή"
481
482-#: html.c:1737
483+#: html.c:1811
484 msgid "Delete this post"
485 msgstr "Διαγραφή αυτής της δημοσίευσης"
486
487-#: html.c:1740 html.c:4397
488+#: html.c:1814 html.c:4560
489 msgid "Hide"
490 msgstr "Απόκρυψη"
491
492-#: html.c:1740
493+#: html.c:1814
494 msgid "Hide this post and its children"
495 msgstr "Απόκρυψη αυτής της δημοσίευσης και των απαντήσεων της"
496
497-#: html.c:1771
498+#: html.c:1845
499 msgid "Edit..."
500 msgstr "Επεξεργασία..."
501
502-#: html.c:1790
503+#: html.c:1865
504 msgid "Reply..."
505 msgstr "Απάντηση..."
506
507-#: html.c:1841
508+#: html.c:1916
509 msgid "Truncated (too deep)"
510 msgstr "Έγινε περικοπή (πολύ βαθύ)"
511
512-#: html.c:1850
513+#: html.c:1925
514 msgid "follows you"
515 msgstr "σε ακολουθεί"
516
517-#: html.c:1913
518+#: html.c:1988
519 msgid "Pinned"
520 msgstr "Καρφιτσωμένο"
521
522-#: html.c:1921
523+#: html.c:1996
524 msgid "Bookmarked"
525 msgstr "Εισήχθηκε σελιδοδείκτης"
526
527-#: html.c:1929
528+#: html.c:2004
529 msgid "Poll"
530 msgstr "Δημοσκόπηση"
531
532-#: html.c:1936
533+#: html.c:2011
534 msgid "Voted"
535 msgstr "Ψήφισες"
536
537-#: html.c:1945
538+#: html.c:2020
539 msgid "Event"
540 msgstr "Εκδήλωση"
541
542-#: html.c:1977 html.c:2006
543+#: html.c:2052 html.c:2081
544 msgid "boosted"
545 msgstr "ενισχύθηκε"
546
547-#: html.c:2022
548+#: html.c:2097
549 msgid "in reply to"
550 msgstr "σε απάντηση του"
551
552-#: html.c:2073
553+#: html.c:2148
554 msgid " [SENSITIVE CONTENT]"
555 msgstr " [ΕΥΑΙΣΘΗΤΟ ΠΕΡΙΕΧΟΜΕΝΟ]"
556
557-#: html.c:2250
558+#: html.c:2325
559 msgid "Vote"
560 msgstr "Ψήφισε"
561
562-#: html.c:2260
563+#: html.c:2335
564 msgid "Closed"
565 msgstr "Έκλεισε"
566
567-#: html.c:2285
568+#: html.c:2360
569 msgid "Closes in"
570 msgstr "Κλείνει σε"
571
572-#: html.c:2366
573+#: html.c:2441
574 msgid "Video"
575 msgstr "Βίντεο"
576
577-#: html.c:2381
578+#: html.c:2456
579 msgid "Audio"
580 msgstr "Ήχος"
581
582-#: html.c:2403
583+#: html.c:2484
584 msgid "Attachment"
585 msgstr "Επισύναψη"
586
587-#: html.c:2417
588+#: html.c:2498
589 msgid "Alt..."
590 msgstr "Εναλλακτικό κείμενο..."
591
592-#: html.c:2430
593+#: html.c:2511
594 msgid "Source channel or community"
595 msgstr "Πηγή κανάλι ή κοινότητα"
596
597-#: html.c:2524
598+#: html.c:2605
599 msgid "Time: "
600 msgstr "Ώρα: "
601
602-#: html.c:2605
603+#: html.c:2686
604 msgid "Older..."
605 msgstr "Παλαιότερα..."
606
607-#: html.c:2702
608+#: html.c:2788
609 msgid "about this site"
610 msgstr "σχετικά με αυτό τον ιστότοπο"
611
612-#: html.c:2704
613+#: html.c:2790
614 msgid "powered by "
615 msgstr "λειτουργεί με "
616
617-#: html.c:2769
618+#: html.c:2855
619 msgid "Dismiss"
620 msgstr "Απόρριψη"
621
622-#: html.c:2786
623+#: html.c:2872
624 #, c-format
625 msgid "Timeline for list '%s'"
626 msgstr "Ροή για λίστα '%s'"
627
628-#: html.c:2805 html.c:3846
629+#: html.c:2891 html.c:3944
630 msgid "Pinned posts"
631 msgstr "Καρφιτσωμένες δημοσιεύσεις"
632
633-#: html.c:2817 html.c:3861
634+#: html.c:2903 html.c:3959
635 msgid "Bookmarked posts"
636 msgstr "Σελιδοδείκτες"
637
638-#: html.c:2829 html.c:3876
639+#: html.c:2915 html.c:3974
640 msgid "Post drafts"
641 msgstr "Προσχέδια δημοσιεύσεων"
642
643-#: html.c:2888
644+#: html.c:2986
645 msgid "No more unseen posts"
646 msgstr "Δεν υπάρχουν άλλες αδιάβαστες δημοσιεύσεις"
647
648-#: html.c:2892 html.c:2992
649+#: html.c:2990 html.c:3090
650 msgid "Back to top"
651 msgstr "Πίσω στη κορυφή"
652
653-#: html.c:2945
654+#: html.c:3043
655 msgid "History"
656 msgstr "Ιστορικό"
657
658-#: html.c:2997 html.c:3417
659+#: html.c:3095 html.c:3515
660 msgid "More..."
661 msgstr "Περισσότερα..."
662
663-#: html.c:3086 html.c:4408
664+#: html.c:3184 html.c:4574
665 msgid "Unlimit"
666 msgstr "Αφαίρεση περιορισμού"
667
668-#: html.c:3087
669+#: html.c:3185
670 msgid "Allow announces (boosts) from this user"
671 msgstr "Επέτρεψε ανακοινώσεις (ενισχύσεις) από αυτό το χρήστη"
672
673-#: html.c:3090 html.c:4404
674+#: html.c:3188 html.c:4570
675 msgid "Limit"
676 msgstr "Περιορισμός"
677
678-#: html.c:3091
679+#: html.c:3189
680 msgid "Block announces (boosts) from this user"
681 msgstr "Απέκλεισε ανακοινώσεις (ενισχύσεις) από αυτό το χρήστη"
682
683-#: html.c:3100
684+#: html.c:3198
685 msgid "Delete this user"
686 msgstr "Διαγραφή αυτού του χρήστη"
687
688-#: html.c:3105 html.c:4520
689+#: html.c:3203 html.c:4688
690 msgid "Approve"
691 msgstr "Έγκριση"
692
693-#: html.c:3106
694+#: html.c:3204
695 msgid "Approve this follow request"
696 msgstr "Έγκριση αυτού του αιτήματος ακόλουθου"
697
698-#: html.c:3109 html.c:4544
699+#: html.c:3207 html.c:4712
700 msgid "Discard"
701 msgstr "Απόρριψη"
702
703-#: html.c:3109
704+#: html.c:3207
705 msgid "Discard this follow request"
706 msgstr "Απόρριψη αυτού του αιτήματος ακόλουθου"
707
708-#: html.c:3114 html.c:4393
709+#: html.c:3212 html.c:4556
710 msgid "Unmute"
711 msgstr "Αφαίρεση σίγασης"
712
713-#: html.c:3115
714+#: html.c:3213
715 msgid "Stop blocking activities from this user"
716 msgstr "Διακοπή αποκλεισμού δραστηριοτήτων από αυτό το χρήστη"
717
718-#: html.c:3119
719+#: html.c:3217
720 msgid "Block any activity from this user"
721 msgstr "Αποκλεισμός οποιασδήποτε δραστηριότητας από αυτό τον χρήστη"
722
723-#: html.c:3127
724+#: html.c:3225
725 msgid "Direct Message..."
726 msgstr "Απευθείας Μήνυμα..."
727
728-#: html.c:3162
729+#: html.c:3260
730 msgid "Pending follow confirmations"
731 msgstr "Εκκεμείς επιβεβαιώσεις ακολουθήσεων"
732
733-#: html.c:3166
734+#: html.c:3264
735 msgid "People you follow"
736 msgstr "Άνθρωποι που ακολουθείτε"
737
738-#: html.c:3167
739+#: html.c:3265
740 msgid "People that follow you"
741 msgstr "Άνθρωποι που σας ακολουθούν"
742
743-#: html.c:3206
744+#: html.c:3304
745 msgid "Clear all"
746 msgstr "Εκκαθάριση όλων"
747
748-#: html.c:3263
749+#: html.c:3361
750 msgid "Mention"
751 msgstr "Αναφορά"
752
753-#: html.c:3266
754+#: html.c:3364
755 msgid "Finished poll"
756 msgstr "Ολοκληρωμένη δημοσκόπηση"
757
758-#: html.c:3281
759+#: html.c:3379
760 msgid "Follow Request"
761 msgstr "Αίτημα Ακόλουθου"
762
763-#: html.c:3364
764+#: html.c:3462
765 msgid "Context"
766 msgstr "Περιεχόμενο"
767
768-#: html.c:3375
769+#: html.c:3473
770 msgid "New"
771 msgstr "Νέο"
772
773-#: html.c:3390
774+#: html.c:3488
775 msgid "Already seen"
776 msgstr "Έχει ήδη προβληθεί"
777
778-#: html.c:3405
779+#: html.c:3503
780 msgid "None"
781 msgstr "Κανένα"
782
783-#: html.c:3671
784+#: html.c:3769
785 #, c-format
786 msgid "Search results for account %s"
787 msgstr "Αποτελέσματα αναζήτηση για λογαριασμό %s"
788
789-#: html.c:3678
790+#: html.c:3776
791 #, c-format
792 msgid "Account %s not found"
793 msgstr "Ο λογαριασμός %s δεν βρέθηκε"
794
795-#: html.c:3709
796+#: html.c:3807
797 #, c-format
798 msgid "Search results for tag %s"
799 msgstr "Αποτελέσματα αναζήτησης για ετικέτα %s"
800
801-#: html.c:3709
802+#: html.c:3807
803 #, c-format
804 msgid "Nothing found for tag %s"
805 msgstr "Δε βρέθηκε κάτι για ετικέτα %s"
806
807-#: html.c:3725
808+#: html.c:3823
809 #, c-format
810 msgid "Search results for '%s' (may be more)"
811 msgstr "Αποτελέσματα αναζήτησης για '%s' (μπορεί να υπάρχουν περισσότερα)"
812
813-#: html.c:3728
814+#: html.c:3826
815 #, c-format
816 msgid "Search results for '%s'"
817 msgstr "Αποτελέσματα αναζήτησης για '%s'"
818
819-#: html.c:3731
820+#: html.c:3829
821 #, c-format
822 msgid "No more matches for '%s'"
823 msgstr "Δεν υπάρχουν άλλα αποτελέσματα για '%s'"
824
825-#: html.c:3733
826+#: html.c:3831
827 #, c-format
828 msgid "Nothing found for '%s'"
829 msgstr "Δε βρέθηκε κάτι για '%s'"
830
831-#: html.c:3831
832+#: html.c:3929
833 msgid "Showing instance timeline"
834 msgstr "Προβάλλεται η ροή του διακομιστή"
835
836-#: html.c:3899
837+#: html.c:4012
838 #, c-format
839 msgid "Showing timeline for list '%s'"
840 msgstr "Προβάλετε η ροή της λίστας '%s'"
841@@ -696,15 +696,15 @@ msgstr "Αποτελέσματα αναζήτησης για ετικέτα #%s"
842 msgid "Recent posts by users in this instance"
843 msgstr "Πρόσφατες αναρτήσεις από χρήστες σε αυτό τον ιστότοπο"
844
845-#: html.c:1529
846+#: html.c:1603
847 msgid "Blocked hashtags..."
848 msgstr "Αποκλεισμένες ετικέτες..."
849
850-#: html.c:420
851+#: html.c:432
852 msgid "Optional URL to reply to"
853 msgstr ""
854
855-#: html.c:527
856+#: html.c:575
857 msgid ""
858 "Option 1...\n"
859 "Option 2...\n"
860@@ -712,30 +712,54 @@ msgid ""
861 "..."
862 msgstr ""
863
864-#: html.c:1346
865+#: html.c:1415
866 msgid "Bot API key"
867 msgstr ""
868
869-#: html.c:1352
870+#: html.c:1421
871 msgid "Chat id"
872 msgstr ""
873
874-#: html.c:1360
875+#: html.c:1429
876 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
877 msgstr ""
878
879-#: html.c:1366
880+#: html.c:1435
881 msgid "ntfy token - if needed"
882 msgstr ""
883
884-#: html.c:2806
885+#: html.c:2892
886 msgid "pinned"
887 msgstr ""
888
889-#: html.c:2818
890+#: html.c:2904
891 msgid "bookmarks"
892 msgstr ""
893
894-#: html.c:2830
895+#: html.c:2916
896 msgid "drafts"
897 msgstr ""
898+
899+#: html.c:464
900+msgid "Scheduled post..."
901+msgstr ""
902+
903+msgid "Post date and time:"
904+msgstr ""
905+
906+#: html.c:2927 html.c:3989
907+msgid "Scheduled posts"
908+msgstr ""
909+
910+#: html.c:2928
911+msgid "scheduled posts"
912+msgstr ""
913+
914+#: html.c:458
915+#, c-format
916+msgid "Post date and time (timezone: %s):"
917+msgstr ""
918+
919+#: html.c:1538
920+msgid "Time zone:"
921+msgstr ""
M
po/en.po
+198,
-174
1@@ -8,671 +8,671 @@ msgstr ""
2 "Language: en\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr ""
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr ""
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr ""
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr ""
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr ""
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr ""
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr ""
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr ""
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr ""
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr ""
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr ""
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr ""
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr ""
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr ""
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr ""
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr ""
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr ""
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr ""
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr ""
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr ""
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr ""
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr ""
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr ""
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr ""
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr ""
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr ""
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr ""
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr ""
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151 msgstr ""
152
153-#: html.c:898
154+#: html.c:946
155 msgid "Content search"
156 msgstr ""
157
158-#: html.c:1020
159+#: html.c:1068
160 msgid "verified link"
161 msgstr ""
162
163-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
164+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
165 msgid "Location: "
166 msgstr ""
167
168-#: html.c:1113
169+#: html.c:1161
170 msgid "New Post..."
171 msgstr ""
172
173-#: html.c:1115
174+#: html.c:1163
175 msgid "What's on your mind?"
176 msgstr ""
177
178-#: html.c:1124
179+#: html.c:1172
180 msgid "Operations..."
181 msgstr ""
182
183-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
184+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
185 msgid "Follow"
186 msgstr ""
187
188-#: html.c:1141
189+#: html.c:1189
190 msgid "(by URL or user@host)"
191 msgstr ""
192
193-#: html.c:1156 html.c:1690 html.c:4364
194+#: html.c:1204 html.c:1764 html.c:4527
195 msgid "Boost"
196 msgstr ""
197
198-#: html.c:1158 html.c:1175
199+#: html.c:1206 html.c:1223
200 msgid "(by URL)"
201 msgstr ""
202
203-#: html.c:1173 html.c:1669 html.c:4355
204+#: html.c:1221 html.c:1743 html.c:4518
205 msgid "Like"
206 msgstr ""
207
208-#: html.c:1278
209+#: html.c:1347
210 msgid "User Settings..."
211 msgstr ""
212
213-#: html.c:1287
214+#: html.c:1356
215 msgid "Display name:"
216 msgstr ""
217
218-#: html.c:1293
219+#: html.c:1362
220 msgid "Your name"
221 msgstr ""
222
223-#: html.c:1295
224+#: html.c:1364
225 msgid "Avatar: "
226 msgstr ""
227
228-#: html.c:1303
229+#: html.c:1372
230 msgid "Delete current avatar"
231 msgstr ""
232
233-#: html.c:1305
234+#: html.c:1374
235 msgid "Header image (banner): "
236 msgstr ""
237
238-#: html.c:1313
239+#: html.c:1382
240 msgid "Delete current header image"
241 msgstr ""
242
243-#: html.c:1315
244+#: html.c:1384
245 msgid "Bio:"
246 msgstr ""
247
248-#: html.c:1321
249+#: html.c:1390
250 msgid "Write about yourself here..."
251 msgstr ""
252
253-#: html.c:1330
254+#: html.c:1399
255 msgid "Always show sensitive content"
256 msgstr ""
257
258-#: html.c:1332
259+#: html.c:1401
260 msgid "Email address for notifications:"
261 msgstr ""
262
263-#: html.c:1340
264+#: html.c:1409
265 msgid "Telegram notifications (bot key and chat id):"
266 msgstr ""
267
268-#: html.c:1354
269+#: html.c:1423
270 msgid "ntfy notifications (ntfy server and token):"
271 msgstr ""
272
273-#: html.c:1368
274+#: html.c:1437
275 msgid "Maximum days to keep posts (0: server settings):"
276 msgstr ""
277
278-#: html.c:1382
279+#: html.c:1451
280 msgid "Drop direct messages from people you don't follow"
281 msgstr ""
282
283-#: html.c:1391
284+#: html.c:1460
285 msgid "This account is a bot"
286 msgstr ""
287
288-#: html.c:1400
289+#: html.c:1469
290 msgid "Auto-boost all mentions to this account"
291 msgstr ""
292
293-#: html.c:1409
294+#: html.c:1478
295 msgid "This account is private (posts are not shown through the web)"
296 msgstr ""
297
298-#: html.c:1419
299+#: html.c:1488
300 msgid "Collapse top threads by default"
301 msgstr ""
302
303-#: html.c:1428
304+#: html.c:1497
305 msgid "Follow requests must be approved"
306 msgstr ""
307
308-#: html.c:1437
309+#: html.c:1506
310 msgid "Publish follower and following metrics"
311 msgstr ""
312
313-#: html.c:1439
314+#: html.c:1508
315 msgid "Current location:"
316 msgstr ""
317
318-#: html.c:1453
319+#: html.c:1522
320 msgid "Profile metadata (key=value pairs in each line):"
321 msgstr ""
322
323-#: html.c:1464
324+#: html.c:1533
325 msgid "Web interface language:"
326 msgstr ""
327
328-#: html.c:1469
329+#: html.c:1543
330 msgid "New password:"
331 msgstr ""
332
333-#: html.c:1476
334+#: html.c:1550
335 msgid "Repeat new password:"
336 msgstr ""
337
338-#: html.c:1486
339+#: html.c:1560
340 msgid "Update user info"
341 msgstr ""
342
343-#: html.c:1497
344+#: html.c:1571
345 msgid "Followed hashtags..."
346 msgstr ""
347
348-#: html.c:1499 html.c:1531
349+#: html.c:1573 html.c:1605
350 msgid "One hashtag per line"
351 msgstr ""
352
353-#: html.c:1520 html.c:1552
354+#: html.c:1594 html.c:1626
355 msgid "Update hashtags"
356 msgstr ""
357
358-#: html.c:1669
359+#: html.c:1743
360 msgid "Say you like this post"
361 msgstr ""
362
363-#: html.c:1674 html.c:4373
364+#: html.c:1748 html.c:4536
365 msgid "Unlike"
366 msgstr ""
367
368-#: html.c:1674
369+#: html.c:1748
370 msgid "Nah don't like it that much"
371 msgstr ""
372
373-#: html.c:1680 html.c:4505
374+#: html.c:1754 html.c:4673
375 msgid "Unpin"
376 msgstr ""
377
378-#: html.c:1680
379+#: html.c:1754
380 msgid "Unpin this post from your timeline"
381 msgstr ""
382
383-#: html.c:1683 html.c:4500
384+#: html.c:1757 html.c:4668
385 msgid "Pin"
386 msgstr ""
387
388-#: html.c:1683
389+#: html.c:1757
390 msgid "Pin this post to the top of your timeline"
391 msgstr ""
392
393-#: html.c:1690
394+#: html.c:1764
395 msgid "Announce this post to your followers"
396 msgstr ""
397
398-#: html.c:1695 html.c:4381
399+#: html.c:1769 html.c:4544
400 msgid "Unboost"
401 msgstr ""
402
403-#: html.c:1695
404+#: html.c:1769
405 msgid "I regret I boosted this"
406 msgstr ""
407
408-#: html.c:1701 html.c:4515
409+#: html.c:1775 html.c:4683
410 msgid "Unbookmark"
411 msgstr ""
412
413-#: html.c:1701
414+#: html.c:1775
415 msgid "Delete this post from your bookmarks"
416 msgstr ""
417
418-#: html.c:1704 html.c:4510
419+#: html.c:1778 html.c:4678
420 msgid "Bookmark"
421 msgstr ""
422
423-#: html.c:1704
424+#: html.c:1778
425 msgid "Add this post to your bookmarks"
426 msgstr ""
427
428-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
429+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
430 msgid "Unfollow"
431 msgstr ""
432
433-#: html.c:1710 html.c:3082
434+#: html.c:1784 html.c:3180
435 msgid "Stop following this user's activity"
436 msgstr ""
437
438-#: html.c:1714 html.c:3096
439+#: html.c:1788 html.c:3194
440 msgid "Start following this user's activity"
441 msgstr ""
442
443-#: html.c:1720 html.c:4455
444+#: html.c:1794 html.c:4621
445 msgid "Unfollow Group"
446 msgstr ""
447
448-#: html.c:1721
449+#: html.c:1795
450 msgid "Stop following this group or channel"
451 msgstr ""
452
453-#: html.c:1725 html.c:4442
454+#: html.c:1799 html.c:4608
455 msgid "Follow Group"
456 msgstr ""
457
458-#: html.c:1726
459+#: html.c:1800
460 msgid "Start following this group or channel"
461 msgstr ""
462
463-#: html.c:1731 html.c:3118 html.c:4389
464+#: html.c:1805 html.c:3216 html.c:4552
465 msgid "MUTE"
466 msgstr ""
467
468-#: html.c:1732
469+#: html.c:1806
470 msgid "Block any activity from this user forever"
471 msgstr ""
472
473-#: html.c:1737 html.c:3100 html.c:4472
474+#: html.c:1811 html.c:3198 html.c:4638
475 msgid "Delete"
476 msgstr ""
477
478-#: html.c:1737
479+#: html.c:1811
480 msgid "Delete this post"
481 msgstr ""
482
483-#: html.c:1740 html.c:4397
484+#: html.c:1814 html.c:4560
485 msgid "Hide"
486 msgstr ""
487
488-#: html.c:1740
489+#: html.c:1814
490 msgid "Hide this post and its children"
491 msgstr ""
492
493-#: html.c:1771
494+#: html.c:1845
495 msgid "Edit..."
496 msgstr ""
497
498-#: html.c:1790
499+#: html.c:1865
500 msgid "Reply..."
501 msgstr ""
502
503-#: html.c:1841
504+#: html.c:1916
505 msgid "Truncated (too deep)"
506 msgstr ""
507
508-#: html.c:1850
509+#: html.c:1925
510 msgid "follows you"
511 msgstr ""
512
513-#: html.c:1913
514+#: html.c:1988
515 msgid "Pinned"
516 msgstr ""
517
518-#: html.c:1921
519+#: html.c:1996
520 msgid "Bookmarked"
521 msgstr ""
522
523-#: html.c:1929
524+#: html.c:2004
525 msgid "Poll"
526 msgstr ""
527
528-#: html.c:1936
529+#: html.c:2011
530 msgid "Voted"
531 msgstr ""
532
533-#: html.c:1945
534+#: html.c:2020
535 msgid "Event"
536 msgstr ""
537
538-#: html.c:1977 html.c:2006
539+#: html.c:2052 html.c:2081
540 msgid "boosted"
541 msgstr ""
542
543-#: html.c:2022
544+#: html.c:2097
545 msgid "in reply to"
546 msgstr ""
547
548-#: html.c:2073
549+#: html.c:2148
550 msgid " [SENSITIVE CONTENT]"
551 msgstr ""
552
553-#: html.c:2250
554+#: html.c:2325
555 msgid "Vote"
556 msgstr ""
557
558-#: html.c:2260
559+#: html.c:2335
560 msgid "Closed"
561 msgstr ""
562
563-#: html.c:2285
564+#: html.c:2360
565 msgid "Closes in"
566 msgstr ""
567
568-#: html.c:2366
569+#: html.c:2441
570 msgid "Video"
571 msgstr ""
572
573-#: html.c:2381
574+#: html.c:2456
575 msgid "Audio"
576 msgstr ""
577
578-#: html.c:2403
579+#: html.c:2484
580 msgid "Attachment"
581 msgstr ""
582
583-#: html.c:2417
584+#: html.c:2498
585 msgid "Alt..."
586 msgstr ""
587
588-#: html.c:2430
589+#: html.c:2511
590 msgid "Source channel or community"
591 msgstr ""
592
593-#: html.c:2524
594+#: html.c:2605
595 msgid "Time: "
596 msgstr ""
597
598-#: html.c:2605
599+#: html.c:2686
600 msgid "Older..."
601 msgstr ""
602
603-#: html.c:2702
604+#: html.c:2788
605 msgid "about this site"
606 msgstr ""
607
608-#: html.c:2704
609+#: html.c:2790
610 msgid "powered by "
611 msgstr ""
612
613-#: html.c:2769
614+#: html.c:2855
615 msgid "Dismiss"
616 msgstr ""
617
618-#: html.c:2786
619+#: html.c:2872
620 #, c-format
621 msgid "Timeline for list '%s'"
622 msgstr ""
623
624-#: html.c:2805 html.c:3846
625+#: html.c:2891 html.c:3944
626 msgid "Pinned posts"
627 msgstr ""
628
629-#: html.c:2817 html.c:3861
630+#: html.c:2903 html.c:3959
631 msgid "Bookmarked posts"
632 msgstr ""
633
634-#: html.c:2829 html.c:3876
635+#: html.c:2915 html.c:3974
636 msgid "Post drafts"
637 msgstr ""
638
639-#: html.c:2888
640+#: html.c:2986
641 msgid "No more unseen posts"
642 msgstr ""
643
644-#: html.c:2892 html.c:2992
645+#: html.c:2990 html.c:3090
646 msgid "Back to top"
647 msgstr ""
648
649-#: html.c:2945
650+#: html.c:3043
651 msgid "History"
652 msgstr ""
653
654-#: html.c:2997 html.c:3417
655+#: html.c:3095 html.c:3515
656 msgid "More..."
657 msgstr ""
658
659-#: html.c:3086 html.c:4408
660+#: html.c:3184 html.c:4574
661 msgid "Unlimit"
662 msgstr ""
663
664-#: html.c:3087
665+#: html.c:3185
666 msgid "Allow announces (boosts) from this user"
667 msgstr ""
668
669-#: html.c:3090 html.c:4404
670+#: html.c:3188 html.c:4570
671 msgid "Limit"
672 msgstr ""
673
674-#: html.c:3091
675+#: html.c:3189
676 msgid "Block announces (boosts) from this user"
677 msgstr ""
678
679-#: html.c:3100
680+#: html.c:3198
681 msgid "Delete this user"
682 msgstr ""
683
684-#: html.c:3105 html.c:4520
685+#: html.c:3203 html.c:4688
686 msgid "Approve"
687 msgstr ""
688
689-#: html.c:3106
690+#: html.c:3204
691 msgid "Approve this follow request"
692 msgstr ""
693
694-#: html.c:3109 html.c:4544
695+#: html.c:3207 html.c:4712
696 msgid "Discard"
697 msgstr ""
698
699-#: html.c:3109
700+#: html.c:3207
701 msgid "Discard this follow request"
702 msgstr ""
703
704-#: html.c:3114 html.c:4393
705+#: html.c:3212 html.c:4556
706 msgid "Unmute"
707 msgstr ""
708
709-#: html.c:3115
710+#: html.c:3213
711 msgid "Stop blocking activities from this user"
712 msgstr ""
713
714-#: html.c:3119
715+#: html.c:3217
716 msgid "Block any activity from this user"
717 msgstr ""
718
719-#: html.c:3127
720+#: html.c:3225
721 msgid "Direct Message..."
722 msgstr ""
723
724-#: html.c:3162
725+#: html.c:3260
726 msgid "Pending follow confirmations"
727 msgstr ""
728
729-#: html.c:3166
730+#: html.c:3264
731 msgid "People you follow"
732 msgstr ""
733
734-#: html.c:3167
735+#: html.c:3265
736 msgid "People that follow you"
737 msgstr ""
738
739-#: html.c:3206
740+#: html.c:3304
741 msgid "Clear all"
742 msgstr ""
743
744-#: html.c:3263
745+#: html.c:3361
746 msgid "Mention"
747 msgstr ""
748
749-#: html.c:3266
750+#: html.c:3364
751 msgid "Finished poll"
752 msgstr ""
753
754-#: html.c:3281
755+#: html.c:3379
756 msgid "Follow Request"
757 msgstr ""
758
759-#: html.c:3364
760+#: html.c:3462
761 msgid "Context"
762 msgstr ""
763
764-#: html.c:3375
765+#: html.c:3473
766 msgid "New"
767 msgstr ""
768
769-#: html.c:3390
770+#: html.c:3488
771 msgid "Already seen"
772 msgstr ""
773
774-#: html.c:3405
775+#: html.c:3503
776 msgid "None"
777 msgstr ""
778
779-#: html.c:3671
780+#: html.c:3769
781 #, c-format
782 msgid "Search results for account %s"
783 msgstr ""
784
785-#: html.c:3678
786+#: html.c:3776
787 #, c-format
788 msgid "Account %s not found"
789 msgstr ""
790
791-#: html.c:3709
792+#: html.c:3807
793 #, c-format
794 msgid "Search results for tag %s"
795 msgstr ""
796
797-#: html.c:3709
798+#: html.c:3807
799 #, c-format
800 msgid "Nothing found for tag %s"
801 msgstr ""
802
803-#: html.c:3725
804+#: html.c:3823
805 #, c-format
806 msgid "Search results for '%s' (may be more)"
807 msgstr ""
808
809-#: html.c:3728
810+#: html.c:3826
811 #, c-format
812 msgid "Search results for '%s'"
813 msgstr ""
814
815-#: html.c:3731
816+#: html.c:3829
817 #, c-format
818 msgid "No more matches for '%s'"
819 msgstr ""
820
821-#: html.c:3733
822+#: html.c:3831
823 #, c-format
824 msgid "Nothing found for '%s'"
825 msgstr ""
826
827-#: html.c:3831
828+#: html.c:3929
829 msgid "Showing instance timeline"
830 msgstr ""
831
832-#: html.c:3899
833+#: html.c:4012
834 #, c-format
835 msgid "Showing timeline for list '%s'"
836 msgstr ""
837@@ -686,15 +686,15 @@ msgstr ""
838 msgid "Recent posts by users in this instance"
839 msgstr ""
840
841-#: html.c:1529
842+#: html.c:1603
843 msgid "Blocked hashtags..."
844 msgstr ""
845
846-#: html.c:420
847+#: html.c:432
848 msgid "Optional URL to reply to"
849 msgstr ""
850
851-#: html.c:527
852+#: html.c:575
853 msgid ""
854 "Option 1...\n"
855 "Option 2...\n"
856@@ -702,30 +702,54 @@ msgid ""
857 "..."
858 msgstr ""
859
860-#: html.c:1346
861+#: html.c:1415
862 msgid "Bot API key"
863 msgstr ""
864
865-#: html.c:1352
866+#: html.c:1421
867 msgid "Chat id"
868 msgstr ""
869
870-#: html.c:1360
871+#: html.c:1429
872 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
873 msgstr ""
874
875-#: html.c:1366
876+#: html.c:1435
877 msgid "ntfy token - if needed"
878 msgstr ""
879
880-#: html.c:2806
881+#: html.c:2892
882 msgid "pinned"
883 msgstr ""
884
885-#: html.c:2818
886+#: html.c:2904
887 msgid "bookmarks"
888 msgstr ""
889
890-#: html.c:2830
891+#: html.c:2916
892 msgid "drafts"
893 msgstr ""
894+
895+#: html.c:464
896+msgid "Scheduled post..."
897+msgstr ""
898+
899+msgid "Post date and time:"
900+msgstr ""
901+
902+#: html.c:2927 html.c:3989
903+msgid "Scheduled posts"
904+msgstr ""
905+
906+#: html.c:2928
907+msgid "scheduled posts"
908+msgstr ""
909+
910+#: html.c:458
911+#, c-format
912+msgid "Post date and time (timezone: %s):"
913+msgstr ""
914+
915+#: html.c:1538
916+msgid "Time zone:"
917+msgstr ""
M
po/es.po
+196,
-174
1@@ -8,120 +8,120 @@ msgstr ""
2 "Language: es\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Contenido sensible: "
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Descripción del contenido sensible"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Solo personas mencionadas: "
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Responder a (URL): "
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "No enviar. Guardar como borrador"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Borrador:"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Adjuntos..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "Archivo:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "Limpiar este campo para eliminar el adjunto"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "Descripción del adjunto"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "Encuesta..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "Opciones de encuesta (una por línea, hasta 8):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "Una opción"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "Opciones múltiples"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "Finalizar en 5 minutos"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "Finalizar en 1 hora"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "Finalizar en 1 día"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr "Publicar"
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "Descripción del sitio"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "Email del Administrador"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "Cuenta del Administrador"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "%d siguiendo, %d seguidores"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "privado"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "público"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "notificaciones"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "personas"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "instancia"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151@@ -129,554 +129,554 @@ msgstr ""
152 "Buscar publicaciones por URL o contenido (expresiones regulares), cuenta "
153 "@usuario@host , ó #etiqueta"
154
155-#: html.c:898
156+#: html.c:946
157 msgid "Content search"
158 msgstr "Buscar contenido"
159
160-#: html.c:1020
161+#: html.c:1068
162 msgid "verified link"
163 msgstr "link verificado"
164
165-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
166+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
167 msgid "Location: "
168 msgstr "Ubicación: "
169
170-#: html.c:1113
171+#: html.c:1161
172 msgid "New Post..."
173 msgstr "Nueva Publicación..."
174
175-#: html.c:1115
176+#: html.c:1163
177 msgid "What's on your mind?"
178 msgstr "¿En qué estás pensando?"
179
180-#: html.c:1124
181+#: html.c:1172
182 msgid "Operations..."
183 msgstr "Operaciones..."
184
185-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
186+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
187 msgid "Follow"
188 msgstr "Seguir"
189
190-#: html.c:1141
191+#: html.c:1189
192 msgid "(by URL or user@host)"
193 msgstr "(por URL o usuario@host)"
194
195-#: html.c:1156 html.c:1690 html.c:4364
196+#: html.c:1204 html.c:1764 html.c:4527
197 msgid "Boost"
198 msgstr "Impulsar"
199
200-#: html.c:1158 html.c:1175
201+#: html.c:1206 html.c:1223
202 msgid "(by URL)"
203 msgstr "(por URL)"
204
205-#: html.c:1173 html.c:1669 html.c:4355
206+#: html.c:1221 html.c:1743 html.c:4518
207 msgid "Like"
208 msgstr "Me gusta"
209
210-#: html.c:1278
211+#: html.c:1347
212 msgid "User Settings..."
213 msgstr "Configuración de usuario..."
214
215-#: html.c:1287
216+#: html.c:1356
217 msgid "Display name:"
218 msgstr "Nombre para mostrar:"
219
220-#: html.c:1293
221+#: html.c:1362
222 msgid "Your name"
223 msgstr "Su nombre"
224
225-#: html.c:1295
226+#: html.c:1364
227 msgid "Avatar: "
228 msgstr "Avatar: "
229
230-#: html.c:1303
231+#: html.c:1372
232 msgid "Delete current avatar"
233 msgstr "Eliminar avatar"
234
235-#: html.c:1305
236+#: html.c:1374
237 msgid "Header image (banner): "
238 msgstr "Imagen de cabecera (banner): "
239
240-#: html.c:1313
241+#: html.c:1382
242 msgid "Delete current header image"
243 msgstr "Eliminar imagen de cabecera"
244
245-#: html.c:1315
246+#: html.c:1384
247 msgid "Bio:"
248 msgstr "Bio:"
249
250-#: html.c:1321
251+#: html.c:1390
252 msgid "Write about yourself here..."
253 msgstr "Escriba algo sobre usted aquí..."
254
255-#: html.c:1330
256+#: html.c:1399
257 msgid "Always show sensitive content"
258 msgstr "Siempre mostrar contenido sensible"
259
260-#: html.c:1332
261+#: html.c:1401
262 msgid "Email address for notifications:"
263 msgstr "Cuenta de email para las notificaciones:"
264
265-#: html.c:1340
266+#: html.c:1409
267 msgid "Telegram notifications (bot key and chat id):"
268 msgstr "Notificaciones en Telegram (llave del bot e id del chat):"
269
270-#: html.c:1354
271+#: html.c:1423
272 msgid "ntfy notifications (ntfy server and token):"
273 msgstr "Notificaciones en ntfy (servidor ntfy y token):"
274
275-#: html.c:1368
276+#: html.c:1437
277 msgid "Maximum days to keep posts (0: server settings):"
278 msgstr ""
279 "Plazo máximo de conservación de publicaciones en días (0: usar configuración "
280 "del servidor):"
281
282-#: html.c:1382
283+#: html.c:1451
284 msgid "Drop direct messages from people you don't follow"
285 msgstr "Descartar mensajes directos de personas a las que no sigue"
286
287-#: html.c:1391
288+#: html.c:1460
289 msgid "This account is a bot"
290 msgstr "Esta cuenta es un bot"
291
292-#: html.c:1400
293+#: html.c:1469
294 msgid "Auto-boost all mentions to this account"
295 msgstr "Impulsar automáticamente todas las menciones a esta cuenta"
296
297-#: html.c:1409
298+#: html.c:1478
299 msgid "This account is private (posts are not shown through the web)"
300 msgstr "Esta cuenta es privada (las publicaciones no se muestran en la web)"
301
302-#: html.c:1419
303+#: html.c:1488
304 msgid "Collapse top threads by default"
305 msgstr "Contraer hilo de publicaciones por defecto"
306
307-#: html.c:1428
308+#: html.c:1497
309 msgid "Follow requests must be approved"
310 msgstr "Las solicitudes de seguimiento deben ser aprobadas"
311
312-#: html.c:1437
313+#: html.c:1506
314 msgid "Publish follower and following metrics"
315 msgstr "Mostrar cantidad de seguidores y seguidos"
316
317-#: html.c:1439
318+#: html.c:1508
319 msgid "Current location:"
320 msgstr "Ubicación actual:"
321
322-#: html.c:1453
323+#: html.c:1522
324 msgid "Profile metadata (key=value pairs in each line):"
325 msgstr "Metadata del perfil (pares llave=valor en cada línea):"
326
327-#: html.c:1464
328+#: html.c:1533
329 msgid "Web interface language:"
330 msgstr "Idioma de la interfaz Web:"
331
332-#: html.c:1469
333+#: html.c:1543
334 msgid "New password:"
335 msgstr "Nueva contraseña:"
336
337-#: html.c:1476
338+#: html.c:1550
339 msgid "Repeat new password:"
340 msgstr "Repetir nueva contraseña:"
341
342-#: html.c:1486
343+#: html.c:1560
344 msgid "Update user info"
345 msgstr "Actualizar información de usuario"
346
347-#: html.c:1497
348+#: html.c:1571
349 msgid "Followed hashtags..."
350 msgstr "Etiquetas en seguimiento..."
351
352-#: html.c:1499 html.c:1531
353+#: html.c:1573 html.c:1605
354 msgid "One hashtag per line"
355 msgstr "Una etiqueta por línea"
356
357-#: html.c:1520 html.c:1552
358+#: html.c:1594 html.c:1626
359 msgid "Update hashtags"
360 msgstr "Actualizar etiquetas"
361
362-#: html.c:1669
363+#: html.c:1743
364 msgid "Say you like this post"
365 msgstr "Decir que te gusta esta publicación"
366
367-#: html.c:1674 html.c:4373
368+#: html.c:1748 html.c:4536
369 msgid "Unlike"
370 msgstr "No me gusta"
371
372-#: html.c:1674
373+#: html.c:1748
374 msgid "Nah don't like it that much"
375 msgstr "Nah, no me gusta tanto"
376
377-#: html.c:1680 html.c:4505
378+#: html.c:1754 html.c:4673
379 msgid "Unpin"
380 msgstr "Desanclar"
381
382-#: html.c:1680
383+#: html.c:1754
384 msgid "Unpin this post from your timeline"
385 msgstr "Desanclar esta publicación de su línea de tiempo"
386
387-#: html.c:1683 html.c:4500
388+#: html.c:1757 html.c:4668
389 msgid "Pin"
390 msgstr "Anclar"
391
392-#: html.c:1683
393+#: html.c:1757
394 msgid "Pin this post to the top of your timeline"
395 msgstr "Anclar esta publicación al inicio de su línea de tiempo"
396
397-#: html.c:1690
398+#: html.c:1764
399 msgid "Announce this post to your followers"
400 msgstr "Anunciar esta publicación a sus seguidores"
401
402-#: html.c:1695 html.c:4381
403+#: html.c:1769 html.c:4544
404 msgid "Unboost"
405 msgstr "Eliminar impulso"
406
407-#: html.c:1695
408+#: html.c:1769
409 msgid "I regret I boosted this"
410 msgstr "Me arrepiento de haber impulsado esto"
411
412-#: html.c:1701 html.c:4515
413+#: html.c:1775 html.c:4683
414 msgid "Unbookmark"
415 msgstr "Eliminar marcador"
416
417-#: html.c:1701
418+#: html.c:1775
419 msgid "Delete this post from your bookmarks"
420 msgstr "Eliminar marcador de esta publicación"
421
422-#: html.c:1704 html.c:4510
423+#: html.c:1778 html.c:4678
424 msgid "Bookmark"
425 msgstr "Marcador"
426
427-#: html.c:1704
428+#: html.c:1778
429 msgid "Add this post to your bookmarks"
430 msgstr "Agregar esta publicación a mis marcadores"
431
432-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
433+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
434 msgid "Unfollow"
435 msgstr "Dejar de seguir"
436
437-#: html.c:1710 html.c:3082
438+#: html.c:1784 html.c:3180
439 msgid "Stop following this user's activity"
440 msgstr "Dejar de seguir la actividad de este usuario"
441
442-#: html.c:1714 html.c:3096
443+#: html.c:1788 html.c:3194
444 msgid "Start following this user's activity"
445 msgstr "Seguir la actividad de este usuario"
446
447-#: html.c:1720 html.c:4455
448+#: html.c:1794 html.c:4621
449 msgid "Unfollow Group"
450 msgstr "Dejar de seguir este Grupo"
451
452-#: html.c:1721
453+#: html.c:1795
454 msgid "Stop following this group or channel"
455 msgstr "Dejar de seguir este grupo o canal"
456
457-#: html.c:1725 html.c:4442
458+#: html.c:1799 html.c:4608
459 msgid "Follow Group"
460 msgstr "Seguir Grupo"
461
462-#: html.c:1726
463+#: html.c:1800
464 msgid "Start following this group or channel"
465 msgstr "Seguir grupo o canal"
466
467-#: html.c:1731 html.c:3118 html.c:4389
468+#: html.c:1805 html.c:3216 html.c:4552
469 msgid "MUTE"
470 msgstr "SILENCIAR"
471
472-#: html.c:1732
473+#: html.c:1806
474 msgid "Block any activity from this user forever"
475 msgstr "Bloquear toda la actividad de este usuario para siempre"
476
477-#: html.c:1737 html.c:3100 html.c:4472
478+#: html.c:1811 html.c:3198 html.c:4638
479 msgid "Delete"
480 msgstr "Eliminar"
481
482-#: html.c:1737
483+#: html.c:1811
484 msgid "Delete this post"
485 msgstr "Eliminar esta publicación"
486
487-#: html.c:1740 html.c:4397
488+#: html.c:1814 html.c:4560
489 msgid "Hide"
490 msgstr "Ocultar"
491
492-#: html.c:1740
493+#: html.c:1814
494 msgid "Hide this post and its children"
495 msgstr "Ocultar esta publicación y sus respuestas"
496
497-#: html.c:1771
498+#: html.c:1845
499 msgid "Edit..."
500 msgstr "Editar..."
501
502-#: html.c:1790
503+#: html.c:1865
504 msgid "Reply..."
505 msgstr "Responder..."
506
507-#: html.c:1841
508+#: html.c:1916
509 msgid "Truncated (too deep)"
510 msgstr "Truncado (demasiado profundo)"
511
512-#: html.c:1850
513+#: html.c:1925
514 msgid "follows you"
515 msgstr "te sigue"
516
517-#: html.c:1913
518+#: html.c:1988
519 msgid "Pinned"
520 msgstr "Anclado"
521
522-#: html.c:1921
523+#: html.c:1996
524 msgid "Bookmarked"
525 msgstr "Marcado"
526
527-#: html.c:1929
528+#: html.c:2004
529 msgid "Poll"
530 msgstr "Encuesta"
531
532-#: html.c:1936
533+#: html.c:2011
534 msgid "Voted"
535 msgstr "Votado"
536
537-#: html.c:1945
538+#: html.c:2020
539 msgid "Event"
540 msgstr "Evento"
541
542-#: html.c:1977 html.c:2006
543+#: html.c:2052 html.c:2081
544 msgid "boosted"
545 msgstr "impulsado"
546
547-#: html.c:2022
548+#: html.c:2097
549 msgid "in reply to"
550 msgstr "en respuesta a"
551
552-#: html.c:2073
553+#: html.c:2148
554 msgid " [SENSITIVE CONTENT]"
555 msgstr " [CONTENIDO SENSIBLE]"
556
557-#: html.c:2250
558+#: html.c:2325
559 msgid "Vote"
560 msgstr "Votar"
561
562-#: html.c:2260
563+#: html.c:2335
564 msgid "Closed"
565 msgstr "Cerrado"
566
567-#: html.c:2285
568+#: html.c:2360
569 msgid "Closes in"
570 msgstr "Cierra en"
571
572-#: html.c:2366
573+#: html.c:2441
574 msgid "Video"
575 msgstr "Video"
576
577-#: html.c:2381
578+#: html.c:2456
579 msgid "Audio"
580 msgstr "Audio"
581
582-#: html.c:2403
583+#: html.c:2484
584 msgid "Attachment"
585 msgstr "Adjunto"
586
587-#: html.c:2417
588+#: html.c:2498
589 msgid "Alt..."
590 msgstr "Alt..."
591
592-#: html.c:2430
593+#: html.c:2511
594 msgid "Source channel or community"
595 msgstr "Canal o comunidad de origen"
596
597-#: html.c:2524
598+#: html.c:2605
599 msgid "Time: "
600 msgstr "Hora: "
601
602-#: html.c:2605
603+#: html.c:2686
604 msgid "Older..."
605 msgstr "Más antiguo..."
606
607-#: html.c:2702
608+#: html.c:2788
609 msgid "about this site"
610 msgstr "acerca de este sitio"
611
612-#: html.c:2704
613+#: html.c:2790
614 msgid "powered by "
615 msgstr "provisto por "
616
617-#: html.c:2769
618+#: html.c:2855
619 msgid "Dismiss"
620 msgstr "Descartar"
621
622-#: html.c:2786
623+#: html.c:2872
624 #, c-format
625 msgid "Timeline for list '%s'"
626 msgstr "Línea de tiempo de la lista '%s'"
627
628-#: html.c:2805 html.c:3846
629+#: html.c:2891 html.c:3944
630 msgid "Pinned posts"
631 msgstr "Publicaciones ancladas"
632
633-#: html.c:2817 html.c:3861
634+#: html.c:2903 html.c:3959
635 msgid "Bookmarked posts"
636 msgstr "Publicaciones marcadas"
637
638-#: html.c:2829 html.c:3876
639+#: html.c:2915 html.c:3974
640 msgid "Post drafts"
641 msgstr "Borradores de publicaciones"
642
643-#: html.c:2888
644+#: html.c:2986
645 msgid "No more unseen posts"
646 msgstr "No quedan publicaciones sin ver"
647
648-#: html.c:2892 html.c:2992
649+#: html.c:2990 html.c:3090
650 msgid "Back to top"
651 msgstr "Volver al inicio"
652
653-#: html.c:2945
654+#: html.c:3043
655 msgid "History"
656 msgstr "Historia"
657
658-#: html.c:2997 html.c:3417
659+#: html.c:3095 html.c:3515
660 msgid "More..."
661 msgstr "Más..."
662
663-#: html.c:3086 html.c:4408
664+#: html.c:3184 html.c:4574
665 msgid "Unlimit"
666 msgstr "Sin límite"
667
668-#: html.c:3087
669+#: html.c:3185
670 msgid "Allow announces (boosts) from this user"
671 msgstr "Permitir anuncios (impulsos) de este usuario"
672
673-#: html.c:3090 html.c:4404
674+#: html.c:3188 html.c:4570
675 msgid "Limit"
676 msgstr "Límite"
677
678-#: html.c:3091
679+#: html.c:3189
680 msgid "Block announces (boosts) from this user"
681 msgstr "Bloquear anuncios (impulsos) de este usuario"
682
683-#: html.c:3100
684+#: html.c:3198
685 msgid "Delete this user"
686 msgstr "Eliminar este usuario"
687
688-#: html.c:3105 html.c:4520
689+#: html.c:3203 html.c:4688
690 msgid "Approve"
691 msgstr "Aprobar"
692
693-#: html.c:3106
694+#: html.c:3204
695 msgid "Approve this follow request"
696 msgstr "Aprobar solicitud de seguimiento"
697
698-#: html.c:3109 html.c:4544
699+#: html.c:3207 html.c:4712
700 msgid "Discard"
701 msgstr "Descartar"
702
703-#: html.c:3109
704+#: html.c:3207
705 msgid "Discard this follow request"
706 msgstr "Descartar solicitud de seguimiento"
707
708-#: html.c:3114 html.c:4393
709+#: html.c:3212 html.c:4556
710 msgid "Unmute"
711 msgstr "Dejar de SILENCIAR"
712
713-#: html.c:3115
714+#: html.c:3213
715 msgid "Stop blocking activities from this user"
716 msgstr "Dejar de bloquear actividad de este usuario"
717
718-#: html.c:3119
719+#: html.c:3217
720 msgid "Block any activity from this user"
721 msgstr "Bloquear toda actividad de este usuario"
722
723-#: html.c:3127
724+#: html.c:3225
725 msgid "Direct Message..."
726 msgstr "Mensaje Directo..."
727
728-#: html.c:3162
729+#: html.c:3260
730 msgid "Pending follow confirmations"
731 msgstr "Confirmaciones de seguimiento pendientes"
732
733-#: html.c:3166
734+#: html.c:3264
735 msgid "People you follow"
736 msgstr "Personas que sigues"
737
738-#: html.c:3167
739+#: html.c:3265
740 msgid "People that follow you"
741 msgstr "Personas que te siguen"
742
743-#: html.c:3206
744+#: html.c:3304
745 msgid "Clear all"
746 msgstr "Limpiar todo"
747
748-#: html.c:3263
749+#: html.c:3361
750 msgid "Mention"
751 msgstr "Mención"
752
753-#: html.c:3266
754+#: html.c:3364
755 msgid "Finished poll"
756 msgstr "Encuesta finalizada"
757
758-#: html.c:3281
759+#: html.c:3379
760 msgid "Follow Request"
761 msgstr "Solicitud de Seguimiento"
762
763-#: html.c:3364
764+#: html.c:3462
765 msgid "Context"
766 msgstr "Contexto"
767
768-#: html.c:3375
769+#: html.c:3473
770 msgid "New"
771 msgstr "Nuevo"
772
773-#: html.c:3390
774+#: html.c:3488
775 msgid "Already seen"
776 msgstr "Ya visto"
777
778-#: html.c:3405
779+#: html.c:3503
780 msgid "None"
781 msgstr "Ninguno"
782
783-#: html.c:3671
784+#: html.c:3769
785 #, c-format
786 msgid "Search results for account %s"
787 msgstr "Buscar resultados para la cuenta %s"
788
789-#: html.c:3678
790+#: html.c:3776
791 #, c-format
792 msgid "Account %s not found"
793 msgstr "No se encontró la cuenta %s"
794
795-#: html.c:3709
796+#: html.c:3807
797 #, c-format
798 msgid "Search results for tag %s"
799 msgstr "Buscar resultados para la etiqueta %s"
800
801-#: html.c:3709
802+#: html.c:3807
803 #, c-format
804 msgid "Nothing found for tag %s"
805 msgstr "No se encontró nada con la etiqueta %s"
806
807-#: html.c:3725
808+#: html.c:3823
809 #, c-format
810 msgid "Search results for '%s' (may be more)"
811 msgstr "Resultados de búsqueda para '%s' (puede haber más)"
812
813-#: html.c:3728
814+#: html.c:3826
815 #, c-format
816 msgid "Search results for '%s'"
817 msgstr "Resultados de búsqueda para '%s'"
818
819-#: html.c:3731
820+#: html.c:3829
821 #, c-format
822 msgid "No more matches for '%s'"
823 msgstr "No hay más coincidencias para '%s'"
824
825-#: html.c:3733
826+#: html.c:3831
827 #, c-format
828 msgid "Nothing found for '%s'"
829 msgstr "No se encontró nada para '%s'"
830
831-#: html.c:3831
832+#: html.c:3929
833 msgid "Showing instance timeline"
834 msgstr "Mostrando línea de tiempo de la instancia"
835
836-#: html.c:3899
837+#: html.c:4012
838 #, c-format
839 msgid "Showing timeline for list '%s'"
840 msgstr "Mostrando línea de tiempo de la lista '%s'"
841@@ -690,15 +690,15 @@ msgstr "Resultado de búsqueda para la etiqueta #%s"
842 msgid "Recent posts by users in this instance"
843 msgstr "Publicaciones recientes de los usuarios de esta instancia"
844
845-#: html.c:1529
846+#: html.c:1603
847 msgid "Blocked hashtags..."
848 msgstr "Etiquetas bloqueadas..."
849
850-#: html.c:420
851+#: html.c:432
852 msgid "Optional URL to reply to"
853 msgstr "URL opcional a la que responder"
854
855-#: html.c:527
856+#: html.c:575
857 msgid ""
858 "Option 1...\n"
859 "Option 2...\n"
860@@ -708,31 +708,53 @@ msgstr ""
861 "Opción 1...\n"
862 "Opción 2...\n"
863 "Opción 3...\n"
864+"..."
865
866-#: html.c:1346
867+#: html.c:1415
868 msgid "Bot API key"
869 msgstr "Clave del API del Bot"
870
871-#: html.c:1352
872+#: html.c:1421
873 msgid "Chat id"
874 msgstr "Identificador de chat"
875
876-#: html.c:1360
877+#: html.c:1429
878 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
879 msgstr "Servidor ntfy - URL completa (example: https://ntfy.sh/YourTopic)"
880
881-#: html.c:1366
882+#: html.c:1435
883 msgid "ntfy token - if needed"
884 msgstr "Token ntft - si es necesario"
885
886-#: html.c:2806
887+#: html.c:2892
888 msgid "pinned"
889 msgstr "Anclados"
890
891-#: html.c:2818
892+#: html.c:2904
893 msgid "bookmarks"
894 msgstr "Marcados"
895
896-#: html.c:2830
897+#: html.c:2916
898 msgid "drafts"
899 msgstr "Borradores"
900+
901+#: html.c:464
902+msgid "Scheduled post..."
903+msgstr "Envío programado..."
904+
905+#: html.c:2927 html.c:3989
906+msgid "Scheduled posts"
907+msgstr "Envíos programados"
908+
909+#: html.c:2928
910+msgid "scheduled posts"
911+msgstr "envíos programados"
912+
913+#: html.c:458
914+#, c-format
915+msgid "Post date and time (timezone: %s):"
916+msgstr "Fecha y hora de publicación (zona horaria: %s):"
917+
918+#: html.c:1538
919+msgid "Time zone:"
920+msgstr "Zona horaria:"
+196,
-174
1@@ -8,120 +8,120 @@ msgstr ""
2 "Language: es_AR\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Contenido sensible: "
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Descripción del contenido sensible"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Solo personas mencionadas: "
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Responder a (URL): "
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "No enviar. Guardar como borrador"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Borrador:"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Adjuntos..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "Archivo:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "Limpiar este campo para eliminar el adjunto"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "Descripción del adjunto"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "Encuesta..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "Opciones de encuesta (una por línea, hasta 8):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "Una opción"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "Opciones múltiples"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "Finalizar en 5 minutos"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "Finalizar en 1 hora"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "Finalizar en 1 día"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr "Publicar"
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "Descripción del sitio"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "Email del Administrador"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "Cuenta del Administrador"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "%d siguiendo, %d seguidores"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "privado"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "público"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "notificaciones"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "personas"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "instancia"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151@@ -129,554 +129,554 @@ msgstr ""
152 "Buscar publicaciones por URL o contenido (expresiones regulares), cuenta "
153 "@usuario@host , ó #etiqueta"
154
155-#: html.c:898
156+#: html.c:946
157 msgid "Content search"
158 msgstr "Buscar contenido"
159
160-#: html.c:1020
161+#: html.c:1068
162 msgid "verified link"
163 msgstr "link verificado"
164
165-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
166+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
167 msgid "Location: "
168 msgstr "Ubicación: "
169
170-#: html.c:1113
171+#: html.c:1161
172 msgid "New Post..."
173 msgstr "Nueva Publicación..."
174
175-#: html.c:1115
176+#: html.c:1163
177 msgid "What's on your mind?"
178 msgstr "¿En qué estás pensando?"
179
180-#: html.c:1124
181+#: html.c:1172
182 msgid "Operations..."
183 msgstr "Operaciones..."
184
185-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
186+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
187 msgid "Follow"
188 msgstr "Seguir"
189
190-#: html.c:1141
191+#: html.c:1189
192 msgid "(by URL or user@host)"
193 msgstr "(por URL o usuario@host)"
194
195-#: html.c:1156 html.c:1690 html.c:4364
196+#: html.c:1204 html.c:1764 html.c:4527
197 msgid "Boost"
198 msgstr "Impulsar"
199
200-#: html.c:1158 html.c:1175
201+#: html.c:1206 html.c:1223
202 msgid "(by URL)"
203 msgstr "(por URL)"
204
205-#: html.c:1173 html.c:1669 html.c:4355
206+#: html.c:1221 html.c:1743 html.c:4518
207 msgid "Like"
208 msgstr "Me gusta"
209
210-#: html.c:1278
211+#: html.c:1347
212 msgid "User Settings..."
213 msgstr "Configuración de usuario..."
214
215-#: html.c:1287
216+#: html.c:1356
217 msgid "Display name:"
218 msgstr "Nombre para mostrar:"
219
220-#: html.c:1293
221+#: html.c:1362
222 msgid "Your name"
223 msgstr "Su nombre"
224
225-#: html.c:1295
226+#: html.c:1364
227 msgid "Avatar: "
228 msgstr "Avatar: "
229
230-#: html.c:1303
231+#: html.c:1372
232 msgid "Delete current avatar"
233 msgstr "Eliminar avatar"
234
235-#: html.c:1305
236+#: html.c:1374
237 msgid "Header image (banner): "
238 msgstr "Imagen de cabecera (banner): "
239
240-#: html.c:1313
241+#: html.c:1382
242 msgid "Delete current header image"
243 msgstr "Eliminar imagen de cabecera"
244
245-#: html.c:1315
246+#: html.c:1384
247 msgid "Bio:"
248 msgstr "Bio:"
249
250-#: html.c:1321
251+#: html.c:1390
252 msgid "Write about yourself here..."
253 msgstr "Escriba algo sobre usted aquí..."
254
255-#: html.c:1330
256+#: html.c:1399
257 msgid "Always show sensitive content"
258 msgstr "Siempre mostrar contenido sensible"
259
260-#: html.c:1332
261+#: html.c:1401
262 msgid "Email address for notifications:"
263 msgstr "Cuenta de email para las notificaciones:"
264
265-#: html.c:1340
266+#: html.c:1409
267 msgid "Telegram notifications (bot key and chat id):"
268 msgstr "Notificaciones en Telegram (llave del bot e id del chat):"
269
270-#: html.c:1354
271+#: html.c:1423
272 msgid "ntfy notifications (ntfy server and token):"
273 msgstr "Notificaciones en ntfy (servidor ntfy y token):"
274
275-#: html.c:1368
276+#: html.c:1437
277 msgid "Maximum days to keep posts (0: server settings):"
278 msgstr ""
279 "Plazo máximo de conservación de publicaciones en días (0: usar configuración "
280 "del servidor):"
281
282-#: html.c:1382
283+#: html.c:1451
284 msgid "Drop direct messages from people you don't follow"
285 msgstr "Descartar mensajes directos de personas a las que no sigue"
286
287-#: html.c:1391
288+#: html.c:1460
289 msgid "This account is a bot"
290 msgstr "Esta cuenta es un bot"
291
292-#: html.c:1400
293+#: html.c:1469
294 msgid "Auto-boost all mentions to this account"
295 msgstr "Impulsar automáticamente todas las menciones a esta cuenta"
296
297-#: html.c:1409
298+#: html.c:1478
299 msgid "This account is private (posts are not shown through the web)"
300 msgstr "Esta cuenta es privada (las publicaciones no se muestran en la web)"
301
302-#: html.c:1419
303+#: html.c:1488
304 msgid "Collapse top threads by default"
305 msgstr "Contraer hilo de publicaciones por defecto"
306
307-#: html.c:1428
308+#: html.c:1497
309 msgid "Follow requests must be approved"
310 msgstr "Las solicitudes de seguimiento deben ser aprobadas"
311
312-#: html.c:1437
313+#: html.c:1506
314 msgid "Publish follower and following metrics"
315 msgstr "Mostrar cantidad de seguidores y seguidos"
316
317-#: html.c:1439
318+#: html.c:1508
319 msgid "Current location:"
320 msgstr "Ubicación actual:"
321
322-#: html.c:1453
323+#: html.c:1522
324 msgid "Profile metadata (key=value pairs in each line):"
325 msgstr "Metadata del perfil (pares llave=valor en cada línea):"
326
327-#: html.c:1464
328+#: html.c:1533
329 msgid "Web interface language:"
330 msgstr "Idioma de la interfaz Web:"
331
332-#: html.c:1469
333+#: html.c:1543
334 msgid "New password:"
335 msgstr "Nueva contraseña:"
336
337-#: html.c:1476
338+#: html.c:1550
339 msgid "Repeat new password:"
340 msgstr "Repetir nueva contraseña:"
341
342-#: html.c:1486
343+#: html.c:1560
344 msgid "Update user info"
345 msgstr "Actualizar información de usuario"
346
347-#: html.c:1497
348+#: html.c:1571
349 msgid "Followed hashtags..."
350 msgstr "Etiquetas en seguimiento..."
351
352-#: html.c:1499 html.c:1531
353+#: html.c:1573 html.c:1605
354 msgid "One hashtag per line"
355 msgstr "Una etiqueta por línea"
356
357-#: html.c:1520 html.c:1552
358+#: html.c:1594 html.c:1626
359 msgid "Update hashtags"
360 msgstr "Actualizar etiquetas"
361
362-#: html.c:1669
363+#: html.c:1743
364 msgid "Say you like this post"
365 msgstr "Decir que te gusta esta publicación"
366
367-#: html.c:1674 html.c:4373
368+#: html.c:1748 html.c:4536
369 msgid "Unlike"
370 msgstr "No me gusta"
371
372-#: html.c:1674
373+#: html.c:1748
374 msgid "Nah don't like it that much"
375 msgstr "Nah, no me gusta tanto"
376
377-#: html.c:1680 html.c:4505
378+#: html.c:1754 html.c:4673
379 msgid "Unpin"
380 msgstr "Desanclar"
381
382-#: html.c:1680
383+#: html.c:1754
384 msgid "Unpin this post from your timeline"
385 msgstr "Desanclar esta publicación de su línea de tiempo"
386
387-#: html.c:1683 html.c:4500
388+#: html.c:1757 html.c:4668
389 msgid "Pin"
390 msgstr "Anclar"
391
392-#: html.c:1683
393+#: html.c:1757
394 msgid "Pin this post to the top of your timeline"
395 msgstr "Anclar esta publicación al inicio de su línea de tiempo"
396
397-#: html.c:1690
398+#: html.c:1764
399 msgid "Announce this post to your followers"
400 msgstr "Anunciar esta publicación a sus seguidores"
401
402-#: html.c:1695 html.c:4381
403+#: html.c:1769 html.c:4544
404 msgid "Unboost"
405 msgstr "Eliminar impulso"
406
407-#: html.c:1695
408+#: html.c:1769
409 msgid "I regret I boosted this"
410 msgstr "Me arrepiento de haber impulsado esto"
411
412-#: html.c:1701 html.c:4515
413+#: html.c:1775 html.c:4683
414 msgid "Unbookmark"
415 msgstr "Eliminar marcador"
416
417-#: html.c:1701
418+#: html.c:1775
419 msgid "Delete this post from your bookmarks"
420 msgstr "Eliminar marcador de esta publicación"
421
422-#: html.c:1704 html.c:4510
423+#: html.c:1778 html.c:4678
424 msgid "Bookmark"
425 msgstr "Marcador"
426
427-#: html.c:1704
428+#: html.c:1778
429 msgid "Add this post to your bookmarks"
430 msgstr "Agregar esta publicación a mis marcadores"
431
432-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
433+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
434 msgid "Unfollow"
435 msgstr "Dejar de seguir"
436
437-#: html.c:1710 html.c:3082
438+#: html.c:1784 html.c:3180
439 msgid "Stop following this user's activity"
440 msgstr "Dejar de seguir la actividad de este usuario"
441
442-#: html.c:1714 html.c:3096
443+#: html.c:1788 html.c:3194
444 msgid "Start following this user's activity"
445 msgstr "Seguir la actividad de este usuario"
446
447-#: html.c:1720 html.c:4455
448+#: html.c:1794 html.c:4621
449 msgid "Unfollow Group"
450 msgstr "Dejar de seguir este Grupo"
451
452-#: html.c:1721
453+#: html.c:1795
454 msgid "Stop following this group or channel"
455 msgstr "Dejar de seguir este grupo o canal"
456
457-#: html.c:1725 html.c:4442
458+#: html.c:1799 html.c:4608
459 msgid "Follow Group"
460 msgstr "Seguir Grupo"
461
462-#: html.c:1726
463+#: html.c:1800
464 msgid "Start following this group or channel"
465 msgstr "Seguir grupo o canal"
466
467-#: html.c:1731 html.c:3118 html.c:4389
468+#: html.c:1805 html.c:3216 html.c:4552
469 msgid "MUTE"
470 msgstr "SILENCIAR"
471
472-#: html.c:1732
473+#: html.c:1806
474 msgid "Block any activity from this user forever"
475 msgstr "Bloquear toda la actividad de este usuario para siempre"
476
477-#: html.c:1737 html.c:3100 html.c:4472
478+#: html.c:1811 html.c:3198 html.c:4638
479 msgid "Delete"
480 msgstr "Eliminar"
481
482-#: html.c:1737
483+#: html.c:1811
484 msgid "Delete this post"
485 msgstr "Eliminar esta publicación"
486
487-#: html.c:1740 html.c:4397
488+#: html.c:1814 html.c:4560
489 msgid "Hide"
490 msgstr "Ocultar"
491
492-#: html.c:1740
493+#: html.c:1814
494 msgid "Hide this post and its children"
495 msgstr "Ocultar esta publicación y sus respuestas"
496
497-#: html.c:1771
498+#: html.c:1845
499 msgid "Edit..."
500 msgstr "Editar..."
501
502-#: html.c:1790
503+#: html.c:1865
504 msgid "Reply..."
505 msgstr "Responder..."
506
507-#: html.c:1841
508+#: html.c:1916
509 msgid "Truncated (too deep)"
510 msgstr "Truncado (demasiado profundo)"
511
512-#: html.c:1850
513+#: html.c:1925
514 msgid "follows you"
515 msgstr "te sigue"
516
517-#: html.c:1913
518+#: html.c:1988
519 msgid "Pinned"
520 msgstr "Anclado"
521
522-#: html.c:1921
523+#: html.c:1996
524 msgid "Bookmarked"
525 msgstr "Marcado"
526
527-#: html.c:1929
528+#: html.c:2004
529 msgid "Poll"
530 msgstr "Encuesta"
531
532-#: html.c:1936
533+#: html.c:2011
534 msgid "Voted"
535 msgstr "Votado"
536
537-#: html.c:1945
538+#: html.c:2020
539 msgid "Event"
540 msgstr "Evento"
541
542-#: html.c:1977 html.c:2006
543+#: html.c:2052 html.c:2081
544 msgid "boosted"
545 msgstr "impulsado"
546
547-#: html.c:2022
548+#: html.c:2097
549 msgid "in reply to"
550 msgstr "en respuesta a"
551
552-#: html.c:2073
553+#: html.c:2148
554 msgid " [SENSITIVE CONTENT]"
555 msgstr " [CONTENIDO SENSIBLE]"
556
557-#: html.c:2250
558+#: html.c:2325
559 msgid "Vote"
560 msgstr "Votar"
561
562-#: html.c:2260
563+#: html.c:2335
564 msgid "Closed"
565 msgstr "Cerrado"
566
567-#: html.c:2285
568+#: html.c:2360
569 msgid "Closes in"
570 msgstr "Cierra en"
571
572-#: html.c:2366
573+#: html.c:2441
574 msgid "Video"
575 msgstr "Video"
576
577-#: html.c:2381
578+#: html.c:2456
579 msgid "Audio"
580 msgstr "Audio"
581
582-#: html.c:2403
583+#: html.c:2484
584 msgid "Attachment"
585 msgstr "Adjunto"
586
587-#: html.c:2417
588+#: html.c:2498
589 msgid "Alt..."
590 msgstr "Alt..."
591
592-#: html.c:2430
593+#: html.c:2511
594 msgid "Source channel or community"
595 msgstr "Canal o comunidad de origen"
596
597-#: html.c:2524
598+#: html.c:2605
599 msgid "Time: "
600 msgstr "Hora: "
601
602-#: html.c:2605
603+#: html.c:2686
604 msgid "Older..."
605 msgstr "Más antiguo..."
606
607-#: html.c:2702
608+#: html.c:2788
609 msgid "about this site"
610 msgstr "acerca de este sitio"
611
612-#: html.c:2704
613+#: html.c:2790
614 msgid "powered by "
615 msgstr "provisto por "
616
617-#: html.c:2769
618+#: html.c:2855
619 msgid "Dismiss"
620 msgstr "Descartar"
621
622-#: html.c:2786
623+#: html.c:2872
624 #, c-format
625 msgid "Timeline for list '%s'"
626 msgstr "Línea de tiempo de la lista '%s'"
627
628-#: html.c:2805 html.c:3846
629+#: html.c:2891 html.c:3944
630 msgid "Pinned posts"
631 msgstr "Publicaciones ancladas"
632
633-#: html.c:2817 html.c:3861
634+#: html.c:2903 html.c:3959
635 msgid "Bookmarked posts"
636 msgstr "Publicaciones marcadas"
637
638-#: html.c:2829 html.c:3876
639+#: html.c:2915 html.c:3974
640 msgid "Post drafts"
641 msgstr "Borradores de publicaciones"
642
643-#: html.c:2888
644+#: html.c:2986
645 msgid "No more unseen posts"
646 msgstr "No quedan publicaciones sin ver"
647
648-#: html.c:2892 html.c:2992
649+#: html.c:2990 html.c:3090
650 msgid "Back to top"
651 msgstr "Volver al inicio"
652
653-#: html.c:2945
654+#: html.c:3043
655 msgid "History"
656 msgstr "Historia"
657
658-#: html.c:2997 html.c:3417
659+#: html.c:3095 html.c:3515
660 msgid "More..."
661 msgstr "Más..."
662
663-#: html.c:3086 html.c:4408
664+#: html.c:3184 html.c:4574
665 msgid "Unlimit"
666 msgstr "Sin límite"
667
668-#: html.c:3087
669+#: html.c:3185
670 msgid "Allow announces (boosts) from this user"
671 msgstr "Permitir anuncios (impulsos) de este usuario"
672
673-#: html.c:3090 html.c:4404
674+#: html.c:3188 html.c:4570
675 msgid "Limit"
676 msgstr "Límite"
677
678-#: html.c:3091
679+#: html.c:3189
680 msgid "Block announces (boosts) from this user"
681 msgstr "Bloquear anuncios (impulsos) de este usuario"
682
683-#: html.c:3100
684+#: html.c:3198
685 msgid "Delete this user"
686 msgstr "Eliminar este usuario"
687
688-#: html.c:3105 html.c:4520
689+#: html.c:3203 html.c:4688
690 msgid "Approve"
691 msgstr "Aprobar"
692
693-#: html.c:3106
694+#: html.c:3204
695 msgid "Approve this follow request"
696 msgstr "Aprobar solicitud de seguimiento"
697
698-#: html.c:3109 html.c:4544
699+#: html.c:3207 html.c:4712
700 msgid "Discard"
701 msgstr "Descartar"
702
703-#: html.c:3109
704+#: html.c:3207
705 msgid "Discard this follow request"
706 msgstr "Descartar solicitud de seguimiento"
707
708-#: html.c:3114 html.c:4393
709+#: html.c:3212 html.c:4556
710 msgid "Unmute"
711 msgstr "Dejar de SILENCIAR"
712
713-#: html.c:3115
714+#: html.c:3213
715 msgid "Stop blocking activities from this user"
716 msgstr "Dejar de bloquear actividad de este usuario"
717
718-#: html.c:3119
719+#: html.c:3217
720 msgid "Block any activity from this user"
721 msgstr "Bloquear toda actividad de este usuario"
722
723-#: html.c:3127
724+#: html.c:3225
725 msgid "Direct Message..."
726 msgstr "Mensaje Directo..."
727
728-#: html.c:3162
729+#: html.c:3260
730 msgid "Pending follow confirmations"
731 msgstr "Confirmaciones de seguimiento pendientes"
732
733-#: html.c:3166
734+#: html.c:3264
735 msgid "People you follow"
736 msgstr "Personas que sigues"
737
738-#: html.c:3167
739+#: html.c:3265
740 msgid "People that follow you"
741 msgstr "Personas que te siguen"
742
743-#: html.c:3206
744+#: html.c:3304
745 msgid "Clear all"
746 msgstr "Limpiar todo"
747
748-#: html.c:3263
749+#: html.c:3361
750 msgid "Mention"
751 msgstr "Mención"
752
753-#: html.c:3266
754+#: html.c:3364
755 msgid "Finished poll"
756 msgstr "Encuesta finalizada"
757
758-#: html.c:3281
759+#: html.c:3379
760 msgid "Follow Request"
761 msgstr "Solicitud de Seguimiento"
762
763-#: html.c:3364
764+#: html.c:3462
765 msgid "Context"
766 msgstr "Contexto"
767
768-#: html.c:3375
769+#: html.c:3473
770 msgid "New"
771 msgstr "Nuevo"
772
773-#: html.c:3390
774+#: html.c:3488
775 msgid "Already seen"
776 msgstr "Ya visto"
777
778-#: html.c:3405
779+#: html.c:3503
780 msgid "None"
781 msgstr "Ninguno"
782
783-#: html.c:3671
784+#: html.c:3769
785 #, c-format
786 msgid "Search results for account %s"
787 msgstr "Buscar resultados para la cuenta %s"
788
789-#: html.c:3678
790+#: html.c:3776
791 #, c-format
792 msgid "Account %s not found"
793 msgstr "No se encontró la cuenta %s"
794
795-#: html.c:3709
796+#: html.c:3807
797 #, c-format
798 msgid "Search results for tag %s"
799 msgstr "Buscar resultados para la etiqueta %s"
800
801-#: html.c:3709
802+#: html.c:3807
803 #, c-format
804 msgid "Nothing found for tag %s"
805 msgstr "No se encontró nada con la etiqueta %s"
806
807-#: html.c:3725
808+#: html.c:3823
809 #, c-format
810 msgid "Search results for '%s' (may be more)"
811 msgstr "Resultados de búsqueda para '%s' (puede haber más)"
812
813-#: html.c:3728
814+#: html.c:3826
815 #, c-format
816 msgid "Search results for '%s'"
817 msgstr "Resultados de búsqueda para '%s'"
818
819-#: html.c:3731
820+#: html.c:3829
821 #, c-format
822 msgid "No more matches for '%s'"
823 msgstr "No hay más coincidencias para '%s'"
824
825-#: html.c:3733
826+#: html.c:3831
827 #, c-format
828 msgid "Nothing found for '%s'"
829 msgstr "No se encontró nada para '%s'"
830
831-#: html.c:3831
832+#: html.c:3929
833 msgid "Showing instance timeline"
834 msgstr "Mostrando línea de tiempo de la instancia"
835
836-#: html.c:3899
837+#: html.c:4012
838 #, c-format
839 msgid "Showing timeline for list '%s'"
840 msgstr "Mostrando línea de tiempo de la lista '%s'"
841@@ -690,15 +690,15 @@ msgstr "Resultado de búsqueda para la etiqueta #%s"
842 msgid "Recent posts by users in this instance"
843 msgstr "Publicaciones recientes de los usuarios de esta instancia"
844
845-#: html.c:1529
846+#: html.c:1603
847 msgid "Blocked hashtags..."
848 msgstr "Etiquetas bloqueadas..."
849
850-#: html.c:420
851+#: html.c:432
852 msgid "Optional URL to reply to"
853 msgstr "URL opcional a la que responder"
854
855-#: html.c:527
856+#: html.c:575
857 msgid ""
858 "Option 1...\n"
859 "Option 2...\n"
860@@ -708,31 +708,53 @@ msgstr ""
861 "Opción 1...\n"
862 "Opción 2...\n"
863 "Opción 3...\n"
864+"..."
865
866-#: html.c:1346
867+#: html.c:1415
868 msgid "Bot API key"
869 msgstr "Clave del API del Bot"
870
871-#: html.c:1352
872+#: html.c:1421
873 msgid "Chat id"
874 msgstr "Identificador de chat"
875
876-#: html.c:1360
877+#: html.c:1429
878 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
879 msgstr "Servidor ntfy - URL completa (example: https://ntfy.sh/YourTopic)"
880
881-#: html.c:1366
882+#: html.c:1435
883 msgid "ntfy token - if needed"
884 msgstr "Token ntft - si es necesario"
885
886-#: html.c:2806
887+#: html.c:2892
888 msgid "pinned"
889 msgstr "Anclados"
890
891-#: html.c:2818
892+#: html.c:2904
893 msgid "bookmarks"
894 msgstr "Marcados"
895
896-#: html.c:2830
897+#: html.c:2916
898 msgid "drafts"
899 msgstr "Borradores"
900+
901+#: html.c:464
902+msgid "Scheduled post..."
903+msgstr "Envío programado..."
904+
905+#: html.c:2927 html.c:3989
906+msgid "Scheduled posts"
907+msgstr "Envíos programados"
908+
909+#: html.c:2928
910+msgid "scheduled posts"
911+msgstr "envíos programados"
912+
913+#: html.c:458
914+#, c-format
915+msgid "Post date and time (timezone: %s):"
916+msgstr "Fecha y hora de publicación (zona horaria: %s):"
917+
918+#: html.c:1538
919+msgid "Time zone:"
920+msgstr "Zona horaria:"
+196,
-174
1@@ -8,120 +8,120 @@ msgstr ""
2 "Language: es_UY\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Contenido sensible: "
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Descripción del contenido sensible"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Solo personas mencionadas: "
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Responder a (URL): "
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "No enviar. Guardar como borrador"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Borrador:"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Adjuntos..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "Archivo:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "Limpiar este campo para eliminar el adjunto"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "Descripción del adjunto"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "Encuesta..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "Opciones de encuesta (una por línea, hasta 8):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "Una opción"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "Opciones múltiples"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "Finalizar en 5 minutos"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "Finalizar en 1 hora"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "Finalizar en 1 día"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr "Publicar"
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "Descripción del sitio"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "Email del Administrador"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "Cuenta del Administrador"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "%d siguiendo, %d seguidores"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "privado"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "público"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "notificaciones"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "personas"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "instancia"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151@@ -129,554 +129,554 @@ msgstr ""
152 "Buscar publicaciones por URL o contenido (expresiones regulares), cuenta "
153 "@usuario@host , ó #etiqueta"
154
155-#: html.c:898
156+#: html.c:946
157 msgid "Content search"
158 msgstr "Buscar contenido"
159
160-#: html.c:1020
161+#: html.c:1068
162 msgid "verified link"
163 msgstr "link verificado"
164
165-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
166+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
167 msgid "Location: "
168 msgstr "Ubicación: "
169
170-#: html.c:1113
171+#: html.c:1161
172 msgid "New Post..."
173 msgstr "Nueva Publicación..."
174
175-#: html.c:1115
176+#: html.c:1163
177 msgid "What's on your mind?"
178 msgstr "¿En qué estás pensando?"
179
180-#: html.c:1124
181+#: html.c:1172
182 msgid "Operations..."
183 msgstr "Operaciones..."
184
185-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
186+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
187 msgid "Follow"
188 msgstr "Seguir"
189
190-#: html.c:1141
191+#: html.c:1189
192 msgid "(by URL or user@host)"
193 msgstr "(por URL o usuario@host)"
194
195-#: html.c:1156 html.c:1690 html.c:4364
196+#: html.c:1204 html.c:1764 html.c:4527
197 msgid "Boost"
198 msgstr "Impulsar"
199
200-#: html.c:1158 html.c:1175
201+#: html.c:1206 html.c:1223
202 msgid "(by URL)"
203 msgstr "(por URL)"
204
205-#: html.c:1173 html.c:1669 html.c:4355
206+#: html.c:1221 html.c:1743 html.c:4518
207 msgid "Like"
208 msgstr "Me gusta"
209
210-#: html.c:1278
211+#: html.c:1347
212 msgid "User Settings..."
213 msgstr "Configuración de usuario..."
214
215-#: html.c:1287
216+#: html.c:1356
217 msgid "Display name:"
218 msgstr "Nombre para mostrar:"
219
220-#: html.c:1293
221+#: html.c:1362
222 msgid "Your name"
223 msgstr "Su nombre"
224
225-#: html.c:1295
226+#: html.c:1364
227 msgid "Avatar: "
228 msgstr "Avatar: "
229
230-#: html.c:1303
231+#: html.c:1372
232 msgid "Delete current avatar"
233 msgstr "Eliminar avatar"
234
235-#: html.c:1305
236+#: html.c:1374
237 msgid "Header image (banner): "
238 msgstr "Imagen de cabecera (banner): "
239
240-#: html.c:1313
241+#: html.c:1382
242 msgid "Delete current header image"
243 msgstr "Eliminar imagen de cabecera"
244
245-#: html.c:1315
246+#: html.c:1384
247 msgid "Bio:"
248 msgstr "Bio:"
249
250-#: html.c:1321
251+#: html.c:1390
252 msgid "Write about yourself here..."
253 msgstr "Escriba algo sobre usted aquí..."
254
255-#: html.c:1330
256+#: html.c:1399
257 msgid "Always show sensitive content"
258 msgstr "Siempre mostrar contenido sensible"
259
260-#: html.c:1332
261+#: html.c:1401
262 msgid "Email address for notifications:"
263 msgstr "Cuenta de email para las notificaciones:"
264
265-#: html.c:1340
266+#: html.c:1409
267 msgid "Telegram notifications (bot key and chat id):"
268 msgstr "Notificaciones en Telegram (llave del bot e id del chat):"
269
270-#: html.c:1354
271+#: html.c:1423
272 msgid "ntfy notifications (ntfy server and token):"
273 msgstr "Notificaciones en ntfy (servidor ntfy y token):"
274
275-#: html.c:1368
276+#: html.c:1437
277 msgid "Maximum days to keep posts (0: server settings):"
278 msgstr ""
279 "Plazo máximo de conservación de publicaciones en días (0: usar configuración "
280 "del servidor):"
281
282-#: html.c:1382
283+#: html.c:1451
284 msgid "Drop direct messages from people you don't follow"
285 msgstr "Descartar mensajes directos de personas a las que no sigue"
286
287-#: html.c:1391
288+#: html.c:1460
289 msgid "This account is a bot"
290 msgstr "Esta cuenta es un bot"
291
292-#: html.c:1400
293+#: html.c:1469
294 msgid "Auto-boost all mentions to this account"
295 msgstr "Impulsar automáticamente todas las menciones a esta cuenta"
296
297-#: html.c:1409
298+#: html.c:1478
299 msgid "This account is private (posts are not shown through the web)"
300 msgstr "Esta cuenta es privada (las publicaciones no se muestran en la web)"
301
302-#: html.c:1419
303+#: html.c:1488
304 msgid "Collapse top threads by default"
305 msgstr "Contraer hilo de publicaciones por defecto"
306
307-#: html.c:1428
308+#: html.c:1497
309 msgid "Follow requests must be approved"
310 msgstr "Las solicitudes de seguimiento deben ser aprobadas"
311
312-#: html.c:1437
313+#: html.c:1506
314 msgid "Publish follower and following metrics"
315 msgstr "Mostrar cantidad de seguidores y seguidos"
316
317-#: html.c:1439
318+#: html.c:1508
319 msgid "Current location:"
320 msgstr "Ubicación actual:"
321
322-#: html.c:1453
323+#: html.c:1522
324 msgid "Profile metadata (key=value pairs in each line):"
325 msgstr "Metadata del perfil (pares llave=valor en cada línea):"
326
327-#: html.c:1464
328+#: html.c:1533
329 msgid "Web interface language:"
330 msgstr "Idioma de la interfaz Web:"
331
332-#: html.c:1469
333+#: html.c:1543
334 msgid "New password:"
335 msgstr "Nueva contraseña:"
336
337-#: html.c:1476
338+#: html.c:1550
339 msgid "Repeat new password:"
340 msgstr "Repetir nueva contraseña:"
341
342-#: html.c:1486
343+#: html.c:1560
344 msgid "Update user info"
345 msgstr "Actualizar información de usuario"
346
347-#: html.c:1497
348+#: html.c:1571
349 msgid "Followed hashtags..."
350 msgstr "Etiquetas en seguimiento..."
351
352-#: html.c:1499 html.c:1531
353+#: html.c:1573 html.c:1605
354 msgid "One hashtag per line"
355 msgstr "Una etiqueta por línea"
356
357-#: html.c:1520 html.c:1552
358+#: html.c:1594 html.c:1626
359 msgid "Update hashtags"
360 msgstr "Actualizar etiquetas"
361
362-#: html.c:1669
363+#: html.c:1743
364 msgid "Say you like this post"
365 msgstr "Decir que te gusta esta publicación"
366
367-#: html.c:1674 html.c:4373
368+#: html.c:1748 html.c:4536
369 msgid "Unlike"
370 msgstr "No me gusta"
371
372-#: html.c:1674
373+#: html.c:1748
374 msgid "Nah don't like it that much"
375 msgstr "Nah, no me gusta tanto"
376
377-#: html.c:1680 html.c:4505
378+#: html.c:1754 html.c:4673
379 msgid "Unpin"
380 msgstr "Desanclar"
381
382-#: html.c:1680
383+#: html.c:1754
384 msgid "Unpin this post from your timeline"
385 msgstr "Desanclar esta publicación de su línea de tiempo"
386
387-#: html.c:1683 html.c:4500
388+#: html.c:1757 html.c:4668
389 msgid "Pin"
390 msgstr "Anclar"
391
392-#: html.c:1683
393+#: html.c:1757
394 msgid "Pin this post to the top of your timeline"
395 msgstr "Anclar esta publicación al inicio de su línea de tiempo"
396
397-#: html.c:1690
398+#: html.c:1764
399 msgid "Announce this post to your followers"
400 msgstr "Anunciar esta publicación a sus seguidores"
401
402-#: html.c:1695 html.c:4381
403+#: html.c:1769 html.c:4544
404 msgid "Unboost"
405 msgstr "Eliminar impulso"
406
407-#: html.c:1695
408+#: html.c:1769
409 msgid "I regret I boosted this"
410 msgstr "Me arrepiento de haber impulsado esto"
411
412-#: html.c:1701 html.c:4515
413+#: html.c:1775 html.c:4683
414 msgid "Unbookmark"
415 msgstr "Eliminar marcador"
416
417-#: html.c:1701
418+#: html.c:1775
419 msgid "Delete this post from your bookmarks"
420 msgstr "Eliminar marcador de esta publicación"
421
422-#: html.c:1704 html.c:4510
423+#: html.c:1778 html.c:4678
424 msgid "Bookmark"
425 msgstr "Marcador"
426
427-#: html.c:1704
428+#: html.c:1778
429 msgid "Add this post to your bookmarks"
430 msgstr "Agregar esta publicación a mis marcadores"
431
432-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
433+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
434 msgid "Unfollow"
435 msgstr "Dejar de seguir"
436
437-#: html.c:1710 html.c:3082
438+#: html.c:1784 html.c:3180
439 msgid "Stop following this user's activity"
440 msgstr "Dejar de seguir la actividad de este usuario"
441
442-#: html.c:1714 html.c:3096
443+#: html.c:1788 html.c:3194
444 msgid "Start following this user's activity"
445 msgstr "Seguir la actividad de este usuario"
446
447-#: html.c:1720 html.c:4455
448+#: html.c:1794 html.c:4621
449 msgid "Unfollow Group"
450 msgstr "Dejar de seguir este Grupo"
451
452-#: html.c:1721
453+#: html.c:1795
454 msgid "Stop following this group or channel"
455 msgstr "Dejar de seguir este grupo o canal"
456
457-#: html.c:1725 html.c:4442
458+#: html.c:1799 html.c:4608
459 msgid "Follow Group"
460 msgstr "Seguir Grupo"
461
462-#: html.c:1726
463+#: html.c:1800
464 msgid "Start following this group or channel"
465 msgstr "Seguir grupo o canal"
466
467-#: html.c:1731 html.c:3118 html.c:4389
468+#: html.c:1805 html.c:3216 html.c:4552
469 msgid "MUTE"
470 msgstr "SILENCIAR"
471
472-#: html.c:1732
473+#: html.c:1806
474 msgid "Block any activity from this user forever"
475 msgstr "Bloquear toda la actividad de este usuario para siempre"
476
477-#: html.c:1737 html.c:3100 html.c:4472
478+#: html.c:1811 html.c:3198 html.c:4638
479 msgid "Delete"
480 msgstr "Eliminar"
481
482-#: html.c:1737
483+#: html.c:1811
484 msgid "Delete this post"
485 msgstr "Eliminar esta publicación"
486
487-#: html.c:1740 html.c:4397
488+#: html.c:1814 html.c:4560
489 msgid "Hide"
490 msgstr "Ocultar"
491
492-#: html.c:1740
493+#: html.c:1814
494 msgid "Hide this post and its children"
495 msgstr "Ocultar esta publicación y sus respuestas"
496
497-#: html.c:1771
498+#: html.c:1845
499 msgid "Edit..."
500 msgstr "Editar..."
501
502-#: html.c:1790
503+#: html.c:1865
504 msgid "Reply..."
505 msgstr "Responder..."
506
507-#: html.c:1841
508+#: html.c:1916
509 msgid "Truncated (too deep)"
510 msgstr "Truncado (demasiado profundo)"
511
512-#: html.c:1850
513+#: html.c:1925
514 msgid "follows you"
515 msgstr "te sigue"
516
517-#: html.c:1913
518+#: html.c:1988
519 msgid "Pinned"
520 msgstr "Anclado"
521
522-#: html.c:1921
523+#: html.c:1996
524 msgid "Bookmarked"
525 msgstr "Marcado"
526
527-#: html.c:1929
528+#: html.c:2004
529 msgid "Poll"
530 msgstr "Encuesta"
531
532-#: html.c:1936
533+#: html.c:2011
534 msgid "Voted"
535 msgstr "Votado"
536
537-#: html.c:1945
538+#: html.c:2020
539 msgid "Event"
540 msgstr "Evento"
541
542-#: html.c:1977 html.c:2006
543+#: html.c:2052 html.c:2081
544 msgid "boosted"
545 msgstr "impulsado"
546
547-#: html.c:2022
548+#: html.c:2097
549 msgid "in reply to"
550 msgstr "en respuesta a"
551
552-#: html.c:2073
553+#: html.c:2148
554 msgid " [SENSITIVE CONTENT]"
555 msgstr " [CONTENIDO SENSIBLE]"
556
557-#: html.c:2250
558+#: html.c:2325
559 msgid "Vote"
560 msgstr "Votar"
561
562-#: html.c:2260
563+#: html.c:2335
564 msgid "Closed"
565 msgstr "Cerrado"
566
567-#: html.c:2285
568+#: html.c:2360
569 msgid "Closes in"
570 msgstr "Cierra en"
571
572-#: html.c:2366
573+#: html.c:2441
574 msgid "Video"
575 msgstr "Video"
576
577-#: html.c:2381
578+#: html.c:2456
579 msgid "Audio"
580 msgstr "Audio"
581
582-#: html.c:2403
583+#: html.c:2484
584 msgid "Attachment"
585 msgstr "Adjunto"
586
587-#: html.c:2417
588+#: html.c:2498
589 msgid "Alt..."
590 msgstr "Alt..."
591
592-#: html.c:2430
593+#: html.c:2511
594 msgid "Source channel or community"
595 msgstr "Canal o comunidad de origen"
596
597-#: html.c:2524
598+#: html.c:2605
599 msgid "Time: "
600 msgstr "Hora: "
601
602-#: html.c:2605
603+#: html.c:2686
604 msgid "Older..."
605 msgstr "Más antiguo..."
606
607-#: html.c:2702
608+#: html.c:2788
609 msgid "about this site"
610 msgstr "acerca de este sitio"
611
612-#: html.c:2704
613+#: html.c:2790
614 msgid "powered by "
615 msgstr "provisto por "
616
617-#: html.c:2769
618+#: html.c:2855
619 msgid "Dismiss"
620 msgstr "Descartar"
621
622-#: html.c:2786
623+#: html.c:2872
624 #, c-format
625 msgid "Timeline for list '%s'"
626 msgstr "Línea de tiempo de la lista '%s'"
627
628-#: html.c:2805 html.c:3846
629+#: html.c:2891 html.c:3944
630 msgid "Pinned posts"
631 msgstr "Publicaciones ancladas"
632
633-#: html.c:2817 html.c:3861
634+#: html.c:2903 html.c:3959
635 msgid "Bookmarked posts"
636 msgstr "Publicaciones marcadas"
637
638-#: html.c:2829 html.c:3876
639+#: html.c:2915 html.c:3974
640 msgid "Post drafts"
641 msgstr "Borradores de publicaciones"
642
643-#: html.c:2888
644+#: html.c:2986
645 msgid "No more unseen posts"
646 msgstr "No quedan publicaciones sin ver"
647
648-#: html.c:2892 html.c:2992
649+#: html.c:2990 html.c:3090
650 msgid "Back to top"
651 msgstr "Volver al inicio"
652
653-#: html.c:2945
654+#: html.c:3043
655 msgid "History"
656 msgstr "Historia"
657
658-#: html.c:2997 html.c:3417
659+#: html.c:3095 html.c:3515
660 msgid "More..."
661 msgstr "Más..."
662
663-#: html.c:3086 html.c:4408
664+#: html.c:3184 html.c:4574
665 msgid "Unlimit"
666 msgstr "Sin límite"
667
668-#: html.c:3087
669+#: html.c:3185
670 msgid "Allow announces (boosts) from this user"
671 msgstr "Permitir anuncios (impulsos) de este usuario"
672
673-#: html.c:3090 html.c:4404
674+#: html.c:3188 html.c:4570
675 msgid "Limit"
676 msgstr "Límite"
677
678-#: html.c:3091
679+#: html.c:3189
680 msgid "Block announces (boosts) from this user"
681 msgstr "Bloquear anuncios (impulsos) de este usuario"
682
683-#: html.c:3100
684+#: html.c:3198
685 msgid "Delete this user"
686 msgstr "Eliminar este usuario"
687
688-#: html.c:3105 html.c:4520
689+#: html.c:3203 html.c:4688
690 msgid "Approve"
691 msgstr "Aprobar"
692
693-#: html.c:3106
694+#: html.c:3204
695 msgid "Approve this follow request"
696 msgstr "Aprobar solicitud de seguimiento"
697
698-#: html.c:3109 html.c:4544
699+#: html.c:3207 html.c:4712
700 msgid "Discard"
701 msgstr "Descartar"
702
703-#: html.c:3109
704+#: html.c:3207
705 msgid "Discard this follow request"
706 msgstr "Descartar solicitud de seguimiento"
707
708-#: html.c:3114 html.c:4393
709+#: html.c:3212 html.c:4556
710 msgid "Unmute"
711 msgstr "Dejar de SILENCIAR"
712
713-#: html.c:3115
714+#: html.c:3213
715 msgid "Stop blocking activities from this user"
716 msgstr "Dejar de bloquear actividad de este usuario"
717
718-#: html.c:3119
719+#: html.c:3217
720 msgid "Block any activity from this user"
721 msgstr "Bloquear toda actividad de este usuario"
722
723-#: html.c:3127
724+#: html.c:3225
725 msgid "Direct Message..."
726 msgstr "Mensaje Directo..."
727
728-#: html.c:3162
729+#: html.c:3260
730 msgid "Pending follow confirmations"
731 msgstr "Confirmaciones de seguimiento pendientes"
732
733-#: html.c:3166
734+#: html.c:3264
735 msgid "People you follow"
736 msgstr "Personas que sigues"
737
738-#: html.c:3167
739+#: html.c:3265
740 msgid "People that follow you"
741 msgstr "Personas que te siguen"
742
743-#: html.c:3206
744+#: html.c:3304
745 msgid "Clear all"
746 msgstr "Limpiar todo"
747
748-#: html.c:3263
749+#: html.c:3361
750 msgid "Mention"
751 msgstr "Mención"
752
753-#: html.c:3266
754+#: html.c:3364
755 msgid "Finished poll"
756 msgstr "Encuesta finalizada"
757
758-#: html.c:3281
759+#: html.c:3379
760 msgid "Follow Request"
761 msgstr "Solicitud de Seguimiento"
762
763-#: html.c:3364
764+#: html.c:3462
765 msgid "Context"
766 msgstr "Contexto"
767
768-#: html.c:3375
769+#: html.c:3473
770 msgid "New"
771 msgstr "Nuevo"
772
773-#: html.c:3390
774+#: html.c:3488
775 msgid "Already seen"
776 msgstr "Ya visto"
777
778-#: html.c:3405
779+#: html.c:3503
780 msgid "None"
781 msgstr "Ninguno"
782
783-#: html.c:3671
784+#: html.c:3769
785 #, c-format
786 msgid "Search results for account %s"
787 msgstr "Buscar resultados para la cuenta %s"
788
789-#: html.c:3678
790+#: html.c:3776
791 #, c-format
792 msgid "Account %s not found"
793 msgstr "No se encontró la cuenta %s"
794
795-#: html.c:3709
796+#: html.c:3807
797 #, c-format
798 msgid "Search results for tag %s"
799 msgstr "Buscar resultados para la etiqueta %s"
800
801-#: html.c:3709
802+#: html.c:3807
803 #, c-format
804 msgid "Nothing found for tag %s"
805 msgstr "No se encontró nada con la etiqueta %s"
806
807-#: html.c:3725
808+#: html.c:3823
809 #, c-format
810 msgid "Search results for '%s' (may be more)"
811 msgstr "Resultados de búsqueda para '%s' (puede haber más)"
812
813-#: html.c:3728
814+#: html.c:3826
815 #, c-format
816 msgid "Search results for '%s'"
817 msgstr "Resultados de búsqueda para '%s'"
818
819-#: html.c:3731
820+#: html.c:3829
821 #, c-format
822 msgid "No more matches for '%s'"
823 msgstr "No hay más coincidencias para '%s'"
824
825-#: html.c:3733
826+#: html.c:3831
827 #, c-format
828 msgid "Nothing found for '%s'"
829 msgstr "No se encontró nada para '%s'"
830
831-#: html.c:3831
832+#: html.c:3929
833 msgid "Showing instance timeline"
834 msgstr "Mostrando línea de tiempo de la instancia"
835
836-#: html.c:3899
837+#: html.c:4012
838 #, c-format
839 msgid "Showing timeline for list '%s'"
840 msgstr "Mostrando línea de tiempo de la lista '%s'"
841@@ -690,15 +690,15 @@ msgstr "Resultado de búsqueda para la etiqueta #%s"
842 msgid "Recent posts by users in this instance"
843 msgstr "Publicaciones recientes de los usuarios de esta instancia"
844
845-#: html.c:1529
846+#: html.c:1603
847 msgid "Blocked hashtags..."
848 msgstr "Etiquetas bloqueadas..."
849
850-#: html.c:420
851+#: html.c:432
852 msgid "Optional URL to reply to"
853 msgstr "URL opcional a la que responder"
854
855-#: html.c:527
856+#: html.c:575
857 msgid ""
858 "Option 1...\n"
859 "Option 2...\n"
860@@ -708,31 +708,53 @@ msgstr ""
861 "Opción 1...\n"
862 "Opción 2...\n"
863 "Opción 3...\n"
864+"..."
865
866-#: html.c:1346
867+#: html.c:1415
868 msgid "Bot API key"
869 msgstr "Clave del API del Bot"
870
871-#: html.c:1352
872+#: html.c:1421
873 msgid "Chat id"
874 msgstr "Identificador de chat"
875
876-#: html.c:1360
877+#: html.c:1429
878 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
879 msgstr "Servidor ntfy - URL completa (example: https://ntfy.sh/YourTopic)"
880
881-#: html.c:1366
882+#: html.c:1435
883 msgid "ntfy token - if needed"
884 msgstr "Token ntft - si es necesario"
885
886-#: html.c:2806
887+#: html.c:2892
888 msgid "pinned"
889 msgstr "Anclados"
890
891-#: html.c:2818
892+#: html.c:2904
893 msgid "bookmarks"
894 msgstr "Marcados"
895
896-#: html.c:2830
897+#: html.c:2916
898 msgid "drafts"
899 msgstr "Borradores"
900+
901+#: html.c:464
902+msgid "Scheduled post..."
903+msgstr "Envío programado..."
904+
905+#: html.c:2927 html.c:3989
906+msgid "Scheduled posts"
907+msgstr "Envíos programados"
908+
909+#: html.c:2928
910+msgid "scheduled posts"
911+msgstr "envíos programados"
912+
913+#: html.c:458
914+#, c-format
915+msgid "Post date and time (timezone: %s):"
916+msgstr "Fecha y hora de publicación (zona horaria: %s):"
917+
918+#: html.c:1538
919+msgid "Time zone:"
920+msgstr "Zona horaria:"
M
po/fi.po
+198,
-174
1@@ -8,120 +8,120 @@ msgstr ""
2 "Language: fi\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Arkaluontoista sisältöä: "
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Arkaluontoisen sisällön kuvaus"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Vain mainituille: "
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Vastaus (osoite): "
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "Älä lähetä, tallenna luonnoksena"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Luonnos:"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Liitteet..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "Tiedosto:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "Tyhjennä kenttä poistaaksesi liiteen"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "Liitteen kuvaus"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "Kysely..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "Kyselyn vaihtoehdot (riveittäin, korkeintaan 8):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "Yksi valinta"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "Monta valintaa"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "Päättyy viiden minuutin päästä"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "Päättyy tunnin päästä"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "Päättyy päivän päästä"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr "Julkaise"
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "Sivuston kuvaus"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "Ylläpitäjän sähköposti"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "Ylläpitäjän tili"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "Seuraa %d, %d seuraajaa"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "yksityinen"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "julkinen"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "ilmoitukset"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "ihmiset"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "palvelin"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151@@ -129,552 +129,552 @@ msgstr ""
152 "Etsi julkaisuja osoitteella tai sisällön perusteella, @käyttäjä@palvelin "
153 "tai #tagi"
154
155-#: html.c:898
156+#: html.c:946
157 msgid "Content search"
158 msgstr "Sisälöhaku"
159
160-#: html.c:1020
161+#: html.c:1068
162 msgid "verified link"
163 msgstr "varmistettu linkki"
164
165-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
166+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
167 msgid "Location: "
168 msgstr "Sijainti: "
169
170-#: html.c:1113
171+#: html.c:1161
172 msgid "New Post..."
173 msgstr "Uusi julkaisu..."
174
175-#: html.c:1115
176+#: html.c:1163
177 msgid "What's on your mind?"
178 msgstr "Mitä on mielessäsi?"
179
180-#: html.c:1124
181+#: html.c:1172
182 msgid "Operations..."
183 msgstr "Toiminnot..."
184
185-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
186+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
187 msgid "Follow"
188 msgstr "Seuraa"
189
190-#: html.c:1141
191+#: html.c:1189
192 msgid "(by URL or user@host)"
193 msgstr "(osoite tai käyttäjä@palvelin)"
194
195-#: html.c:1156 html.c:1690 html.c:4364
196+#: html.c:1204 html.c:1764 html.c:4527
197 msgid "Boost"
198 msgstr "Tehosta"
199
200-#: html.c:1158 html.c:1175
201+#: html.c:1206 html.c:1223
202 msgid "(by URL)"
203 msgstr "(osoite)"
204
205-#: html.c:1173 html.c:1669 html.c:4355
206+#: html.c:1221 html.c:1743 html.c:4518
207 msgid "Like"
208 msgstr "Tykkää"
209
210-#: html.c:1278
211+#: html.c:1347
212 msgid "User Settings..."
213 msgstr "Käyttäjäasetukset..."
214
215-#: html.c:1287
216+#: html.c:1356
217 msgid "Display name:"
218 msgstr "Näytetty nimi:"
219
220-#: html.c:1293
221+#: html.c:1362
222 msgid "Your name"
223 msgstr "Nimesi"
224
225-#: html.c:1295
226+#: html.c:1364
227 msgid "Avatar: "
228 msgstr "Avatar: "
229
230-#: html.c:1303
231+#: html.c:1372
232 msgid "Delete current avatar"
233 msgstr "Poista nykyinen avatar"
234
235-#: html.c:1305
236+#: html.c:1374
237 msgid "Header image (banner): "
238 msgstr "Otsikkokuva: "
239
240-#: html.c:1313
241+#: html.c:1382
242 msgid "Delete current header image"
243 msgstr "Poista nykyinen otsikkokuva"
244
245-#: html.c:1315
246+#: html.c:1384
247 msgid "Bio:"
248 msgstr "Kuvaus:"
249
250-#: html.c:1321
251+#: html.c:1390
252 msgid "Write about yourself here..."
253 msgstr "Kirjoita itsestäsi tähän..."
254
255-#: html.c:1330
256+#: html.c:1399
257 msgid "Always show sensitive content"
258 msgstr "Näytä arkaluontoinen sisältö aina"
259
260-#: html.c:1332
261+#: html.c:1401
262 msgid "Email address for notifications:"
263 msgstr "Sähköposti ilmoituksille:"
264
265-#: html.c:1340
266+#: html.c:1409
267 msgid "Telegram notifications (bot key and chat id):"
268 msgstr "Telegram-ilmoitukset (botin avain ja chat id):"
269
270-#: html.c:1354
271+#: html.c:1423
272 msgid "ntfy notifications (ntfy server and token):"
273 msgstr "nfty-ilmoitukset (ntfy-palvelin ja token):"
274
275-#: html.c:1368
276+#: html.c:1437
277 msgid "Maximum days to keep posts (0: server settings):"
278 msgstr "Säilytä julkaisut korkeintaan (päivää, 0: palvelimen asetukset)"
279
280-#: html.c:1382
281+#: html.c:1451
282 msgid "Drop direct messages from people you don't follow"
283 msgstr "Poista yksityisviestit ihmisiltä, joita et seuraa"
284
285-#: html.c:1391
286+#: html.c:1460
287 msgid "This account is a bot"
288 msgstr "Tämä tili on botti"
289
290-#: html.c:1400
291+#: html.c:1469
292 msgid "Auto-boost all mentions to this account"
293 msgstr "Tehosta tilin maininnat automaattisesti"
294
295-#: html.c:1409
296+#: html.c:1478
297 msgid "This account is private (posts are not shown through the web)"
298 msgstr "Tili on yksityinen (julkaisuja ei näytetä sivustolla)"
299
300-#: html.c:1419
301+#: html.c:1488
302 msgid "Collapse top threads by default"
303 msgstr "Avaa säikeet automaattisesti"
304
305-#: html.c:1428
306+#: html.c:1497
307 msgid "Follow requests must be approved"
308 msgstr "Vaadi hyväksyntä seurantapyynnöille"
309
310-#: html.c:1437
311+#: html.c:1506
312 msgid "Publish follower and following metrics"
313 msgstr "Julkaise seuraamistilastot"
314
315-#: html.c:1439
316+#: html.c:1508
317 msgid "Current location:"
318 msgstr "Nykyinen sijainti:"
319
320-#: html.c:1453
321+#: html.c:1522
322 msgid "Profile metadata (key=value pairs in each line):"
323 msgstr "Profiilin metadata (avain=arvo, riveittäin):"
324
325-#: html.c:1464
326+#: html.c:1533
327 msgid "Web interface language:"
328 msgstr "Käyttöliitymän kieli:"
329
330-#: html.c:1469
331+#: html.c:1543
332 msgid "New password:"
333 msgstr "Uusi salasana:"
334
335-#: html.c:1476
336+#: html.c:1550
337 msgid "Repeat new password:"
338 msgstr "Toista salasana:"
339
340-#: html.c:1486
341+#: html.c:1560
342 msgid "Update user info"
343 msgstr "Päivitä käyttäjätiedot"
344
345-#: html.c:1497
346+#: html.c:1571
347 msgid "Followed hashtags..."
348 msgstr "Seuratut aihetunnisteet..."
349
350-#: html.c:1499 html.c:1531
351+#: html.c:1573 html.c:1605
352 msgid "One hashtag per line"
353 msgstr "Aihetunnisteet, riveittäin"
354
355-#: html.c:1520 html.c:1552
356+#: html.c:1594 html.c:1626
357 msgid "Update hashtags"
358 msgstr "Päivitä aihetunnisteet"
359
360-#: html.c:1669
361+#: html.c:1743
362 msgid "Say you like this post"
363 msgstr "Tykkää tästä julkaisusta"
364
365-#: html.c:1674 html.c:4373
366+#: html.c:1748 html.c:4536
367 msgid "Unlike"
368 msgstr "Poista tykkäys"
369
370-#: html.c:1674
371+#: html.c:1748
372 msgid "Nah don't like it that much"
373 msgstr "Ei ole omaan makuuni"
374
375-#: html.c:1680 html.c:4505
376+#: html.c:1754 html.c:4673
377 msgid "Unpin"
378 msgstr "Poista kiinnitys"
379
380-#: html.c:1680
381+#: html.c:1754
382 msgid "Unpin this post from your timeline"
383 msgstr "Poista julkaisun kiinnitys aikajanalle"
384
385-#: html.c:1683 html.c:4500
386+#: html.c:1757 html.c:4668
387 msgid "Pin"
388 msgstr "Kiinnitä"
389
390-#: html.c:1683
391+#: html.c:1757
392 msgid "Pin this post to the top of your timeline"
393 msgstr "Kiinnitä julkaisu aikajanasi alkuun"
394
395-#: html.c:1690
396+#: html.c:1764
397 msgid "Announce this post to your followers"
398 msgstr "Ilmoita julkaisusta seuraajillesi"
399
400-#: html.c:1695 html.c:4381
401+#: html.c:1769 html.c:4544
402 msgid "Unboost"
403 msgstr "Poista tehostus"
404
405-#: html.c:1695
406+#: html.c:1769
407 msgid "I regret I boosted this"
408 msgstr "Kadun tehostaneeni tätä"
409
410-#: html.c:1701 html.c:4515
411+#: html.c:1775 html.c:4683
412 msgid "Unbookmark"
413 msgstr "Poista kirjanmerkki"
414
415-#: html.c:1701
416+#: html.c:1775
417 msgid "Delete this post from your bookmarks"
418 msgstr "Poista julkaisu kirjanmerkeistäsi"
419
420-#: html.c:1704 html.c:4510
421+#: html.c:1778 html.c:4678
422 msgid "Bookmark"
423 msgstr "Lisää kirjanmerkki"
424
425-#: html.c:1704
426+#: html.c:1778
427 msgid "Add this post to your bookmarks"
428 msgstr "Lisää julkaisu kirjanmerkkeihisi"
429
430-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
431+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
432 msgid "Unfollow"
433 msgstr "Älä seuraa"
434
435-#: html.c:1710 html.c:3082
436+#: html.c:1784 html.c:3180
437 msgid "Stop following this user's activity"
438 msgstr "Lakkaa seuraamasta käyttäjän toimintaa"
439
440-#: html.c:1714 html.c:3096
441+#: html.c:1788 html.c:3194
442 msgid "Start following this user's activity"
443 msgstr "Seuraa käyttäjän toimintaa"
444
445-#: html.c:1720 html.c:4455
446+#: html.c:1794 html.c:4621
447 msgid "Unfollow Group"
448 msgstr "Älä seuraa ryhmää"
449
450-#: html.c:1721
451+#: html.c:1795
452 msgid "Stop following this group or channel"
453 msgstr "Lopeta ryhnän tai kanavan seuraaminen"
454
455-#: html.c:1725 html.c:4442
456+#: html.c:1799 html.c:4608
457 msgid "Follow Group"
458 msgstr "Seuraa ryhmää"
459
460-#: html.c:1726
461+#: html.c:1800
462 msgid "Start following this group or channel"
463 msgstr "Seuraa tätä ryhmää tai kanavaa"
464
465-#: html.c:1731 html.c:3118 html.c:4389
466+#: html.c:1805 html.c:3216 html.c:4552
467 msgid "MUTE"
468 msgstr "VAIMENNA"
469
470-#: html.c:1732
471+#: html.c:1806
472 msgid "Block any activity from this user forever"
473 msgstr "Estä kaikki toiminta tältä käyttäjältä"
474
475-#: html.c:1737 html.c:3100 html.c:4472
476+#: html.c:1811 html.c:3198 html.c:4638
477 msgid "Delete"
478 msgstr "Poista"
479
480-#: html.c:1737
481+#: html.c:1811
482 msgid "Delete this post"
483 msgstr "Poista julkaisu"
484
485-#: html.c:1740 html.c:4397
486+#: html.c:1814 html.c:4560
487 msgid "Hide"
488 msgstr "Piilota"
489
490-#: html.c:1740
491+#: html.c:1814
492 msgid "Hide this post and its children"
493 msgstr "Piilota julkaisu ja vastaukset"
494
495-#: html.c:1771
496+#: html.c:1845
497 msgid "Edit..."
498 msgstr "Muokkaa..."
499
500-#: html.c:1790
501+#: html.c:1865
502 msgid "Reply..."
503 msgstr "Vastaa..."
504
505-#: html.c:1841
506+#: html.c:1916
507 msgid "Truncated (too deep)"
508 msgstr "Katkaistu (liian syvä)"
509
510-#: html.c:1850
511+#: html.c:1925
512 msgid "follows you"
513 msgstr "seuraa sinua"
514
515-#: html.c:1913
516+#: html.c:1988
517 msgid "Pinned"
518 msgstr "Kiinnitetty"
519
520-#: html.c:1921
521+#: html.c:1996
522 msgid "Bookmarked"
523 msgstr "Kirjanmerkitty"
524
525-#: html.c:1929
526+#: html.c:2004
527 msgid "Poll"
528 msgstr "Kysely"
529
530-#: html.c:1936
531+#: html.c:2011
532 msgid "Voted"
533 msgstr "Äänestetty"
534
535-#: html.c:1945
536+#: html.c:2020
537 msgid "Event"
538 msgstr "Tapahtuma"
539
540-#: html.c:1977 html.c:2006
541+#: html.c:2052 html.c:2081
542 msgid "boosted"
543 msgstr "tehostettu"
544
545-#: html.c:2022
546+#: html.c:2097
547 msgid "in reply to"
548 msgstr "vastauksena"
549
550-#: html.c:2073
551+#: html.c:2148
552 msgid " [SENSITIVE CONTENT]"
553 msgstr " [ARKALUONTOISTA SISÄLTÖÄ]"
554
555-#: html.c:2250
556+#: html.c:2325
557 msgid "Vote"
558 msgstr "Äänestä"
559
560-#: html.c:2260
561+#: html.c:2335
562 msgid "Closed"
563 msgstr "Sulkeutunut"
564
565-#: html.c:2285
566+#: html.c:2360
567 msgid "Closes in"
568 msgstr "Sulkeutuu"
569
570-#: html.c:2366
571+#: html.c:2441
572 msgid "Video"
573 msgstr "Video"
574
575-#: html.c:2381
576+#: html.c:2456
577 msgid "Audio"
578 msgstr "Ääni"
579
580-#: html.c:2403
581+#: html.c:2484
582 msgid "Attachment"
583 msgstr "Liite"
584
585-#: html.c:2417
586+#: html.c:2498
587 msgid "Alt..."
588 msgstr "Kuvaus..."
589
590-#: html.c:2430
591+#: html.c:2511
592 msgid "Source channel or community"
593 msgstr "Lähdekanava tai -yhteisö"
594
595-#: html.c:2524
596+#: html.c:2605
597 msgid "Time: "
598 msgstr "Aika: "
599
600-#: html.c:2605
601+#: html.c:2686
602 msgid "Older..."
603 msgstr "Vanhemmat..."
604
605-#: html.c:2702
606+#: html.c:2788
607 msgid "about this site"
608 msgstr "tietoa sivustosta"
609
610-#: html.c:2704
611+#: html.c:2790
612 msgid "powered by "
613 msgstr "moottorina "
614
615-#: html.c:2769
616+#: html.c:2855
617 msgid "Dismiss"
618 msgstr "Kuittaa"
619
620-#: html.c:2786
621+#: html.c:2872
622 #, c-format
623 msgid "Timeline for list '%s'"
624 msgstr "Listan ”%s” aikajana"
625
626-#: html.c:2805 html.c:3846
627+#: html.c:2891 html.c:3944
628 msgid "Pinned posts"
629 msgstr "Kiinnitetyt julkaisut"
630
631-#: html.c:2817 html.c:3861
632+#: html.c:2903 html.c:3959
633 msgid "Bookmarked posts"
634 msgstr "Kirjanmerkit"
635
636-#: html.c:2829 html.c:3876
637+#: html.c:2915 html.c:3974
638 msgid "Post drafts"
639 msgstr "Vedokset"
640
641-#: html.c:2888
642+#: html.c:2986
643 msgid "No more unseen posts"
644 msgstr "Ei lukemattonia julkaisuja"
645
646-#: html.c:2892 html.c:2992
647+#: html.c:2990 html.c:3090
648 msgid "Back to top"
649 msgstr "Takaisin"
650
651-#: html.c:2945
652+#: html.c:3043
653 msgid "History"
654 msgstr "Historia"
655
656-#: html.c:2997 html.c:3417
657+#: html.c:3095 html.c:3515
658 msgid "More..."
659 msgstr "Enemmän..."
660
661-#: html.c:3086 html.c:4408
662+#: html.c:3184 html.c:4574
663 msgid "Unlimit"
664 msgstr "Poista rajoitus"
665
666-#: html.c:3087
667+#: html.c:3185
668 msgid "Allow announces (boosts) from this user"
669 msgstr "Salli tehostukset käyttäjältä"
670
671-#: html.c:3090 html.c:4404
672+#: html.c:3188 html.c:4570
673 msgid "Limit"
674 msgstr "Rajoita"
675
676-#: html.c:3091
677+#: html.c:3189
678 msgid "Block announces (boosts) from this user"
679 msgstr "Kiellö tehostukset käyttäjältä"
680
681-#: html.c:3100
682+#: html.c:3198
683 msgid "Delete this user"
684 msgstr "Poista käyttäjä"
685
686-#: html.c:3105 html.c:4520
687+#: html.c:3203 html.c:4688
688 msgid "Approve"
689 msgstr "Hyväksy"
690
691-#: html.c:3106
692+#: html.c:3204
693 msgid "Approve this follow request"
694 msgstr "Hyväksy seurantapyyntö"
695
696-#: html.c:3109 html.c:4544
697+#: html.c:3207 html.c:4712
698 msgid "Discard"
699 msgstr "Hylkää"
700
701-#: html.c:3109
702+#: html.c:3207
703 msgid "Discard this follow request"
704 msgstr "Hylkää seurantapyyntö"
705
706-#: html.c:3114 html.c:4393
707+#: html.c:3212 html.c:4556
708 msgid "Unmute"
709 msgstr "Poista vaimennus"
710
711-#: html.c:3115
712+#: html.c:3213
713 msgid "Stop blocking activities from this user"
714 msgstr "Salli toiminta käyttäjältä"
715
716-#: html.c:3119
717+#: html.c:3217
718 msgid "Block any activity from this user"
719 msgstr "Estä kaikki toiminnat käyttäjältä"
720
721-#: html.c:3127
722+#: html.c:3225
723 msgid "Direct Message..."
724 msgstr "Yksityisviesti..."
725
726-#: html.c:3162
727+#: html.c:3260
728 msgid "Pending follow confirmations"
729 msgstr "Hyväksymistä odottavat seurantapyynnöt"
730
731-#: html.c:3166
732+#: html.c:3264
733 msgid "People you follow"
734 msgstr "Seuraamasi ihniset"
735
736-#: html.c:3167
737+#: html.c:3265
738 msgid "People that follow you"
739 msgstr "Sinua seuraavat"
740
741-#: html.c:3206
742+#: html.c:3304
743 msgid "Clear all"
744 msgstr "Tyhjennä"
745
746-#: html.c:3263
747+#: html.c:3361
748 msgid "Mention"
749 msgstr "Mainitse"
750
751-#: html.c:3266
752+#: html.c:3364
753 msgid "Finished poll"
754 msgstr "Päättynyt kysely"
755
756-#: html.c:3281
757+#: html.c:3379
758 msgid "Follow Request"
759 msgstr "Seurantapyyntö"
760
761-#: html.c:3364
762+#: html.c:3462
763 msgid "Context"
764 msgstr "Konteksti"
765
766-#: html.c:3375
767+#: html.c:3473
768 msgid "New"
769 msgstr "Uusi"
770
771-#: html.c:3390
772+#: html.c:3488
773 msgid "Already seen"
774 msgstr "Nähty"
775
776-#: html.c:3405
777+#: html.c:3503
778 msgid "None"
779 msgstr "Ei ilmoituksia"
780
781-#: html.c:3671
782+#: html.c:3769
783 #, c-format
784 msgid "Search results for account %s"
785 msgstr "Hakutulokset tilille %s"
786
787-#: html.c:3678
788+#: html.c:3776
789 #, c-format
790 msgid "Account %s not found"
791 msgstr "Tiliä %s ei löytynyt"
792
793-#: html.c:3709
794+#: html.c:3807
795 #, c-format
796 msgid "Search results for tag %s"
797 msgstr "Hakutulokset aihetunnisteelle %s"
798
799-#: html.c:3709
800+#: html.c:3807
801 #, c-format
802 msgid "Nothing found for tag %s"
803 msgstr "Aihetunnisteella %s ei löytynyt tuloksia"
804
805-#: html.c:3725
806+#: html.c:3823
807 #, c-format
808 msgid "Search results for '%s' (may be more)"
809 msgstr "Tulokset haulle ”%s” (mahdollisesti enemmän tuloksia)"
810
811-#: html.c:3728
812+#: html.c:3826
813 #, c-format
814 msgid "Search results for '%s'"
815 msgstr "Tulokset haulle ”%s”"
816
817-#: html.c:3731
818+#: html.c:3829
819 #, c-format
820 msgid "No more matches for '%s'"
821 msgstr "Ei enempää tuloksia haulle ”%s”"
822
823-#: html.c:3733
824+#: html.c:3831
825 #, c-format
826 msgid "Nothing found for '%s'"
827 msgstr "Haulla ”%s” ei löytynyt tuloksia"
828
829-#: html.c:3831
830+#: html.c:3929
831 msgid "Showing instance timeline"
832 msgstr "Palvelimen aikajana"
833
834-#: html.c:3899
835+#: html.c:4012
836 #, c-format
837 msgid "Showing timeline for list '%s'"
838 msgstr "Listan ”%s” aikajana"
839@@ -688,15 +688,15 @@ msgstr "Hakutulokset aihetunnisteelle #%s"
840 msgid "Recent posts by users in this instance"
841 msgstr "Viimeaikaisia julkaisuja tällä palvelimella"
842
843-#: html.c:1529
844+#: html.c:1603
845 msgid "Blocked hashtags..."
846 msgstr "Estetyt aihetunnisteet..."
847
848-#: html.c:420
849+#: html.c:432
850 msgid "Optional URL to reply to"
851 msgstr "Vastaus julkaisuun (osoite, valinnainen)"
852
853-#: html.c:527
854+#: html.c:575
855 msgid ""
856 "Option 1...\n"
857 "Option 2...\n"
858@@ -708,30 +708,54 @@ msgstr ""
859 "Vaihtoehto 3...\n"
860 "..."
861
862-#: html.c:1346
863+#: html.c:1415
864 msgid "Bot API key"
865 msgstr "botin API-avain"
866
867-#: html.c:1352
868+#: html.c:1421
869 msgid "Chat id"
870 msgstr "chat id"
871
872-#: html.c:1360
873+#: html.c:1429
874 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
875 msgstr "ntfy-palvelin - täydellinen osoite (esim: https://ntfy.sh/YourTopic)"
876
877-#: html.c:1366
878+#: html.c:1435
879 msgid "ntfy token - if needed"
880 msgstr "ntfy token - tarvittaessa"
881
882-#: html.c:2806
883+#: html.c:2892
884 msgid "pinned"
885 msgstr "kiinnitetyt"
886
887-#: html.c:2818
888+#: html.c:2904
889 msgid "bookmarks"
890 msgstr "kirjanmerkit"
891
892-#: html.c:2830
893+#: html.c:2916
894 msgid "drafts"
895 msgstr "vedokset"
896+
897+#: html.c:464
898+msgid "Scheduled post..."
899+msgstr "Ajastettu julkaisu..."
900+
901+msgid "Post date and time:"
902+msgstr "Julkaisuajankohta:"
903+
904+#: html.c:2927 html.c:3989
905+msgid "Scheduled posts"
906+msgstr "Ajastetut julkaisut"
907+
908+#: html.c:2928
909+msgid "scheduled posts"
910+msgstr "ajastetut julkaisut"
911+
912+#: html.c:458
913+#, c-format
914+msgid "Post date and time (timezone: %s):"
915+msgstr "Julkaisuajankohta (aikavyöhyke: %s):"
916+
917+#: html.c:1538
918+msgid "Time zone:"
919+msgstr "Aikavyöhyke: "
M
po/fr.po
+242,
-214
1@@ -8,674 +8,674 @@ msgstr ""
2 "Language: fr\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Contenu sensible :"
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Description du contenu sensible :"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Seulement pour les personnes mentionnées :"
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Répondre à (URL) :"
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "Ne pas envoyer, mais sauvegarder en tant que brouillon"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Brouillon :"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Pièces jointes…"
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "Fichier :"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48-msgstr "Nettoyer ce champs pour supprimer l'attachement"
49+msgstr "Nettoyer ce champs pour supprimer la pièce jointe"
50
51-#: html.c:482 html.c:507
52+#: html.c:530 html.c:555
53 msgid "Attachment description"
54-msgstr "Description de l'attachement"
55+msgstr "Description de la pièce jointe"
56
57-#: html.c:518
58+#: html.c:566
59 msgid "Poll..."
60 msgstr "Sondage…"
61
62-#: html.c:520
63+#: html.c:568
64 msgid "Poll options (one per line, up to 8):"
65 msgstr "Options du sondage (une par ligne, jusqu'à 8) :"
66
67-#: html.c:532
68+#: html.c:580
69 msgid "One choice"
70 msgstr "Un seul choix"
71
72-#: html.c:535
73+#: html.c:583
74 msgid "Multiple choices"
75 msgstr "Choix multiples"
76
77-#: html.c:541
78+#: html.c:589
79 msgid "End in 5 minutes"
80 msgstr "Se termine dans 5 minutes"
81
82-#: html.c:545
83+#: html.c:593
84 msgid "End in 1 hour"
85 msgstr "Se termine dans 1 heure"
86
87-#: html.c:548
88+#: html.c:596
89 msgid "End in 1 day"
90 msgstr "Se termine dans 1 jour"
91
92-#: html.c:556
93+#: html.c:604
94 msgid "Post"
95 msgstr "Envoyer"
96
97-#: html.c:653 html.c:660
98+#: html.c:701 html.c:708
99 msgid "Site description"
100 msgstr "Description du site"
101
102-#: html.c:671
103+#: html.c:719
104 msgid "Admin email"
105-msgstr "email de l'admin"
106+msgstr "Email de l'admin"
107
108-#: html.c:684
109+#: html.c:732
110 msgid "Admin account"
111-msgstr "compte de l'admin"
112+msgstr "Compte de l'admin"
113
114-#: html.c:752 html.c:1088
115+#: html.c:800 html.c:1136
116 #, c-format
117 msgid "%d following, %d followers"
118-msgstr "Suit %d, %d suiveurs"
119+msgstr "%d abonnements, %d personnes abonnées"
120
121-#: html.c:842
122+#: html.c:890
123 msgid "RSS"
124 msgstr "RSS"
125
126-#: html.c:847 html.c:875
127+#: html.c:895 html.c:923
128 msgid "private"
129 msgstr "privé"
130
131-#: html.c:871
132+#: html.c:919
133 msgid "public"
134 msgstr "public"
135
136-#: html.c:879
137+#: html.c:927
138 msgid "notifications"
139 msgstr "notifications"
140
141-#: html.c:884
142+#: html.c:932
143 msgid "people"
144 msgstr "personnes"
145
146-#: html.c:888
147+#: html.c:936
148 msgid "instance"
149 msgstr "instance"
150
151-#: html.c:897
152+#: html.c:945
153 msgid ""
154 "Search posts by URL or content (regular expression), @user@host accounts, or "
155 "#tag"
156 msgstr ""
157 "Chercher les messages par URL ou contenu (expression régulière), comptes "
158-"@utilisateur@hôte, ou #tag"
159+"@pseudo@hôte, ou #tag"
160
161-#: html.c:898
162+#: html.c:946
163 msgid "Content search"
164 msgstr "Recherche de contenu"
165
166-#: html.c:1020
167+#: html.c:1068
168 msgid "verified link"
169 msgstr "Lien vérifié"
170
171-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
172+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
173 msgid "Location: "
174 msgstr "Emplacement : "
175
176-#: html.c:1113
177+#: html.c:1161
178 msgid "New Post..."
179 msgstr "Nouveau message…"
180
181-#: html.c:1115
182+#: html.c:1163
183 msgid "What's on your mind?"
184 msgstr "Qu'avez-vous en tête ?"
185
186-#: html.c:1124
187+#: html.c:1172
188 msgid "Operations..."
189 msgstr "Opérations…"
190
191-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
192+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
193 msgid "Follow"
194 msgstr "Suivre"
195
196-#: html.c:1141
197+#: html.c:1189
198 msgid "(by URL or user@host)"
199-msgstr "(par URL ou utilisateur@hôte)"
200+msgstr "(par URL ou pseudo@hôte)"
201
202-#: html.c:1156 html.c:1690 html.c:4364
203+#: html.c:1204 html.c:1764 html.c:4527
204 msgid "Boost"
205-msgstr "repartager"
206+msgstr "Repartager"
207
208-#: html.c:1158 html.c:1175
209+#: html.c:1206 html.c:1223
210 msgid "(by URL)"
211 msgstr "(par URL)"
212
213-#: html.c:1173 html.c:1669 html.c:4355
214+#: html.c:1221 html.c:1743 html.c:4518
215 msgid "Like"
216 msgstr "Aime"
217
218-#: html.c:1278
219+#: html.c:1347
220 msgid "User Settings..."
221-msgstr "Réglages utilisateur…"
222+msgstr "Paramètre du compte…"
223
224-#: html.c:1287
225+#: html.c:1356
226 msgid "Display name:"
227 msgstr "Nom affiché :"
228
229-#: html.c:1293
230+#: html.c:1362
231 msgid "Your name"
232 msgstr "Votre nom"
233
234-#: html.c:1295
235+#: html.c:1364
236 msgid "Avatar: "
237 msgstr "Avatar : "
238
239-#: html.c:1303
240+#: html.c:1372
241 msgid "Delete current avatar"
242 msgstr "Supprimer l'avatar actuel"
243
244-#: html.c:1305
245+#: html.c:1374
246 msgid "Header image (banner): "
247 msgstr "Image d'entête (bannière) : "
248
249-#: html.c:1313
250+#: html.c:1382
251 msgid "Delete current header image"
252 msgstr "Supprimer l'image d'entête actuelle"
253
254-#: html.c:1315
255+#: html.c:1384
256 msgid "Bio:"
257-msgstr "CV :"
258+msgstr "Description :"
259
260-#: html.c:1321
261+#: html.c:1390
262 msgid "Write about yourself here..."
263 msgstr "Décrivez-vous ici…"
264
265-#: html.c:1330
266+#: html.c:1399
267 msgid "Always show sensitive content"
268 msgstr "Toujours afficher le contenu sensible"
269
270-#: html.c:1332
271+#: html.c:1401
272 msgid "Email address for notifications:"
273 msgstr "Adresse email pour les notifications :"
274
275-#: html.c:1340
276+#: html.c:1409
277 msgid "Telegram notifications (bot key and chat id):"
278 msgstr "Notifications Telegram (clé de bot et ID de discussion) :"
279
280-#: html.c:1354
281+#: html.c:1423
282 msgid "ntfy notifications (ntfy server and token):"
283 msgstr "notifications ntfy (serveur et jeton ntfy) :"
284
285-#: html.c:1368
286+#: html.c:1437
287 msgid "Maximum days to keep posts (0: server settings):"
288 msgstr ""
289 "Nombre de jours maximum de rétention des messages (0 : réglages du serveur) :"
290
291-#: html.c:1382
292+#: html.c:1451
293 msgid "Drop direct messages from people you don't follow"
294 msgstr "Rejeter les messages directs des personnes que vous ne suivez pas"
295
296-#: html.c:1391
297+#: html.c:1460
298 msgid "This account is a bot"
299 msgstr "Ce compte est un bot"
300
301-#: html.c:1400
302+#: html.c:1469
303 msgid "Auto-boost all mentions to this account"
304 msgstr "Auto-repartage de toutes les mentions de ce compte"
305
306-#: html.c:1409
307+#: html.c:1478
308 msgid "This account is private (posts are not shown through the web)"
309 msgstr "Ce compte est privé (les messages ne sont pas affiché sur le web)"
310
311-#: html.c:1419
312+#: html.c:1488
313 msgid "Collapse top threads by default"
314 msgstr "replier les fils de discussion principaux par défaut"
315
316-#: html.c:1428
317+#: html.c:1497
318 msgid "Follow requests must be approved"
319 msgstr "Les demande de suivi doivent être approuvées"
320
321-#: html.c:1437
322+#: html.c:1506
323 msgid "Publish follower and following metrics"
324-msgstr "Publier les suiveurs et les statistiques de suivis"
325+msgstr "Publier les statistiques d'abonnements"
326
327-#: html.c:1439
328+#: html.c:1508
329 msgid "Current location:"
330 msgstr "Localisation actuelle :"
331
332-#: html.c:1453
333+#: html.c:1522
334 msgid "Profile metadata (key=value pairs in each line):"
335 msgstr "Métadonnées du profile (paires clé=valeur à chaque ligne) :"
336
337-#: html.c:1464
338+#: html.c:1533
339 msgid "Web interface language:"
340 msgstr "Langue de l'interface web :"
341
342-#: html.c:1469
343+#: html.c:1543
344 msgid "New password:"
345 msgstr "Nouveau mot de passe :"
346
347-#: html.c:1476
348+#: html.c:1550
349 msgid "Repeat new password:"
350 msgstr "Répétez le nouveau mot de passe :"
351
352-#: html.c:1486
353+#: html.c:1560
354 msgid "Update user info"
355-msgstr "Mettre à jour les infos utilisateur"
356+msgstr "Mettre à jour les infos du compte"
357
358-#: html.c:1497
359+#: html.c:1571
360 msgid "Followed hashtags..."
361 msgstr "hashtags suivis…"
362
363-#: html.c:1499 html.c:1531
364+#: html.c:1573 html.c:1605
365 msgid "One hashtag per line"
366 msgstr "Un hashtag par ligne"
367
368-#: html.c:1520 html.c:1552
369+#: html.c:1594 html.c:1626
370 msgid "Update hashtags"
371 msgstr "Mettre à jour les hashtags"
372
373-#: html.c:1669
374+#: html.c:1743
375 msgid "Say you like this post"
376 msgstr "Dire que vous aimez ce message"
377
378-#: html.c:1674 html.c:4373
379+#: html.c:1748 html.c:4536
380 msgid "Unlike"
381 msgstr "N'aime plus"
382
383-#: html.c:1674
384+#: html.c:1748
385 msgid "Nah don't like it that much"
386 msgstr "Nan, j'aime pas tant que ça"
387
388-#: html.c:1680 html.c:4505
389+#: html.c:1754 html.c:4673
390 msgid "Unpin"
391 msgstr "Dés-épingler"
392
393-#: html.c:1680
394+#: html.c:1754
395 msgid "Unpin this post from your timeline"
396 msgstr "Dés-épingler ce message de votre chronologie"
397
398-#: html.c:1683 html.c:4500
399+#: html.c:1757 html.c:4668
400 msgid "Pin"
401 msgstr "Épingler"
402
403-#: html.c:1683
404+#: html.c:1757
405 msgid "Pin this post to the top of your timeline"
406 msgstr "Épingler ce message en haut de votre chronologie"
407
408-#: html.c:1690
409+#: html.c:1764
410 msgid "Announce this post to your followers"
411-msgstr "Annoncer ce message à vos suiveurs"
412+msgstr "Annoncer ce message aux personnes abonnées"
413
414-#: html.c:1695 html.c:4381
415+#: html.c:1769 html.c:4544
416 msgid "Unboost"
417 msgstr "Dé-repartager"
418
419-#: html.c:1695
420+#: html.c:1769
421 msgid "I regret I boosted this"
422 msgstr "Je regrette d'avoir repartagé ceci"
423
424-#: html.c:1701 html.c:4515
425+#: html.c:1775 html.c:4683
426 msgid "Unbookmark"
427 msgstr "Retirer le signet"
428
429-#: html.c:1701
430+#: html.c:1775
431 msgid "Delete this post from your bookmarks"
432 msgstr "Supprime ce message de vos signets"
433
434-#: html.c:1704 html.c:4510
435+#: html.c:1778 html.c:4678
436 msgid "Bookmark"
437 msgstr "Signet"
438
439-#: html.c:1704
440+#: html.c:1778
441 msgid "Add this post to your bookmarks"
442 msgstr "Ajouter ce message à vos signets"
443
444-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
445+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
446 msgid "Unfollow"
447 msgstr "Ne plus suivre"
448
449-#: html.c:1710 html.c:3082
450+#: html.c:1784 html.c:3180
451 msgid "Stop following this user's activity"
452-msgstr "Arrêter de suivre les activités de cet utilisateur"
453+msgstr "Arrêter de suivre les activités de cette personne"
454
455-#: html.c:1714 html.c:3096
456+#: html.c:1788 html.c:3194
457 msgid "Start following this user's activity"
458-msgstr "Commencer à suivre les activité de cet utilisateur"
459+msgstr "Commencer à suivre les activité de cette personne"
460
461-#: html.c:1720 html.c:4455
462+#: html.c:1794 html.c:4621
463 msgid "Unfollow Group"
464 msgstr "Ne plus suivre le Groupe"
465
466-#: html.c:1721
467+#: html.c:1795
468 msgid "Stop following this group or channel"
469 msgstr "Arrêter de suivre ce groupe ou canal"
470
471-#: html.c:1725 html.c:4442
472+#: html.c:1799 html.c:4608
473 msgid "Follow Group"
474 msgstr "Suivre le Groupe"
475
476-#: html.c:1726
477+#: html.c:1800
478 msgid "Start following this group or channel"
479 msgstr "Commencer à suivre ce groupe ou canal"
480
481-#: html.c:1731 html.c:3118 html.c:4389
482+#: html.c:1805 html.c:3216 html.c:4552
483 msgid "MUTE"
484-msgstr "TAIRE"
485+msgstr "SOURDINE"
486
487-#: html.c:1732
488+#: html.c:1806
489 msgid "Block any activity from this user forever"
490-msgstr "Bloquer toute activité de cet utilisateur à jamais"
491+msgstr "Bloquer toute activité de cette personne à jamais"
492
493-#: html.c:1737 html.c:3100 html.c:4472
494+#: html.c:1811 html.c:3198 html.c:4638
495 msgid "Delete"
496 msgstr "Supprimer"
497
498-#: html.c:1737
499+#: html.c:1811
500 msgid "Delete this post"
501 msgstr "Supprimer ce message"
502
503-#: html.c:1740 html.c:4397
504+#: html.c:1814 html.c:4560
505 msgid "Hide"
506 msgstr "Cacher"
507
508-#: html.c:1740
509+#: html.c:1814
510 msgid "Hide this post and its children"
511 msgstr "Cacher ce message et ses réponses"
512
513-#: html.c:1771
514+#: html.c:1845
515 msgid "Edit..."
516-msgstr "Éditer…"
517+msgstr "Modifier…"
518
519-#: html.c:1790
520+#: html.c:1865
521 msgid "Reply..."
522 msgstr "Répondre…"
523
524-#: html.c:1841
525+#: html.c:1916
526 msgid "Truncated (too deep)"
527 msgstr "Tronqué (trop profond)"
528
529-#: html.c:1850
530+#: html.c:1925
531 msgid "follows you"
532 msgstr "vous suit"
533
534-#: html.c:1913
535+#: html.c:1988
536 msgid "Pinned"
537 msgstr "Épinglé"
538
539-#: html.c:1921
540+#: html.c:1996
541 msgid "Bookmarked"
542-msgstr "Ajouté au signets"
543+msgstr "Ajouté aux signets"
544
545-#: html.c:1929
546+#: html.c:2004
547 msgid "Poll"
548 msgstr "Sondage"
549
550-#: html.c:1936
551+#: html.c:2011
552 msgid "Voted"
553 msgstr "Voté"
554
555-#: html.c:1945
556+#: html.c:2020
557 msgid "Event"
558 msgstr "Événement"
559
560-#: html.c:1977 html.c:2006
561+#: html.c:2052 html.c:2081
562 msgid "boosted"
563 msgstr "Repartagé"
564
565-#: html.c:2022
566+#: html.c:2097
567 msgid "in reply to"
568 msgstr "En réponse à"
569
570-#: html.c:2073
571+#: html.c:2148
572 msgid " [SENSITIVE CONTENT]"
573 msgstr " [CONTENU SENSIBLE]"
574
575-#: html.c:2250
576+#: html.c:2325
577 msgid "Vote"
578 msgstr "Vote"
579
580-#: html.c:2260
581+#: html.c:2335
582 msgid "Closed"
583 msgstr "Terminé"
584
585-#: html.c:2285
586+#: html.c:2360
587 msgid "Closes in"
588 msgstr "Termine dans"
589
590-#: html.c:2366
591+#: html.c:2441
592 msgid "Video"
593 msgstr "Vidéo"
594
595-#: html.c:2381
596+#: html.c:2456
597 msgid "Audio"
598 msgstr "Audio"
599
600-#: html.c:2403
601+#: html.c:2484
602 msgid "Attachment"
603-msgstr "Attachement"
604+msgstr "Pièce jointe"
605
606-#: html.c:2417
607+#: html.c:2498
608 msgid "Alt..."
609 msgstr "Alt…"
610
611-#: html.c:2430
612+#: html.c:2511
613 msgid "Source channel or community"
614 msgstr "Canal ou communauté source"
615
616-#: html.c:2524
617+#: html.c:2605
618 msgid "Time: "
619 msgstr "Date : "
620
621-#: html.c:2605
622+#: html.c:2686
623 msgid "Older..."
624 msgstr "Plus anciens…"
625
626-#: html.c:2702
627+#: html.c:2788
628 msgid "about this site"
629 msgstr "à propos de ce site"
630
631-#: html.c:2704
632+#: html.c:2790
633 msgid "powered by "
634 msgstr "fonctionne grace à "
635
636-#: html.c:2769
637+#: html.c:2855
638 msgid "Dismiss"
639 msgstr "Rejeter"
640
641-#: html.c:2786
642+#: html.c:2872
643 #, c-format
644 msgid "Timeline for list '%s'"
645 msgstr "Chronologie pour la liste '%s'"
646
647-#: html.c:2805 html.c:3846
648+#: html.c:2891 html.c:3944
649 msgid "Pinned posts"
650 msgstr "Messages épinglés"
651
652-#: html.c:2817 html.c:3861
653+#: html.c:2903 html.c:3959
654 msgid "Bookmarked posts"
655 msgstr "Messages en signets"
656
657-#: html.c:2829 html.c:3876
658+#: html.c:2915 html.c:3974
659 msgid "Post drafts"
660 msgstr "Brouillons de messages"
661
662-#: html.c:2888
663+#: html.c:2986
664 msgid "No more unseen posts"
665 msgstr "Pas d'avantage de message non vus"
666
667-#: html.c:2892 html.c:2992
668+#: html.c:2990 html.c:3090
669 msgid "Back to top"
670 msgstr "Retourner en haut"
671
672-#: html.c:2945
673+#: html.c:3043
674 msgid "History"
675 msgstr "Historique"
676
677-#: html.c:2997 html.c:3417
678+#: html.c:3095 html.c:3515
679 msgid "More..."
680 msgstr "Plus…"
681
682-#: html.c:3086 html.c:4408
683+#: html.c:3184 html.c:4574
684 msgid "Unlimit"
685 msgstr "Illimité"
686
687-#: html.c:3087
688+#: html.c:3185
689 msgid "Allow announces (boosts) from this user"
690-msgstr "Permettre les annonces (repartages) par cet utilisateur"
691+msgstr "Permettre les annonces (repartages) par cette personne"
692
693-#: html.c:3090 html.c:4404
694+#: html.c:3188 html.c:4570
695 msgid "Limit"
696 msgstr "Limite"
697
698-#: html.c:3091
699+#: html.c:3189
700 msgid "Block announces (boosts) from this user"
701-msgstr "Bloquer les annonces (repartages) par cet utilisateur"
702+msgstr "Bloquer les annonces (repartages) par cette personne"
703
704-#: html.c:3100
705+#: html.c:3198
706 msgid "Delete this user"
707-msgstr "Supprimer cet utilisateur"
708+msgstr "Supprimer cette personne"
709
710-#: html.c:3105 html.c:4520
711+#: html.c:3203 html.c:4688
712 msgid "Approve"
713 msgstr "Approuver"
714
715-#: html.c:3106
716+#: html.c:3204
717 msgid "Approve this follow request"
718-msgstr "Approuver cette demande de suivit"
719+msgstr "Approuver cette demande de suivi"
720
721-#: html.c:3109 html.c:4544
722+#: html.c:3207 html.c:4712
723 msgid "Discard"
724 msgstr "Rejeter"
725
726-#: html.c:3109
727+#: html.c:3207
728 msgid "Discard this follow request"
729 msgstr "Rejeter la demande suivante"
730
731-#: html.c:3114 html.c:4393
732+#: html.c:3212 html.c:4556
733 msgid "Unmute"
734 msgstr "Ne plus taire"
735
736-#: html.c:3115
737+#: html.c:3213
738 msgid "Stop blocking activities from this user"
739-msgstr "Arrêter de bloquer les activités de cet utilisateur"
740+msgstr "Arrêter de bloquer les activités de cette personne"
741
742-#: html.c:3119
743+#: html.c:3217
744 msgid "Block any activity from this user"
745-msgstr "Bloque toutes les activités de cet utilisateur"
746+msgstr "Bloque toutes les activités de cette personne"
747
748-#: html.c:3127
749+#: html.c:3225
750 msgid "Direct Message..."
751 msgstr "Message direct…"
752
753-#: html.c:3162
754+#: html.c:3260
755 msgid "Pending follow confirmations"
756-msgstr "Confirmation de suivit en attente"
757+msgstr "Confirmation de suivi en attente"
758
759-#: html.c:3166
760+#: html.c:3264
761 msgid "People you follow"
762 msgstr "Personnes que vous suivez"
763
764-#: html.c:3167
765+#: html.c:3265
766 msgid "People that follow you"
767 msgstr "Personnes qui vous suivent"
768
769-#: html.c:3206
770+#: html.c:3304
771 msgid "Clear all"
772 msgstr "Tout nettoyer"
773
774-#: html.c:3263
775+#: html.c:3361
776 msgid "Mention"
777 msgstr "Mention"
778
779-#: html.c:3266
780+#: html.c:3364
781 msgid "Finished poll"
782 msgstr "Sondage terminé"
783
784-#: html.c:3281
785+#: html.c:3379
786 msgid "Follow Request"
787-msgstr "Requête de suivit"
788+msgstr "Requête de suivi"
789
790-#: html.c:3364
791+#: html.c:3462
792 msgid "Context"
793 msgstr "Contexte"
794
795-#: html.c:3375
796+#: html.c:3473
797 msgid "New"
798 msgstr "Nouveau"
799
800-#: html.c:3390
801+#: html.c:3488
802 msgid "Already seen"
803 msgstr "Déjà vu"
804
805-#: html.c:3405
806+#: html.c:3503
807 msgid "None"
808 msgstr "Aucun"
809
810-#: html.c:3671
811+#: html.c:3769
812 #, c-format
813 msgid "Search results for account %s"
814-msgstr "Résultats de recher pour le compte %s"
815+msgstr "Résultats de recherche pour le compte %s"
816
817-#: html.c:3678
818+#: html.c:3776
819 #, c-format
820 msgid "Account %s not found"
821 msgstr "Compte %s non trouvé"
822
823-#: html.c:3709
824+#: html.c:3807
825 #, c-format
826 msgid "Search results for tag %s"
827 msgstr "Résultats de recherche pour le tag %s"
828
829-#: html.c:3709
830+#: html.c:3807
831 #, c-format
832 msgid "Nothing found for tag %s"
833 msgstr "Rien n'a été trouvé pour le tag %s"
834
835-#: html.c:3725
836+#: html.c:3823
837 #, c-format
838 msgid "Search results for '%s' (may be more)"
839-msgstr "Résultats de recherche pour '%s' (il pourrait y en avoir d'avantage)"
840+msgstr "Résultats de recherche pour '%s' (il pourrait y en avoir davantage)"
841
842-#: html.c:3728
843+#: html.c:3826
844 #, c-format
845 msgid "Search results for '%s'"
846 msgstr "Résultats de recherche pour '%s'"
847
848-#: html.c:3731
849+#: html.c:3829
850 #, c-format
851 msgid "No more matches for '%s'"
852-msgstr "Pas d'avantage de résultats pour '%s'"
853+msgstr "Pas davantage de résultats pour '%s'"
854
855-#: html.c:3733
856+#: html.c:3831
857 #, c-format
858 msgid "Nothing found for '%s'"
859 msgstr "Rien n'a été trouvé pour '%s'"
860
861-#: html.c:3831
862+#: html.c:3929
863 msgid "Showing instance timeline"
864 msgstr "Montrer la chronologie de l'instance"
865
866-#: html.c:3899
867+#: html.c:4012
868 #, c-format
869 msgid "Showing timeline for list '%s'"
870 msgstr "Montrer le chronologie pour la liste '%s'"
871@@ -687,48 +687,76 @@ msgstr "Résultats de recherche pour le tag #%s"
872
873 #: httpd.c:259
874 msgid "Recent posts by users in this instance"
875-msgstr "Messages récents des utilisateurs de cette instance"
876+msgstr "Messages récents des internautes de cette instance"
877
878-#: html.c:1529
879+#: html.c:1603
880 msgid "Blocked hashtags..."
881 msgstr "Hashtags bloqués…"
882
883-#: html.c:420
884+#: html.c:432
885 msgid "Optional URL to reply to"
886-msgstr ""
887+msgstr "URL optionnelle pour répondre à"
888
889-#: html.c:527
890+#: html.c:575
891 msgid ""
892 "Option 1...\n"
893 "Option 2...\n"
894 "Option 3...\n"
895 "..."
896 msgstr ""
897+"Option 1…\n"
898+"Option 2…\n"
899+"Option 3…\n"
900+"…"
901
902-#: html.c:1346
903+#: html.c:1415
904 msgid "Bot API key"
905-msgstr ""
906+msgstr "Clé API de bot"
907
908-#: html.c:1352
909+#: html.c:1421
910 msgid "Chat id"
911-msgstr ""
912+msgstr "Identifiant du salon"
913
914-#: html.c:1360
915+#: html.c:1429
916 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
917-msgstr ""
918+msgstr "serveur ntfy – adresse complète (ex : https://ntfy.sh/VotreSujet)"
919
920-#: html.c:1366
921+#: html.c:1435
922 msgid "ntfy token - if needed"
923-msgstr ""
924+msgstr "jeton ntfy – si nécessaire"
925
926-#: html.c:2806
927+#: html.c:2892
928 msgid "pinned"
929-msgstr ""
930+msgstr "épinglé"
931
932-#: html.c:2818
933+#: html.c:2904
934 msgid "bookmarks"
935-msgstr ""
936+msgstr "signets"
937
938-#: html.c:2830
939+#: html.c:2916
940 msgid "drafts"
941-msgstr ""
942+msgstr "brouillons"
943+
944+#: html.c:464
945+msgid "Scheduled post..."
946+msgstr "Publication planifiée…"
947+
948+msgid "Post date and time:"
949+msgstr "Date et heure de publication :"
950+
951+#: html.c:2927 html.c:3989
952+msgid "Scheduled posts"
953+msgstr "Publications planifiées"
954+
955+#: html.c:2928
956+msgid "scheduled posts"
957+msgstr "publications planifiées"
958+
959+#: html.c:458
960+#, c-format
961+msgid "Post date and time (timezone: %s):"
962+msgstr "Date et heure de publication (fuseau horaire : %s) :"
963+
964+#: html.c:1538
965+msgid "Time zone:"
966+msgstr "Fuseau horaire :"
M
po/it.po
+198,
-174
1@@ -8,120 +8,120 @@ msgstr ""
2 "Language: it\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Contenuto sensibile"
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Descrizione del contenuto sensibile"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Riservato alle persone indicate: "
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Rispondi a (URL): "
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "Salva come bozza senza inviare"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Bozza"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Allegati..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "File:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "Pulisci ed elimina l'allegato"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "Descrizione dell'allegato"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "Sondaggio..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "Scelte per il sondaggio (una per linea, massimo 8):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "Una scelta"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "Scelte multiple"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "Termina in 5 minuti"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "Termina in 1 ora"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "Termina in 1 giorno"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr "Post"
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "Descrizione del sito web"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "Email dell'amministratore"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "Account amministratore"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "%d seguiti, %d seguenti"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "privato"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "pubblico"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "notifiche"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "persone"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "istanza"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151@@ -129,552 +129,552 @@ msgstr ""
152 "Ricerca post per URL o contenuto (espressione regolare), @user@host "
153 "accounts, #tag"
154
155-#: html.c:898
156+#: html.c:946
157 msgid "Content search"
158 msgstr "Ricerca contenuto"
159
160-#: html.c:1020
161+#: html.c:1068
162 msgid "verified link"
163 msgstr "link verificato"
164
165-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
166+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
167 msgid "Location: "
168 msgstr "Posizione: "
169
170-#: html.c:1113
171+#: html.c:1161
172 msgid "New Post..."
173 msgstr "Nuovo post..."
174
175-#: html.c:1115
176+#: html.c:1163
177 msgid "What's on your mind?"
178 msgstr "Cosa stai pensando?"
179
180-#: html.c:1124
181+#: html.c:1172
182 msgid "Operations..."
183 msgstr "Operazioni..."
184
185-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
186+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
187 msgid "Follow"
188 msgstr "Segui"
189
190-#: html.c:1141
191+#: html.c:1189
192 msgid "(by URL or user@host)"
193 msgstr "(per URL o user@host)"
194
195-#: html.c:1156 html.c:1690 html.c:4364
196+#: html.c:1204 html.c:1764 html.c:4527
197 msgid "Boost"
198 msgstr "Annuncia"
199
200-#: html.c:1158 html.c:1175
201+#: html.c:1206 html.c:1223
202 msgid "(by URL)"
203 msgstr "(per URL)"
204
205-#: html.c:1173 html.c:1669 html.c:4355
206+#: html.c:1221 html.c:1743 html.c:4518
207 msgid "Like"
208 msgstr "Mi piace"
209
210-#: html.c:1278
211+#: html.c:1347
212 msgid "User Settings..."
213 msgstr "Impostazioni..."
214
215-#: html.c:1287
216+#: html.c:1356
217 msgid "Display name:"
218 msgstr "Nome visualizzato:"
219
220-#: html.c:1293
221+#: html.c:1362
222 msgid "Your name"
223 msgstr "Il tuo nome"
224
225-#: html.c:1295
226+#: html.c:1364
227 msgid "Avatar: "
228 msgstr "Avatar: "
229
230-#: html.c:1303
231+#: html.c:1372
232 msgid "Delete current avatar"
233 msgstr "Elimina l'avatar"
234
235-#: html.c:1305
236+#: html.c:1374
237 msgid "Header image (banner): "
238 msgstr "Immagine intestazione (banner): "
239
240-#: html.c:1313
241+#: html.c:1382
242 msgid "Delete current header image"
243 msgstr "Elimina l'immagine d'intestazione"
244
245-#: html.c:1315
246+#: html.c:1384
247 msgid "Bio:"
248 msgstr "Bio:"
249
250-#: html.c:1321
251+#: html.c:1390
252 msgid "Write about yourself here..."
253 msgstr "Descriviti qui..."
254
255-#: html.c:1330
256+#: html.c:1399
257 msgid "Always show sensitive content"
258 msgstr "Mostra sempre i contenuti sensibili"
259
260-#: html.c:1332
261+#: html.c:1401
262 msgid "Email address for notifications:"
263 msgstr "Indirizzo email per le notifiche:"
264
265-#: html.c:1340
266+#: html.c:1409
267 msgid "Telegram notifications (bot key and chat id):"
268 msgstr "Notifiche Telegram (bot key e chat id):"
269
270-#: html.c:1354
271+#: html.c:1423
272 msgid "ntfy notifications (ntfy server and token):"
273 msgstr "Notifiche ntfy (server ntfy e token)"
274
275-#: html.c:1368
276+#: html.c:1437
277 msgid "Maximum days to keep posts (0: server settings):"
278 msgstr "Giorni di mantenimento dei post (0: impostazione server)"
279
280-#: html.c:1382
281+#: html.c:1451
282 msgid "Drop direct messages from people you don't follow"
283 msgstr "Elimina i messaggi diretti delle persone non seguite"
284
285-#: html.c:1391
286+#: html.c:1460
287 msgid "This account is a bot"
288 msgstr "Questo account è un bot"
289
290-#: html.c:1400
291+#: html.c:1469
292 msgid "Auto-boost all mentions to this account"
293 msgstr "Annuncio automatico delle citazioni a quest'account"
294
295-#: html.c:1409
296+#: html.c:1478
297 msgid "This account is private (posts are not shown through the web)"
298 msgstr "Quest'account è privato (post invisibili nel web)"
299
300-#: html.c:1419
301+#: html.c:1488
302 msgid "Collapse top threads by default"
303 msgstr "Tieni chiuse le discussioni"
304
305-#: html.c:1428
306+#: html.c:1497
307 msgid "Follow requests must be approved"
308 msgstr "Devi approvare le richieste dei seguenti"
309
310-#: html.c:1437
311+#: html.c:1506
312 msgid "Publish follower and following metrics"
313 msgstr "Rendi pubblici seguenti e seguiti"
314
315-#: html.c:1439
316+#: html.c:1508
317 msgid "Current location:"
318 msgstr "Posizione corrente:"
319
320-#: html.c:1453
321+#: html.c:1522
322 msgid "Profile metadata (key=value pairs in each line):"
323 msgstr "Dati del profilo (coppie di chiave=valore per ogni linea):"
324
325-#: html.c:1464
326+#: html.c:1533
327 msgid "Web interface language:"
328 msgstr "Lingua dell'interfaccia web:"
329
330-#: html.c:1469
331+#: html.c:1543
332 msgid "New password:"
333 msgstr "Nuova password:"
334
335-#: html.c:1476
336+#: html.c:1550
337 msgid "Repeat new password:"
338 msgstr "Reinserisci la password:"
339
340-#: html.c:1486
341+#: html.c:1560
342 msgid "Update user info"
343 msgstr "Aggiorna dati utente"
344
345-#: html.c:1497
346+#: html.c:1571
347 msgid "Followed hashtags..."
348 msgstr "Hashtag seguiti..."
349
350-#: html.c:1499 html.c:1531
351+#: html.c:1573 html.c:1605
352 msgid "One hashtag per line"
353 msgstr "Un hashtag per linea"
354
355-#: html.c:1520 html.c:1552
356+#: html.c:1594 html.c:1626
357 msgid "Update hashtags"
358 msgstr "Aggiorna hashtags"
359
360-#: html.c:1669
361+#: html.c:1743
362 msgid "Say you like this post"
363 msgstr "Questo post ti piace"
364
365-#: html.c:1674 html.c:4373
366+#: html.c:1748 html.c:4536
367 msgid "Unlike"
368 msgstr "Non mi piace"
369
370-#: html.c:1674
371+#: html.c:1748
372 msgid "Nah don't like it that much"
373 msgstr "No, non mi piace molto"
374
375-#: html.c:1680 html.c:4505
376+#: html.c:1754 html.c:4673
377 msgid "Unpin"
378 msgstr "Sgancia"
379
380-#: html.c:1680
381+#: html.c:1754
382 msgid "Unpin this post from your timeline"
383 msgstr "Sgancia questo post dalla timeline"
384
385-#: html.c:1683 html.c:4500
386+#: html.c:1757 html.c:4668
387 msgid "Pin"
388 msgstr "Aggancia"
389
390-#: html.c:1683
391+#: html.c:1757
392 msgid "Pin this post to the top of your timeline"
393 msgstr "Aggancia questo post in cima alla timeline"
394
395-#: html.c:1690
396+#: html.c:1764
397 msgid "Announce this post to your followers"
398 msgstr "Annuncia questo post ai tuoi seguenti"
399
400-#: html.c:1695 html.c:4381
401+#: html.c:1769 html.c:4544
402 msgid "Unboost"
403 msgstr "Rimuovi annuncio"
404
405-#: html.c:1695
406+#: html.c:1769
407 msgid "I regret I boosted this"
408 msgstr "Mi pento di aver annunciato questo"
409
410-#: html.c:1701 html.c:4515
411+#: html.c:1775 html.c:4683
412 msgid "Unbookmark"
413 msgstr "Elimina segnalibro"
414
415-#: html.c:1701
416+#: html.c:1775
417 msgid "Delete this post from your bookmarks"
418 msgstr "Elimina questo post dai segnalibri"
419
420-#: html.c:1704 html.c:4510
421+#: html.c:1778 html.c:4678
422 msgid "Bookmark"
423 msgstr "Segnalibro"
424
425-#: html.c:1704
426+#: html.c:1778
427 msgid "Add this post to your bookmarks"
428 msgstr "Aggiungi questo post ai segnalibri"
429
430-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
431+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
432 msgid "Unfollow"
433 msgstr "Smetti di seguire"
434
435-#: html.c:1710 html.c:3082
436+#: html.c:1784 html.c:3180
437 msgid "Stop following this user's activity"
438 msgstr "Smetti di seguire l'utente"
439
440-#: html.c:1714 html.c:3096
441+#: html.c:1788 html.c:3194
442 msgid "Start following this user's activity"
443 msgstr "Sequi l'utente"
444
445-#: html.c:1720 html.c:4455
446+#: html.c:1794 html.c:4621
447 msgid "Unfollow Group"
448 msgstr "Smetti di seguire il gruppo"
449
450-#: html.c:1721
451+#: html.c:1795
452 msgid "Stop following this group or channel"
453 msgstr "Smetti di seguire il gruppo o canale"
454
455-#: html.c:1725 html.c:4442
456+#: html.c:1799 html.c:4608
457 msgid "Follow Group"
458 msgstr "Segui grupp"
459
460-#: html.c:1726
461+#: html.c:1800
462 msgid "Start following this group or channel"
463 msgstr "Segui il gruppo o canale"
464
465-#: html.c:1731 html.c:3118 html.c:4389
466+#: html.c:1805 html.c:3216 html.c:4552
467 msgid "MUTE"
468 msgstr "Silenzia"
469
470-#: html.c:1732
471+#: html.c:1806
472 msgid "Block any activity from this user forever"
473 msgstr "Blocca l'utente"
474
475-#: html.c:1737 html.c:3100 html.c:4472
476+#: html.c:1811 html.c:3198 html.c:4638
477 msgid "Delete"
478 msgstr "Elimina"
479
480-#: html.c:1737
481+#: html.c:1811
482 msgid "Delete this post"
483 msgstr "Elimina questo post"
484
485-#: html.c:1740 html.c:4397
486+#: html.c:1814 html.c:4560
487 msgid "Hide"
488 msgstr "Nascondi"
489
490-#: html.c:1740
491+#: html.c:1814
492 msgid "Hide this post and its children"
493 msgstr "Nascondi questo post completamente"
494
495-#: html.c:1771
496+#: html.c:1845
497 msgid "Edit..."
498 msgstr "Modifica..."
499
500-#: html.c:1790
501+#: html.c:1865
502 msgid "Reply..."
503 msgstr "Rispondi..."
504
505-#: html.c:1841
506+#: html.c:1916
507 msgid "Truncated (too deep)"
508 msgstr "Troncato (troppo lungo)"
509
510-#: html.c:1850
511+#: html.c:1925
512 msgid "follows you"
513 msgstr "Ti segue"
514
515-#: html.c:1913
516+#: html.c:1988
517 msgid "Pinned"
518 msgstr "Aggancia"
519
520-#: html.c:1921
521+#: html.c:1996
522 msgid "Bookmarked"
523 msgstr "Segnalibro"
524
525-#: html.c:1929
526+#: html.c:2004
527 msgid "Poll"
528 msgstr "Sondaggio"
529
530-#: html.c:1936
531+#: html.c:2011
532 msgid "Voted"
533 msgstr "Votato"
534
535-#: html.c:1945
536+#: html.c:2020
537 msgid "Event"
538 msgstr "Evento"
539
540-#: html.c:1977 html.c:2006
541+#: html.c:2052 html.c:2081
542 msgid "boosted"
543 msgstr "Annunciato"
544
545-#: html.c:2022
546+#: html.c:2097
547 msgid "in reply to"
548 msgstr "in risposta a"
549
550-#: html.c:2073
551+#: html.c:2148
552 msgid " [SENSITIVE CONTENT]"
553 msgstr " [CONTENUTO SENSIBILE]"
554
555-#: html.c:2250
556+#: html.c:2325
557 msgid "Vote"
558 msgstr "Vota"
559
560-#: html.c:2260
561+#: html.c:2335
562 msgid "Closed"
563 msgstr "Chiuso"
564
565-#: html.c:2285
566+#: html.c:2360
567 msgid "Closes in"
568 msgstr "Chiude in"
569
570-#: html.c:2366
571+#: html.c:2441
572 msgid "Video"
573 msgstr "Video"
574
575-#: html.c:2381
576+#: html.c:2456
577 msgid "Audio"
578 msgstr "Audio"
579
580-#: html.c:2403
581+#: html.c:2484
582 msgid "Attachment"
583 msgstr "Allegato"
584
585-#: html.c:2417
586+#: html.c:2498
587 msgid "Alt..."
588 msgstr "Testo alternativo..."
589
590-#: html.c:2430
591+#: html.c:2511
592 msgid "Source channel or community"
593 msgstr "Provenienza del canale o comunità"
594
595-#: html.c:2524
596+#: html.c:2605
597 msgid "Time: "
598 msgstr "Orario:"
599
600-#: html.c:2605
601+#: html.c:2686
602 msgid "Older..."
603 msgstr "Vecchi..."
604
605-#: html.c:2702
606+#: html.c:2788
607 msgid "about this site"
608 msgstr "descrizione"
609
610-#: html.c:2704
611+#: html.c:2790
612 msgid "powered by "
613 msgstr "gestito da "
614
615-#: html.c:2769
616+#: html.c:2855
617 msgid "Dismiss"
618 msgstr "Congeda"
619
620-#: html.c:2786
621+#: html.c:2872
622 #, c-format
623 msgid "Timeline for list '%s'"
624 msgstr "Timeline per la lista '%s'"
625
626-#: html.c:2805 html.c:3846
627+#: html.c:2891 html.c:3944
628 msgid "Pinned posts"
629 msgstr "Post appuntati"
630
631-#: html.c:2817 html.c:3861
632+#: html.c:2903 html.c:3959
633 msgid "Bookmarked posts"
634 msgstr "Post segnati"
635
636-#: html.c:2829 html.c:3876
637+#: html.c:2915 html.c:3974
638 msgid "Post drafts"
639 msgstr "Bozze"
640
641-#: html.c:2888
642+#: html.c:2986
643 msgid "No more unseen posts"
644 msgstr "Nessun ulteriore post"
645
646-#: html.c:2892 html.c:2992
647+#: html.c:2990 html.c:3090
648 msgid "Back to top"
649 msgstr "Torna in cima"
650
651-#: html.c:2945
652+#: html.c:3043
653 msgid "History"
654 msgstr "Storico"
655
656-#: html.c:2997 html.c:3417
657+#: html.c:3095 html.c:3515
658 msgid "More..."
659 msgstr "Ancora..."
660
661-#: html.c:3086 html.c:4408
662+#: html.c:3184 html.c:4574
663 msgid "Unlimit"
664 msgstr "Senza limite"
665
666-#: html.c:3087
667+#: html.c:3185
668 msgid "Allow announces (boosts) from this user"
669 msgstr "Permetti annunci dall'utente"
670
671-#: html.c:3090 html.c:4404
672+#: html.c:3188 html.c:4570
673 msgid "Limit"
674 msgstr "Limite"
675
676-#: html.c:3091
677+#: html.c:3189
678 msgid "Block announces (boosts) from this user"
679 msgstr "Blocca annunci dall'utente"
680
681-#: html.c:3100
682+#: html.c:3198
683 msgid "Delete this user"
684 msgstr "Elimina l'utente"
685
686-#: html.c:3105 html.c:4520
687+#: html.c:3203 html.c:4688
688 msgid "Approve"
689 msgstr "Approva"
690
691-#: html.c:3106
692+#: html.c:3204
693 msgid "Approve this follow request"
694 msgstr "Approva richiesta di seguirti"
695
696-#: html.c:3109 html.c:4544
697+#: html.c:3207 html.c:4712
698 msgid "Discard"
699 msgstr "Scarta"
700
701-#: html.c:3109
702+#: html.c:3207
703 msgid "Discard this follow request"
704 msgstr "Scarta richiesta di seguirti"
705
706-#: html.c:3114 html.c:4393
707+#: html.c:3212 html.c:4556
708 msgid "Unmute"
709 msgstr "Rimuovi silenziamento"
710
711-#: html.c:3115
712+#: html.c:3213
713 msgid "Stop blocking activities from this user"
714 msgstr "Sblocca l'utente"
715
716-#: html.c:3119
717+#: html.c:3217
718 msgid "Block any activity from this user"
719 msgstr "Blocca l'utente completamente"
720
721-#: html.c:3127
722+#: html.c:3225
723 msgid "Direct Message..."
724 msgstr "Messaggio diretto..."
725
726-#: html.c:3162
727+#: html.c:3260
728 msgid "Pending follow confirmations"
729 msgstr "Conferme di seguirti in attesa"
730
731-#: html.c:3166
732+#: html.c:3264
733 msgid "People you follow"
734 msgstr "Persone che segui"
735
736-#: html.c:3167
737+#: html.c:3265
738 msgid "People that follow you"
739 msgstr "Persone che ti seguono"
740
741-#: html.c:3206
742+#: html.c:3304
743 msgid "Clear all"
744 msgstr "Pulisci"
745
746-#: html.c:3263
747+#: html.c:3361
748 msgid "Mention"
749 msgstr "Citazione"
750
751-#: html.c:3266
752+#: html.c:3364
753 msgid "Finished poll"
754 msgstr "Sondaggio concluso"
755
756-#: html.c:3281
757+#: html.c:3379
758 msgid "Follow Request"
759 msgstr "Richiesta di seguire"
760
761-#: html.c:3364
762+#: html.c:3462
763 msgid "Context"
764 msgstr "Contesto"
765
766-#: html.c:3375
767+#: html.c:3473
768 msgid "New"
769 msgstr "Nuovo"
770
771-#: html.c:3390
772+#: html.c:3488
773 msgid "Already seen"
774 msgstr "Già visto"
775
776-#: html.c:3405
777+#: html.c:3503
778 msgid "None"
779 msgstr "Niente"
780
781-#: html.c:3671
782+#: html.c:3769
783 #, c-format
784 msgid "Search results for account %s"
785 msgstr "Risultati per account %s"
786
787-#: html.c:3678
788+#: html.c:3776
789 #, c-format
790 msgid "Account %s not found"
791 msgstr "Account %s non trovato"
792
793-#: html.c:3709
794+#: html.c:3807
795 #, c-format
796 msgid "Search results for tag %s"
797 msgstr "Risultati per tag %s"
798
799-#: html.c:3709
800+#: html.c:3807
801 #, c-format
802 msgid "Nothing found for tag %s"
803 msgstr "Nessun risultato per il tag %S"
804
805-#: html.c:3725
806+#: html.c:3823
807 #, c-format
808 msgid "Search results for '%s' (may be more)"
809 msgstr "Risultati per tag %s (ancora...)"
810
811-#: html.c:3728
812+#: html.c:3826
813 #, c-format
814 msgid "Search results for '%s'"
815 msgstr "Risultati per %s"
816
817-#: html.c:3731
818+#: html.c:3829
819 #, c-format
820 msgid "No more matches for '%s'"
821 msgstr "Nessuna corrispondenza per '%s'"
822
823-#: html.c:3733
824+#: html.c:3831
825 #, c-format
826 msgid "Nothing found for '%s'"
827 msgstr "Non trovato per '%s'"
828
829-#: html.c:3831
830+#: html.c:3929
831 msgid "Showing instance timeline"
832 msgstr "Mostra la timeline dell'istanza"
833
834-#: html.c:3899
835+#: html.c:4012
836 #, c-format
837 msgid "Showing timeline for list '%s'"
838 msgstr "Mostra la timeline della lista '%s'"
839@@ -688,15 +688,15 @@ msgstr "Risultati per tag #%s"
840 msgid "Recent posts by users in this instance"
841 msgstr "Post recenti in questa istanza"
842
843-#: html.c:1529
844+#: html.c:1603
845 msgid "Blocked hashtags..."
846 msgstr "Hashtag bloccati..."
847
848-#: html.c:420
849+#: html.c:432
850 msgid "Optional URL to reply to"
851 msgstr "URL facoltativo di risposta"
852
853-#: html.c:527
854+#: html.c:575
855 msgid ""
856 "Option 1...\n"
857 "Option 2...\n"
858@@ -708,30 +708,54 @@ msgstr ""
859 "Scelta 3...\n"
860 "..."
861
862-#: html.c:1346
863+#: html.c:1415
864 msgid "Bot API key"
865 msgstr "Chiave per le API del bot"
866
867-#: html.c:1352
868+#: html.c:1421
869 msgid "Chat id"
870 msgstr "Id della chat"
871
872-#: html.c:1360
873+#: html.c:1429
874 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
875 msgstr "Server ntfy - URL completo (esempio: https://ntfy.sh/YourTopic)"
876
877-#: html.c:1366
878+#: html.c:1435
879 msgid "ntfy token - if needed"
880 msgstr "Token ntfy - se richiesto"
881
882-#: html.c:2806
883+#: html.c:2892
884 msgid "pinned"
885 msgstr "appuntati"
886
887-#: html.c:2818
888+#: html.c:2904
889 msgid "bookmarks"
890 msgstr "segnalibri"
891
892-#: html.c:2830
893+#: html.c:2916
894 msgid "drafts"
895 msgstr "bozze"
896+
897+#: html.c:464
898+msgid "Scheduled post..."
899+msgstr ""
900+
901+msgid "Post date and time:"
902+msgstr ""
903+
904+#: html.c:2927 html.c:3989
905+msgid "Scheduled posts"
906+msgstr ""
907+
908+#: html.c:2928
909+msgid "scheduled posts"
910+msgstr ""
911+
912+#: html.c:458
913+#, c-format
914+msgid "Post date and time (timezone: %s):"
915+msgstr ""
916+
917+#: html.c:1538
918+msgid "Time zone:"
919+msgstr ""
+203,
-176
1@@ -4,125 +4,128 @@
2 msgid ""
3 msgstr ""
4 "Project-Id-Version: snac\n"
5-"Last-Translator: Daltux <https://daltux.net>\n"
6+"PO-Revision-Date: 2025-04-18\n"
7+"Last-Translator: Daltux <@daltux@snac.daltux.net>\n"
8 "Language: pt_BR\n"
9+"MIME-Version: 1.0\n"
10 "Content-Type: text/plain; charset=UTF-8\n"
11-"X-Generator: Poedit 3.5\n"
12+"Content-Transfer-Encoding: 8bit\n"
13+"X-Generator: Poedit 3.6\n"
14
15-#: html.c:372
16+#: html.c:384
17 msgid "Sensitive content: "
18 msgstr "Conteúdo sensível: "
19
20-#: html.c:380
21+#: html.c:392
22 msgid "Sensitive content description"
23 msgstr "Descrição do conteúdo sensível"
24
25-#: html.c:393
26+#: html.c:405
27 msgid "Only for mentioned people: "
28 msgstr "Apenas para pessoas mencionadas: "
29
30-#: html.c:416
31+#: html.c:428
32 msgid "Reply to (URL): "
33 msgstr "Resposta para (URL): "
34
35-#: html.c:425
36+#: html.c:437
37 msgid "Don't send, but store as a draft"
38 msgstr "Não enviar, mas armazenar como rascunho"
39
40-#: html.c:426
41+#: html.c:438
42 msgid "Draft:"
43 msgstr "Rascunho:"
44
45-#: html.c:446
46+#: html.c:494
47 msgid "Attachments..."
48 msgstr "Anexos..."
49
50-#: html.c:469
51+#: html.c:517
52 msgid "File:"
53 msgstr "Arquivo:"
54
55-#: html.c:473
56+#: html.c:521
57 msgid "Clear this field to delete the attachment"
58 msgstr "Limpe este campo para remover o anexo"
59
60-#: html.c:482 html.c:507
61+#: html.c:530 html.c:555
62 msgid "Attachment description"
63 msgstr "Descrição do anexo"
64
65-#: html.c:518
66+#: html.c:566
67 msgid "Poll..."
68 msgstr "Enquete..."
69
70-#: html.c:520
71+#: html.c:568
72 msgid "Poll options (one per line, up to 8):"
73 msgstr "Alternativas da enquete (uma por linha, até 8):"
74
75-#: html.c:532
76+#: html.c:580
77 msgid "One choice"
78 msgstr "Escolha única"
79
80-#: html.c:535
81+#: html.c:583
82 msgid "Multiple choices"
83 msgstr "Escolhas múltiplas"
84
85-#: html.c:541
86+#: html.c:589
87 msgid "End in 5 minutes"
88 msgstr "Encerrar em 5 minutos"
89
90-#: html.c:545
91+#: html.c:593
92 msgid "End in 1 hour"
93 msgstr "Encerrar em 1 hora"
94
95-#: html.c:548
96+#: html.c:596
97 msgid "End in 1 day"
98 msgstr "Encerrar em 1 dia"
99
100-#: html.c:556
101+#: html.c:604
102 msgid "Post"
103 msgstr "Publicar"
104
105-#: html.c:653 html.c:660
106+#: html.c:701 html.c:708
107 msgid "Site description"
108 msgstr "Descrição do sítio eletrônico"
109
110-#: html.c:671
111+#: html.c:719
112 msgid "Admin email"
113 msgstr "E-mail da administração"
114
115-#: html.c:684
116+#: html.c:732
117 msgid "Admin account"
118 msgstr "Conta de quem administra"
119
120-#: html.c:752 html.c:1088
121+#: html.c:800 html.c:1136
122 #, c-format
123 msgid "%d following, %d followers"
124 msgstr "%d seguidos, %d seguidores"
125
126-#: html.c:842
127+#: html.c:890
128 msgid "RSS"
129 msgstr "RSS"
130
131-#: html.c:847 html.c:875
132+#: html.c:895 html.c:923
133 msgid "private"
134 msgstr "privado"
135
136-#: html.c:871
137+#: html.c:919
138 msgid "public"
139 msgstr "público"
140
141-#: html.c:879
142+#: html.c:927
143 msgid "notifications"
144 msgstr "notificações"
145
146-#: html.c:884
147+#: html.c:932
148 msgid "people"
149 msgstr "pessoas"
150
151-#: html.c:888
152+#: html.c:936
153 msgid "instance"
154 msgstr "instância"
155
156-#: html.c:897
157+#: html.c:945
158 msgid ""
159 "Search posts by URL or content (regular expression), @user@host accounts, or "
160 "#tag"
161@@ -130,552 +133,552 @@ msgstr ""
162 "Procurar publicações por URL ou conteúdo (expressão regular), contas "
163 "(@perfil@servidor) ou #tag"
164
165-#: html.c:898
166+#: html.c:946
167 msgid "Content search"
168 msgstr "Buscar conteúdo"
169
170-#: html.c:1020
171+#: html.c:1068
172 msgid "verified link"
173 msgstr "ligação verificada"
174
175-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
176+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
177 msgid "Location: "
178 msgstr "Localização: "
179
180-#: html.c:1113
181+#: html.c:1161
182 msgid "New Post..."
183 msgstr "Nova publicação..."
184
185-#: html.c:1115
186+#: html.c:1163
187 msgid "What's on your mind?"
188 msgstr "O que tem em mente?"
189
190-#: html.c:1124
191+#: html.c:1172
192 msgid "Operations..."
193 msgstr "Operações..."
194
195-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
196+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
197 msgid "Follow"
198 msgstr "Seguir"
199
200-#: html.c:1141
201+#: html.c:1189
202 msgid "(by URL or user@host)"
203 msgstr "(por URL ou conta@servidor)"
204
205-#: html.c:1156 html.c:1690 html.c:4364
206+#: html.c:1204 html.c:1764 html.c:4527
207 msgid "Boost"
208 msgstr "Impulsionar"
209
210-#: html.c:1158 html.c:1175
211+#: html.c:1206 html.c:1223
212 msgid "(by URL)"
213 msgstr "(por URL)"
214
215-#: html.c:1173 html.c:1669 html.c:4355
216+#: html.c:1221 html.c:1743 html.c:4518
217 msgid "Like"
218 msgstr "Curtir"
219
220-#: html.c:1278
221+#: html.c:1347
222 msgid "User Settings..."
223 msgstr "Definições de uso..."
224
225-#: html.c:1287
226+#: html.c:1356
227 msgid "Display name:"
228 msgstr "Nome a ser exibido:"
229
230-#: html.c:1293
231+#: html.c:1362
232 msgid "Your name"
233 msgstr "Seu nome"
234
235-#: html.c:1295
236+#: html.c:1364
237 msgid "Avatar: "
238 msgstr "Avatar: "
239
240-#: html.c:1303
241+#: html.c:1372
242 msgid "Delete current avatar"
243 msgstr "Remover avatar atual"
244
245-#: html.c:1305
246+#: html.c:1374
247 msgid "Header image (banner): "
248 msgstr "Imagem de cabeçalho (capa): "
249
250-#: html.c:1313
251+#: html.c:1382
252 msgid "Delete current header image"
253 msgstr "Remover imagem de cabeçalho atual"
254
255-#: html.c:1315
256+#: html.c:1384
257 msgid "Bio:"
258 msgstr "Biografia:"
259
260-#: html.c:1321
261+#: html.c:1390
262 msgid "Write about yourself here..."
263 msgstr "Escreva aqui sobre você..."
264
265-#: html.c:1330
266+#: html.c:1399
267 msgid "Always show sensitive content"
268 msgstr "Sempre exibir conteúdo sensível"
269
270-#: html.c:1332
271+#: html.c:1401
272 msgid "Email address for notifications:"
273 msgstr "Endereço de e-mail para notificações:"
274
275-#: html.c:1340
276+#: html.c:1409
277 msgid "Telegram notifications (bot key and chat id):"
278 msgstr "Notificações Telegram (chave do robô e ID da conversa):"
279
280-#: html.c:1354
281+#: html.c:1423
282 msgid "ntfy notifications (ntfy server and token):"
283 msgstr "Notificações ntfy (servidor ntfy e token):"
284
285-#: html.c:1368
286+#: html.c:1437
287 msgid "Maximum days to keep posts (0: server settings):"
288 msgstr "Máximo de dias a preservar publicações (0: definições do servidor):"
289
290-#: html.c:1382
291+#: html.c:1451
292 msgid "Drop direct messages from people you don't follow"
293 msgstr "Descartar mensagens diretas de pessoas que você não segue"
294
295-#: html.c:1391
296+#: html.c:1460
297 msgid "This account is a bot"
298 msgstr "Esta conta é robô"
299
300-#: html.c:1400
301+#: html.c:1469
302 msgid "Auto-boost all mentions to this account"
303 msgstr "Impulsionar automaticamente todas as menções a esta conta"
304
305-#: html.c:1409
306+#: html.c:1478
307 msgid "This account is private (posts are not shown through the web)"
308 msgstr "Esta conta é privada (as publicações não são exibidas na Web)"
309
310-#: html.c:1419
311+#: html.c:1488
312 msgid "Collapse top threads by default"
313 msgstr "Recolher por padrão as sequências de publicações"
314
315-#: html.c:1428
316+#: html.c:1497
317 msgid "Follow requests must be approved"
318 msgstr "Solicitações de seguimento precisam ser aprovadas"
319
320-#: html.c:1437
321+#: html.c:1506
322 msgid "Publish follower and following metrics"
323 msgstr "Publicar métricas de seguidores e seguidos"
324
325-#: html.c:1439
326+#: html.c:1508
327 msgid "Current location:"
328 msgstr "Localização atual:"
329
330-#: html.c:1453
331+#: html.c:1522
332 msgid "Profile metadata (key=value pairs in each line):"
333 msgstr "Metadados do perfil (par de chave=valor em cada linha):"
334
335-#: html.c:1464
336+#: html.c:1533
337 msgid "Web interface language:"
338 msgstr "Idioma da interface Web:"
339
340-#: html.c:1469
341+#: html.c:1543
342 msgid "New password:"
343 msgstr "Nova senha:"
344
345-#: html.c:1476
346+#: html.c:1550
347 msgid "Repeat new password:"
348 msgstr "Repita a nova senha:"
349
350-#: html.c:1486
351+#: html.c:1560
352 msgid "Update user info"
353 msgstr "Atualizar informações da conta"
354
355-#: html.c:1497
356+#: html.c:1571
357 msgid "Followed hashtags..."
358 msgstr "Hashtags seguidas..."
359
360-#: html.c:1499 html.c:1531
361+#: html.c:1573 html.c:1605
362 msgid "One hashtag per line"
363 msgstr "Uma hashtag por linha"
364
365-#: html.c:1520 html.c:1552
366+#: html.c:1594 html.c:1626
367 msgid "Update hashtags"
368 msgstr "Atualizar hashtags"
369
370-#: html.c:1669
371+#: html.c:1743
372 msgid "Say you like this post"
373 msgstr "Declarar que gosta desta publicação"
374
375-#: html.c:1674 html.c:4373
376+#: html.c:1748 html.c:4536
377 msgid "Unlike"
378 msgstr "Descurtir"
379
380-#: html.c:1674
381+#: html.c:1748
382 msgid "Nah don't like it that much"
383 msgstr "Não gosto tanto assim disso"
384
385-#: html.c:1680 html.c:4505
386+#: html.c:1754 html.c:4673
387 msgid "Unpin"
388 msgstr "Desafixar"
389
390-#: html.c:1680
391+#: html.c:1754
392 msgid "Unpin this post from your timeline"
393 msgstr "Desafixar esta publicação da sua linha do tempo"
394
395-#: html.c:1683 html.c:4500
396+#: html.c:1757 html.c:4668
397 msgid "Pin"
398 msgstr "Afixar"
399
400-#: html.c:1683
401+#: html.c:1757
402 msgid "Pin this post to the top of your timeline"
403 msgstr "Afixar esta publicação no topo de sua linha do tempo"
404
405-#: html.c:1690
406+#: html.c:1764
407 msgid "Announce this post to your followers"
408 msgstr "Anunciar esta publicação para seus seguidores"
409
410-#: html.c:1695 html.c:4381
411+#: html.c:1769 html.c:4544
412 msgid "Unboost"
413 msgstr "Desimpulsionar"
414
415-#: html.c:1695
416+#: html.c:1769
417 msgid "I regret I boosted this"
418 msgstr "Arrependo-me de ter impulsionado isso"
419
420-#: html.c:1701 html.c:4515
421+#: html.c:1775 html.c:4683
422 msgid "Unbookmark"
423 msgstr "Desmarcar"
424
425-#: html.c:1701
426+#: html.c:1775
427 msgid "Delete this post from your bookmarks"
428 msgstr "Remover esta publicação dos seus marcadores"
429
430-#: html.c:1704 html.c:4510
431+#: html.c:1778 html.c:4678
432 msgid "Bookmark"
433 msgstr "Marcar"
434
435-#: html.c:1704
436+#: html.c:1778
437 msgid "Add this post to your bookmarks"
438 msgstr "Adicionar esta publicação aos seus marcadores"
439
440-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
441+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
442 msgid "Unfollow"
443 msgstr "Deixar de seguir"
444
445-#: html.c:1710 html.c:3082
446+#: html.c:1784 html.c:3180
447 msgid "Stop following this user's activity"
448 msgstr "Parar de acompanhar a atividade deste perfil"
449
450-#: html.c:1714 html.c:3096
451+#: html.c:1788 html.c:3194
452 msgid "Start following this user's activity"
453 msgstr "Começar a acompanhar a atividade deste perfil"
454
455-#: html.c:1720 html.c:4455
456+#: html.c:1794 html.c:4621
457 msgid "Unfollow Group"
458 msgstr "Deixar de seguir grupo"
459
460-#: html.c:1721
461+#: html.c:1795
462 msgid "Stop following this group or channel"
463 msgstr "Parar de acompanhar este grupo ou canal"
464
465-#: html.c:1725 html.c:4442
466+#: html.c:1799 html.c:4608
467 msgid "Follow Group"
468 msgstr "Seguir grupo"
469
470-#: html.c:1726
471+#: html.c:1800
472 msgid "Start following this group or channel"
473 msgstr "Começar a acompanhar este grupo ou canal"
474
475-#: html.c:1731 html.c:3118 html.c:4389
476+#: html.c:1805 html.c:3216 html.c:4552
477 msgid "MUTE"
478 msgstr "MUDO"
479
480-#: html.c:1732
481+#: html.c:1806
482 msgid "Block any activity from this user forever"
483 msgstr "Bloquear toda atividade deste perfil para sempre"
484
485-#: html.c:1737 html.c:3100 html.c:4472
486+#: html.c:1811 html.c:3198 html.c:4638
487 msgid "Delete"
488 msgstr "Eliminar"
489
490-#: html.c:1737
491+#: html.c:1811
492 msgid "Delete this post"
493 msgstr "Apagar esta publicação"
494
495-#: html.c:1740 html.c:4397
496+#: html.c:1814 html.c:4560
497 msgid "Hide"
498 msgstr "Ocultar"
499
500-#: html.c:1740
501+#: html.c:1814
502 msgid "Hide this post and its children"
503 msgstr "Ocultar esta publicação e suas respostas"
504
505-#: html.c:1771
506+#: html.c:1845
507 msgid "Edit..."
508 msgstr "Editar..."
509
510-#: html.c:1790
511+#: html.c:1865
512 msgid "Reply..."
513 msgstr "Responder..."
514
515-#: html.c:1841
516+#: html.c:1916
517 msgid "Truncated (too deep)"
518 msgstr "Truncada (muito extensa)"
519
520-#: html.c:1850
521+#: html.c:1925
522 msgid "follows you"
523 msgstr "segue você"
524
525-#: html.c:1913
526+#: html.c:1988
527 msgid "Pinned"
528 msgstr "Afixada"
529
530-#: html.c:1921
531+#: html.c:1996
532 msgid "Bookmarked"
533 msgstr "Marcada"
534
535-#: html.c:1929
536+#: html.c:2004
537 msgid "Poll"
538 msgstr "Enquete"
539
540-#: html.c:1936
541+#: html.c:2011
542 msgid "Voted"
543 msgstr "Votou"
544
545-#: html.c:1945
546+#: html.c:2020
547 msgid "Event"
548 msgstr "Evento"
549
550-#: html.c:1977 html.c:2006
551+#: html.c:2052 html.c:2081
552 msgid "boosted"
553 msgstr "impulsionou"
554
555-#: html.c:2022
556+#: html.c:2097
557 msgid "in reply to"
558 msgstr "em resposta a"
559
560-#: html.c:2073
561+#: html.c:2148
562 msgid " [SENSITIVE CONTENT]"
563 msgstr " [CONTEÚDO SENSÍVEL]"
564
565-#: html.c:2250
566+#: html.c:2325
567 msgid "Vote"
568 msgstr "Votar"
569
570-#: html.c:2260
571+#: html.c:2335
572 msgid "Closed"
573 msgstr "Encerrada"
574
575-#: html.c:2285
576+#: html.c:2360
577 msgid "Closes in"
578 msgstr "Encerra em"
579
580-#: html.c:2366
581+#: html.c:2441
582 msgid "Video"
583 msgstr "Vídeo"
584
585-#: html.c:2381
586+#: html.c:2456
587 msgid "Audio"
588 msgstr "Áudio"
589
590-#: html.c:2403
591+#: html.c:2484
592 msgid "Attachment"
593 msgstr "Anexo"
594
595-#: html.c:2417
596+#: html.c:2498
597 msgid "Alt..."
598 msgstr "Texto alternativo..."
599
600-#: html.c:2430
601+#: html.c:2511
602 msgid "Source channel or community"
603 msgstr "Canal ou comunidade de origem"
604
605-#: html.c:2524
606+#: html.c:2605
607 msgid "Time: "
608 msgstr "Horário: "
609
610-#: html.c:2605
611+#: html.c:2686
612 msgid "Older..."
613 msgstr "Anteriores..."
614
615-#: html.c:2702
616+#: html.c:2788
617 msgid "about this site"
618 msgstr "sobre este sítio eletrônico"
619
620-#: html.c:2704
621+#: html.c:2790
622 msgid "powered by "
623 msgstr "movido por "
624
625-#: html.c:2769
626+#: html.c:2855
627 msgid "Dismiss"
628 msgstr "Dispensar"
629
630-#: html.c:2786
631+#: html.c:2872
632 #, c-format
633 msgid "Timeline for list '%s'"
634 msgstr "Linha do tempo da lista '%s'"
635
636-#: html.c:2805 html.c:3846
637+#: html.c:2891 html.c:3944
638 msgid "Pinned posts"
639 msgstr "Publicações afixadas"
640
641-#: html.c:2817 html.c:3861
642+#: html.c:2903 html.c:3959
643 msgid "Bookmarked posts"
644 msgstr "Publicações marcadas"
645
646-#: html.c:2829 html.c:3876
647+#: html.c:2915 html.c:3974
648 msgid "Post drafts"
649 msgstr "Publicações em rascunho"
650
651-#: html.c:2888
652+#: html.c:2986
653 msgid "No more unseen posts"
654 msgstr "Sem mais publicações não vistas"
655
656-#: html.c:2892 html.c:2992
657+#: html.c:2990 html.c:3090
658 msgid "Back to top"
659 msgstr "Voltar ao topo"
660
661-#: html.c:2945
662+#: html.c:3043
663 msgid "History"
664 msgstr "Histórico"
665
666-#: html.c:2997 html.c:3417
667+#: html.c:3095 html.c:3515
668 msgid "More..."
669 msgstr "Mais..."
670
671-#: html.c:3086 html.c:4408
672+#: html.c:3184 html.c:4574
673 msgid "Unlimit"
674 msgstr "Retirar restrição"
675
676-#: html.c:3087
677+#: html.c:3185
678 msgid "Allow announces (boosts) from this user"
679 msgstr "Permitir anúncios (impulsionamentos) deste perfil"
680
681-#: html.c:3090 html.c:4404
682+#: html.c:3188 html.c:4570
683 msgid "Limit"
684 msgstr "Restringir"
685
686-#: html.c:3091
687+#: html.c:3189
688 msgid "Block announces (boosts) from this user"
689 msgstr "Bloquear anúncios (impulsionamentos) deste perfil"
690
691-#: html.c:3100
692+#: html.c:3198
693 msgid "Delete this user"
694 msgstr "Apagar este perfil"
695
696-#: html.c:3105 html.c:4520
697+#: html.c:3203 html.c:4688
698 msgid "Approve"
699 msgstr "Aprovar"
700
701-#: html.c:3106
702+#: html.c:3204
703 msgid "Approve this follow request"
704 msgstr "Aprovar esta solicitação de seguimento"
705
706-#: html.c:3109 html.c:4544
707+#: html.c:3207 html.c:4712
708 msgid "Discard"
709 msgstr "Descartar"
710
711-#: html.c:3109
712+#: html.c:3207
713 msgid "Discard this follow request"
714 msgstr "Descartar esta solicitação de seguimento"
715
716-#: html.c:3114 html.c:4393
717+#: html.c:3212 html.c:4556
718 msgid "Unmute"
719 msgstr "Desbloquear"
720
721-#: html.c:3115
722+#: html.c:3213
723 msgid "Stop blocking activities from this user"
724 msgstr "Parar de bloquear as atividades deste perfil"
725
726-#: html.c:3119
727+#: html.c:3217
728 msgid "Block any activity from this user"
729 msgstr "Bloquear toda atividade deste perfil"
730
731-#: html.c:3127
732+#: html.c:3225
733 msgid "Direct Message..."
734 msgstr "Mensagem direta..."
735
736-#: html.c:3162
737+#: html.c:3260
738 msgid "Pending follow confirmations"
739 msgstr "Confirmações de seguimento pendentes"
740
741-#: html.c:3166
742+#: html.c:3264
743 msgid "People you follow"
744 msgstr "Pessoas que você segue"
745
746-#: html.c:3167
747+#: html.c:3265
748 msgid "People that follow you"
749 msgstr "Pessoas que seguem você"
750
751-#: html.c:3206
752+#: html.c:3304
753 msgid "Clear all"
754 msgstr "Limpar tudo"
755
756-#: html.c:3263
757+#: html.c:3361
758 msgid "Mention"
759 msgstr "Menção"
760
761-#: html.c:3266
762+#: html.c:3364
763 msgid "Finished poll"
764 msgstr "Enquete encerrada"
765
766-#: html.c:3281
767+#: html.c:3379
768 msgid "Follow Request"
769 msgstr "Solicitação de seguimento"
770
771-#: html.c:3364
772+#: html.c:3462
773 msgid "Context"
774 msgstr "Contexto"
775
776-#: html.c:3375
777+#: html.c:3473
778 msgid "New"
779 msgstr "Novas"
780
781-#: html.c:3390
782+#: html.c:3488
783 msgid "Already seen"
784 msgstr "Já vistas"
785
786-#: html.c:3405
787+#: html.c:3503
788 msgid "None"
789 msgstr "Nenhuma"
790
791-#: html.c:3671
792+#: html.c:3769
793 #, c-format
794 msgid "Search results for account %s"
795 msgstr "Resultados da busca pela conta %s"
796
797-#: html.c:3678
798+#: html.c:3776
799 #, c-format
800 msgid "Account %s not found"
801 msgstr "Conta %s não encontrada"
802
803-#: html.c:3709
804+#: html.c:3807
805 #, c-format
806 msgid "Search results for tag %s"
807 msgstr "Resultados da busca pela hashtag %s"
808
809-#: html.c:3709
810+#: html.c:3807
811 #, c-format
812 msgid "Nothing found for tag %s"
813 msgstr "Nada consta com hashtag %s"
814
815-#: html.c:3725
816+#: html.c:3823
817 #, c-format
818 msgid "Search results for '%s' (may be more)"
819 msgstr "Resultados da busca por '%s' (pode haver mais)"
820
821-#: html.c:3728
822+#: html.c:3826
823 #, c-format
824 msgid "Search results for '%s'"
825 msgstr "Resultados da busca por '%s'"
826
827-#: html.c:3731
828+#: html.c:3829
829 #, c-format
830 msgid "No more matches for '%s'"
831 msgstr "Sem mais combinações para '%s'"
832
833-#: html.c:3733
834+#: html.c:3831
835 #, c-format
836 msgid "Nothing found for '%s'"
837 msgstr "Nada consta com '%s'"
838
839-#: html.c:3831
840+#: html.c:3929
841 msgid "Showing instance timeline"
842 msgstr "Exibindo linha do tempo da instância"
843
844-#: html.c:3899
845+#: html.c:4012
846 #, c-format
847 msgid "Showing timeline for list '%s'"
848 msgstr "Exibindo linha do tempo da lista '%s'"
849@@ -689,15 +692,15 @@ msgstr "Resultados da busca pela hashtag #%s"
850 msgid "Recent posts by users in this instance"
851 msgstr "Publicações recentes de perfis desta instância"
852
853-#: html.c:1529
854+#: html.c:1603
855 msgid "Blocked hashtags..."
856 msgstr "Hashtags bloqueadas..."
857
858-#: html.c:420
859+#: html.c:432
860 msgid "Optional URL to reply to"
861 msgstr "URL opcional para a qual responder"
862
863-#: html.c:527
864+#: html.c:575
865 msgid ""
866 "Option 1...\n"
867 "Option 2...\n"
868@@ -709,30 +712,54 @@ msgstr ""
869 "Opção 3...\n"
870 "..."
871
872-#: html.c:1346
873+#: html.c:1415
874 msgid "Bot API key"
875 msgstr "Chave de API do robô"
876
877-#: html.c:1352
878+#: html.c:1421
879 msgid "Chat id"
880 msgstr "ID da conversa"
881
882-#: html.c:1360
883+#: html.c:1429
884 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
885 msgstr "Servidor ntfy - URL completa (exemplo: https://ntfy.sh/SeuTópico)"
886
887-#: html.c:1366
888+#: html.c:1435
889 msgid "ntfy token - if needed"
890 msgstr "Token ntfy - se necessário"
891
892-#: html.c:2806
893+#: html.c:2892
894 msgid "pinned"
895 msgstr "afixadas"
896
897-#: html.c:2818
898+#: html.c:2904
899 msgid "bookmarks"
900 msgstr "marcadores"
901
902-#: html.c:2830
903+#: html.c:2916
904 msgid "drafts"
905 msgstr "rascunhos"
906+
907+#: html.c:464
908+msgid "Scheduled post..."
909+msgstr "Publicação agendada..."
910+
911+msgid "Post date and time:"
912+msgstr "Data e horário da publicação:"
913+
914+#: html.c:2927 html.c:3989
915+msgid "Scheduled posts"
916+msgstr "Publicações agendadas"
917+
918+#: html.c:2928
919+msgid "scheduled posts"
920+msgstr "publicações agendadas"
921+
922+#: html.c:458
923+#, c-format
924+msgid "Post date and time (timezone: %s):"
925+msgstr "Data e hora da publicação (fuso horário: %s):"
926+
927+#: html.c:1538
928+msgid "Time zone:"
929+msgstr "Fuso horário:"
M
po/ru.po
+198,
-174
1@@ -15,120 +15,120 @@ msgstr ""
2 "Content-Transfer-Encoding: 8bit\n"
3 "X-Generator: Poedit 3.0\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "Чувствительное содержимое: "
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "Описание чувствительного содержимого"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "Только для упомянутых людей: "
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "Ответ на (URL): "
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "Не отправлять, сохранить черновик"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "Черновик:"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "Вложения..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "Файл:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "Очистите это поле, чтоб удалить вложение"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "Описание вложения"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "Опрос..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "Варианты ответа (один на строку, до 8 шт):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "Один выбор"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "Множественный выбор"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "Заканчивается через 5 минут"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "Заканчивается через 1 час"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "Заканчивается через 1 день"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr "Отправить"
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "Описание сайта"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "Почта админа"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "Учётная запись админа"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "%d подписан, %d подписчиков"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "личное"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "публичное"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "уведомления"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "люди"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "экземпляр"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151@@ -136,552 +136,552 @@ msgstr ""
152 "Поиск сообщений по URL или содержимому (регулярное выражение), учетной "
153 "записи вида @user@host, или #тегу"
154
155-#: html.c:898
156+#: html.c:946
157 msgid "Content search"
158 msgstr "Поиск содержимого"
159
160-#: html.c:1020
161+#: html.c:1068
162 msgid "verified link"
163 msgstr "проверенная ссылка"
164
165-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
166+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
167 msgid "Location: "
168 msgstr "Местоположение: "
169
170-#: html.c:1113
171+#: html.c:1161
172 msgid "New Post..."
173 msgstr "Новое сообщение..."
174
175-#: html.c:1115
176+#: html.c:1163
177 msgid "What's on your mind?"
178 msgstr "Что у вас на уме?"
179
180-#: html.c:1124
181+#: html.c:1172
182 msgid "Operations..."
183 msgstr "Действия..."
184
185-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
186+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
187 msgid "Follow"
188 msgstr "Подписаться"
189
190-#: html.c:1141
191+#: html.c:1189
192 msgid "(by URL or user@host)"
193 msgstr "(по URL или user@host)"
194
195-#: html.c:1156 html.c:1690 html.c:4364
196+#: html.c:1204 html.c:1764 html.c:4527
197 msgid "Boost"
198 msgstr "Продвинуть"
199
200-#: html.c:1158 html.c:1175
201+#: html.c:1206 html.c:1223
202 msgid "(by URL)"
203 msgstr "(по URL)"
204
205-#: html.c:1173 html.c:1669 html.c:4355
206+#: html.c:1221 html.c:1743 html.c:4518
207 msgid "Like"
208 msgstr "Лайкнуть"
209
210-#: html.c:1278
211+#: html.c:1347
212 msgid "User Settings..."
213 msgstr "Пользовательские настройки..."
214
215-#: html.c:1287
216+#: html.c:1356
217 msgid "Display name:"
218 msgstr "Отображаемое имя:"
219
220-#: html.c:1293
221+#: html.c:1362
222 msgid "Your name"
223 msgstr "Ваше имя"
224
225-#: html.c:1295
226+#: html.c:1364
227 msgid "Avatar: "
228 msgstr "Аватар: "
229
230-#: html.c:1303
231+#: html.c:1372
232 msgid "Delete current avatar"
233 msgstr "Удалить текущий аватар"
234
235-#: html.c:1305
236+#: html.c:1374
237 msgid "Header image (banner): "
238 msgstr "Заглавное изображение (баннер): "
239
240-#: html.c:1313
241+#: html.c:1382
242 msgid "Delete current header image"
243 msgstr "Удалить текущее заглавное изображение"
244
245-#: html.c:1315
246+#: html.c:1384
247 msgid "Bio:"
248 msgstr "О себе:"
249
250-#: html.c:1321
251+#: html.c:1390
252 msgid "Write about yourself here..."
253 msgstr "Напишите что-нибудь про себя..."
254
255-#: html.c:1330
256+#: html.c:1399
257 msgid "Always show sensitive content"
258 msgstr "Всегда показывать чувствительное содержимое"
259
260-#: html.c:1332
261+#: html.c:1401
262 msgid "Email address for notifications:"
263 msgstr "Почтовый адрес для уведомлений:"
264
265-#: html.c:1340
266+#: html.c:1409
267 msgid "Telegram notifications (bot key and chat id):"
268 msgstr "Уведомления в Telegram (ключ бота и id чата):"
269
270-#: html.c:1354
271+#: html.c:1423
272 msgid "ntfy notifications (ntfy server and token):"
273 msgstr "уведомления в ntfy (сервер и токен ntfy):"
274
275-#: html.c:1368
276+#: html.c:1437
277 msgid "Maximum days to keep posts (0: server settings):"
278 msgstr "Максимальное время хранения сообщений (0: настройки сервера):"
279
280-#: html.c:1382
281+#: html.c:1451
282 msgid "Drop direct messages from people you don't follow"
283 msgstr "Отклонять личные сообщения от незнакомцев"
284
285-#: html.c:1391
286+#: html.c:1460
287 msgid "This account is a bot"
288 msgstr "Это аккаунт бота"
289
290-#: html.c:1400
291+#: html.c:1469
292 msgid "Auto-boost all mentions to this account"
293 msgstr "Автоматически продвигать все упоминания этого аккаунта"
294
295-#: html.c:1409
296+#: html.c:1478
297 msgid "This account is private (posts are not shown through the web)"
298 msgstr "Это закрытый аккаунт (сообщения не показываются в сети)"
299
300-#: html.c:1419
301+#: html.c:1488
302 msgid "Collapse top threads by default"
303 msgstr "Сворачивать обсуждения по умолчанию"
304
305-#: html.c:1428
306+#: html.c:1497
307 msgid "Follow requests must be approved"
308 msgstr "Запросы подписки требуют подтверждения"
309
310-#: html.c:1437
311+#: html.c:1506
312 msgid "Publish follower and following metrics"
313 msgstr "Публиковать статистику подписок и подписчиков"
314
315-#: html.c:1439
316+#: html.c:1508
317 msgid "Current location:"
318 msgstr "Текущее метоположение:"
319
320-#: html.c:1453
321+#: html.c:1522
322 msgid "Profile metadata (key=value pairs in each line):"
323 msgstr "Метаданные профиля (пары ключ=значение, по одной на строку)"
324
325-#: html.c:1464
326+#: html.c:1533
327 msgid "Web interface language:"
328 msgstr "Язык интерфейса:"
329
330-#: html.c:1469
331+#: html.c:1543
332 msgid "New password:"
333 msgstr "Новый пароль:"
334
335-#: html.c:1476
336+#: html.c:1550
337 msgid "Repeat new password:"
338 msgstr "Повторите новый пароль:"
339
340-#: html.c:1486
341+#: html.c:1560
342 msgid "Update user info"
343 msgstr "Обновить данные пользователя"
344
345-#: html.c:1497
346+#: html.c:1571
347 msgid "Followed hashtags..."
348 msgstr "Отслеживаемые хештеги..."
349
350-#: html.c:1499 html.c:1531
351+#: html.c:1573 html.c:1605
352 msgid "One hashtag per line"
353 msgstr "По одному на строку"
354
355-#: html.c:1520 html.c:1552
356+#: html.c:1594 html.c:1626
357 msgid "Update hashtags"
358 msgstr "Обновить хештеги"
359
360-#: html.c:1669
361+#: html.c:1743
362 msgid "Say you like this post"
363 msgstr "Отметить сообщение понравившимся"
364
365-#: html.c:1674 html.c:4373
366+#: html.c:1748 html.c:4536
367 msgid "Unlike"
368 msgstr "Больше не нравится"
369
370-#: html.c:1674
371+#: html.c:1748
372 msgid "Nah don't like it that much"
373 msgstr "Не так уж и понравилось"
374
375-#: html.c:1680 html.c:4505
376+#: html.c:1754 html.c:4673
377 msgid "Unpin"
378 msgstr "Открепить"
379
380-#: html.c:1680
381+#: html.c:1754
382 msgid "Unpin this post from your timeline"
383 msgstr "Открепить это сообщение из своей ленты"
384
385-#: html.c:1683 html.c:4500
386+#: html.c:1757 html.c:4668
387 msgid "Pin"
388 msgstr "Закрепить"
389
390-#: html.c:1683
391+#: html.c:1757
392 msgid "Pin this post to the top of your timeline"
393 msgstr "Закрепить это сообщение в своей ленте"
394
395-#: html.c:1690
396+#: html.c:1764
397 msgid "Announce this post to your followers"
398 msgstr "Поделиться этим сообщением со своими подписчиками"
399
400-#: html.c:1695 html.c:4381
401+#: html.c:1769 html.c:4544
402 msgid "Unboost"
403 msgstr "Отменить продвижение"
404
405-#: html.c:1695
406+#: html.c:1769
407 msgid "I regret I boosted this"
408 msgstr "Не буду продвигать, пожалуй"
409
410-#: html.c:1701 html.c:4515
411+#: html.c:1775 html.c:4683
412 msgid "Unbookmark"
413 msgstr "Удалить из закладок"
414
415-#: html.c:1701
416+#: html.c:1775
417 msgid "Delete this post from your bookmarks"
418 msgstr "Удалить это сообщение из закладок"
419
420-#: html.c:1704 html.c:4510
421+#: html.c:1778 html.c:4678
422 msgid "Bookmark"
423 msgstr "Добавить в закладки"
424
425-#: html.c:1704
426+#: html.c:1778
427 msgid "Add this post to your bookmarks"
428 msgstr "Добавить сообщение в закладки"
429
430-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
431+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
432 msgid "Unfollow"
433 msgstr "Отписаться"
434
435-#: html.c:1710 html.c:3082
436+#: html.c:1784 html.c:3180
437 msgid "Stop following this user's activity"
438 msgstr "Отменить подписку на этого пользователя"
439
440-#: html.c:1714 html.c:3096
441+#: html.c:1788 html.c:3194
442 msgid "Start following this user's activity"
443 msgstr "Начать следовать за этим пользователем"
444
445-#: html.c:1720 html.c:4455
446+#: html.c:1794 html.c:4621
447 msgid "Unfollow Group"
448 msgstr "Отписаться от группы"
449
450-#: html.c:1721
451+#: html.c:1795
452 msgid "Stop following this group or channel"
453 msgstr "Отписаться от группы или канала"
454
455-#: html.c:1725 html.c:4442
456+#: html.c:1799 html.c:4608
457 msgid "Follow Group"
458 msgstr "Подписаться на группу"
459
460-#: html.c:1726
461+#: html.c:1800
462 msgid "Start following this group or channel"
463 msgstr "Подписаться на группу или канал"
464
465-#: html.c:1731 html.c:3118 html.c:4389
466+#: html.c:1805 html.c:3216 html.c:4552
467 msgid "MUTE"
468 msgstr "Заглушить"
469
470-#: html.c:1732
471+#: html.c:1806
472 msgid "Block any activity from this user forever"
473 msgstr "Заглушить всю активность от этого пользователя, навсегда"
474
475-#: html.c:1737 html.c:3100 html.c:4472
476+#: html.c:1811 html.c:3198 html.c:4638
477 msgid "Delete"
478 msgstr "Удалить"
479
480-#: html.c:1737
481+#: html.c:1811
482 msgid "Delete this post"
483 msgstr "Удалить это сообщение"
484
485-#: html.c:1740 html.c:4397
486+#: html.c:1814 html.c:4560
487 msgid "Hide"
488 msgstr "Скрыть"
489
490-#: html.c:1740
491+#: html.c:1814
492 msgid "Hide this post and its children"
493 msgstr "Скрыть это сообщение вместе с обсуждением"
494
495-#: html.c:1771
496+#: html.c:1845
497 msgid "Edit..."
498 msgstr "Редактировать..."
499
500-#: html.c:1790
501+#: html.c:1865
502 msgid "Reply..."
503 msgstr "Ответить..."
504
505-#: html.c:1841
506+#: html.c:1916
507 msgid "Truncated (too deep)"
508 msgstr "Обрезано (слишком много)"
509
510-#: html.c:1850
511+#: html.c:1925
512 msgid "follows you"
513 msgstr "подписан на вас"
514
515-#: html.c:1913
516+#: html.c:1988
517 msgid "Pinned"
518 msgstr "Закреплено"
519
520-#: html.c:1921
521+#: html.c:1996
522 msgid "Bookmarked"
523 msgstr "Добавлено в закладки"
524
525-#: html.c:1929
526+#: html.c:2004
527 msgid "Poll"
528 msgstr "Опрос"
529
530-#: html.c:1936
531+#: html.c:2011
532 msgid "Voted"
533 msgstr "Проголосовано"
534
535-#: html.c:1945
536+#: html.c:2020
537 msgid "Event"
538 msgstr "Событие"
539
540-#: html.c:1977 html.c:2006
541+#: html.c:2052 html.c:2081
542 msgid "boosted"
543 msgstr "поделился"
544
545-#: html.c:2022
546+#: html.c:2097
547 msgid "in reply to"
548 msgstr "в ответ на"
549
550-#: html.c:2073
551+#: html.c:2148
552 msgid " [SENSITIVE CONTENT]"
553 msgstr " [ЧУВСТВИТЕЛЬНО СОДЕРЖИМОЕ]"
554
555-#: html.c:2250
556+#: html.c:2325
557 msgid "Vote"
558 msgstr "Голос"
559
560-#: html.c:2260
561+#: html.c:2335
562 msgid "Closed"
563 msgstr "Закрыт"
564
565-#: html.c:2285
566+#: html.c:2360
567 msgid "Closes in"
568 msgstr "Закрывается через"
569
570-#: html.c:2366
571+#: html.c:2441
572 msgid "Video"
573 msgstr "Видео"
574
575-#: html.c:2381
576+#: html.c:2456
577 msgid "Audio"
578 msgstr "Аудио"
579
580-#: html.c:2403
581+#: html.c:2484
582 msgid "Attachment"
583 msgstr "Вложение"
584
585-#: html.c:2417
586+#: html.c:2498
587 msgid "Alt..."
588 msgstr "Описание..."
589
590-#: html.c:2430
591+#: html.c:2511
592 msgid "Source channel or community"
593 msgstr "Исходный канал или сообщество"
594
595-#: html.c:2524
596+#: html.c:2605
597 msgid "Time: "
598 msgstr "Время: "
599
600-#: html.c:2605
601+#: html.c:2686
602 msgid "Older..."
603 msgstr "Ранее..."
604
605-#: html.c:2702
606+#: html.c:2788
607 msgid "about this site"
608 msgstr "про этот сайт"
609
610-#: html.c:2704
611+#: html.c:2790
612 msgid "powered by "
613 msgstr "на основе "
614
615-#: html.c:2769
616+#: html.c:2855
617 msgid "Dismiss"
618 msgstr "Скрыть"
619
620-#: html.c:2786
621+#: html.c:2872
622 #, c-format
623 msgid "Timeline for list '%s'"
624 msgstr "Ленты для списка '%s'"
625
626-#: html.c:2805 html.c:3846
627+#: html.c:2891 html.c:3944
628 msgid "Pinned posts"
629 msgstr "Закреплённые сообщения"
630
631-#: html.c:2817 html.c:3861
632+#: html.c:2903 html.c:3959
633 msgid "Bookmarked posts"
634 msgstr "Сообщения в закладках"
635
636-#: html.c:2829 html.c:3876
637+#: html.c:2915 html.c:3974
638 msgid "Post drafts"
639 msgstr "Черновики сообщений"
640
641-#: html.c:2888
642+#: html.c:2986
643 msgid "No more unseen posts"
644 msgstr "Всё просмотрено"
645
646-#: html.c:2892 html.c:2992
647+#: html.c:2990 html.c:3090
648 msgid "Back to top"
649 msgstr "Вернуться наверх"
650
651-#: html.c:2945
652+#: html.c:3043
653 msgid "History"
654 msgstr "История"
655
656-#: html.c:2997 html.c:3417
657+#: html.c:3095 html.c:3515
658 msgid "More..."
659 msgstr "Ещё..."
660
661-#: html.c:3086 html.c:4408
662+#: html.c:3184 html.c:4574
663 msgid "Unlimit"
664 msgstr "Без ограничения"
665
666-#: html.c:3087
667+#: html.c:3185
668 msgid "Allow announces (boosts) from this user"
669 msgstr "Разрешить продвижения от этого пользователя"
670
671-#: html.c:3090 html.c:4404
672+#: html.c:3188 html.c:4570
673 msgid "Limit"
674 msgstr "Лимит"
675
676-#: html.c:3091
677+#: html.c:3189
678 msgid "Block announces (boosts) from this user"
679 msgstr "Запретить продвижения от этого пользователя"
680
681-#: html.c:3100
682+#: html.c:3198
683 msgid "Delete this user"
684 msgstr "Удалить пользователя"
685
686-#: html.c:3105 html.c:4520
687+#: html.c:3203 html.c:4688
688 msgid "Approve"
689 msgstr "Подтвердить"
690
691-#: html.c:3106
692+#: html.c:3204
693 msgid "Approve this follow request"
694 msgstr "Подтвердить запрос на подписку"
695
696-#: html.c:3109 html.c:4544
697+#: html.c:3207 html.c:4712
698 msgid "Discard"
699 msgstr "Отклонить"
700
701-#: html.c:3109
702+#: html.c:3207
703 msgid "Discard this follow request"
704 msgstr "Отклонить этот запрос на подписку"
705
706-#: html.c:3114 html.c:4393
707+#: html.c:3212 html.c:4556
708 msgid "Unmute"
709 msgstr "Отменить глушение"
710
711-#: html.c:3115
712+#: html.c:3213
713 msgid "Stop blocking activities from this user"
714 msgstr "Прекратить глушение действий этого пользователя"
715
716-#: html.c:3119
717+#: html.c:3217
718 msgid "Block any activity from this user"
719 msgstr "Заглушить все действия этого пользователя"
720
721-#: html.c:3127
722+#: html.c:3225
723 msgid "Direct Message..."
724 msgstr "Личное сообщение..."
725
726-#: html.c:3162
727+#: html.c:3260
728 msgid "Pending follow confirmations"
729 msgstr "Ожидающие запросы на подписку"
730
731-#: html.c:3166
732+#: html.c:3264
733 msgid "People you follow"
734 msgstr "Ваши подписки"
735
736-#: html.c:3167
737+#: html.c:3265
738 msgid "People that follow you"
739 msgstr "Ваши подписчики"
740
741-#: html.c:3206
742+#: html.c:3304
743 msgid "Clear all"
744 msgstr "Очистить всё"
745
746-#: html.c:3263
747+#: html.c:3361
748 msgid "Mention"
749 msgstr "Упоминание"
750
751-#: html.c:3266
752+#: html.c:3364
753 msgid "Finished poll"
754 msgstr "Завершённый опрос"
755
756-#: html.c:3281
757+#: html.c:3379
758 msgid "Follow Request"
759 msgstr "Запрос на подписку"
760
761-#: html.c:3364
762+#: html.c:3462
763 msgid "Context"
764 msgstr "Контекст"
765
766-#: html.c:3375
767+#: html.c:3473
768 msgid "New"
769 msgstr "Новое"
770
771-#: html.c:3390
772+#: html.c:3488
773 msgid "Already seen"
774 msgstr "Уже просмотрено"
775
776-#: html.c:3405
777+#: html.c:3503
778 msgid "None"
779 msgstr "Нет"
780
781-#: html.c:3671
782+#: html.c:3769
783 #, c-format
784 msgid "Search results for account %s"
785 msgstr "Результаты поиска для учётной записи %s"
786
787-#: html.c:3678
788+#: html.c:3776
789 #, c-format
790 msgid "Account %s not found"
791 msgstr "Учётная запись %s не найдена"
792
793-#: html.c:3709
794+#: html.c:3807
795 #, c-format
796 msgid "Search results for tag %s"
797 msgstr "Результаты поиска тега %s"
798
799-#: html.c:3709
800+#: html.c:3807
801 #, c-format
802 msgid "Nothing found for tag %s"
803 msgstr "Ничего не найдено по тегу %s"
804
805-#: html.c:3725
806+#: html.c:3823
807 #, c-format
808 msgid "Search results for '%s' (may be more)"
809 msgstr "Результаты поиска для '%s' (возможно, есть ещё)"
810
811-#: html.c:3728
812+#: html.c:3826
813 #, c-format
814 msgid "Search results for '%s'"
815 msgstr "Результаты поиска для '%s'"
816
817-#: html.c:3731
818+#: html.c:3829
819 #, c-format
820 msgid "No more matches for '%s'"
821 msgstr "Больше нет совпадений для '%s'"
822
823-#: html.c:3733
824+#: html.c:3831
825 #, c-format
826 msgid "Nothing found for '%s'"
827 msgstr "Ничего не найдено для '%s'"
828
829-#: html.c:3831
830+#: html.c:3929
831 msgid "Showing instance timeline"
832 msgstr "Показываем ленту инстанции"
833
834-#: html.c:3899
835+#: html.c:4012
836 #, c-format
837 msgid "Showing timeline for list '%s'"
838 msgstr "Показываем ленты инстанции для списка '%s'"
839@@ -695,15 +695,15 @@ msgstr "Результаты поиска для тега #%s"
840 msgid "Recent posts by users in this instance"
841 msgstr "Последние сообщения на этой инстанции"
842
843-#: html.c:1529
844+#: html.c:1603
845 msgid "Blocked hashtags..."
846 msgstr "Заблокированные теги..."
847
848-#: html.c:420
849+#: html.c:432
850 msgid "Optional URL to reply to"
851 msgstr "Необязательный URL для ответа"
852
853-#: html.c:527
854+#: html.c:575
855 msgid ""
856 "Option 1...\n"
857 "Option 2...\n"
858@@ -715,30 +715,54 @@ msgstr ""
859 "Вариант 3...\n"
860 "..."
861
862-#: html.c:1346
863+#: html.c:1415
864 msgid "Bot API key"
865 msgstr "Ключ API для бота"
866
867-#: html.c:1352
868+#: html.c:1421
869 msgid "Chat id"
870 msgstr "Id чата"
871
872-#: html.c:1360
873+#: html.c:1429
874 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
875 msgstr "полный URL сервера ntfy (например https://ntfy.sh/YourTopic)"
876
877-#: html.c:1366
878+#: html.c:1435
879 msgid "ntfy token - if needed"
880 msgstr "токен ntfy - если нужен"
881
882-#: html.c:2806
883+#: html.c:2892
884 msgid "pinned"
885 msgstr "закреплено"
886
887-#: html.c:2818
888+#: html.c:2904
889 msgid "bookmarks"
890 msgstr "закладки"
891
892-#: html.c:2830
893+#: html.c:2916
894 msgid "drafts"
895 msgstr "черновики"
896+
897+#: html.c:464
898+msgid "Scheduled post..."
899+msgstr "Запланировать..."
900+
901+msgid "Post date and time:"
902+msgstr "Время поста:"
903+
904+#: html.c:2927 html.c:3989
905+msgid "Scheduled posts"
906+msgstr "Запланированные посты"
907+
908+#: html.c:2928
909+msgid "scheduled posts"
910+msgstr "запланированные посты"
911+
912+#: html.c:458
913+#, c-format
914+msgid "Post date and time (timezone: %s):"
915+msgstr "Время поста (Часовой пояс: %s):"
916+
917+#: html.c:1538
918+msgid "Time zone:"
919+msgstr "Часовой пояс:"
M
po/zh.po
+198,
-174
1@@ -8,672 +8,672 @@ msgstr ""
2 "Language: zh\n"
3 "Content-Type: text/plain; charset=UTF-8\n"
4
5-#: html.c:372
6+#: html.c:384
7 msgid "Sensitive content: "
8 msgstr "敏感内容:"
9
10-#: html.c:380
11+#: html.c:392
12 msgid "Sensitive content description"
13 msgstr "敏感内容描述"
14
15-#: html.c:393
16+#: html.c:405
17 msgid "Only for mentioned people: "
18 msgstr "只有提及到的人:"
19
20-#: html.c:416
21+#: html.c:428
22 msgid "Reply to (URL): "
23 msgstr "回复给(网址):"
24
25-#: html.c:425
26+#: html.c:437
27 msgid "Don't send, but store as a draft"
28 msgstr "不要发送,但是保存为草稿"
29
30-#: html.c:426
31+#: html.c:438
32 msgid "Draft:"
33 msgstr "草稿:"
34
35-#: html.c:446
36+#: html.c:494
37 msgid "Attachments..."
38 msgstr "附件..."
39
40-#: html.c:469
41+#: html.c:517
42 msgid "File:"
43 msgstr "文件:"
44
45-#: html.c:473
46+#: html.c:521
47 msgid "Clear this field to delete the attachment"
48 msgstr "清除此项以删除附件"
49
50-#: html.c:482 html.c:507
51+#: html.c:530 html.c:555
52 msgid "Attachment description"
53 msgstr "附件描述"
54
55-#: html.c:518
56+#: html.c:566
57 msgid "Poll..."
58 msgstr "投票..."
59
60-#: html.c:520
61+#: html.c:568
62 msgid "Poll options (one per line, up to 8):"
63 msgstr "投票选项(每项一行,最多八项):"
64
65-#: html.c:532
66+#: html.c:580
67 msgid "One choice"
68 msgstr "单选"
69
70-#: html.c:535
71+#: html.c:583
72 msgid "Multiple choices"
73 msgstr "多选"
74
75-#: html.c:541
76+#: html.c:589
77 msgid "End in 5 minutes"
78 msgstr "五分钟后结束"
79
80-#: html.c:545
81+#: html.c:593
82 msgid "End in 1 hour"
83 msgstr "一小时后结束"
84
85-#: html.c:548
86+#: html.c:596
87 msgid "End in 1 day"
88 msgstr "一天后结束"
89
90-#: html.c:556
91+#: html.c:604
92 msgid "Post"
93 msgstr ""
94
95-#: html.c:653 html.c:660
96+#: html.c:701 html.c:708
97 msgid "Site description"
98 msgstr "站点描述"
99
100-#: html.c:671
101+#: html.c:719
102 msgid "Admin email"
103 msgstr "管理员电子邮箱"
104
105-#: html.c:684
106+#: html.c:732
107 msgid "Admin account"
108 msgstr "管理员帐号"
109
110-#: html.c:752 html.c:1088
111+#: html.c:800 html.c:1136
112 #, c-format
113 msgid "%d following, %d followers"
114 msgstr "%d 个正在关注,%d 个关注者"
115
116-#: html.c:842
117+#: html.c:890
118 msgid "RSS"
119 msgstr "RSS"
120
121-#: html.c:847 html.c:875
122+#: html.c:895 html.c:923
123 msgid "private"
124 msgstr "私密"
125
126-#: html.c:871
127+#: html.c:919
128 msgid "public"
129 msgstr "公开"
130
131-#: html.c:879
132+#: html.c:927
133 msgid "notifications"
134 msgstr "通知"
135
136-#: html.c:884
137+#: html.c:932
138 msgid "people"
139 msgstr "成员"
140
141-#: html.c:888
142+#: html.c:936
143 msgid "instance"
144 msgstr "实例"
145
146-#: html.c:897
147+#: html.c:945
148 msgid ""
149 "Search posts by URL or content (regular expression), @user@host accounts, or "
150 "#tag"
151 msgstr ""
152 "通过网址、内容(正则表达式)、@用户@服务器 帐号,或者 #话题标签搜索贴子"
153
154-#: html.c:898
155+#: html.c:946
156 msgid "Content search"
157 msgstr "内容搜索"
158
159-#: html.c:1020
160+#: html.c:1068
161 msgid "verified link"
162 msgstr "已验证的链接"
163
164-#: html.c:1077 html.c:2459 html.c:2472 html.c:2481
165+#: html.c:1125 html.c:2540 html.c:2553 html.c:2562
166 msgid "Location: "
167 msgstr "位置:"
168
169-#: html.c:1113
170+#: html.c:1161
171 msgid "New Post..."
172 msgstr "新贴子..."
173
174-#: html.c:1115
175+#: html.c:1163
176 msgid "What's on your mind?"
177 msgstr "你在想什么?"
178
179-#: html.c:1124
180+#: html.c:1172
181 msgid "Operations..."
182 msgstr "操作..."
183
184-#: html.c:1139 html.c:1714 html.c:3095 html.c:4412
185+#: html.c:1187 html.c:1788 html.c:3193 html.c:4578
186 msgid "Follow"
187 msgstr "关注"
188
189-#: html.c:1141
190+#: html.c:1189
191 msgid "(by URL or user@host)"
192 msgstr "(通过网址或者 用户名@服务器)"
193
194-#: html.c:1156 html.c:1690 html.c:4364
195+#: html.c:1204 html.c:1764 html.c:4527
196 msgid "Boost"
197 msgstr "转发"
198
199-#: html.c:1158 html.c:1175
200+#: html.c:1206 html.c:1223
201 msgid "(by URL)"
202 msgstr "(通过网址)"
203
204-#: html.c:1173 html.c:1669 html.c:4355
205+#: html.c:1221 html.c:1743 html.c:4518
206 msgid "Like"
207 msgstr "点赞"
208
209-#: html.c:1278
210+#: html.c:1347
211 msgid "User Settings..."
212 msgstr "用户设置..."
213
214-#: html.c:1287
215+#: html.c:1356
216 msgid "Display name:"
217 msgstr "显示名字:"
218
219-#: html.c:1293
220+#: html.c:1362
221 msgid "Your name"
222 msgstr "你的名字"
223
224-#: html.c:1295
225+#: html.c:1364
226 msgid "Avatar: "
227 msgstr "头像:"
228
229-#: html.c:1303
230+#: html.c:1372
231 msgid "Delete current avatar"
232 msgstr "删除当前头像"
233
234-#: html.c:1305
235+#: html.c:1374
236 msgid "Header image (banner): "
237 msgstr "页眉图像(横幅)"
238
239-#: html.c:1313
240+#: html.c:1382
241 msgid "Delete current header image"
242 msgstr "删除当前的页眉图像"
243
244-#: html.c:1315
245+#: html.c:1384
246 msgid "Bio:"
247 msgstr "简介"
248
249-#: html.c:1321
250+#: html.c:1390
251 msgid "Write about yourself here..."
252 msgstr "在这里介绍你自己..."
253
254-#: html.c:1330
255+#: html.c:1399
256 msgid "Always show sensitive content"
257 msgstr "总是显示敏感内容"
258
259-#: html.c:1332
260+#: html.c:1401
261 msgid "Email address for notifications:"
262 msgstr "用于通知的电子邮箱地址"
263
264-#: html.c:1340
265+#: html.c:1409
266 msgid "Telegram notifications (bot key and chat id):"
267 msgstr "Telegram通知(bot密钥和聊天ID)"
268
269-#: html.c:1354
270+#: html.c:1423
271 msgid "ntfy notifications (ntfy server and token):"
272 msgstr "ntfy通知(ntfy服务器和令牌):"
273
274-#: html.c:1368
275+#: html.c:1437
276 msgid "Maximum days to keep posts (0: server settings):"
277 msgstr "保存贴子的最大天数(0:服务器设置)"
278
279-#: html.c:1382
280+#: html.c:1451
281 msgid "Drop direct messages from people you don't follow"
282 msgstr "丢弃你没有关注的人的私信"
283
284-#: html.c:1391
285+#: html.c:1460
286 msgid "This account is a bot"
287 msgstr "此帐号是机器人"
288
289-#: html.c:1400
290+#: html.c:1469
291 msgid "Auto-boost all mentions to this account"
292 msgstr "自动转发所有对此帐号的提及"
293
294-#: html.c:1409
295+#: html.c:1478
296 msgid "This account is private (posts are not shown through the web)"
297 msgstr "这是一个私密帐号(贴子不会在网页中显示)"
298
299-#: html.c:1419
300+#: html.c:1488
301 msgid "Collapse top threads by default"
302 msgstr "默认收起主题帖"
303
304-#: html.c:1428
305+#: html.c:1497
306 msgid "Follow requests must be approved"
307 msgstr "关注请求必须经过审批"
308
309-#: html.c:1437
310+#: html.c:1506
311 msgid "Publish follower and following metrics"
312 msgstr "展示关注者和正在关注的数量"
313
314-#: html.c:1439
315+#: html.c:1508
316 msgid "Current location:"
317 msgstr "当前位置:"
318
319-#: html.c:1453
320+#: html.c:1522
321 msgid "Profile metadata (key=value pairs in each line):"
322 msgstr "个人资料元数据(每行一条 键=值)"
323
324-#: html.c:1464
325+#: html.c:1533
326 msgid "Web interface language:"
327 msgstr "网页界面语言:"
328
329-#: html.c:1469
330+#: html.c:1543
331 msgid "New password:"
332 msgstr "新密码:"
333
334-#: html.c:1476
335+#: html.c:1550
336 msgid "Repeat new password:"
337 msgstr "重复新密码:"
338
339-#: html.c:1486
340+#: html.c:1560
341 msgid "Update user info"
342 msgstr "更新用户信息:"
343
344-#: html.c:1497
345+#: html.c:1571
346 msgid "Followed hashtags..."
347 msgstr "已关注的话题标签..."
348
349-#: html.c:1499 html.c:1531
350+#: html.c:1573 html.c:1605
351 msgid "One hashtag per line"
352 msgstr "每行一个话题标签"
353
354-#: html.c:1520 html.c:1552
355+#: html.c:1594 html.c:1626
356 msgid "Update hashtags"
357 msgstr "更新话题标签"
358
359-#: html.c:1669
360+#: html.c:1743
361 msgid "Say you like this post"
362 msgstr "说你喜欢这个贴子"
363
364-#: html.c:1674 html.c:4373
365+#: html.c:1748 html.c:4536
366 msgid "Unlike"
367 msgstr "不喜欢"
368
369-#: html.c:1674
370+#: html.c:1748
371 msgid "Nah don't like it that much"
372 msgstr "啊,不怎么喜欢这个"
373
374-#: html.c:1680 html.c:4505
375+#: html.c:1754 html.c:4673
376 msgid "Unpin"
377 msgstr "取消置顶"
378
379-#: html.c:1680
380+#: html.c:1754
381 msgid "Unpin this post from your timeline"
382 msgstr "从你的时间线上取消置顶这个贴子"
383
384-#: html.c:1683 html.c:4500
385+#: html.c:1757 html.c:4668
386 msgid "Pin"
387 msgstr "置顶"
388
389-#: html.c:1683
390+#: html.c:1757
391 msgid "Pin this post to the top of your timeline"
392 msgstr "把这条贴子置顶在你的时间线上"
393
394-#: html.c:1690
395+#: html.c:1764
396 msgid "Announce this post to your followers"
397 msgstr "向你的关注者宣布这条贴子"
398
399-#: html.c:1695 html.c:4381
400+#: html.c:1769 html.c:4544
401 msgid "Unboost"
402 msgstr "取消转发"
403
404-#: html.c:1695
405+#: html.c:1769
406 msgid "I regret I boosted this"
407 msgstr "我后悔转发这个了"
408
409-#: html.c:1701 html.c:4515
410+#: html.c:1775 html.c:4683
411 msgid "Unbookmark"
412 msgstr "取消收藏"
413
414-#: html.c:1701
415+#: html.c:1775
416 msgid "Delete this post from your bookmarks"
417 msgstr "从收藏夹中删除这个贴子"
418
419-#: html.c:1704 html.c:4510
420+#: html.c:1778 html.c:4678
421 msgid "Bookmark"
422 msgstr "收藏"
423
424-#: html.c:1704
425+#: html.c:1778
426 msgid "Add this post to your bookmarks"
427 msgstr "把这个贴子加入收藏夹"
428
429-#: html.c:1710 html.c:3081 html.c:3269 html.c:4425
430+#: html.c:1784 html.c:3179 html.c:3367 html.c:4591
431 msgid "Unfollow"
432 msgstr "取消关注"
433
434-#: html.c:1710 html.c:3082
435+#: html.c:1784 html.c:3180
436 msgid "Stop following this user's activity"
437 msgstr "停止关注此用户的动态"
438
439-#: html.c:1714 html.c:3096
440+#: html.c:1788 html.c:3194
441 msgid "Start following this user's activity"
442 msgstr "开始关注此用户的动态"
443
444-#: html.c:1720 html.c:4455
445+#: html.c:1794 html.c:4621
446 msgid "Unfollow Group"
447 msgstr "取消关注群组"
448
449-#: html.c:1721
450+#: html.c:1795
451 msgid "Stop following this group or channel"
452 msgstr "取消关注这个群组或频道"
453
454-#: html.c:1725 html.c:4442
455+#: html.c:1799 html.c:4608
456 msgid "Follow Group"
457 msgstr "关注群组"
458
459-#: html.c:1726
460+#: html.c:1800
461 msgid "Start following this group or channel"
462 msgstr "开始关注这个群组或频道"
463
464-#: html.c:1731 html.c:3118 html.c:4389
465+#: html.c:1805 html.c:3216 html.c:4552
466 msgid "MUTE"
467 msgstr "静音"
468
469-#: html.c:1732
470+#: html.c:1806
471 msgid "Block any activity from this user forever"
472 msgstr "永久屏蔽来自这个用户的任何动态"
473
474-#: html.c:1737 html.c:3100 html.c:4472
475+#: html.c:1811 html.c:3198 html.c:4638
476 msgid "Delete"
477 msgstr "删除"
478
479-#: html.c:1737
480+#: html.c:1811
481 msgid "Delete this post"
482 msgstr "删除这条贴子"
483
484-#: html.c:1740 html.c:4397
485+#: html.c:1814 html.c:4560
486 msgid "Hide"
487 msgstr "隐藏"
488
489-#: html.c:1740
490+#: html.c:1814
491 msgid "Hide this post and its children"
492 msgstr "删除这条贴子及其回复"
493
494-#: html.c:1771
495+#: html.c:1845
496 msgid "Edit..."
497 msgstr "编辑..."
498
499-#: html.c:1790
500+#: html.c:1865
501 msgid "Reply..."
502 msgstr "回复..."
503
504-#: html.c:1841
505+#: html.c:1916
506 msgid "Truncated (too deep)"
507 msgstr "已被截断(太深了)"
508
509-#: html.c:1850
510+#: html.c:1925
511 msgid "follows you"
512 msgstr "关注了你"
513
514-#: html.c:1913
515+#: html.c:1988
516 msgid "Pinned"
517 msgstr "已置顶"
518
519-#: html.c:1921
520+#: html.c:1996
521 msgid "Bookmarked"
522 msgstr "已收藏"
523
524-#: html.c:1929
525+#: html.c:2004
526 msgid "Poll"
527 msgstr "投票"
528
529-#: html.c:1936
530+#: html.c:2011
531 msgid "Voted"
532 msgstr "已投票"
533
534-#: html.c:1945
535+#: html.c:2020
536 msgid "Event"
537 msgstr "事件"
538
539-#: html.c:1977 html.c:2006
540+#: html.c:2052 html.c:2081
541 msgid "boosted"
542 msgstr "已转发"
543
544-#: html.c:2022
545+#: html.c:2097
546 msgid "in reply to"
547 msgstr "回复给"
548
549-#: html.c:2073
550+#: html.c:2148
551 msgid " [SENSITIVE CONTENT]"
552 msgstr "【敏感内容】"
553
554-#: html.c:2250
555+#: html.c:2325
556 msgid "Vote"
557 msgstr "投票"
558
559-#: html.c:2260
560+#: html.c:2335
561 msgid "Closed"
562 msgstr "已关闭"
563
564-#: html.c:2285
565+#: html.c:2360
566 msgid "Closes in"
567 msgstr "距离关闭还有"
568
569-#: html.c:2366
570+#: html.c:2441
571 msgid "Video"
572 msgstr "视频"
573
574-#: html.c:2381
575+#: html.c:2456
576 msgid "Audio"
577 msgstr "音频"
578
579-#: html.c:2403
580+#: html.c:2484
581 msgid "Attachment"
582 msgstr "附件"
583
584-#: html.c:2417
585+#: html.c:2498
586 msgid "Alt..."
587 msgstr "描述..."
588
589-#: html.c:2430
590+#: html.c:2511
591 msgid "Source channel or community"
592 msgstr "来源频道或者社群"
593
594-#: html.c:2524
595+#: html.c:2605
596 msgid "Time: "
597 msgstr "时间:"
598
599-#: html.c:2605
600+#: html.c:2686
601 msgid "Older..."
602 msgstr "更早的..."
603
604-#: html.c:2702
605+#: html.c:2788
606 msgid "about this site"
607 msgstr "关于此站点"
608
609-#: html.c:2704
610+#: html.c:2790
611 msgid "powered by "
612 msgstr "驱动自"
613
614-#: html.c:2769
615+#: html.c:2855
616 msgid "Dismiss"
617 msgstr "忽略"
618
619-#: html.c:2786
620+#: html.c:2872
621 #, c-format
622 msgid "Timeline for list '%s'"
623 msgstr "列表'%s'的时间线"
624
625-#: html.c:2805 html.c:3846
626+#: html.c:2891 html.c:3944
627 msgid "Pinned posts"
628 msgstr "置顶的贴子"
629
630-#: html.c:2817 html.c:3861
631+#: html.c:2903 html.c:3959
632 msgid "Bookmarked posts"
633 msgstr "收藏的贴子"
634
635-#: html.c:2829 html.c:3876
636+#: html.c:2915 html.c:3974
637 msgid "Post drafts"
638 msgstr "贴子草稿"
639
640-#: html.c:2888
641+#: html.c:2986
642 msgid "No more unseen posts"
643 msgstr "没有更多未读贴子了"
644
645-#: html.c:2892 html.c:2992
646+#: html.c:2990 html.c:3090
647 msgid "Back to top"
648 msgstr "返回顶部"
649
650-#: html.c:2945
651+#: html.c:3043
652 msgid "History"
653 msgstr "历史"
654
655-#: html.c:2997 html.c:3417
656+#: html.c:3095 html.c:3515
657 msgid "More..."
658 msgstr "更多..."
659
660-#: html.c:3086 html.c:4408
661+#: html.c:3184 html.c:4574
662 msgid "Unlimit"
663 msgstr "取消限制"
664
665-#: html.c:3087
666+#: html.c:3185
667 msgid "Allow announces (boosts) from this user"
668 msgstr "允许来自这个用户的通知(转发)"
669
670-#: html.c:3090 html.c:4404
671+#: html.c:3188 html.c:4570
672 msgid "Limit"
673 msgstr "限制"
674
675-#: html.c:3091
676+#: html.c:3189
677 msgid "Block announces (boosts) from this user"
678 msgstr "屏蔽来自这个用户的通知(转发)"
679
680-#: html.c:3100
681+#: html.c:3198
682 msgid "Delete this user"
683 msgstr "删除此用户"
684
685-#: html.c:3105 html.c:4520
686+#: html.c:3203 html.c:4688
687 msgid "Approve"
688 msgstr "允许"
689
690-#: html.c:3106
691+#: html.c:3204
692 msgid "Approve this follow request"
693 msgstr "允许这个关注请求"
694
695-#: html.c:3109 html.c:4544
696+#: html.c:3207 html.c:4712
697 msgid "Discard"
698 msgstr "丢弃"
699
700-#: html.c:3109
701+#: html.c:3207
702 msgid "Discard this follow request"
703 msgstr "丢弃这个关注请求"
704
705-#: html.c:3114 html.c:4393
706+#: html.c:3212 html.c:4556
707 msgid "Unmute"
708 msgstr "取消静音"
709
710-#: html.c:3115
711+#: html.c:3213
712 msgid "Stop blocking activities from this user"
713 msgstr "停止屏蔽来自此用户的动态"
714
715-#: html.c:3119
716+#: html.c:3217
717 msgid "Block any activity from this user"
718 msgstr "屏蔽来自此用户的任何动态"
719
720-#: html.c:3127
721+#: html.c:3225
722 msgid "Direct Message..."
723 msgstr "私信..."
724
725-#: html.c:3162
726+#: html.c:3260
727 msgid "Pending follow confirmations"
728 msgstr "待处理的关注确认"
729
730-#: html.c:3166
731+#: html.c:3264
732 msgid "People you follow"
733 msgstr "你关注的人"
734
735-#: html.c:3167
736+#: html.c:3265
737 msgid "People that follow you"
738 msgstr "关注你的人"
739
740-#: html.c:3206
741+#: html.c:3304
742 msgid "Clear all"
743 msgstr "清除全部"
744
745-#: html.c:3263
746+#: html.c:3361
747 msgid "Mention"
748 msgstr "提及"
749
750-#: html.c:3266
751+#: html.c:3364
752 msgid "Finished poll"
753 msgstr "结束投票"
754
755-#: html.c:3281
756+#: html.c:3379
757 msgid "Follow Request"
758 msgstr "关注请求"
759
760-#: html.c:3364
761+#: html.c:3462
762 msgid "Context"
763 msgstr "上下文"
764
765-#: html.c:3375
766+#: html.c:3473
767 msgid "New"
768 msgstr "新建"
769
770-#: html.c:3390
771+#: html.c:3488
772 msgid "Already seen"
773 msgstr "已经看过"
774
775-#: html.c:3405
776+#: html.c:3503
777 msgid "None"
778 msgstr "没有"
779
780-#: html.c:3671
781+#: html.c:3769
782 #, c-format
783 msgid "Search results for account %s"
784 msgstr "账户 %s 的搜索结果"
785
786-#: html.c:3678
787+#: html.c:3776
788 #, c-format
789 msgid "Account %s not found"
790 msgstr "没有找到账户 %s"
791
792-#: html.c:3709
793+#: html.c:3807
794 #, c-format
795 msgid "Search results for tag %s"
796 msgstr "标签 %s 的搜索结果"
797
798-#: html.c:3709
799+#: html.c:3807
800 #, c-format
801 msgid "Nothing found for tag %s"
802 msgstr "没有找到标签'%s'的结果"
803
804-#: html.c:3725
805+#: html.c:3823
806 #, c-format
807 msgid "Search results for '%s' (may be more)"
808 msgstr "'%s'的搜索结果(可能还有更多)"
809
810-#: html.c:3728
811+#: html.c:3826
812 #, c-format
813 msgid "Search results for '%s'"
814 msgstr "'%s'的搜索结果"
815
816-#: html.c:3731
817+#: html.c:3829
818 #, c-format
819 msgid "No more matches for '%s'"
820 msgstr "没有更多匹配'%s'的结果了"
821
822-#: html.c:3733
823+#: html.c:3831
824 #, c-format
825 msgid "Nothing found for '%s'"
826 msgstr "没有找到'%s'的结果"
827
828-#: html.c:3831
829+#: html.c:3929
830 msgid "Showing instance timeline"
831 msgstr "显示实例时间线"
832
833-#: html.c:3899
834+#: html.c:4012
835 #, c-format
836 msgid "Showing timeline for list '%s'"
837 msgstr "显示列表'%s'的事件线"
838@@ -687,15 +687,15 @@ msgstr "标签 #%s 的搜索结果"
839 msgid "Recent posts by users in this instance"
840 msgstr "此实例上的用户最近的贴子"
841
842-#: html.c:1529
843+#: html.c:1603
844 msgid "Blocked hashtags..."
845 msgstr "已屏蔽的话题标签"
846
847-#: html.c:420
848+#: html.c:432
849 msgid "Optional URL to reply to"
850 msgstr "可选的回复的网址"
851
852-#: html.c:527
853+#: html.c:575
854 msgid ""
855 "Option 1...\n"
856 "Option 2...\n"
857@@ -707,30 +707,54 @@ msgstr ""
858 "选项3...\n"
859 "..."
860
861-#: html.c:1346
862+#: html.c:1415
863 msgid "Bot API key"
864 msgstr "Bot API 密钥"
865
866-#: html.c:1352
867+#: html.c:1421
868 msgid "Chat id"
869 msgstr "聊天ID"
870
871-#: html.c:1360
872+#: html.c:1429
873 msgid "ntfy server - full URL (example: https://ntfy.sh/YourTopic)"
874 msgstr "ntfy服务器 - 完整网址(例如:https://ntft.sh/YourTopic)"
875
876-#: html.c:1366
877+#: html.c:1435
878 msgid "ntfy token - if needed"
879 msgstr "ntft令牌 - 如果需要的话"
880
881-#: html.c:2806
882+#: html.c:2892
883 msgid "pinned"
884 msgstr "置顶"
885
886-#: html.c:2818
887+#: html.c:2904
888 msgid "bookmarks"
889 msgstr "收藏夹"
890
891-#: html.c:2830
892+#: html.c:2916
893 msgid "drafts"
894 msgstr "草稿"
895+
896+#: html.c:464
897+msgid "Scheduled post..."
898+msgstr ""
899+
900+msgid "Post date and time:"
901+msgstr ""
902+
903+#: html.c:2927 html.c:3989
904+msgid "Scheduled posts"
905+msgstr ""
906+
907+#: html.c:2928
908+msgid "scheduled posts"
909+msgstr ""
910+
911+#: html.c:458
912+#, c-format
913+msgid "Post date and time (timezone: %s):"
914+msgstr ""
915+
916+#: html.c:1538
917+msgid "Time zone:"
918+msgstr ""
+14,
-16
1@@ -8,8 +8,6 @@ void sbox_enter(const char *basedir)
2 {
3 const char *address = xs_dict_get(srv_config, "address");
4
5- int smail = !xs_is_true(xs_dict_get(srv_config, "disable_email_notifications"));
6-
7 if (xs_is_true(xs_dict_get(srv_config, "disable_openbsd_security"))) {
8 srv_log(xs_dup("OpenBSD security disabled by admin"));
9 return;
10@@ -24,9 +22,6 @@ void sbox_enter(const char *basedir)
11 unveil("/etc/ssl/cert.pem", "r");
12 unveil("/usr/share/zoneinfo", "r");
13
14- if (smail)
15- unveil("/usr/sbin/sendmail", "x");
16-
17 if (*address == '/')
18 unveil(address, "rwc");
19
20@@ -36,9 +31,6 @@ void sbox_enter(const char *basedir)
21
22 xs *p = xs_str_new("stdio rpath wpath cpath flock inet proc dns fattr");
23
24- if (smail)
25- p = xs_str_cat(p, " exec");
26-
27 if (*address == '/')
28 p = xs_str_cat(p, " unix");
29
30@@ -55,7 +47,7 @@ void sbox_enter(const char *basedir)
31 #include "landloc.h"
32
33 static
34-LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smail) {
35+LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smtp_port) {
36
37 const unsigned long long
38 rd = LANDLOCK_ACCESS_FS_READ_DIR,
39@@ -101,9 +93,6 @@ LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smail)
40 LL_PATH(sdir, s);
41 }
42
43- if (smail && mtime("/usr/sbin/sendmail") > 0)
44- LL_PATH("/usr/sbin/sendmail", x);
45-
46 if (*address != '/') {
47 unsigned short listen_port = xs_number_get(xs_dict_get(srv_config, "port"));
48 LL_PORT(listen_port, LANDLOCK_ACCESS_NET_BIND_TCP_COMPAT);
49@@ -111,24 +100,33 @@ LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smail)
50
51 LL_PORT(80, LANDLOCK_ACCESS_NET_CONNECT_TCP_COMPAT);
52 LL_PORT(443, LANDLOCK_ACCESS_NET_CONNECT_TCP_COMPAT);
53+ if (smtp_port > 0)
54+ LL_PORT((unsigned short)smtp_port, LANDLOCK_ACCESS_NET_CONNECT_TCP_COMPAT);
55
56 } LL_END
57
58 void sbox_enter(const char *basedir)
59 {
60+ const char *errstr;
61 const char *address = xs_dict_get(srv_config, "address");
62-
63- int smail = !xs_is_true(xs_dict_get(srv_config, "disable_email_notifications"));
64+ const char *smtp_url = xs_dict_get(srv_config, "smtp_url");
65+ int smtp_port = -1;
66
67 if (xs_is_true(xs_dict_get(srv_config, "disable_sandbox"))) {
68 srv_debug(1, xs_dup("Linux sandbox disabled by admin"));
69 return;
70 }
71
72- if (sbox_enter_linux_(basedir, address, smail) == 0)
73+ if (xs_is_string(smtp_url) && *smtp_url != '\0') {
74+ smtp_port = parse_port(smtp_url, &errstr);
75+ if (errstr)
76+ srv_debug(0, xs_fmt("Couldn't determine port from '%s': %s", smtp_url, errstr));
77+ }
78+
79+ if (sbox_enter_linux_(basedir, address, smtp_port) == 0)
80 srv_debug(1, xs_dup("Linux sandbox enabled"));
81 else
82- srv_debug(1, xs_dup("Linux sandbox failed"));
83+ srv_debug(0, xs_dup("Linux sandbox failed"));
84 }
85
86 #else /* defined(WITH_LINUX_SANDBOX) */
M
snac.c
+1,
-0
1@@ -25,6 +25,7 @@
2 #include "xs_fcgi.h"
3 #include "xs_html.h"
4 #include "xs_po.h"
5+#include "xs_webmention.h"
6
7 #include "snac.h"
8
M
snac.h
+14,
-1
1@@ -1,7 +1,7 @@
2 /* snac - A simple, minimalistic ActivityPub instance */
3 /* copyright (c) 2022 - 2025 grunfink et al. / MIT license */
4
5-#define VERSION "2.74"
6+#define VERSION "2.77"
7
8 #define USER_AGENT "snac/" VERSION
9
10@@ -61,6 +61,7 @@ typedef struct {
11 xs_str *actor; /* actor url */
12 xs_str *md5; /* actor url md5 */
13 const xs_dict *lang;/* string translation dict */
14+ const char *tz; /* configured timezone */
15 } snac;
16
17 typedef struct {
18@@ -152,12 +153,14 @@ int follower_add(snac *snac, const char *actor);
19 int follower_del(snac *snac, const char *actor);
20 int follower_check(snac *snac, const char *actor);
21 xs_list *follower_list(snac *snac);
22+int follower_list_len(snac *snac);
23
24 int pending_add(snac *user, const char *actor, const xs_dict *msg);
25 int pending_check(snac *user, const char *actor);
26 xs_dict *pending_get(snac *user, const char *actor);
27 void pending_del(snac *user, const char *actor);
28 xs_list *pending_list(snac *user);
29+int pending_count(snac *user);
30
31 double timeline_mtime(snac *snac);
32 int timeline_touch(snac *snac);
33@@ -182,6 +185,7 @@ int following_del(snac *snac, const char *actor);
34 int following_check(snac *snac, const char *actor);
35 int following_get(snac *snac, const char *actor, xs_dict **data);
36 xs_list *following_list(snac *snac);
37+int following_list_len(snac *snac);
38
39 void mute(snac *snac, const char *actor);
40 void unmute(snac *snac, const char *actor);
41@@ -205,6 +209,12 @@ void draft_del(snac *user, const char *id);
42 void draft_add(snac *user, const char *id, const xs_dict *msg);
43 xs_list *draft_list(snac *user);
44
45+int is_scheduled(snac *user, const char *id);
46+void schedule_del(snac *user, const char *id);
47+void schedule_add(snac *user, const char *id, const xs_dict *msg);
48+xs_list *scheduled_list(snac *user);
49+void scheduled_process(snac *user);
50+
51 int limited(snac *user, const char *id, int cmd);
52 #define is_limited(user, id) limited((user), (id), 0)
53 #define limit(user, id) limited((user), (id), 1)
54@@ -282,6 +292,7 @@ void enqueue_close_question(snac *user, const char *id, int end_secs);
55 void enqueue_object_request(snac *user, const char *id, int forward_secs);
56 void enqueue_verify_links(snac *user);
57 void enqueue_actor_refresh(snac *user, const char *actor, int forward_secs);
58+void enqueue_webmention(const xs_dict *msg);
59 int was_question_voted(snac *user, const char *id);
60
61 xs_list *user_queue(snac *snac);
62@@ -367,6 +378,7 @@ int activitypub_post_handler(const xs_dict *req, const char *q_path,
63 char **body, int *b_size, char **ctype);
64
65 xs_dict *emojis(void);
66+xs_str *format_text_with_emoji(snac *user, const char *text, int ems, const char *proxy);
67 xs_str *not_really_markdown(const char *content, xs_list **attach, xs_list **tag);
68 xs_str *sanitize(const char *content);
69 xs_str *encode_html(const char *str);
70@@ -427,6 +439,7 @@ void import_blocked_accounts_csv(snac *user, const char *fn);
71 void import_following_accounts_csv(snac *user, const char *fn);
72 void import_list_csv(snac *user, const char *fn);
73 void import_csv(snac *user);
74+int parse_port(const char *url, const char **errstr);
75
76 typedef enum {
77 #define HTTP_STATUS(code, name, text) HTTP_STATUS_ ## name = code,
+24,
-0
1@@ -0,0 +1,24 @@
2+/* snac - A simple, minimalistic ActivityPub instance */
3+/* copyright (c) 2022 - 2025 grunfink et al. / MIT license */
4+
5+#define XS_IMPLEMENTATION
6+#include "../xs.h"
7+#include "../xs_curl.h"
8+
9+#define FROM "<snac-smtp-test@locahost>"
10+
11+int main(void) {
12+ xs *to = xs_fmt("<%s@localhost>", getenv("USER")),
13+ *body = xs_fmt(""
14+ "To: %s \r\n"
15+ "From: " FROM "\r\n"
16+ "Subject: snac smtp test\r\n"
17+ "\r\n"
18+ "If you read this as an email, it probably worked!\r\n",
19+ to);
20+
21+ return xs_smtp_request("smtp://localhost", NULL, NULL,
22+ FROM,
23+ to,
24+ body, 0);
25+}
M
utils.c
+59,
-1
1@@ -101,8 +101,9 @@ static const char *greeting_html =
2 "<html><head>\n"
3 "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n"
4 "<link rel=\"icon\" type=\"image/x-icon\" href=\"https://%host%/favicon.ico\"/>\n"
5+ "<style>*{color-scheme:light dark}body{margin:auto;max-width:50em}</style>\n"
6 "<title>Welcome to %host%</title>\n</head>\n"
7- "<body style=\"margin: auto; max-width: 50em\">\n"
8+ "<body>\n"
9 "%blurb%"
10 "<p>The following users are part of this community:</p>\n"
11 "\n"
12@@ -912,3 +913,60 @@ void import_csv(snac *user)
13 else
14 snac_log(user, xs_fmt("Cannot open file %s", fn));
15 }
16+
17+static const struct {
18+ const char *proto;
19+ unsigned short default_port;
20+} FALLBACK_PORTS[] = {
21+ /* caution: https > http, smpts > smtp */
22+ {"https", 443},
23+ {"http", 80},
24+ {"smtps", 465},
25+ {"smtp", 25}
26+};
27+
28+int parse_port(const char *url, const char **errstr)
29+{
30+ const char *col, *rcol;
31+ int tmp, ret = -1;
32+
33+ if (errstr)
34+ *errstr = NULL;
35+
36+ if (!(col = strchr(url, ':'))) {
37+ if (errstr)
38+ *errstr = "bad url";
39+
40+ return -1;
41+ }
42+
43+ for (size_t i = 0; i < sizeof(FALLBACK_PORTS) / sizeof(*FALLBACK_PORTS); ++i) {
44+ if (memcmp(url, FALLBACK_PORTS[i].proto, strlen(FALLBACK_PORTS[i].proto)) == 0) {
45+ ret = FALLBACK_PORTS[i].default_port;
46+ break;
47+ }
48+ }
49+
50+ if (!(rcol = strchr(col + 1, ':')))
51+ rcol = col;
52+
53+ if (rcol) {
54+ tmp = atoi(rcol + 1);
55+ if (tmp == 0) {
56+ if (ret != -1)
57+ return ret;
58+
59+ if (errstr)
60+ *errstr = strerror(errno);
61+
62+ return -1;
63+ }
64+
65+ return tmp;
66+ }
67+
68+ if (errstr)
69+ *errstr = "unknown protocol";
70+
71+ return -1;
72+}
+47,
-0
1@@ -9,6 +9,10 @@ xs_dict *xs_http_request(const char *method, const char *url,
2 const xs_str *body, int b_size, int *status,
3 xs_str **payload, int *p_size, int timeout);
4
5+int xs_smtp_request(const char *url, const char *user, const char *pass,
6+ const char *from, const char *to, const xs_str *body,
7+ int use_ssl);
8+
9 const char *xs_curl_strerr(int errnum);
10
11 #ifdef XS_IMPLEMENTATION
12@@ -197,6 +201,49 @@ xs_dict *xs_http_request(const char *method, const char *url,
13 }
14
15
16+int xs_smtp_request(const char *url, const char *user, const char *pass,
17+ const char *from, const char *to, const xs_str *body,
18+ int use_ssl)
19+{
20+ CURL *curl;
21+ CURLcode res = CURLE_OK;
22+ struct curl_slist *rcpt = NULL;
23+ struct _payload_data pd = {
24+ .data = (char *)body,
25+ .size = strlen(body),
26+ .offset = 0
27+ };
28+
29+ curl = curl_easy_init();
30+
31+ curl_easy_setopt(curl, CURLOPT_URL, url);
32+ if (user && pass) {
33+ /* allow authless connections, to, e.g. localhost */
34+ curl_easy_setopt(curl, CURLOPT_USERNAME, user);
35+ curl_easy_setopt(curl, CURLOPT_PASSWORD, pass);
36+ }
37+
38+ if (use_ssl)
39+ curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);
40+
41+ curl_easy_setopt(curl, CURLOPT_MAIL_FROM, from);
42+
43+ rcpt = curl_slist_append(rcpt, to);
44+ curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt);
45+
46+ curl_easy_setopt(curl, CURLOPT_READDATA, &pd);
47+ curl_easy_setopt(curl, CURLOPT_READFUNCTION, _post_callback);
48+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
49+
50+ res = curl_easy_perform(curl);
51+
52+ curl_easy_cleanup(curl);
53+ curl_slist_free_all(rcpt);
54+
55+ return (int)res;
56+}
57+
58+
59 const char *xs_curl_strerr(int errnum)
60 {
61 CURLcode cc = errnum < 0 ? -errnum : errnum;
+1,
-0
1@@ -16,6 +16,7 @@ extern const char *xs_mime_types[];
2 const char *xs_mime_types[] = {
3 "3gp", "video/3gpp",
4 "aac", "audio/aac",
5+ "apng", "image/apng",
6 "avif", "image/avif",
7 "css", "text/css",
8 "flac", "audio/flac",
+124,
-0
1@@ -15,6 +15,8 @@ time_t xs_parse_time(const char *str, const char *fmt, int local);
2 #define xs_parse_localtime(str, fmt) xs_parse_time(str, fmt, 1)
3 #define xs_parse_utctime(str, fmt) xs_parse_time(str, fmt, 0)
4 xs_str *xs_str_time_diff(time_t time_diff);
5+xs_list *xs_tz_list(void);
6+int xs_tz_offset(const char *tz);
7
8 #ifdef XS_IMPLEMENTATION
9
10@@ -106,6 +108,128 @@ time_t xs_parse_iso_date(const char *iso_date, int local)
11 }
12
13
14+/** timezones **/
15+
16+/* intentionally dead simple */
17+
18+struct {
19+ const char *tz; /* timezone name */
20+ float h_offset; /* hour offset */
21+} xs_tz[] = {
22+ { "UTC", 0 },
23+ { "WET (Western European Time)", 0 },
24+ { "WEST (Western European Summer Time)", 1 },
25+ { "CET (Central European Time)", 1 },
26+ { "CEST (Central European Summer Time)", 2 },
27+ { "EET (Eastern European Time)", 2 },
28+ { "EEST (Eastern European Summer Time)", 3 },
29+ { "MSK (Moskow Time Zone)", 3 },
30+ { "EST (Eastern Time Zone)", -5 },
31+ { "AST (Atlantic Time Zone)", -4 },
32+ { "ADT (Atlantic Daylight Time Zone)", -3 },
33+ { "CST (Central Time Zone)", -6 },
34+ { "CDT (Central Daylight Time Zone)", -5 },
35+ { "MST (Mountain Time Zone)", -7 },
36+ { "MDT (Mountain Daylight Time Zone)", -6 },
37+ { "PST (Pacific Time Zone)", -8 },
38+ { "PDT (Pacific Daylight Time Zone)", -7 },
39+ { "AKST (Alaska Time Zone)", -9 },
40+ { "AKDT (Alaska Daylight Time Zone)", -8 },
41+ { "China Time Zone", 8 },
42+ { "IST (Israel Standard Time)", 2 },
43+ { "IDT (Israel Daylight Standard Time)", 3 },
44+ { "WIB (Western Indonesia Time)", 7 },
45+ { "WITA (Central Indonesia Time)", 8 },
46+ { "WIT (Eastern Indonesia Time)", 9 },
47+ { "AWST (Australian Western Time)", 8 },
48+ { "ACST (Australian Eastern Time)", 9.5 },
49+ { "ACDT (Australian Daylight Eastern Time)", 10.5 },
50+ { "AEST (Australian Eastern Time)", 10 },
51+ { "AEDT (Australian Daylight Eastern Time)", 11 },
52+ { "NZST (New Zealand Time)", 12 },
53+ { "NZDT (New Zealand Daylight Time)", 13 },
54+ { "UTC", 0 },
55+ { "UTC+1", 1 },
56+ { "UTC+2", 2 },
57+ { "UTC+3", 3 },
58+ { "UTC+4", 4 },
59+ { "UTC+5", 5 },
60+ { "UTC+6", 6 },
61+ { "UTC+7", 7 },
62+ { "UTC+8", 8 },
63+ { "UTC+9", 9 },
64+ { "UTC+10", 10 },
65+ { "UTC+11", 11 },
66+ { "UTC+12", 12 },
67+ { "UTC-1", -1 },
68+ { "UTC-2", -2 },
69+ { "UTC-3", -3 },
70+ { "UTC-4", -4 },
71+ { "UTC-5", -5 },
72+ { "UTC-6", -6 },
73+ { "UTC-7", -7 },
74+ { "UTC-8", -8 },
75+ { "UTC-9", -9 },
76+ { "UTC-10", -10 },
77+ { "UTC-11", -11 },
78+ { "UTC-12", -12 },
79+ { "UTC-13", -13 },
80+ { "UTC-14", -14 },
81+ { "GMT", 0 },
82+ { "GMT+1", -1 },
83+ { "GMT+2", -2 },
84+ { "GMT+3", -3 },
85+ { "GMT+4", -4 },
86+ { "GMT+5", -5 },
87+ { "GMT+6", -6 },
88+ { "GMT+7", -7 },
89+ { "GMT+8", -8 },
90+ { "GMT+9", -9 },
91+ { "GMT+10", -10 },
92+ { "GMT+11", -11 },
93+ { "GMT+12", -12 },
94+ { "GMT-1", 1 },
95+ { "GMT-2", 2 },
96+ { "GMT-3", 3 },
97+ { "GMT-4", 4 },
98+ { "GMT-5", 5 },
99+ { "GMT-6", 6 },
100+ { "GMT-7", 7 },
101+ { "GMT-8", 8 },
102+ { "GMT-9", 9 },
103+ { "GMT-10", 10 },
104+ { "GMT-11", 11 },
105+ { "GMT-12", 12 },
106+ { "GMT-13", 13 },
107+ { "GMT-14", 14 },
108+ { NULL, 0 }
109+};
110+
111+
112+xs_list *xs_tz_list(void)
113+/* returns the list of supported timezones */
114+{
115+ xs_list *l = xs_list_new();
116+
117+ for (int n = 0; xs_tz[n].tz != NULL; n++)
118+ l = xs_list_append(l, xs_tz[n].tz);
119+
120+ return l;
121+}
122+
123+
124+int xs_tz_offset(const char *tz)
125+/* returns the offset in seconds from the specified Time Zone to UTC */
126+{
127+ for (int n = 0; xs_tz[n].tz != NULL; n++) {
128+ if (strcmp(xs_tz[n].tz, tz) == 0)
129+ return xs_tz[n].h_offset * 3600;
130+ }
131+
132+ return 0;
133+}
134+
135+
136 #endif /* XS_IMPLEMENTATION */
137
138 #endif /* _XS_TIME_H */
+1,
-1
1@@ -1 +1 @@
2-/* d467dc71e518603250a55c8a67e26cf40e1710e9 2025-02-14T10:21:15+01:00 */
3+/* 871d420cef893b6efe32869407294baf084ce3ab 2025-05-04T11:01:01+02:00 */
+123,
-0
1@@ -0,0 +1,123 @@
2+/* copyright (c) 2025 grunfink et al. / MIT license */
3+
4+#ifndef _XS_WEBMENTION_H
5+
6+#define _XS_WEBMENTION_H
7+
8+int xs_webmention_send(const char *source, const char *target, const char *user_agent);
9+
10+
11+#ifdef XS_IMPLEMENTATION
12+
13+int xs_webmention_send(const char *source, const char *target, const char *user_agent)
14+/* sends a Webmention to target.
15+ Returns: < 0, error; 0, no Webmention endpoint; > 0, Webmention sent */
16+{
17+ int status = 0;
18+ xs *endpoint = NULL;
19+
20+ xs *ua = xs_fmt("%s (Webmention)", user_agent ? user_agent : "xs_webmention");
21+ xs *headers = xs_dict_new();
22+ headers = xs_dict_set(headers, "accept", "text/html");
23+ headers = xs_dict_set(headers, "user-agent", ua);
24+
25+ xs *h_req = NULL;
26+ int p_size = 0;
27+
28+ /* try first a HEAD, to see if there is a Webmention Link header */
29+ h_req = xs_http_request("HEAD", target, headers, NULL, 0, &status, NULL, &p_size, 0);
30+
31+ /* return immediate failures */
32+ if (status < 200 || status > 299)
33+ return -1;
34+
35+ const char *link = xs_dict_get(h_req, "link");
36+
37+ if (xs_is_string(link) && xs_regex_match(link, "rel *= *(\"|')?webmention")) {
38+ /* endpoint is between < and > */
39+ xs *r = xs_regex_select_n(link, "<[^>]+>", 1);
40+
41+ if (xs_list_len(r) == 1) {
42+ endpoint = xs_dup(xs_list_get(r, 0));
43+ endpoint = xs_strip_chars_i(endpoint, "<>");
44+ }
45+ }
46+
47+ if (endpoint == NULL) {
48+ /* no Link header; get the content */
49+ xs *g_req = NULL;
50+ xs *payload = NULL;
51+
52+ g_req = xs_http_request("GET", target, headers, NULL, 0, &status, &payload, &p_size, 0);
53+
54+ if (status < 200 || status > 299)
55+ return -1;
56+
57+ const char *ctype = xs_dict_get(g_req, "content-type");
58+
59+ /* not HTML? no point in looking inside */
60+ if (!xs_is_string(ctype) || xs_str_in(ctype, "text/html") == -1)
61+ return -2;
62+
63+ if (!xs_is_string(payload))
64+ return -3;
65+
66+ xs *links = xs_regex_select(payload, "<(a +|link +)[^>]+>");
67+ const char *link;
68+
69+ xs_list_foreach(links, link) {
70+ if (xs_regex_match(link, "rel *= *(\"|')?webmention")) {
71+ /* found; extract the href */
72+ xs *r = xs_regex_select_n(link, "href *= *(\"|')?[^\"]+(\"|')", 1);
73+
74+ if (xs_list_len(r) == 1) {
75+ xs *l = xs_split_n(xs_list_get(r, 0), "=", 1);
76+
77+ if (xs_list_len(l) == 2) {
78+ endpoint = xs_dup(xs_list_get(l, 1));
79+ endpoint = xs_strip_chars_i(endpoint, " \"'");
80+
81+ break;
82+ }
83+ }
84+ }
85+ }
86+ }
87+
88+ /* is it a relative endpoint? */
89+ if (xs_is_string(endpoint)) {
90+ if (!xs_startswith(endpoint, "https://") && !xs_startswith(endpoint, "http://")) {
91+ xs *l = xs_split(target, "/");
92+
93+ if (xs_list_len(l) < 3)
94+ endpoint = xs_free(endpoint);
95+ else {
96+ xs *s = xs_fmt("%s/" "/%s", xs_list_get(l, 0), xs_list_get(l, 2));
97+ endpoint = xs_str_wrap_i(s, endpoint, NULL);
98+ }
99+ }
100+ }
101+
102+ if (xs_is_string(endpoint)) {
103+ /* got it! */
104+ headers = xs_dict_set(headers, "content-type", "application/x-www-form-urlencoded");
105+
106+ xs *body = xs_fmt("source=%s&target=%s", source, target);
107+
108+ xs *rsp = xs_http_request("POST", endpoint, headers, body, strlen(body), &status, NULL, 0, 0);
109+
110+ if (status < 200 || status > 299)
111+ status = -4;
112+ else
113+ status = 1;
114+ }
115+ else
116+ status = 0;
117+
118+ return status;
119+}
120+
121+
122+#endif /* XS_IMPLEMENTATION */
123+
124+#endif /* _XS_WEBMENTION_H */