@rmdes/indiekit-endpoint-activitypub 3.6.6 → 3.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { accountId } from "../helpers/id-mapping.js";
9
9
  import { sanitizeHtml, stripHtml } from "./sanitize.js";
10
+ import { getCachedAccountStats } from "../helpers/account-cache.js";
10
11
 
11
12
  /**
12
13
  * Serialize an actor as a Mastodon Account entity.
@@ -111,6 +112,20 @@ export function serializeAccount(actor, { baseUrl, isLocal = false, handle = ""
111
112
  statuses_count: actor.statusesCount || 0,
112
113
  followers_count: actor.followersCount || 0,
113
114
  following_count: actor.followingCount || 0,
115
+ // Enrich from cache if counts are 0 (embedded accounts in statuses lack counts)
116
+ ...((!actor.statusesCount && !actor.followersCount && !isLocal)
117
+ ? (() => {
118
+ const cached = getCachedAccountStats(url);
119
+ return cached
120
+ ? {
121
+ statuses_count: cached.statusesCount || 0,
122
+ followers_count: cached.followersCount || 0,
123
+ following_count: cached.followingCount || 0,
124
+ created_at: cached.createdAt || actor.createdAt || new Date().toISOString(),
125
+ }
126
+ : {};
127
+ })()
128
+ : {}),
114
129
  moved: actor.movedTo || null,
115
130
  suspended: false,
116
131
  limited: false,
@@ -0,0 +1,51 @@
1
+ /**
2
+ * In-memory cache for remote account stats (followers, following, statuses).
3
+ *
4
+ * Populated by resolveRemoteAccount() when a profile is fetched.
5
+ * Read by serializeAccount() to enrich embedded account objects in statuses.
6
+ *
7
+ * LRU-style with TTL — entries expire after 1 hour.
8
+ */
9
+
10
+ const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
11
+ const MAX_ENTRIES = 500;
12
+
13
+ // Map<actorUrl, { followersCount, followingCount, statusesCount, createdAt, cachedAt }>
14
+ const cache = new Map();
15
+
16
+ /**
17
+ * Store account stats in cache.
18
+ * @param {string} actorUrl - The actor's URL (cache key)
19
+ * @param {object} stats - { followersCount, followingCount, statusesCount, createdAt }
20
+ */
21
+ export function cacheAccountStats(actorUrl, stats) {
22
+ if (!actorUrl) return;
23
+
24
+ // Evict oldest if at capacity
25
+ if (cache.size >= MAX_ENTRIES) {
26
+ const oldest = cache.keys().next().value;
27
+ cache.delete(oldest);
28
+ }
29
+
30
+ cache.set(actorUrl, { ...stats, cachedAt: Date.now() });
31
+ }
32
+
33
+ /**
34
+ * Get cached account stats.
35
+ * @param {string} actorUrl - The actor's URL
36
+ * @returns {object|null} Stats or null if not cached/expired
37
+ */
38
+ export function getCachedAccountStats(actorUrl) {
39
+ if (!actorUrl) return null;
40
+
41
+ const entry = cache.get(actorUrl);
42
+ if (!entry) return null;
43
+
44
+ // Check TTL
45
+ if (Date.now() - entry.cachedAt > CACHE_TTL_MS) {
46
+ cache.delete(actorUrl);
47
+ return null;
48
+ }
49
+
50
+ return entry;
51
+ }
@@ -5,6 +5,7 @@
5
5
  * Shared by accounts.js (lookup) and search.js (resolve=true).
6
6
  */
7
7
  import { serializeAccount } from "../entities/account.js";
8
+ import { cacheAccountStats } from "./account-cache.js";
8
9
 
9
10
  /**
10
11
  * @param {string} acct - Account identifier (user@domain or URL)
@@ -115,6 +116,14 @@ export async function resolveRemoteAccount(acct, pluginOptions, baseUrl) {
115
116
  account.following_count = followingCount;
116
117
  account.statuses_count = statusesCount;
117
118
 
119
+ // Cache stats so embedded account objects in statuses can use them
120
+ cacheAccountStats(actorUrl, {
121
+ followersCount,
122
+ followingCount,
123
+ statusesCount,
124
+ createdAt: published || undefined,
125
+ });
126
+
118
127
  return account;
119
128
  } catch (error) {
120
129
  console.warn(`[Mastodon API] Remote account resolution failed for ${acct}:`, error.message);
@@ -0,0 +1,358 @@
1
+ {
2
+ "activitypub": {
3
+ "title": "ActivityPub",
4
+ "followers": "Пратиоци",
5
+ "following": "Праћени",
6
+ "activities": "Дневник активности",
7
+ "featured": "Закачени објаве",
8
+ "featuredTags": "Истакнуте ознаке",
9
+ "recentActivity": "Недавна активност",
10
+ "noActivity": "Још нема активности. Када ваш актер буде федерисан, интеракције ће се појавити овде.",
11
+ "noFollowers": "Још нема пратилаца.",
12
+ "noFollowing": "Још не пратите никога.",
13
+ "pendingFollows": "На чекању",
14
+ "noPendingFollows": "Нема захтева за праћење на чекању.",
15
+ "approve": "Одобри",
16
+ "reject": "Одбиј",
17
+ "followApproved": "Захтев за праћење одобрен.",
18
+ "followRejected": "Захтев за праћење одбијен.",
19
+ "followRequest": "жели да вас прати",
20
+ "followerCount": "%d пратилац",
21
+ "followerCount_plural": "%d пратилаца",
22
+ "followingCount": "%d праћених",
23
+ "followedAt": "Прати од",
24
+ "source": "Извор",
25
+ "sourceImport": "Mastodon увоз",
26
+ "sourceManual": "Ручно",
27
+ "sourceFederation": "Федерација",
28
+ "sourceRefollowPending": "Поновно праћење на чекању",
29
+ "sourceRefollowFailed": "Поновно праћење неуспешно",
30
+ "direction": "Смер",
31
+ "directionInbound": "Примљено",
32
+ "directionOutbound": "Послато",
33
+ "profile": {
34
+ "title": "Профил",
35
+ "intro": "Уредите како ваш актер изгледа другим корисницима fediverse-а. Промене одмах ступају на снагу.",
36
+ "nameLabel": "Приказано име",
37
+ "nameHint": "Ваше име како се приказује на вашем fediverse профилу",
38
+ "summaryLabel": "Биографија",
39
+ "summaryHint": "Кратак опис о себи. HTML је дозвољен.",
40
+ "urlLabel": "URL веб сајта",
41
+ "urlHint": "Адреса вашег веб сајта, приказана као линк на вашем профилу",
42
+ "iconLabel": "URL аватара",
43
+ "iconHint": "URL ваше профилне слике (квадратна, препоручено најмање 400x400px)",
44
+ "imageLabel": "URL слике заглавља",
45
+ "imageHint": "URL банер слике приказане на врху вашег профила",
46
+ "manualApprovalLabel": "Ручно одобравање пратилаца",
47
+ "manualApprovalHint": "Када је омогућено, захтеви за праћење захтевају вашу сагласност пре него што ступе на снагу",
48
+ "actorTypeLabel": "Тип актера",
49
+ "actorTypeHint": "Како ваш налог изгледа у fediverse-у. Person за појединце, Service за ботове или аутоматизоване налоге, Organization за групе или компаније.",
50
+ "linksLabel": "Линкови профила",
51
+ "linksHint": "Линкови приказани на вашем fediverse профилу. Додајте свој веб сајт, друштвене налоге или друге URL-ове. Странице које линкују назад са rel=\"me\" биће приказане као верификоване на Mastodon-у.",
52
+ "linkNameLabel": "Ознака",
53
+ "linkValueLabel": "URL",
54
+ "addLink": "Додај линк",
55
+ "removeLink": "Уклони",
56
+ "authorizedFetchLabel": "Захтевај ауторизовано преузимање (безбедни режим)",
57
+ "authorizedFetchHint": "Када је омогућено, само сервери са важећим HTTP потписима могу преузети вашег актера и колекције. Ово побољшава приватност али може смањити компатибилност са неким клијентима.",
58
+ "save": "Сачувај профил",
59
+ "saved": "Профил сачуван. Промене су сада видљиве у fediverse-у.",
60
+ "public": {
61
+ "followPrompt": "Пратите ме на fediverse-у",
62
+ "copyHandle": "Копирај идентификатор",
63
+ "copied": "Копирано!",
64
+ "pinnedPosts": "Закачене објаве",
65
+ "recentPosts": "Недавне објаве",
66
+ "joinedDate": "Придружио/ла се",
67
+ "posts": "Објаве",
68
+ "followers": "Пратиоци",
69
+ "following": "Праћени",
70
+ "viewOnSite": "Погледај на сајту"
71
+ },
72
+ "remote": {
73
+ "follow": "Прати",
74
+ "unfollow": "Отпрати",
75
+ "viewOn": "Погледај на",
76
+ "postsTitle": "Објаве",
77
+ "noPosts": "Још нема објава са овог налога.",
78
+ "followToSee": "Пратите овај налог да бисте видели њихове објаве на вашој временској линији.",
79
+ "notFound": "Није могуће пронаћи овај налог. Можда је обрисан или је сервер недоступан."
80
+ }
81
+ },
82
+ "migrate": {
83
+ "title": "Mastodon миграција",
84
+ "intro": "Овај водич вас води кроз пребацивање вашег Mastodon идентитета на ваш IndieWeb сајт. Завршите сваки корак по реду — ваши постојећи пратиоци биће обавештени и могу вас аутоматски поново пратити.",
85
+ "step1Title": "Корак 1 — Повежите свој стари налог",
86
+ "step1Desc": "Обавестите fediverse да ваш стари Mastodon налог и овај сајт припадају истој особи. Ово поставља својство <code>alsoKnownAs</code> на вашем ActivityPub актеру, које Mastodon проверава пре него што дозволи пребацивање.",
87
+ "aliasLabel": "URL старог Mastodon налога",
88
+ "aliasHint": "Пуни URL вашег Mastodon профила, нпр. https://mstdn.social/users/rmdes",
89
+ "aliasSave": "Сачувај алијас",
90
+ "aliasCurrent": "Тренутни алијас",
91
+ "aliasNone": "Алијас још није подешен.",
92
+ "step2Title": "Корак 2 — Увезите свој друштвени граф",
93
+ "step2Desc": "Отпремите CSV фајлове из вашег Mastodon извоза података да бисте пренели своје везе. Идите на своју Mastodon инстанцу → Подешавања → Увоз и извоз → Извоз података да их преузмете.",
94
+ "importLegend": "Шта увести",
95
+ "fileLabel": "CSV фајл",
96
+ "fileHint": "Изаберите CSV фајл из вашег Mastodon извоза података (нпр. following_accounts.csv или followers.csv)",
97
+ "importButton": "Увези",
98
+ "importFollowing": "Листа праћених",
99
+ "importFollowingHint": "Налози које пратите — одмах ће се појавити на вашој листи Праћених",
100
+ "importFollowers": "Листа пратилаца",
101
+ "importFollowersHint": "Ваши тренутни пратиоци — биће забележени као на чекању док вас поново не запрате после пребацивања у кораку 3",
102
+ "step3Title": "Корак 3 — Пребаците свој налог",
103
+ "step3Desc": "Када сачувате свој алијас и увезете своје податке, идите на своју Mastodon инстанцу → Подешавања → Налог → <strong>Пребаци на други налог</strong>. Унесите свој нови fediverse идентификатор и потврдите. Mastodon ће обавестити све ваше пратиоце, а они чији сервери то подржавају аутоматски ће вас пратити овде. Овај корак је неповратан — ваш стари налог ће постати преусмеравање.",
104
+ "errorNoFile": "Молимо изаберите CSV фајл пре увоза.",
105
+ "success": "Увезено %d праћених, %d пратилаца (%d неуспешних).",
106
+ "failedList": "Није могуће резолвирати: %s",
107
+ "failedListSummary": "Неуспешни идентификатори",
108
+ "aliasSuccess": "Алијас сачуван — ваш документ актера сада укључује овај налог као alsoKnownAs."
109
+ },
110
+ "refollow": {
111
+ "title": "Групно поновно праћење",
112
+ "progress": "Напредак поновног праћења",
113
+ "remaining": "Преостало",
114
+ "awaitingAccept": "Чека се прихватање",
115
+ "accepted": "Прихваћено",
116
+ "failed": "Неуспешно",
117
+ "pause": "Паузирај",
118
+ "resume": "Настави",
119
+ "status": {
120
+ "idle": "Неактивно",
121
+ "running": "У току",
122
+ "paused": "Паузирано",
123
+ "completed": "Завршено"
124
+ }
125
+ },
126
+ "moderation": {
127
+ "title": "Модерација",
128
+ "blockedTitle": "Блокирани налози",
129
+ "mutedActorsTitle": "Утишани налози",
130
+ "mutedKeywordsTitle": "Утишане кључне речи",
131
+ "noBlocked": "Нема блокираних налога.",
132
+ "noMutedActors": "Нема утишаних налога.",
133
+ "noMutedKeywords": "Нема утишаних кључних речи.",
134
+ "unblock": "Деблокирај",
135
+ "unmute": "Укључи",
136
+ "addKeywordTitle": "Додај утишану кључну реч",
137
+ "keywordPlaceholder": "Унесите кључну реч или фразу…",
138
+ "addKeyword": "Додај",
139
+ "muteActor": "Утишај",
140
+ "blockActor": "Блокирај",
141
+ "filterModeTitle": "Режим филтрирања",
142
+ "filterModeHint": "Изаберите како се утишани садржај обрађује на вашој временској линији. Блокирани налози су увек скривени.",
143
+ "filterModeHide": "Сакриј — уклони са временске линије",
144
+ "filterModeWarn": "Упозори — прикажи иза упозорења о садржају",
145
+ "cwMutedAccount": "Утишани налог",
146
+ "cwMutedKeyword": "Утишана кључна реч:",
147
+ "cwFiltered": "Филтрирани садржај"
148
+ },
149
+ "compose": {
150
+ "title": "Напиши одговор",
151
+ "placeholder": "Напишите свој одговор…",
152
+ "syndicateLabel": "Синдицирај на",
153
+ "submitMicropub": "Објави одговор",
154
+ "cancel": "Откажи",
155
+ "errorEmpty": "Садржај одговора не може бити празан",
156
+ "visibilityLabel": "Видљивост",
157
+ "visibilityPublic": "Јавно",
158
+ "visibilityUnlisted": "Неизлистано",
159
+ "visibilityFollowers": "Само пратиоци",
160
+ "cwLabel": "Упозорење о садржају",
161
+ "cwPlaceholder": "Напишите своје упозорење овде…"
162
+ },
163
+ "notifications": {
164
+ "title": "Обавештења",
165
+ "empty": "Још нема обавештења. Интеракције од других корисника fediverse-а ће се појавити овде.",
166
+ "liked": "допала се ваша објава",
167
+ "boostedPost": "поделио/ла вашу објаву",
168
+ "followedYou": "прати вас",
169
+ "repliedTo": "одговорио/ла на вашу објаву",
170
+ "mentionedYou": "вас је поменуо/ла",
171
+ "markAllRead": "Означи све као прочитано",
172
+ "clearAll": "Обриши све",
173
+ "clearConfirm": "Обрисати сва обавештења? Ово се не може поништити.",
174
+ "dismiss": "Одбаци",
175
+ "viewThread": "Погледај нит",
176
+ "tabs": {
177
+ "all": "Све",
178
+ "replies": "Одговори",
179
+ "likes": "Свиђања",
180
+ "boosts": "Дељења",
181
+ "follows": "Праћења",
182
+ "dms": "ПП",
183
+ "reports": "Пријаве"
184
+ },
185
+ "emptyTab": "Још нема %s обавештења."
186
+ },
187
+ "messages": {
188
+ "title": "Поруке",
189
+ "empty": "Још нема порука. Директне поруке од других корисника fediverse-а ће се појавити овде.",
190
+ "allConversations": "Сви разговори",
191
+ "compose": "Нова порука",
192
+ "send": "Пошаљи поруку",
193
+ "delete": "Обриши",
194
+ "markAllRead": "Означи све као прочитано",
195
+ "clearAll": "Обриши све",
196
+ "clearConfirm": "Обрисати све поруке? Ово се не може поништити.",
197
+ "recipientLabel": "За",
198
+ "recipientPlaceholder": "@корисник@инстанца.social",
199
+ "placeholder": "Напишите своју поруку...",
200
+ "sentTo": "За",
201
+ "replyingTo": "Одговор на",
202
+ "sentYouDM": "вам је послао/ла директну поруку",
203
+ "viewMessage": "Погледај поруку",
204
+ "errorEmpty": "Садржај поруке не може бити празан.",
205
+ "errorNoRecipient": "Молимо унесите примаоца.",
206
+ "errorRecipientNotFound": "Није могуће пронаћи тог корисника. Покушајте са пуним @корисник@домен идентификатором."
207
+ },
208
+ "reader": {
209
+ "title": "Читач",
210
+ "tabs": {
211
+ "all": "Све",
212
+ "notes": "Белешке",
213
+ "articles": "Чланци",
214
+ "replies": "Одговори",
215
+ "boosts": "Дељења",
216
+ "media": "Медији"
217
+ },
218
+ "empty": "Ваша временска линија је празна. Пратите неке налоге да бисте видели њихове објаве овде.",
219
+ "boosted": "поделио/ла",
220
+ "replyingTo": "Одговор на",
221
+ "showContent": "Прикажи садржај",
222
+ "hideContent": "Сакриј садржај",
223
+ "sensitiveContent": "Осетљив садржај",
224
+ "videoNotSupported": "Ваш прегледач не подржава видео елемент.",
225
+ "audioNotSupported": "Ваш прегледач не подржава аудио елемент.",
226
+ "actions": {
227
+ "reply": "Одговори",
228
+ "boost": "Подели",
229
+ "unboost": "Поништи дељење",
230
+ "like": "Свиђа ми се",
231
+ "unlike": "Поништи свиђање",
232
+ "viewOriginal": "Погледај оригинал",
233
+ "liked": "Свиђа се",
234
+ "boosted": "Подељено",
235
+ "likeError": "Није могуће означити ову објаву свиђањем",
236
+ "boostError": "Није могуће поделити ову објаву"
237
+ },
238
+ "post": {
239
+ "title": "Детаљи објаве",
240
+ "notFound": "Објава није пронађена или више није доступна.",
241
+ "openExternal": "Отвори на оригиналној инстанци",
242
+ "parentPosts": "Нит",
243
+ "replies": "Одговори",
244
+ "back": "Назад на временску линију",
245
+ "loadingThread": "Учитавање нити...",
246
+ "threadError": "Није могуће учитати целу нит"
247
+ },
248
+ "resolve": {
249
+ "placeholder": "Налепите fediverse URL или @корисник@домен идентификатор…",
250
+ "label": "Претражите fediverse објаву или налог",
251
+ "button": "Претражи",
252
+ "notFoundTitle": "Није пронађено",
253
+ "notFound": "Није могуће пронаћи ову објаву или налог. URL може бити неважећи, сервер може бити недоступан или је садржај можда обрисан.",
254
+ "followersLabel": "пратилаца"
255
+ },
256
+ "linkPreview": {
257
+ "label": "Преглед линка"
258
+ },
259
+ "explore": {
260
+ "title": "Истражите",
261
+ "description": "Прегледајте јавне временске линије са удаљених инстанци компатибилних са Mastodon-ом.",
262
+ "instancePlaceholder": "Унесите назив хоста инстанце, нпр. mastodon.social",
263
+ "browse": "Прегледај",
264
+ "local": "Локално",
265
+ "federated": "Федерисано",
266
+ "loadError": "Није могуће учитати временску линију са ове инстанце. Можда је недоступна или не подржава Mastodon API.",
267
+ "timeout": "Захтев је истекао. Инстанца може бити спора или недоступна.",
268
+ "noResults": "Нису пронађене објаве на јавној временској линији ове инстанце.",
269
+ "invalidInstance": "Неважећи назив хоста инстанце. Молимо унесите важећи назив домена.",
270
+ "mauLabel": "MAU",
271
+ "timelineSupported": "Јавна временска линија доступна",
272
+ "timelineUnsupported": "Јавна временска линија недоступна",
273
+ "hashtagLabel": "Хештег (опционо)",
274
+ "hashtagPlaceholder": "нпр. indieweb",
275
+ "hashtagHint": "Филтрирајте резултате по одређеном хештегу",
276
+ "tabs": {
277
+ "label": "Картице за истраживање",
278
+ "search": "Претражи",
279
+ "pinAsTab": "Закачи као картицу",
280
+ "pinned": "Закачене",
281
+ "remove": "Уклони картицу",
282
+ "moveUp": "Помери горе",
283
+ "moveDown": "Помери доле",
284
+ "addHashtag": "Додај картицу хештега",
285
+ "hashtagTabPlaceholder": "Унесите хештег",
286
+ "addTab": "Додај",
287
+ "retry": "Покушај поново",
288
+ "noInstances": "Закачите прво неке инстанце да бисте користили картице хештега.",
289
+ "sources": "Претрага #%s на %d инстанци",
290
+ "sources_plural": "Претрага #%s на %d инстанци",
291
+ "sourcesPartial": "%d од %d инстанци је одговорило"
292
+ }
293
+ },
294
+ "tagTimeline": {
295
+ "postsTagged": "%d објава",
296
+ "postsTagged_plural": "%d објава",
297
+ "noPosts": "Нису пронађене објаве са #%s на вашој временској линији.",
298
+ "followTag": "Прати хештег",
299
+ "unfollowTag": "Отпрати хештег",
300
+ "following": "Праћено"
301
+ },
302
+ "pagination": {
303
+ "newer": "← Новије",
304
+ "older": "Старије →",
305
+ "loadMore": "Учитај више",
306
+ "loading": "Учитавање…",
307
+ "noMore": "У току сте са свим."
308
+ }
309
+ },
310
+ "myProfile": {
311
+ "title": "Мој профил",
312
+ "posts": "објаве",
313
+ "editProfile": "Уреди профил",
314
+ "empty": "Овде још нема ничега.",
315
+ "tabs": {
316
+ "posts": "Објаве",
317
+ "replies": "Одговори",
318
+ "likes": "Свиђања",
319
+ "boosts": "Дељења"
320
+ }
321
+ },
322
+ "poll": {
323
+ "voters": "гласача",
324
+ "votes": "гласова",
325
+ "closed": "Анкета затворена",
326
+ "endsAt": "Завршава се"
327
+ },
328
+ "federation": {
329
+ "deleteSuccess": "Активност брисања послата пратиоцима",
330
+ "deleteButton": "Обриши из fediverse-а"
331
+ },
332
+ "federationMgmt": {
333
+ "title": "Федерација",
334
+ "collections": "Стање колекција",
335
+ "quickActions": "Брзе акције",
336
+ "broadcastActor": "Емитуј ажурирање актера",
337
+ "debugDashboard": "Контролна табла за дебаговање",
338
+ "objectLookup": "Претрага објекта",
339
+ "lookupPlaceholder": "URL или @корисник@домен идентификатор…",
340
+ "lookup": "Претражи",
341
+ "lookupLoading": "Резолвирање…",
342
+ "postActions": "Федерација објава",
343
+ "viewJson": "JSON",
344
+ "rebroadcast": "Поново емитуј Create активност",
345
+ "rebroadcastShort": "Поново пошаљи",
346
+ "broadcastDelete": "Емитуј Delete активност",
347
+ "deleteShort": "Обриши",
348
+ "noPosts": "Нису пронађене објаве.",
349
+ "apJsonTitle": "ActivityStreams JSON-LD",
350
+ "recentActivity": "Недавна активност",
351
+ "viewAllActivities": "Погледај све активности →"
352
+ },
353
+ "reports": {
354
+ "sentReport": "је поднео/ла пријаву",
355
+ "title": "Пријаве"
356
+ }
357
+ }
358
+ }
@@ -0,0 +1,358 @@
1
+ {
2
+ "activitypub": {
3
+ "title": "ActivityPub",
4
+ "followers": "Följare",
5
+ "following": "Följer",
6
+ "activities": "Aktivitetslogg",
7
+ "featured": "Fästa inlägg",
8
+ "featuredTags": "Utvalda taggar",
9
+ "recentActivity": "Senaste aktivitet",
10
+ "noActivity": "Ingen aktivitet ännu. När din aktör är federerad kommer interaktioner att visas här.",
11
+ "noFollowers": "Inga följare ännu.",
12
+ "noFollowing": "Följer ingen ännu.",
13
+ "pendingFollows": "Väntande",
14
+ "noPendingFollows": "Inga väntande följförfrågningar.",
15
+ "approve": "Godkänn",
16
+ "reject": "Avvisa",
17
+ "followApproved": "Följförfrågan godkänd.",
18
+ "followRejected": "Följförfrågan avvisad.",
19
+ "followRequest": "vill följa dig",
20
+ "followerCount": "%d följare",
21
+ "followerCount_plural": "%d följare",
22
+ "followingCount": "%d följer",
23
+ "followedAt": "Följer sedan",
24
+ "source": "Källa",
25
+ "sourceImport": "Mastodon-import",
26
+ "sourceManual": "Manuell",
27
+ "sourceFederation": "Federation",
28
+ "sourceRefollowPending": "Omföljning väntar",
29
+ "sourceRefollowFailed": "Omföljning misslyckades",
30
+ "direction": "Riktning",
31
+ "directionInbound": "Mottaget",
32
+ "directionOutbound": "Skickat",
33
+ "profile": {
34
+ "title": "Profil",
35
+ "intro": "Redigera hur din aktör visas för andra fediverse-användare. Ändringar träder i kraft omedelbart.",
36
+ "nameLabel": "Visningsnamn",
37
+ "nameHint": "Ditt namn som det visas på din fediverse-profil",
38
+ "summaryLabel": "Biografi",
39
+ "summaryHint": "En kort beskrivning av dig själv. HTML är tillåtet.",
40
+ "urlLabel": "Webbplatsens URL",
41
+ "urlHint": "Din webbadress, visad som en länk på din profil",
42
+ "iconLabel": "Avatar-URL",
43
+ "iconHint": "URL till din profilbild (kvadratisk, minst 400x400px rekommenderas)",
44
+ "imageLabel": "Rubrikbildens URL",
45
+ "imageHint": "URL till en bannerbild som visas högst upp på din profil",
46
+ "manualApprovalLabel": "Godkänn följare manuellt",
47
+ "manualApprovalHint": "När aktiverat kräver följförfrågningar ditt godkännande innan de träder i kraft",
48
+ "actorTypeLabel": "Aktörstyp",
49
+ "actorTypeHint": "Hur ditt konto visas i fediverse. Person för individer, Service för botar eller automatiserade konton, Organization för grupper eller företag.",
50
+ "linksLabel": "Profillänkar",
51
+ "linksHint": "Länkar som visas på din fediverse-profil. Lägg till din webbplats, sociala konton eller andra URL:er. Sidor som länkar tillbaka med rel=\"me\" visas som verifierade på Mastodon.",
52
+ "linkNameLabel": "Etikett",
53
+ "linkValueLabel": "URL",
54
+ "addLink": "Lägg till länk",
55
+ "removeLink": "Ta bort",
56
+ "authorizedFetchLabel": "Kräv auktoriserad hämtning (säkert läge)",
57
+ "authorizedFetchHint": "När aktiverat kan bara servrar med giltiga HTTP-signaturer hämta din aktör och samlingar. Detta förbättrar integriteten men kan minska kompatibiliteten med vissa klienter.",
58
+ "save": "Spara profil",
59
+ "saved": "Profil sparad. Ändringar är nu synliga i fediverse.",
60
+ "public": {
61
+ "followPrompt": "Följ mig på fediverse",
62
+ "copyHandle": "Kopiera handtag",
63
+ "copied": "Kopierat!",
64
+ "pinnedPosts": "Fästa inlägg",
65
+ "recentPosts": "Senaste inlägg",
66
+ "joinedDate": "Gick med",
67
+ "posts": "Inlägg",
68
+ "followers": "Följare",
69
+ "following": "Följer",
70
+ "viewOnSite": "Visa på webbplatsen"
71
+ },
72
+ "remote": {
73
+ "follow": "Följ",
74
+ "unfollow": "Sluta följa",
75
+ "viewOn": "Visa på",
76
+ "postsTitle": "Inlägg",
77
+ "noPosts": "Inga inlägg från detta konto ännu.",
78
+ "followToSee": "Följ detta konto för att se deras inlägg i din tidslinje.",
79
+ "notFound": "Kunde inte hitta detta konto. Det kan ha raderats eller servern kan vara otillgänglig."
80
+ }
81
+ },
82
+ "migrate": {
83
+ "title": "Mastodon-migrering",
84
+ "intro": "Denna guide leder dig genom att flytta din Mastodon-identitet till din IndieWeb-webbplats. Slutför varje steg i ordning — dina befintliga följare kommer att meddelas och kan följa dig automatiskt.",
85
+ "step1Title": "Steg 1 — Länka ditt gamla konto",
86
+ "step1Desc": "Berätta för fediverse att ditt gamla Mastodon-konto och denna webbplats tillhör samma person. Detta sätter egenskapen <code>alsoKnownAs</code> på din ActivityPub-aktör, som Mastodon kontrollerar innan en flytt tillåts.",
87
+ "aliasLabel": "URL till gammalt Mastodon-konto",
88
+ "aliasHint": "Den fullständiga URL:en till din Mastodon-profil, t.ex. https://mstdn.social/users/rmdes",
89
+ "aliasSave": "Spara alias",
90
+ "aliasCurrent": "Aktuellt alias",
91
+ "aliasNone": "Inget alias konfigurerat ännu.",
92
+ "step2Title": "Steg 2 — Importera ditt sociala nätverk",
93
+ "step2Desc": "Ladda upp CSV-filerna från din Mastodon-dataexport för att ta med dina kontakter. Gå till din Mastodon-instans → Inställningar → Import och export → Dataexport för att ladda ner dem.",
94
+ "importLegend": "Vad som ska importeras",
95
+ "fileLabel": "CSV-fil",
96
+ "fileHint": "Välj en CSV-fil från din Mastodon-dataexport (t.ex. following_accounts.csv eller followers.csv)",
97
+ "importButton": "Importera",
98
+ "importFollowing": "Följlista",
99
+ "importFollowingHint": "Konton du följer — de visas omedelbart i din Följer-lista",
100
+ "importFollowers": "Följarlista",
101
+ "importFollowersHint": "Dina nuvarande följare — de registreras som väntande tills de följer dig igen efter flytten i steg 3",
102
+ "step3Title": "Steg 3 — Flytta ditt konto",
103
+ "step3Desc": "När du har sparat ditt alias och importerat dina data, gå till din Mastodon-instans → Inställningar → Konto → <strong>Flytta till ett annat konto</strong>. Ange ditt nya fediverse-handtag och bekräfta. Mastodon meddelar alla dina följare, och de vars servrar stöder det kommer automatiskt att följa dig här. Detta steg är oåterkalleligt — ditt gamla konto blir en omdirigering.",
104
+ "errorNoFile": "Välj en CSV-fil innan du importerar.",
105
+ "success": "Importerade %d följda, %d följare (%d misslyckades).",
106
+ "failedList": "Kunde inte lösa: %s",
107
+ "failedListSummary": "Misslyckade handtag",
108
+ "aliasSuccess": "Alias sparat — ditt aktörsdokument inkluderar nu detta konto som alsoKnownAs."
109
+ },
110
+ "refollow": {
111
+ "title": "Massomföljning",
112
+ "progress": "Omföljningsförlopp",
113
+ "remaining": "Återstående",
114
+ "awaitingAccept": "Väntar på godkännande",
115
+ "accepted": "Godkänd",
116
+ "failed": "Misslyckades",
117
+ "pause": "Pausa",
118
+ "resume": "Återuppta",
119
+ "status": {
120
+ "idle": "Inaktiv",
121
+ "running": "Körs",
122
+ "paused": "Pausad",
123
+ "completed": "Slutförd"
124
+ }
125
+ },
126
+ "moderation": {
127
+ "title": "Moderering",
128
+ "blockedTitle": "Blockerade konton",
129
+ "mutedActorsTitle": "Tystade konton",
130
+ "mutedKeywordsTitle": "Tystade nyckelord",
131
+ "noBlocked": "Inga blockerade konton.",
132
+ "noMutedActors": "Inga tystade konton.",
133
+ "noMutedKeywords": "Inga tystade nyckelord.",
134
+ "unblock": "Avblockera",
135
+ "unmute": "Sluta tysta",
136
+ "addKeywordTitle": "Lägg till tystat nyckelord",
137
+ "keywordPlaceholder": "Ange nyckelord eller fras…",
138
+ "addKeyword": "Lägg till",
139
+ "muteActor": "Tysta",
140
+ "blockActor": "Blockera",
141
+ "filterModeTitle": "Filterläge",
142
+ "filterModeHint": "Välj hur tystat innehåll hanteras i din tidslinje. Blockerade konton döljs alltid.",
143
+ "filterModeHide": "Dölj — ta bort från tidslinjen",
144
+ "filterModeWarn": "Varna — visa bakom innehållsvarning",
145
+ "cwMutedAccount": "Tystat konto",
146
+ "cwMutedKeyword": "Tystat nyckelord:",
147
+ "cwFiltered": "Filtrerat innehåll"
148
+ },
149
+ "compose": {
150
+ "title": "Skriv svar",
151
+ "placeholder": "Skriv ditt svar…",
152
+ "syndicateLabel": "Syndikera till",
153
+ "submitMicropub": "Publicera svar",
154
+ "cancel": "Avbryt",
155
+ "errorEmpty": "Svarsinnehållet kan inte vara tomt",
156
+ "visibilityLabel": "Synlighet",
157
+ "visibilityPublic": "Offentligt",
158
+ "visibilityUnlisted": "Olistad",
159
+ "visibilityFollowers": "Bara följare",
160
+ "cwLabel": "Innehållsvarning",
161
+ "cwPlaceholder": "Skriv din varning här…"
162
+ },
163
+ "notifications": {
164
+ "title": "Aviseringar",
165
+ "empty": "Inga aviseringar ännu. Interaktioner från andra fediverse-användare kommer att visas här.",
166
+ "liked": "gillade ditt inlägg",
167
+ "boostedPost": "boostade ditt inlägg",
168
+ "followedYou": "följde dig",
169
+ "repliedTo": "svarade på ditt inlägg",
170
+ "mentionedYou": "nämnde dig",
171
+ "markAllRead": "Markera alla som lästa",
172
+ "clearAll": "Rensa alla",
173
+ "clearConfirm": "Radera alla aviseringar? Detta kan inte ångras.",
174
+ "dismiss": "Avfärda",
175
+ "viewThread": "Visa tråd",
176
+ "tabs": {
177
+ "all": "Alla",
178
+ "replies": "Svar",
179
+ "likes": "Gillningar",
180
+ "boosts": "Boostar",
181
+ "follows": "Följningar",
182
+ "dms": "DM",
183
+ "reports": "Rapporter"
184
+ },
185
+ "emptyTab": "Inga %s-aviseringar ännu."
186
+ },
187
+ "messages": {
188
+ "title": "Meddelanden",
189
+ "empty": "Inga meddelanden ännu. Direktmeddelanden från andra fediverse-användare kommer att visas här.",
190
+ "allConversations": "Alla konversationer",
191
+ "compose": "Nytt meddelande",
192
+ "send": "Skicka meddelande",
193
+ "delete": "Radera",
194
+ "markAllRead": "Markera alla som lästa",
195
+ "clearAll": "Rensa alla",
196
+ "clearConfirm": "Radera alla meddelanden? Detta kan inte ångras.",
197
+ "recipientLabel": "Till",
198
+ "recipientPlaceholder": "@användare@instans.social",
199
+ "placeholder": "Skriv ditt meddelande...",
200
+ "sentTo": "Till",
201
+ "replyingTo": "Svarar",
202
+ "sentYouDM": "skickade dig ett direktmeddelande",
203
+ "viewMessage": "Visa meddelande",
204
+ "errorEmpty": "Meddelandeinnehållet kan inte vara tomt.",
205
+ "errorNoRecipient": "Ange en mottagare.",
206
+ "errorRecipientNotFound": "Kunde inte hitta den användaren. Prova ett fullständigt @användare@domän-handtag."
207
+ },
208
+ "reader": {
209
+ "title": "Läsare",
210
+ "tabs": {
211
+ "all": "Alla",
212
+ "notes": "Anteckningar",
213
+ "articles": "Artiklar",
214
+ "replies": "Svar",
215
+ "boosts": "Boostar",
216
+ "media": "Media"
217
+ },
218
+ "empty": "Din tidslinje är tom. Följ några konton för att se deras inlägg här.",
219
+ "boosted": "boostade",
220
+ "replyingTo": "Svarar",
221
+ "showContent": "Visa innehåll",
222
+ "hideContent": "Dölj innehåll",
223
+ "sensitiveContent": "Känsligt innehåll",
224
+ "videoNotSupported": "Din webbläsare stöder inte videoelementet.",
225
+ "audioNotSupported": "Din webbläsare stöder inte ljudelementet.",
226
+ "actions": {
227
+ "reply": "Svara",
228
+ "boost": "Boosta",
229
+ "unboost": "Ångra boost",
230
+ "like": "Gilla",
231
+ "unlike": "Ångra gillning",
232
+ "viewOriginal": "Visa original",
233
+ "liked": "Gillad",
234
+ "boosted": "Boostad",
235
+ "likeError": "Kunde inte gilla detta inlägg",
236
+ "boostError": "Kunde inte boosta detta inlägg"
237
+ },
238
+ "post": {
239
+ "title": "Inläggsdetalj",
240
+ "notFound": "Inlägg hittades inte eller är inte längre tillgängligt.",
241
+ "openExternal": "Öppna på ursprungsinstansen",
242
+ "parentPosts": "Tråd",
243
+ "replies": "Svar",
244
+ "back": "Tillbaka till tidslinjen",
245
+ "loadingThread": "Laddar tråd...",
246
+ "threadError": "Kunde inte ladda hela tråden"
247
+ },
248
+ "resolve": {
249
+ "placeholder": "Klistra in en fediverse-URL eller @användare@domän-handtag…",
250
+ "label": "Slå upp ett fediverse-inlägg eller -konto",
251
+ "button": "Slå upp",
252
+ "notFoundTitle": "Hittades inte",
253
+ "notFound": "Kunde inte hitta detta inlägg eller konto. URL:en kan vara ogiltig, servern kan vara otillgänglig eller innehållet kan ha raderats.",
254
+ "followersLabel": "följare"
255
+ },
256
+ "linkPreview": {
257
+ "label": "Länkförhandsvisning"
258
+ },
259
+ "explore": {
260
+ "title": "Utforska",
261
+ "description": "Bläddra i offentliga tidslinjer från fjärrinstanser som är kompatibla med Mastodon.",
262
+ "instancePlaceholder": "Ange ett instansvärdnamn, t.ex. mastodon.social",
263
+ "browse": "Bläddra",
264
+ "local": "Lokal",
265
+ "federated": "Federerad",
266
+ "loadError": "Kunde inte ladda tidslinjen från denna instans. Den kan vara otillgänglig eller stöder inte Mastodon-API:et.",
267
+ "timeout": "Förfrågan tog för lång tid. Instansen kan vara långsam eller otillgänglig.",
268
+ "noResults": "Inga inlägg hittades på denna instans offentliga tidslinje.",
269
+ "invalidInstance": "Ogiltigt instansvärdnamn. Ange ett giltigt domännamn.",
270
+ "mauLabel": "MAU",
271
+ "timelineSupported": "Offentlig tidslinje tillgänglig",
272
+ "timelineUnsupported": "Offentlig tidslinje inte tillgänglig",
273
+ "hashtagLabel": "Hashtag (valfritt)",
274
+ "hashtagPlaceholder": "t.ex. indieweb",
275
+ "hashtagHint": "Filtrera resultat efter en specifik hashtag",
276
+ "tabs": {
277
+ "label": "Utforska-flikar",
278
+ "search": "Sök",
279
+ "pinAsTab": "Fäst som flik",
280
+ "pinned": "Fästa",
281
+ "remove": "Ta bort flik",
282
+ "moveUp": "Flytta upp",
283
+ "moveDown": "Flytta ner",
284
+ "addHashtag": "Lägg till hashtag-flik",
285
+ "hashtagTabPlaceholder": "Ange hashtag",
286
+ "addTab": "Lägg till",
287
+ "retry": "Försök igen",
288
+ "noInstances": "Fäst några instanser först för att använda hashtag-flikar.",
289
+ "sources": "Söker #%s på %d instans",
290
+ "sources_plural": "Söker #%s på %d instanser",
291
+ "sourcesPartial": "%d av %d instanser svarade"
292
+ }
293
+ },
294
+ "tagTimeline": {
295
+ "postsTagged": "%d inlägg",
296
+ "postsTagged_plural": "%d inlägg",
297
+ "noPosts": "Inga inlägg med #%s hittades i din tidslinje.",
298
+ "followTag": "Följ hashtag",
299
+ "unfollowTag": "Sluta följa hashtag",
300
+ "following": "Följer"
301
+ },
302
+ "pagination": {
303
+ "newer": "← Nyare",
304
+ "older": "Äldre →",
305
+ "loadMore": "Ladda fler",
306
+ "loading": "Laddar…",
307
+ "noMore": "Du är ikapp."
308
+ }
309
+ },
310
+ "myProfile": {
311
+ "title": "Min profil",
312
+ "posts": "inlägg",
313
+ "editProfile": "Redigera profil",
314
+ "empty": "Inget här ännu.",
315
+ "tabs": {
316
+ "posts": "Inlägg",
317
+ "replies": "Svar",
318
+ "likes": "Gillningar",
319
+ "boosts": "Boostar"
320
+ }
321
+ },
322
+ "poll": {
323
+ "voters": "röstande",
324
+ "votes": "röster",
325
+ "closed": "Omröstning stängd",
326
+ "endsAt": "Slutar"
327
+ },
328
+ "federation": {
329
+ "deleteSuccess": "Raderingsaktivitet skickad till följare",
330
+ "deleteButton": "Radera från fediverse"
331
+ },
332
+ "federationMgmt": {
333
+ "title": "Federation",
334
+ "collections": "Samlingshälsa",
335
+ "quickActions": "Snabbåtgärder",
336
+ "broadcastActor": "Sänd aktörsuppdatering",
337
+ "debugDashboard": "Felsökningspanel",
338
+ "objectLookup": "Objektsökning",
339
+ "lookupPlaceholder": "URL eller @användare@domän-handtag…",
340
+ "lookup": "Slå upp",
341
+ "lookupLoading": "Löser…",
342
+ "postActions": "Inläggsfederation",
343
+ "viewJson": "JSON",
344
+ "rebroadcast": "Återsänd Create-aktivitet",
345
+ "rebroadcastShort": "Skicka igen",
346
+ "broadcastDelete": "Sänd Delete-aktivitet",
347
+ "deleteShort": "Radera",
348
+ "noPosts": "Inga inlägg hittades.",
349
+ "apJsonTitle": "ActivityStreams JSON-LD",
350
+ "recentActivity": "Senaste aktivitet",
351
+ "viewAllActivities": "Visa alla aktiviteter →"
352
+ },
353
+ "reports": {
354
+ "sentReport": "lämnade in en rapport",
355
+ "title": "Rapporter"
356
+ }
357
+ }
358
+ }
@@ -0,0 +1,358 @@
1
+ {
2
+ "activitypub": {
3
+ "title": "ActivityPub",
4
+ "followers": "关注者",
5
+ "following": "正在关注",
6
+ "activities": "活动日志",
7
+ "featured": "置顶帖子",
8
+ "featuredTags": "精选标签",
9
+ "recentActivity": "最近活动",
10
+ "noActivity": "暂无活动。当你的行为者完成联邦后,互动将显示在此处。",
11
+ "noFollowers": "暂无关注者。",
12
+ "noFollowing": "尚未关注任何人。",
13
+ "pendingFollows": "待处理",
14
+ "noPendingFollows": "没有待处理的关注请求。",
15
+ "approve": "批准",
16
+ "reject": "拒绝",
17
+ "followApproved": "关注请求已批准。",
18
+ "followRejected": "关注请求已拒绝。",
19
+ "followRequest": "请求关注你",
20
+ "followerCount": "%d 位关注者",
21
+ "followerCount_plural": "%d 位关注者",
22
+ "followingCount": "正在关注 %d 人",
23
+ "followedAt": "关注时间",
24
+ "source": "来源",
25
+ "sourceImport": "Mastodon 导入",
26
+ "sourceManual": "手动",
27
+ "sourceFederation": "联邦",
28
+ "sourceRefollowPending": "重新关注待处理",
29
+ "sourceRefollowFailed": "重新关注失败",
30
+ "direction": "方向",
31
+ "directionInbound": "已接收",
32
+ "directionOutbound": "已发送",
33
+ "profile": {
34
+ "title": "个人资料",
35
+ "intro": "编辑你的行为者在其他联邦宇宙用户面前的显示方式。更改会立即生效。",
36
+ "nameLabel": "显示名称",
37
+ "nameHint": "你在联邦宇宙个人资料上显示的名称",
38
+ "summaryLabel": "个人简介",
39
+ "summaryHint": "关于你自己的简短描述。允许使用 HTML。",
40
+ "urlLabel": "网站 URL",
41
+ "urlHint": "你的网站地址,在个人资料上显示为链接",
42
+ "iconLabel": "头像 URL",
43
+ "iconHint": "你的个人头像 URL(方形,建议至少 400x400 像素)",
44
+ "imageLabel": "横幅图片 URL",
45
+ "imageHint": "显示在个人资料顶部的横幅图片 URL",
46
+ "manualApprovalLabel": "手动批准关注者",
47
+ "manualApprovalHint": "启用后,关注请求需要你的批准才能生效",
48
+ "actorTypeLabel": "行为者类型",
49
+ "actorTypeHint": "你的账户在联邦宇宙中的显示方式。个人用 Person,机器人或自动化账户用 Service,团体或公司用 Organization。",
50
+ "linksLabel": "个人资料链接",
51
+ "linksHint": "显示在你联邦宇宙个人资料上的链接。添加你的网站、社交账户或其他 URL。使用 rel=\"me\" 回链的页面将在 Mastodon 上显示为已验证。",
52
+ "linkNameLabel": "标签",
53
+ "linkValueLabel": "URL",
54
+ "addLink": "添加链接",
55
+ "removeLink": "移除",
56
+ "authorizedFetchLabel": "要求授权获取(安全模式)",
57
+ "authorizedFetchHint": "启用后,只有具有有效 HTTP 签名的服务器才能获取你的行为者和集合。这可以提高隐私性,但可能降低与某些客户端的兼容性。",
58
+ "save": "保存个人资料",
59
+ "saved": "个人资料已保存。更改现在在联邦宇宙中可见。",
60
+ "public": {
61
+ "followPrompt": "在联邦宇宙关注我",
62
+ "copyHandle": "复制标识",
63
+ "copied": "已复制!",
64
+ "pinnedPosts": "置顶帖子",
65
+ "recentPosts": "最近帖子",
66
+ "joinedDate": "加入时间",
67
+ "posts": "帖子",
68
+ "followers": "关注者",
69
+ "following": "正在关注",
70
+ "viewOnSite": "在网站上查看"
71
+ },
72
+ "remote": {
73
+ "follow": "关注",
74
+ "unfollow": "取消关注",
75
+ "viewOn": "查看于",
76
+ "postsTitle": "帖子",
77
+ "noPosts": "此账户暂无帖子。",
78
+ "followToSee": "关注此账户以在你的时间线中查看他们的帖子。",
79
+ "notFound": "无法找到此账户。它可能已被删除或服务器不可用。"
80
+ }
81
+ },
82
+ "migrate": {
83
+ "title": "Mastodon 迁移",
84
+ "intro": "本指南将引导你将 Mastodon 身份迁移到你的 IndieWeb 网站。按顺序完成每个步骤——你现有的关注者将收到通知,并可以自动重新关注你。",
85
+ "step1Title": "步骤 1 — 关联你的旧账户",
86
+ "step1Desc": "告诉联邦宇宙你的旧 Mastodon 账户和本网站属于同一个人。这会在你的 ActivityPub 行为者上设置 <code>alsoKnownAs</code> 属性,Mastodon 在允许迁移前会检查此属性。",
87
+ "aliasLabel": "旧 Mastodon 账户 URL",
88
+ "aliasHint": "你的 Mastodon 个人资料的完整 URL,例如 https://mstdn.social/users/rmdes",
89
+ "aliasSave": "保存别名",
90
+ "aliasCurrent": "当前别名",
91
+ "aliasNone": "尚未配置别名。",
92
+ "step2Title": "步骤 2 — 导入你的社交网络",
93
+ "step2Desc": "上传你 Mastodon 数据导出中的 CSV 文件以导入你的社交关系。前往你的 Mastodon 实例 → 首选项 → 导入和导出 → 数据导出来下载它们。",
94
+ "importLegend": "要导入的内容",
95
+ "fileLabel": "CSV 文件",
96
+ "fileHint": "选择你 Mastodon 数据导出中的 CSV 文件(例如 following_accounts.csv 或 followers.csv)",
97
+ "importButton": "导入",
98
+ "importFollowing": "关注列表",
99
+ "importFollowingHint": "你关注的账户——它们将立即出现在你的关注列表中",
100
+ "importFollowers": "关注者列表",
101
+ "importFollowersHint": "你当前的关注者——在步骤 3 迁移后他们重新关注你之前,将被记录为待处理状态",
102
+ "step3Title": "步骤 3 — 迁移你的账户",
103
+ "step3Desc": "保存别名并导入数据后,前往你的 Mastodon 实例 → 首选项 → 账户 → <strong>迁移到另一个账户</strong>。输入你的新联邦宇宙标识并确认。Mastodon 将通知你所有的关注者,支持此功能的服务器上的关注者将自动在此处重新关注你。此步骤不可逆——你的旧账户将变为重定向。",
104
+ "errorNoFile": "请在导入前选择一个 CSV 文件。",
105
+ "success": "已导入 %d 个关注、%d 个关注者(%d 个失败)。",
106
+ "failedList": "无法解析:%s",
107
+ "failedListSummary": "失败的标识",
108
+ "aliasSuccess": "别名已保存——你的行为者文档现在包含此账户作为 alsoKnownAs。"
109
+ },
110
+ "refollow": {
111
+ "title": "批量重新关注",
112
+ "progress": "重新关注进度",
113
+ "remaining": "剩余",
114
+ "awaitingAccept": "等待接受",
115
+ "accepted": "已接受",
116
+ "failed": "失败",
117
+ "pause": "暂停",
118
+ "resume": "继续",
119
+ "status": {
120
+ "idle": "空闲",
121
+ "running": "运行中",
122
+ "paused": "已暂停",
123
+ "completed": "已完成"
124
+ }
125
+ },
126
+ "moderation": {
127
+ "title": "内容审核",
128
+ "blockedTitle": "已屏蔽账户",
129
+ "mutedActorsTitle": "已静音账户",
130
+ "mutedKeywordsTitle": "已静音关键词",
131
+ "noBlocked": "没有已屏蔽的账户。",
132
+ "noMutedActors": "没有已静音的账户。",
133
+ "noMutedKeywords": "没有已静音的关键词。",
134
+ "unblock": "取消屏蔽",
135
+ "unmute": "取消静音",
136
+ "addKeywordTitle": "添加静音关键词",
137
+ "keywordPlaceholder": "输入关键词或短语…",
138
+ "addKeyword": "添加",
139
+ "muteActor": "静音",
140
+ "blockActor": "屏蔽",
141
+ "filterModeTitle": "过滤模式",
142
+ "filterModeHint": "选择如何处理时间线中的静音内容。已屏蔽的账户始终隐藏。",
143
+ "filterModeHide": "隐藏——从时间线中移除",
144
+ "filterModeWarn": "警告——在内容警告后显示",
145
+ "cwMutedAccount": "已静音账户",
146
+ "cwMutedKeyword": "已静音关键词:",
147
+ "cwFiltered": "已过滤内容"
148
+ },
149
+ "compose": {
150
+ "title": "撰写回复",
151
+ "placeholder": "写下你的回复…",
152
+ "syndicateLabel": "联合发布到",
153
+ "submitMicropub": "发布回复",
154
+ "cancel": "取消",
155
+ "errorEmpty": "回复内容不能为空",
156
+ "visibilityLabel": "可见性",
157
+ "visibilityPublic": "公开",
158
+ "visibilityUnlisted": "不列出",
159
+ "visibilityFollowers": "仅关注者",
160
+ "cwLabel": "内容警告",
161
+ "cwPlaceholder": "在此写下你的警告…"
162
+ },
163
+ "notifications": {
164
+ "title": "通知",
165
+ "empty": "暂无通知。来自其他联邦宇宙用户的互动将显示在此处。",
166
+ "liked": "赞了你的帖子",
167
+ "boostedPost": "转发了你的帖子",
168
+ "followedYou": "关注了你",
169
+ "repliedTo": "回复了你的帖子",
170
+ "mentionedYou": "提到了你",
171
+ "markAllRead": "全部标为已读",
172
+ "clearAll": "全部清除",
173
+ "clearConfirm": "删除所有通知?此操作无法撤销。",
174
+ "dismiss": "忽略",
175
+ "viewThread": "查看主题",
176
+ "tabs": {
177
+ "all": "全部",
178
+ "replies": "回复",
179
+ "likes": "赞",
180
+ "boosts": "转发",
181
+ "follows": "关注",
182
+ "dms": "私信",
183
+ "reports": "举报"
184
+ },
185
+ "emptyTab": "暂无%s通知。"
186
+ },
187
+ "messages": {
188
+ "title": "消息",
189
+ "empty": "暂无消息。来自其他联邦宇宙用户的私信将显示在此处。",
190
+ "allConversations": "所有对话",
191
+ "compose": "新消息",
192
+ "send": "发送消息",
193
+ "delete": "删除",
194
+ "markAllRead": "全部标为已读",
195
+ "clearAll": "全部清除",
196
+ "clearConfirm": "删除所有消息?此操作无法撤销。",
197
+ "recipientLabel": "收件人",
198
+ "recipientPlaceholder": "@用户@实例.social",
199
+ "placeholder": "写下你的消息...",
200
+ "sentTo": "收件人",
201
+ "replyingTo": "回复",
202
+ "sentYouDM": "向你发送了一条私信",
203
+ "viewMessage": "查看消息",
204
+ "errorEmpty": "消息内容不能为空。",
205
+ "errorNoRecipient": "请输入收件人。",
206
+ "errorRecipientNotFound": "无法找到该用户。请尝试完整的 @用户@域名 标识。"
207
+ },
208
+ "reader": {
209
+ "title": "阅读器",
210
+ "tabs": {
211
+ "all": "全部",
212
+ "notes": "短文",
213
+ "articles": "文章",
214
+ "replies": "回复",
215
+ "boosts": "转发",
216
+ "media": "媒体"
217
+ },
218
+ "empty": "你的时间线为空。关注一些账户以在此查看他们的帖子。",
219
+ "boosted": "转发了",
220
+ "replyingTo": "回复",
221
+ "showContent": "显示内容",
222
+ "hideContent": "隐藏内容",
223
+ "sensitiveContent": "敏感内容",
224
+ "videoNotSupported": "你的浏览器不支持视频元素。",
225
+ "audioNotSupported": "你的浏览器不支持音频元素。",
226
+ "actions": {
227
+ "reply": "回复",
228
+ "boost": "转发",
229
+ "unboost": "取消转发",
230
+ "like": "赞",
231
+ "unlike": "取消赞",
232
+ "viewOriginal": "查看原文",
233
+ "liked": "已赞",
234
+ "boosted": "已转发",
235
+ "likeError": "无法赞此帖子",
236
+ "boostError": "无法转发此帖子"
237
+ },
238
+ "post": {
239
+ "title": "帖子详情",
240
+ "notFound": "帖子未找到或不再可用。",
241
+ "openExternal": "在原始实例上打开",
242
+ "parentPosts": "主题",
243
+ "replies": "回复",
244
+ "back": "返回时间线",
245
+ "loadingThread": "正在加载主题...",
246
+ "threadError": "无法加载完整主题"
247
+ },
248
+ "resolve": {
249
+ "placeholder": "粘贴一个联邦宇宙 URL 或 @用户@域名 标识…",
250
+ "label": "查找联邦宇宙帖子或账户",
251
+ "button": "查找",
252
+ "notFoundTitle": "未找到",
253
+ "notFound": "无法找到此帖子或账户。URL 可能无效,服务器可能不可用,或内容可能已被删除。",
254
+ "followersLabel": "关注者"
255
+ },
256
+ "linkPreview": {
257
+ "label": "链接预览"
258
+ },
259
+ "explore": {
260
+ "title": "探索",
261
+ "description": "浏览来自兼容 Mastodon 的远程实例的公共时间线。",
262
+ "instancePlaceholder": "输入实例主机名,例如 mastodon.social",
263
+ "browse": "浏览",
264
+ "local": "本地",
265
+ "federated": "联邦",
266
+ "loadError": "无法加载此实例的时间线。它可能不可用或不支持 Mastodon API。",
267
+ "timeout": "请求超时。该实例可能较慢或不可用。",
268
+ "noResults": "此实例的公共时间线上未找到帖子。",
269
+ "invalidInstance": "无效的实例主机名。请输入有效的域名。",
270
+ "mauLabel": "MAU",
271
+ "timelineSupported": "公共时间线可用",
272
+ "timelineUnsupported": "公共时间线不可用",
273
+ "hashtagLabel": "标签(可选)",
274
+ "hashtagPlaceholder": "例如 indieweb",
275
+ "hashtagHint": "按特定标签筛选结果",
276
+ "tabs": {
277
+ "label": "探索选项卡",
278
+ "search": "搜索",
279
+ "pinAsTab": "固定为选项卡",
280
+ "pinned": "已固定",
281
+ "remove": "移除选项卡",
282
+ "moveUp": "上移",
283
+ "moveDown": "下移",
284
+ "addHashtag": "添加标签选项卡",
285
+ "hashtagTabPlaceholder": "输入标签",
286
+ "addTab": "添加",
287
+ "retry": "重试",
288
+ "noInstances": "先固定一些实例以使用标签选项卡。",
289
+ "sources": "正在 %d 个实例上搜索 #%s",
290
+ "sources_plural": "正在 %d 个实例上搜索 #%s",
291
+ "sourcesPartial": "%d 个实例中有 %d 个已响应"
292
+ }
293
+ },
294
+ "tagTimeline": {
295
+ "postsTagged": "%d 条帖子",
296
+ "postsTagged_plural": "%d 条帖子",
297
+ "noPosts": "在你的时间线中未找到带有 #%s 的帖子。",
298
+ "followTag": "关注标签",
299
+ "unfollowTag": "取消关注标签",
300
+ "following": "正在关注"
301
+ },
302
+ "pagination": {
303
+ "newer": "← 更新的",
304
+ "older": "更早的 →",
305
+ "loadMore": "加载更多",
306
+ "loading": "加载中…",
307
+ "noMore": "你已经看完了所有内容。"
308
+ }
309
+ },
310
+ "myProfile": {
311
+ "title": "我的个人资料",
312
+ "posts": "帖子",
313
+ "editProfile": "编辑个人资料",
314
+ "empty": "这里还没有内容。",
315
+ "tabs": {
316
+ "posts": "帖子",
317
+ "replies": "回复",
318
+ "likes": "赞",
319
+ "boosts": "转发"
320
+ }
321
+ },
322
+ "poll": {
323
+ "voters": "投票者",
324
+ "votes": "票",
325
+ "closed": "投票已关闭",
326
+ "endsAt": "结束时间"
327
+ },
328
+ "federation": {
329
+ "deleteSuccess": "删除活动已发送给关注者",
330
+ "deleteButton": "从联邦宇宙删除"
331
+ },
332
+ "federationMgmt": {
333
+ "title": "联邦",
334
+ "collections": "集合状态",
335
+ "quickActions": "快捷操作",
336
+ "broadcastActor": "广播行为者更新",
337
+ "debugDashboard": "调试面板",
338
+ "objectLookup": "对象查找",
339
+ "lookupPlaceholder": "URL 或 @用户@域名 标识…",
340
+ "lookup": "查找",
341
+ "lookupLoading": "解析中…",
342
+ "postActions": "帖子联邦",
343
+ "viewJson": "JSON",
344
+ "rebroadcast": "重新广播 Create 活动",
345
+ "rebroadcastShort": "重新发送",
346
+ "broadcastDelete": "广播 Delete 活动",
347
+ "deleteShort": "删除",
348
+ "noPosts": "未找到帖子。",
349
+ "apJsonTitle": "ActivityStreams JSON-LD",
350
+ "recentActivity": "最近活动",
351
+ "viewAllActivities": "查看所有活动 →"
352
+ },
353
+ "reports": {
354
+ "sentReport": "提交了举报",
355
+ "title": "举报"
356
+ }
357
+ }
358
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rmdes/indiekit-endpoint-activitypub",
3
- "version": "3.6.6",
3
+ "version": "3.6.7",
4
4
  "description": "ActivityPub federation endpoint for Indiekit via Fedify. Adds full fediverse support: actor, inbox, outbox, followers, following, syndication, and Mastodon migration.",
5
5
  "keywords": [
6
6
  "indiekit",