From 11a7f725da5129fb430b2d99e05cd160a506cbb2 Mon Sep 17 00:00:00 2001 From: SerCom_KC Date: Mon, 25 Jun 2018 10:43:23 +0800 Subject: i18n: (zh-CN) #7823, #7828 (#7887) --- config/locales/simple_form.zh-CN.yml | 8 +++++++- config/locales/zh-CN.yml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'config') diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index f1947e961..ce990d692 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -10,8 +10,10 @@ zh-CN: display_name: 还能输入 %{count} 个字符 fields: 这将会在个人资料页上以表格的形式展示,最多 4 个项目 header: 文件大小限制 2MB,只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 700×335px + locale: 用户界面、电子邮件和推送通知中使用的语言 locked: 你需要手动审核所有关注请求 note: 还能输入 %{count} 个字符 + setting_default_language: 嘟文语言自动检测的结果有可能不准确(此设置仅影响你的嘟文) setting_hide_network: 你关注的人和关注你的人将不会在你的个人资料页上展示 setting_noindex: 此设置会影响到你的公开个人资料以及嘟文页面 setting_theme: 此设置会影响到所有已登录设备上 Mastodon 的显示样式 @@ -19,6 +21,8 @@ zh-CN: data: 请上传从其他 Mastodon 实例导出的 CSV 文件 sessions: otp: 输入你手机应用上生成的双重认证码,或者任意一个恢复代码: + user: + chosen_languages: 仅选中语言的嘟文会出现在公共时间轴上(全不选则显示所有语言的嘟文) labels: account: fields: @@ -28,6 +32,7 @@ zh-CN: autofollow: 让被邀请人关注你的帐户 avatar: 头像 bot: 这是一个机器人帐户 + chosen_languages: 语言过滤 confirm_new_password: 确认新密码 confirm_password: 确认密码 current_password: 当前密码 @@ -37,7 +42,7 @@ zh-CN: expires_in: 失效时间 fields: 个人资料附加信息 header: 个人资料页横幅图片 - locale: 语言 + locale: 界面语言 locked: 保护你的帐户(锁嘟) max_uses: 最大使用次数 new_password: 新密码 @@ -46,6 +51,7 @@ zh-CN: password: 密码 setting_auto_play_gif: 自动播放 GIF 动画 setting_boost_modal: 在转嘟前询问我 + setting_default_language: 发布语言 setting_default_privacy: 嘟文默认可见范围 setting_default_sensitive: 总是将我发送的媒体文件标记为敏感内容 setting_delete_modal: 在删除嘟文前询问我 diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 9abffa01a..1b741a7d6 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -663,6 +663,7 @@ zh-CN: disallowed_hashtags: one: 包含了一个禁止的话题标签:%{tags} other: 包含了这些禁止的话题标签:%{tags} + language_detection: 自动检测语言 open_in_web: 在站内打开 over_character_limit: 超过了 %{max} 字的限制 pin_errors: -- cgit From 349d0196b2f23a9a5118f22620617a6e58ed102b Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Mon, 25 Jun 2018 20:31:48 +0900 Subject: Weblate translations (2018-06-25) (#7890) * Translated using Weblate (Basque) Currently translated at 100.0% (623 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/ * Translated using Weblate (Galician) Currently translated at 100.0% (623 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/ * Translated using Weblate (Galician) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/ * Translated using Weblate (German) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/ * Translated using Weblate (German) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/ * Translated using Weblate (Persian) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fa/ * Translated using Weblate (Basque) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eu/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/zh_Hant/ * Translated using Weblate (Japanese) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/ * Translated using Weblate (German) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/ * Translated using Weblate (German) Currently translated at 99.6% (621 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (Slovak) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (Dutch) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Telugu) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/te/ * Translated using Weblate (Slovak) Currently translated at 96.6% (602 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Catalan) Currently translated at 99.8% (622 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/ * Translated using Weblate (Chinese (Hong Kong)) Currently translated at 99.1% (618 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/zh_Hant_HK/ * Translated using Weblate (Chinese (Hong Kong)) Currently translated at 99.6% (306 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/zh_Hant_HK/ * Translated using Weblate (Chinese (Hong Kong)) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/zh_Hant_HK/ * Translated using Weblate (Malay) Currently translated at 0.4% (3 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ms/ * Translated using Weblate (Occitan) Currently translated at 99.8% (622 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/oc/ Work in Progress * Translated using Weblate (French) Currently translated at 94.3% (67 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/ * Translated using Weblate (French) Currently translated at 94.3% (67 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/ * Translated using Weblate (French) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/ * Translated using Weblate (Slovak) Currently translated at 97.1% (605 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Dutch) Currently translated at 100.0% (623 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 36.2% (226 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 94.0% (586 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 99.3% (305 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 96.9% (604 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/zh_Hant/ * Translated using Weblate (Esperanto) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eo/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/zh_Hant/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 97.5% (608 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/zh_Hant/ * Translated using Weblate (Italian) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/it/ * Translated using Weblate (Italian) Currently translated at 84.4% (526 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/it/ * Translated using Weblate (Slovak) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/sk/ * Translated using Weblate (Slovak) Currently translated at 97.1% (605 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Slovak) Currently translated at 97.2% (606 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * yarn manage:translations && i18n-tasks normalize && i18n-tasks remove-unused --- app/javascript/mastodon/locales/ja.json | 2 +- app/javascript/mastodon/locales/nl.json | 4 +- app/javascript/mastodon/locales/sk.json | 8 +- app/javascript/mastodon/locales/te.json | 594 +++++++++++++-------------- app/javascript/mastodon/locales/zh-HK.json | 2 +- app/javascript/mastodon/locales/zh-TW.json | 236 +++++------ config/locales/ca.yml | 6 +- config/locales/de.yml | 1 + config/locales/devise.sk.yml | 2 +- config/locales/devise.zh-TW.yml | 40 +- config/locales/doorkeeper.sk.yml | 2 +- config/locales/doorkeeper.zh-TW.yml | 33 +- config/locales/eu.yml | 1 + config/locales/gl.yml | 1 + config/locales/it.yml | 2 +- config/locales/ms.yml | 7 +- config/locales/nl.yml | 6 +- config/locales/oc.yml | 22 + config/locales/simple_form.de.yml | 16 +- config/locales/simple_form.eo.yml | 8 +- config/locales/simple_form.eu.yml | 8 +- config/locales/simple_form.fa.yml | 8 +- config/locales/simple_form.fr.yml | 8 +- config/locales/simple_form.gl.yml | 8 +- config/locales/simple_form.it.yml | 8 +- config/locales/simple_form.sk.yml | 4 + config/locales/simple_form.zh-HK.yml | 10 +- config/locales/simple_form.zh-TW.yml | 91 +++-- config/locales/sk.yml | 10 +- config/locales/zh-HK.yml | 4 +- config/locales/zh-TW.yml | 636 ++++++++++++++++++++++++----- 31 files changed, 1184 insertions(+), 604 deletions(-) (limited to 'config') diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index b7613b87a..bb43df44e 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -116,7 +116,7 @@ "follow_request.reject": "拒否", "getting_started.developers": "開発", "getting_started.documentation": "ドキュメント", - "getting_started.find_friends": "Twitterでの友達を探す", + "getting_started.find_friends": "Twitterの友達を探す", "getting_started.heading": "スタート", "getting_started.invite": "招待", "getting_started.open_source_notice": "Mastodonはオープンソースソフトウェアです。誰でもGitHub({github})から開発に参加したり、問題を報告したりできます。", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 891e5b45b..a6cba4b47 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -170,12 +170,12 @@ "navigation_bar.edit_profile": "Profiel bewerken", "navigation_bar.favourites": "Favorieten", "navigation_bar.follow_requests": "Volgverzoeken", - "navigation_bar.info": "Uitgebreide informatie", + "navigation_bar.info": "Over deze server", "navigation_bar.keyboard_shortcuts": "Sneltoetsen", "navigation_bar.lists": "Lijsten", "navigation_bar.logout": "Afmelden", "navigation_bar.mutes": "Genegeerde gebruikers", - "navigation_bar.personal": "Personal", + "navigation_bar.personal": "Persoonlijk", "navigation_bar.pins": "Vastgezette toots", "navigation_bar.preferences": "Instellingen", "navigation_bar.public_timeline": "Globale tijdlijn", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index efe0a2f30..648e5c598 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -75,11 +75,11 @@ "compose_form.spoiler_placeholder": "Sem napíšte vaše varovanie", "confirmation_modal.cancel": "Zrušiť", "confirmations.block.confirm": "Blokovať", - "confirmations.block.message": "Ste si istý, že chcete blokovať {name}?", + "confirmations.block.message": "Si si istý, že chcete blokovať {name}?", "confirmations.delete.confirm": "Zmazať", - "confirmations.delete.message": "Naozaj chcete vymazať túto správu?", + "confirmations.delete.message": "Si si naozaj istá/ý, že chceš vymazať túto správu?", "confirmations.delete_list.confirm": "Vymazať", - "confirmations.delete_list.message": "Ste si istý/á, že chceťe navždy vymazať tento zoznam?", + "confirmations.delete_list.message": "Si si istý/á, že chceš navždy vymazať tento zoznam?", "confirmations.domain_block.confirm": "Skryť celú doménu", "confirmations.domain_block.message": "Si si naozaj istý, že chceš blokovať celú {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych používateľov, čo sa doporučuje. Neuvidíš obsah z tejto domény v žiadnej verejnej časovej osi, ani v oznámeniach. Tvoji následovníci pochádzajúci z tejto domény budú odstránení.", "confirmations.mute.confirm": "Ignoruj", @@ -119,7 +119,7 @@ "getting_started.find_friends": "Nájdi priateľov z Twitteru", "getting_started.heading": "Začni tu", "getting_started.invite": "Pozvať ľudí", - "getting_started.open_source_notice": "Mastodon má otvorený kód. Nahlásiť chyby, alebo prispieť môžeš na GitHube v {github}.", + "getting_started.open_source_notice": "Mastodon je softvér s otvoreným kódom. Nahlásiť chyby, alebo prispievať môžeš na GitHube v {github}.", "getting_started.security": "Zabezpečenie", "getting_started.terms": "Podmienky prevozu", "home.column_settings.advanced": "Pokročilé", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 74fe732e1..a89734ce6 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -1,309 +1,309 @@ { - "account.badges.bot": "Bot", - "account.block": "Block @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", - "account.direct": "Direct message @{name}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", - "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", - "account.follow": "Follow", - "account.followers": "Followers", - "account.follows": "Follows", - "account.follows_you": "Follows you", - "account.hide_reblogs": "Hide boosts from @{name}", - "account.media": "Media", - "account.mention": "Mention @{name}", - "account.moved_to": "{name} has moved to:", - "account.mute": "Mute @{name}", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", - "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", - "account.share": "Share @{name}'s profile", - "account.show_reblogs": "Show boosts from @{name}", - "account.unblock": "Unblock @{name}", - "account.unblock_domain": "Unhide {domain}", - "account.unfollow": "Unfollow", - "account.unmute": "Unmute @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", - "account.view_full_profile": "View full profile", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "boost_modal.combo": "You can press {combo} to skip this next time", - "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", - "column.favourites": "Favourites", - "column.follow_requests": "Follow requests", - "column.home": "Home", - "column.lists": "Lists", - "column.mutes": "Muted users", - "column.notifications": "Notifications", + "account.badges.bot": "బాట్", + "account.block": "@{name} ను బ్లాక్ చేయి", + "account.block_domain": "{domain} నుంచి అన్నీ దాచిపెట్టు", + "account.blocked": "బ్లాక్ అయినవి", + "account.direct": "@{name}కు నేరుగా సందేశం పంపు", + "account.disclaimer_full": "క్రింది సమాచారం వాడుకరి యొక్క ప్రొఫైల్ను అసంపూర్తిగా ప్రతిబింబించవచ్చు.", + "account.domain_blocked": "డొమైన్ దాచిపెట్టబడినది", + "account.edit_profile": "ప్రొఫైల్ని సవరించండి", + "account.follow": "అనుసరించు", + "account.followers": "అనుచరులు", + "account.follows": "అనుసరిస్తున్నవి", + "account.follows_you": "మిమ్మల్ని అనుసరిస్తున్నారు", + "account.hide_reblogs": "@{name} నుంచి బూస్ట్ లను దాచిపెట్టు", + "account.media": "మీడియా", + "account.mention": "@{name}ను ప్రస్తావించు", + "account.moved_to": "{name} ఇక్కడికి మారారు:", + "account.mute": "@{name}ను మ్యూట్ చెయ్యి", + "account.mute_notifications": "@{name}నుంచి ప్రకటనలను మ్యూట్ చెయ్యి", + "account.muted": "మ్యూట్ అయినవి", + "account.posts": "టూట్లు", + "account.posts_with_replies": "టూట్లు మరియు ప్రత్యుత్తరములు", + "account.report": "@{name}పై ఫిర్యాదుచేయు", + "account.requested": "ఆమోదం కోసం వేచి ఉంది. అభ్యర్థనను రద్దు చేయడానికి క్లిక్ చేయండి", + "account.share": "@{name} యొక్క ప్రొఫైల్ను పంచుకోండి", + "account.show_reblogs": "@{name}నుంచి బూస్ట్ లను చూపించు", + "account.unblock": "@{name}పై బ్లాక్ ను తొలగించు", + "account.unblock_domain": "{domain}ను దాచవద్దు", + "account.unfollow": "అనుసరించవద్దు", + "account.unmute": "@{name}పై మ్యూట్ ని తొలగించు", + "account.unmute_notifications": "@{name} నుంచి ప్రకటనలపై మ్యూట్ ని తొలగించు", + "account.view_full_profile": "పూర్తి ప్రొఫైల్ను చూడండి", + "alert.unexpected.message": "అనుకోని తప్పు జరిగినది.", + "alert.unexpected.title": "అయ్యో!", + "boost_modal.combo": "మీరు తదుపరిసారి దీనిని దాటవేయడానికి {combo} నొక్కవచ్చు", + "bundle_column_error.body": "ఈ భాగం లోడ్ అవుతున్నప్పుడు ఏదో తప్పు జరిగింది.", + "bundle_column_error.retry": "మళ్ళీ ప్రయత్నించండి", + "bundle_column_error.title": "నెట్వర్క్ లోపం", + "bundle_modal_error.close": "మూసివేయు", + "bundle_modal_error.message": "ఈ భాగం లోడ్ అవుతున్నప్పుడు ఏదో తప్పు జరిగింది.", + "bundle_modal_error.retry": "మళ్ళీ ప్రయత్నించండి", + "column.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు", + "column.community": "స్థానిక కాలక్రమం", + "column.direct": "ప్రత్యక్ష సందేశాలు", + "column.domain_blocks": "దాచిన డొమైన్లు", + "column.favourites": "ఇష్టపడినవి", + "column.follow_requests": "అనుసరించడానికి అభ్యర్ధనలు", + "column.home": "హోమ్", + "column.lists": "జాబితాలు", + "column.mutes": "మ్యూట్ చేయబడిన వినియోగదారులు", + "column.notifications": "ప్రకటనలు", "column.pins": "Pinned toot", - "column.public": "Federated timeline", - "column_back_button.label": "Back", - "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", - "column_subheading.settings": "Settings", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What is on your mind?", - "compose_form.publish": "Toot", + "column.public": "సమాఖ్య కాలక్రమం", + "column_back_button.label": "వెనక్కి", + "column_header.hide_settings": "అమర్పులను దాచిపెట్టు", + "column_header.moveLeft_settings": "నిలువు వరుసను ఎడమకి తరలించు", + "column_header.moveRight_settings": "నిలువు వరుసను కుడికి తరలించు", + "column_header.pin": "అతికించు", + "column_header.show_settings": "అమర్పులను చూపించు", + "column_header.unpin": "పీకివేయు", + "column_subheading.settings": "అమర్పులు", + "community.column_settings.media_only": "మీడియా మాత్రమే", + "compose_form.direct_message_warning": "ఈ టూట్ పేర్కొన్న వినియోగదారులకు మాత్రమే పంపబడుతుంది.", + "compose_form.direct_message_warning_learn_more": "మరింత తెలుసుకోండి", + "compose_form.hashtag_warning": "ఈ టూట్ అన్లిస్టెడ్ కాబట్టి ఏ హాష్ ట్యాగ్ క్రిందకూ రాదు. పబ్లిక్ టూట్ లను మాత్రమే హాష్ ట్యాగ్ ద్వారా శోధించవచ్చు.", + "compose_form.lock_disclaimer": "మీ ఖాతా {locked} చేయబడలేదు. ఎవరైనా మిమ్మల్ని అనుసరించి మీ అనుచరులకు-మాత్రమే పోస్ట్లను వీక్షించవచ్చు.", + "compose_form.lock_disclaimer.lock": "బిగించబడినది", + "compose_form.placeholder": "మీ మనస్సులో ఏమి ఉంది?", + "compose_form.publish": "టూట్", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.marked": "Media is marked as sensitive", - "compose_form.sensitive.unmarked": "Media is not marked as sensitive", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", - "compose_form.spoiler_placeholder": "Write your warning here", - "confirmation_modal.cancel": "Cancel", - "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", - "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", - "confirmations.domain_block.confirm": "Hide entire domain", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", - "confirmations.mute.confirm": "Mute", - "confirmations.mute.message": "Are you sure you want to mute {name}?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", - "emoji_button.activity": "Activity", - "emoji_button.custom": "Custom", - "emoji_button.flags": "Flags", - "emoji_button.food": "Food & Drink", - "emoji_button.label": "Insert emoji", - "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", - "emoji_button.objects": "Objects", - "emoji_button.people": "People", - "emoji_button.recent": "Frequently used", - "emoji_button.search": "Search...", - "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", - "empty_column.home.public_timeline": "the public timeline", - "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", - "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", - "follow_request.authorize": "Authorize", - "follow_request.reject": "Reject", - "getting_started.developers": "Developers", + "compose_form.sensitive.marked": "మీడియా సున్నితమైనదిగా గుర్తించబడింది", + "compose_form.sensitive.unmarked": "మీడియా సున్నితమైనదిగా గుర్తించబడలేదు", + "compose_form.spoiler.marked": "హెచ్చరిక వెనుక పాఠ్యం దాచబడింది", + "compose_form.spoiler.unmarked": "పాఠ్యం దాచబడలేదు", + "compose_form.spoiler_placeholder": "ఇక్కడ మీ హెచ్చరికను రాయండి", + "confirmation_modal.cancel": "రద్దు చెయ్యి", + "confirmations.block.confirm": "బ్లాక్ చేయి", + "confirmations.block.message": "మీరు ఖచ్చితంగా {name}ని బ్లాక్ చేయాలనుకుంటున్నారా?", + "confirmations.delete.confirm": "తొలగించు", + "confirmations.delete.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించాలనుకుంటున్నారా?", + "confirmations.delete_list.confirm": "తొలగించు", + "confirmations.delete_list.message": "మీరు ఖచ్చితంగా ఈ జాబితాను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", + "confirmations.domain_block.confirm": "మొత్తం డొమైన్ను దాచు", + "confirmations.domain_block.message": "మీరు నిజంగా నిజంగా మొత్తం {domain} ని బ్లాక్ చేయాలనుకుంటున్నారా? చాలా సందర్భాలలో కొన్ని లక్ష్యంగా ఉన్న బ్లాక్స్ లేదా మ్యూట్స్ సరిపోతాయి మరియు ఉత్తమమైనవి. మీరు ఆ డొమైన్ నుండి కంటెంట్ను ఏ ప్రజా కాలక్రమాలలో లేదా మీ నోటిఫికేషన్లలో చూడలేరు. ఆ డొమైన్ నుండి మీ అనుచరులు తీసివేయబడతారు.", + "confirmations.mute.confirm": "మ్యూట్ చేయి", + "confirmations.mute.message": "{name}ను మీరు ఖచ్చితంగా మ్యూట్ చేయాలనుకుంటున్నారా?", + "confirmations.redraft.confirm": "తొలగించు & తిరగరాయు", + "confirmations.redraft.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించి తిరగరాయాలనుకుంటున్నారా? మీరు అన్ని ప్రత్యుత్తరాలను, బూస్ట్ లను మరియు ఇష్టపడినవి కోల్పోతారు.", + "confirmations.unfollow.confirm": "అనుసరించవద్దు", + "confirmations.unfollow.message": "{name}ను మీరు ఖచ్చితంగా అనుసరించవద్దనుకుంటున్నారా?", + "embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.", + "embed.preview": "అది ఈ క్రింది విధంగా కనిపిస్తుంది:", + "emoji_button.activity": "కార్యకలాపాలు", + "emoji_button.custom": "అనుకూలీకరించిన", + "emoji_button.flags": "ఫ్లాగ్స్", + "emoji_button.food": "ఆహారం & పానీయం", + "emoji_button.label": "ఎమోజి చొప్పించు", + "emoji_button.nature": "ప్రకృతి", + "emoji_button.not_found": "ఎమోజీలు లేవు!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "వస్తువులు", + "emoji_button.people": "ప్రజలు", + "emoji_button.recent": "తరచుగా ఉపయోగించునవి", + "emoji_button.search": "వెదుకు...", + "emoji_button.search_results": "శోధన ఫలితాలు", + "emoji_button.symbols": "చిహ్నాలు", + "emoji_button.travel": "ప్రయాణం & ప్రదేశాలు", + "empty_column.community": "స్థానిక కాలక్రమం ఖాళీగా ఉంది. మొదలుపెట్టడానికి బహిరంగంగా ఏదో ఒకటి వ్రాయండి!", + "empty_column.direct": "మీకు ఇంకా ఏ ప్రత్యక్ష సందేశాలు లేవు. మీరు ఒకదాన్ని పంపినప్పుడు లేదా స్వీకరించినప్పుడు, అది ఇక్కడ చూపబడుతుంది.", + "empty_column.hashtag": "ఇంకా హాష్ ట్యాగ్లో ఏమీ లేదు.", + "empty_column.home": "మీ హోమ్ కాలక్రమం ఖాళీగా ఉంది! {Public} ను సందర్శించండి లేదా ఇతర వినియోగదారులను కలుసుకోవడానికి మరియు అన్వేషణ కోసం శోధనను ఉపయోగించండి.", + "empty_column.home.public_timeline": "ప్రజా కాలక్రమం", + "empty_column.list": "ఇంకా ఈ జాబితాలో ఏదీ లేదు. ఈ జాబితాలోని సభ్యులు కొత్త స్టేటస్ లను పోస్ట్ చేసినప్పుడు, అవి ఇక్కడ కనిపిస్తాయి.", + "empty_column.notifications": "మీకు ఇంకా ఏ నోటిఫికేషన్లు లేవు. సంభాషణను ప్రారంభించడానికి ఇతరులతో ప్రతిస్పందించండి.", + "empty_column.public": "ఇక్కడ ఏమీ లేదు! దీన్ని నింపడానికి బహిరంగంగా ఏదైనా వ్రాయండి, లేదా ఇతర దృష్టాంతాల్లోని వినియోగదారులను అనుసరించండి", + "follow_request.authorize": "అనుమతించు", + "follow_request.reject": "తిరస్కరించు", + "getting_started.developers": "డెవలపర్లు", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", - "getting_started.heading": "Getting started", - "getting_started.invite": "Invite people", - "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.security": "Security", - "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Advanced", - "home.column_settings.basic": "Basic", - "home.column_settings.filter_regex": "Filter out by regular expressions", - "home.column_settings.show_reblogs": "Show boosts", - "home.column_settings.show_replies": "Show replies", - "home.settings": "Column settings", - "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.boost": "to boost", - "keyboard_shortcuts.column": "to focus a status in one of the columns", - "keyboard_shortcuts.compose": "to focus the compose textarea", + "getting_started.find_friends": "ట్విట్టర్ నుండి స్నేహితులను కనుగొనండి", + "getting_started.heading": "మొదలుపెడదాం", + "getting_started.invite": "వ్యక్తులను ఆహ్వానించండి", + "getting_started.open_source_notice": "మాస్టొడొన్ ఓపెన్ సోర్స్ సాఫ్ట్వేర్. మీరు {github} వద్ద GitHub పై సమస్యలను నివేదించవచ్చు లేదా తోడ్పడచ్చు.", + "getting_started.security": "భద్రత", + "getting_started.terms": "సేవా నిబంధనలు", + "home.column_settings.advanced": "అధునాతన", + "home.column_settings.basic": "ప్రాథమిక", + "home.column_settings.filter_regex": "రెగ్యులర్ ఎక్స్ప్రెషన్ల ద్వారా ఫిల్టర్ చేయండి", + "home.column_settings.show_reblogs": "బూస్ట్ లను చూపించు", + "home.column_settings.show_replies": "ప్రత్యుత్తరాలను చూపించు", + "home.settings": "నిలువు వరుస అమర్పులు", + "keyboard_shortcuts.back": "వెనక్కి తిరిగి వెళ్ళడానికి", + "keyboard_shortcuts.boost": "బూస్ట్ చేయడానికి", + "keyboard_shortcuts.column": "నిలువు వరుసలలో ఒకదానిపై దృష్టి పెట్టడానికి", + "keyboard_shortcuts.compose": "కంపోజ్ టెక్స్ట్ఏరియా పై దృష్టి పెట్టడానికి", "keyboard_shortcuts.description": "Description", - "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.down": "జాబితాలో క్రిందికి వెళ్ళడానికి", "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.favourite": "to favourite", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toot": "to start a brand new toot", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", - "lightbox.close": "Close", - "lightbox.next": "Next", - "lightbox.previous": "Previous", - "lists.account.add": "Add to list", - "lists.account.remove": "Remove from list", - "lists.delete": "Delete list", - "lists.edit": "Edit list", - "lists.new.create": "Add list", - "lists.new.title_placeholder": "New list title", - "lists.search": "Search among people you follow", - "lists.subheading": "Your lists", - "loading_indicator.label": "Loading...", - "media_gallery.toggle_visible": "Toggle visibility", - "missing_indicator.label": "Not found", - "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "navigation_bar.blocks": "Blocked users", - "navigation_bar.community_timeline": "Local timeline", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Favourites", - "navigation_bar.follow_requests": "Follow requests", - "navigation_bar.info": "Extended information", - "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", - "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", - "navigation_bar.mutes": "Muted users", - "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned toots", - "navigation_bar.preferences": "Preferences", - "navigation_bar.public_timeline": "Federated timeline", - "navigation_bar.security": "Security", - "notification.favourite": "{name} favourited your status", - "notification.follow": "{name} followed you", - "notification.mention": "{name} mentioned you", - "notification.reblog": "{name} boosted your status", - "notifications.clear": "Clear notifications", - "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", - "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Favourites:", - "notifications.column_settings.follow": "New followers:", - "notifications.column_settings.mention": "Mentions:", - "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.push_meta": "This device", - "notifications.column_settings.reblog": "Boosts:", - "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", - "notifications.group": "{count} notifications", - "onboarding.done": "Done", - "onboarding.next": "Next", - "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", - "onboarding.page_four.home": "The home timeline shows posts from people you follow.", - "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", - "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.full_handle": "Your full handle", - "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", - "onboarding.page_one.welcome": "Welcome to Mastodon!", - "onboarding.page_six.admin": "Your instance's admin is {admin}.", - "onboarding.page_six.almost_done": "Almost done...", - "onboarding.page_six.appetoot": "Bon Appetoot!", - "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", - "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.", - "onboarding.page_six.guidelines": "community guidelines", - "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", - "onboarding.page_six.various_app": "mobile apps", - "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.", - "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.", - "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", - "onboarding.skip": "Skip", - "privacy.change": "Adjust status privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Post to public timelines", - "privacy.public.short": "Public", - "privacy.unlisted.long": "Do not show in public timelines", - "privacy.unlisted.short": "Unlisted", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "keyboard_shortcuts.favourite": "ఇష్టపడడానికి", + "keyboard_shortcuts.heading": "కీబోర్డ్ సత్వరమార్గాలు", + "keyboard_shortcuts.hotkey": "హాట్ కీ", + "keyboard_shortcuts.legend": "ఈ లెజెండ్ ప్రదర్శించడానికి", + "keyboard_shortcuts.mention": "రచయితను ప్రస్తావించడానికి", + "keyboard_shortcuts.reply": "ప్రత్యుత్తరం ఇవ్వడానికి", + "keyboard_shortcuts.search": "శోధనపై దృష్టి పెట్టండి", + "keyboard_shortcuts.toggle_hidden": "CW వెనుక ఉన్న పాఠ్యాన్ని చూపడానికి / దాచడానికి", + "keyboard_shortcuts.toot": "ఒక సరికొత్త టూట్ను ప్రారంభించడానికి", + "keyboard_shortcuts.unfocus": "పాఠ్యం వ్రాసే ఏరియా/శోధన పట్టిక నుండి బయటకు రావడానికి", + "keyboard_shortcuts.up": "జాబితాలో పైకి తరలించడానికి", + "lightbox.close": "మూసివేయు", + "lightbox.next": "తరువాత", + "lightbox.previous": "మునుపటి", + "lists.account.add": "జాబితాకు జోడించు", + "lists.account.remove": "జాబితా నుండి తొలగించు", + "lists.delete": "జాబితాను తొలగించు", + "lists.edit": "జాబితాను సవరించు", + "lists.new.create": "జాబితాను జోడించు", + "lists.new.title_placeholder": "కొత్త జాబితా శీర్షిక", + "lists.search": "మీరు అనుసరించే వ్యక్తులలో శోధించండి", + "lists.subheading": "మీ జాబితాలు", + "loading_indicator.label": "లోడ్ అవుతోంది...", + "media_gallery.toggle_visible": "దృశ్యమానతను టోగుల్ చేయండి", + "missing_indicator.label": "దొరకలేదు", + "missing_indicator.sublabel": "ఈ వనరు కనుగొనబడలేదు", + "mute_modal.hide_notifications": "ఈ వినియోగదారు నుండి నోటిఫికేషన్లను దాచాలా?", + "navigation_bar.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు", + "navigation_bar.community_timeline": "స్థానిక కాలక్రమం", + "navigation_bar.direct": "ప్రత్యక్ష సందేశాలు", + "navigation_bar.discover": "కనుగొను", + "navigation_bar.domain_blocks": "దాచిన డొమైన్లు", + "navigation_bar.edit_profile": "ప్రొఫైల్ని సవరించండి", + "navigation_bar.favourites": "ఇష్టపడినవి", + "navigation_bar.follow_requests": "అనుసరించడానికి అభ్యర్ధనలు", + "navigation_bar.info": "ఈ దృష్టాంతం గురించి", + "navigation_bar.keyboard_shortcuts": "హాట్ కీలు", + "navigation_bar.lists": "జాబితాలు", + "navigation_bar.logout": "లాగ్ అవుట్ చేయండి", + "navigation_bar.mutes": "మ్యూట్ చేయబడిన వినియోగదారులు", + "navigation_bar.personal": "వ్యక్తిగతం", + "navigation_bar.pins": "అతికించిన టూట్లు", + "navigation_bar.preferences": "ప్రాధాన్యతలు", + "navigation_bar.public_timeline": "సమాఖ్య కాలక్రమం", + "navigation_bar.security": "భద్రత", + "notification.favourite": "{name} మీ స్టేటస్ ను ఇష్టపడ్డారు", + "notification.follow": "{name} మిమ్మల్ని అనుసరిస్తున్నారు", + "notification.mention": "{name} మిమ్మల్ని ప్రస్తావించారు", + "notification.reblog": "{name} మీ స్టేటస్ ను బూస్ట్ చేసారు", + "notifications.clear": "ప్రకటనలను తుడిచివేయు", + "notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", + "notifications.column_settings.alert": "డెస్క్టాప్ నోటిఫికేషన్లు", + "notifications.column_settings.favourite": "ఇష్టపడినవి:", + "notifications.column_settings.follow": "క్రొత్త అనుచరులు:", + "notifications.column_settings.mention": "ప్రస్తావనలు:", + "notifications.column_settings.push": "పుష్ ప్రకటనలు", + "notifications.column_settings.push_meta": "ఈ పరికరం", + "notifications.column_settings.reblog": "బూస్ట్ లు:", + "notifications.column_settings.show": "నిలువు వరుసలో చూపు", + "notifications.column_settings.sound": "ధ్వనిని ప్లే చేయి", + "notifications.group": "{count} ప్రకటనలు", + "onboarding.done": "పూర్తయింది", + "onboarding.next": "తరువాత", + "onboarding.page_five.public_timelines": "స్థానిక కాలక్రమం {domain}లో ప్రతి ఒక్కరి నుండి పబ్లిక్ పోస్ట్లను చూపుతుంది. సమాఖ్య కాలక్రమం {డొమైన్} లోని వ్యక్తులు అనుసరించే ప్రతి ఒక్కరి నుండి పబ్లిక్ పోస్ట్లను చూపుతుంది. ఈ పబ్లిక్ కాలక్రమాలు క్రొత్త వ్యక్తులను కనుగొనడానికి ఒక గొప్ప మార్గం.", + "onboarding.page_four.home": "హోమ్ కాలక్రమం మీరు అనుసరించే వ్యక్తుల నుండి పోస్ట్లను చూపిస్తుంది.", + "onboarding.page_four.notifications": "ఎవరైనా మీతో సంభాషించినప్పుడు నోటిఫికేషన్ల నిలువు వరుసలో కనిపిస్తుంది.", + "onboarding.page_one.federation": "మాస్టొడొన్ అనేది అనేక స్వతంత్ర సేవికల సమాహారం వలన ఏర్పడిన ఒక సోషల్ నెట్వర్క్. మేము ఈ సేవికలను దుష్టాంతాలని అంటాము.", + "onboarding.page_one.full_handle": "మీ పూర్తి హ్యాండిల్", + "onboarding.page_one.handle_hint": "మీరు మీ స్నేహితులకు శోధించమని చెప్పేది ఇదే.", + "onboarding.page_one.welcome": "మాస్తోడాన్ కు స్వాగతం!", + "onboarding.page_six.admin": "మీ దృష్టాంతం యొక్క నిర్వాహకులు {admin}.", + "onboarding.page_six.almost_done": "దాదాపుగా అయిపోయింది...", + "onboarding.page_six.appetoot": "బాన్ ఆప్పెటూట్!", + "onboarding.page_six.apps_available": "iOS, Android మరియు ఇతర ప్లాట్ఫారమ్లకు {apps} అందుబాటులో ఉన్నాయి.", + "onboarding.page_six.github": "మాస్టొడొన్ ఉచిత ఓపెన్ సోర్స్ సాఫ్ట్వేర్. మీరు దోషాలను నివేదించవచ్చు, ఫీచర్లను అభ్యర్థించవచ్చు లేదా {github} లో కోడ్కు దోహదం చేయవచ్చు.", + "onboarding.page_six.guidelines": "సంఘం మార్గదర్శకాలు", + "onboarding.page_six.read_guidelines": "దయచేసి {domain} యొక్క {guidelines} చదవండి!", + "onboarding.page_six.various_app": "మొబైల్ అనువర్తనాలు", + "onboarding.page_three.profile": "మీ అవతార్, బయో, ప్రదర్శన పేరు మార్చడానికి మీ ప్రొఫైల్ను సవరించండి. అక్కడ, మీరు ఇతర ప్రాధాన్యతలను కూడా కనుగొంటారు.", + "onboarding.page_three.search": "వ్యక్తులను కనుగొనడానికి లేదా {illustration} మరియు {introductions} వంటి హ్యాష్ట్యాగ్లను చూడటానికి శోధన పట్టీని ఉపయోగించండి. ఈ దుష్టాంతంలో లేని ఒక వ్యక్తి కోసం శోధించేందుకు, వారి పూర్తి హ్యాండిల్ను ఉపయోగించండి.", + "onboarding.page_two.compose": "కంపోజ్ నిలువు వరుస నుండి పోస్ట్లను వ్రాయండి. మీరు చిత్రాలను అప్లోడ్ చెయ్యవచ్చు, గోప్యతా సెట్టింగ్లను మార్చవచ్చు మరియు దిగువ చిహ్నాలతో కంటెంట్ హెచ్చరికలను జోడించవచ్చు.", + "onboarding.skip": "దాటవేయి", + "privacy.change": "స్టేటస్ గోప్యతను సర్దుబాటు చేయండి", + "privacy.direct.long": "పేర్కొన్న వినియోగదారులకు మాత్రమే పోస్ట్ చేయి", + "privacy.direct.short": "ప్రత్యక్ష", + "privacy.private.long": "అనుచరులకు మాత్రమే పోస్ట్ చేయి", + "privacy.private.short": "అనుచరులకు మాత్రమే", + "privacy.public.long": "ప్రజా కాలక్రమాలకు పోస్ట్ చేయండి", + "privacy.public.short": "ప్రజా", + "privacy.unlisted.long": "ప్రజా కాలక్రమాలలో చూపించవద్దు", + "privacy.unlisted.short": "జాబితా చేయబడనిది", + "regeneration_indicator.label": "లోడ్ అవుతోంది…", + "regeneration_indicator.sublabel": "మీ హోమ్ ఫీడ్ సిద్ధమవుతోంది!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", - "relative_time.just_now": "now", + "relative_time.just_now": "ఇప్పుడు", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Cancel", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", - "report.placeholder": "Additional comments", - "report.submit": "Submit", - "report.target": "Report {target}", - "search.placeholder": "Search", - "search_popout.search_format": "Advanced search format", - "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", - "search_results.accounts": "People", - "search_results.hashtags": "Hashtags", - "search_results.statuses": "Toots", + "reply_indicator.cancel": "రద్దు చెయ్యి", + "report.forward": "{target}కి ఫార్వార్డ్ చేయండి", + "report.forward_hint": "ఖాతా మరొక సర్వర్లో ఉంది. నివేదిక యొక్క ఒక అనామకంగా ఉన్న కాపీని అక్కడికి కూడా పంపించమంటారా?", + "report.hint": "మీ దుష్టాంత మోడరేటర్లకు నివేదిక పంపబడుతుంది. దిగువ ఈ ఖాతాను ఎందుకు నివేదిస్తున్నారనేదాని వివరణను మీరు అందించవచ్చు:", + "report.placeholder": "అదనపు వ్యాఖ్యలు", + "report.submit": "సమర్పించండి", + "report.target": "{target}పై ఫిర్యాదు చేయండి", + "search.placeholder": "శోధన", + "search_popout.search_format": "అధునాతన శోధన ఆకృతి", + "search_popout.tips.full_text": "సాధారణ వచనం మీరు వ్రాసిన, ఇష్టపడే, పెంచబడిన లేదా పేర్కొనబడిన, అలాగే యూజర్పేర్లు, ప్రదర్శన పేర్లు, మరియు హ్యాష్ట్యాగ్లను నమోదు చేసిన హోదాలను అందిస్తుంది.", + "search_popout.tips.hashtag": "హాష్ ట్యాగ్", + "search_popout.tips.status": "స్టేటస్", + "search_popout.tips.text": "సింపుల్ టెక్స్ట్ ప్రదర్శన పేర్లు, యూజర్ పేర్లు మరియు హ్యాష్ట్యాగ్లను సరిపోలుస్తుంది", + "search_popout.tips.user": "వాడుకరి", + "search_results.accounts": "వ్యక్తులు", + "search_results.hashtags": "హాష్ ట్యాగ్లు", + "search_results.statuses": "టూట్లు", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", - "standalone.public_title": "A look inside...", - "status.block": "Block @{name}", - "status.cancel_reblog_private": "Unboost", - "status.cannot_reblog": "This post cannot be boosted", - "status.delete": "Delete", - "status.direct": "Direct message @{name}", - "status.embed": "Embed", - "status.favourite": "Favourite", - "status.load_more": "Load more", - "status.media_hidden": "Media hidden", - "status.mention": "Mention @{name}", - "status.more": "More", - "status.mute": "Mute @{name}", - "status.mute_conversation": "Mute conversation", - "status.open": "Expand this status", - "status.pin": "Pin on profile", - "status.pinned": "Pinned toot", - "status.reblog": "Boost", - "status.reblog_private": "Boost to original audience", - "status.reblogged_by": "{name} boosted", - "status.redraft": "Delete & re-draft", - "status.reply": "Reply", - "status.replyAll": "Reply to thread", - "status.report": "Report @{name}", - "status.sensitive_toggle": "Click to view", - "status.sensitive_warning": "Sensitive content", - "status.share": "Share", - "status.show_less": "Show less", - "status.show_less_all": "Show less for all", - "status.show_more": "Show more", - "status.show_more_all": "Show more for all", - "status.unmute_conversation": "Unmute conversation", - "status.unpin": "Unpin from profile", - "tabs_bar.federated_timeline": "Federated", - "tabs_bar.home": "Home", - "tabs_bar.local_timeline": "Local", - "tabs_bar.notifications": "Notifications", - "tabs_bar.search": "Search", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", - "upload_area.title": "Drag & drop to upload", - "upload_button.label": "Add media", - "upload_form.description": "Describe for the visually impaired", - "upload_form.focus": "Crop", - "upload_form.undo": "Undo", - "upload_progress.label": "Uploading...", - "video.close": "Close video", - "video.exit_fullscreen": "Exit full screen", - "video.expand": "Expand video", - "video.fullscreen": "Full screen", - "video.hide": "Hide video", - "video.mute": "Mute sound", - "video.pause": "Pause", - "video.play": "Play", - "video.unmute": "Unmute sound" + "standalone.public_title": "లోపలికి ఒక చూపు...", + "status.block": "@{name} ను బ్లాక్ చేయి", + "status.cancel_reblog_private": "బూస్ట్ను తొలగించు", + "status.cannot_reblog": "ఈ పోస్ట్ను బూస్ట్ చేయడం సాధ్యం కాదు", + "status.delete": "తొలగించు", + "status.direct": "@{name}కు నేరుగా సందేశం పంపు", + "status.embed": "ఎంబెడ్", + "status.favourite": "ఇష్టపడు", + "status.load_more": "మరిన్ని లోడ్ చేయి", + "status.media_hidden": "మీడియా దాచబడింది", + "status.mention": "@{name}ను ప్రస్తావించు", + "status.more": "ఇంకొన్ని", + "status.mute": "@{name}ను మ్యూట్ చెయ్యి", + "status.mute_conversation": "సంభాషణను మ్యూట్ చెయ్యి", + "status.open": "ఈ స్టేటస్ ను విస్తరించు", + "status.pin": "ప్రొఫైల్లో అతికించు", + "status.pinned": "అతికించిన టూట్", + "status.reblog": "బూస్ట్", + "status.reblog_private": "అసలు ప్రేక్షకులకు బూస్ట్ చేయి", + "status.reblogged_by": "{name} బూస్ట్ చేసారు", + "status.redraft": "తొలగించు & తిరగరాయు", + "status.reply": "ప్రత్యుత్తరం", + "status.replyAll": "సంభాషణకు ప్రత్యుత్తరం ఇవ్వండి", + "status.report": "@{name}పై ఫిర్యాదుచేయు", + "status.sensitive_toggle": "వీక్షించడానికి క్లిక్ చేయండి", + "status.sensitive_warning": "సున్నితమైన కంటెంట్", + "status.share": "పంచుకోండి", + "status.show_less": "తక్కువ చూపించు", + "status.show_less_all": "అన్నిటికీ తక్కువ చూపించు", + "status.show_more": "ఇంకా చూపించు", + "status.show_more_all": "అన్నిటికీ ఇంకా చూపించు", + "status.unmute_conversation": "సంభాషణను అన్మ్యూట్ చేయి", + "status.unpin": "ప్రొఫైల్ నుండి పీకివేయు", + "tabs_bar.federated_timeline": "సమాఖ్య", + "tabs_bar.home": "హోమ్", + "tabs_bar.local_timeline": "స్థానిక", + "tabs_bar.notifications": "ప్రకటనలు", + "tabs_bar.search": "శోధన", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} మాట్లాడుతున్నారు", + "ui.beforeunload": "మీరు మాస్టొడొన్ను వదిలివేస్తే మీ డ్రాఫ్ట్లు పోతాయి.", + "upload_area.title": "అప్లోడ్ చేయడానికి డ్రాగ్ & డ్రాప్ చేయండి", + "upload_button.label": "మీడియాను జోడించండి", + "upload_form.description": "దృష్టి లోపమున్న వారి కోసం వివరించండి", + "upload_form.focus": "కత్తిరించు", + "upload_form.undo": "తొలగించు", + "upload_progress.label": "అప్లోడ్ అవుతోంది...", + "video.close": "వీడియోని మూసివేయి", + "video.exit_fullscreen": "పూర్తి స్క్రీన్ నుండి నిష్క్రమించు", + "video.expand": "వీడియోను విస్తరించండి", + "video.fullscreen": "పూర్తి స్క్రీన్", + "video.hide": "వీడియోను దాచు", + "video.mute": "ధ్వనిని మ్యూట్ చేయి", + "video.pause": "పాజ్ చేయి", + "video.play": "ప్లే చేయి", + "video.unmute": "ధ్వనిని అన్మ్యూట్ చేయి" } diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 90a6500ae..c65d8ed38 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -81,7 +81,7 @@ "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?", "confirmations.domain_block.confirm": "隱藏整個網站", - "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。", + "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。你從此將不會再看到該站的內容和通知。來自該站的關注者亦會被移除。", "confirmations.mute.confirm": "靜音", "confirmations.mute.message": "你確定要將{name}靜音嗎?", "confirmations.redraft.confirm": "Delete & redraft", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 1ba277e28..0eca30158 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -1,34 +1,34 @@ { - "account.badges.bot": "Bot", + "account.badges.bot": "機器人", "account.block": "封鎖 @{name}", "account.block_domain": "隱藏來自 {domain} 的一切貼文", "account.blocked": "已被封鎖的", - "account.direct": "給 @{name} 私人訊息", + "account.direct": "發送私訊給 @{name}", "account.disclaimer_full": "下列資料不一定完整。", - "account.domain_blocked": "域名隱藏", + "account.domain_blocked": "站點被隱藏", "account.edit_profile": "編輯使用者資訊", "account.follow": "關注", "account.followers": "關注者", - "account.follows": "正關注", + "account.follows": "正在關注", "account.follows_you": "關注你", "account.hide_reblogs": "隱藏來自 @{name} 的轉推", "account.media": "媒體", "account.mention": "提到 @{name}", "account.moved_to": "{name} 已經移至:", - "account.mute": "消音 @{name}", - "account.mute_notifications": "消音來自 @{name} 的通知", - "account.muted": "消音的", - "account.posts": "貼文", - "account.posts_with_replies": "貼文及回覆", + "account.mute": "靜音 @{name}", + "account.mute_notifications": "靜音來自 @{name} 的通知", + "account.muted": "靜音", + "account.posts": "嘟文", + "account.posts_with_replies": "嘟文與回覆", "account.report": "檢舉 @{name}", - "account.requested": "正在等待許可", - "account.share": "分享 @{name} 的用者資訊", - "account.show_reblogs": "Show boosts from @{name}", + "account.requested": "正在等待對方同意。點擊以取消發送關注請求", + "account.share": "分享 @{name} 的使用者資訊", + "account.show_reblogs": "顯示來自 @{name} 的嘟文", "account.unblock": "取消封鎖 @{name}", "account.unblock_domain": "不再隱藏 {domain}", "account.unfollow": "取消關注", - "account.unmute": "不再消音 @{name}", - "account.unmute_notifications": "不再對來自 @{name} 的通知消音", + "account.unmute": "不再靜音 @{name}", + "account.unmute_notifications": "不再對來自 @{name} 的通知靜音", "account.view_full_profile": "查看完整資訊", "alert.unexpected.message": "發生非預期的錯誤。", "alert.unexpected.title": "哎呀!", @@ -41,16 +41,16 @@ "bundle_modal_error.retry": "重試", "column.blocks": "封鎖的使用者", "column.community": "本地時間軸", - "column.direct": "Direct messages", - "column.domain_blocks": "隱藏域名", + "column.direct": "私訊", + "column.domain_blocks": "隱藏的站點", "column.favourites": "最愛", "column.follow_requests": "關注請求", - "column.home": "家", + "column.home": "主頁", "column.lists": "名單", - "column.mutes": "消音的使用者", + "column.mutes": "靜音的使用者", "column.notifications": "通知", - "column.pins": "置頂貼文", - "column.public": "聯盟時間軸", + "column.pins": "置頂嘟文", + "column.public": "其他站點時間軸", "column_back_button.label": "上一頁", "column_header.hide_settings": "隱藏設定", "column_header.moveLeft_settings": "將欄左移", @@ -59,9 +59,9 @@ "column_header.show_settings": "顯示設定", "column_header.unpin": "取下", "column_subheading.settings": "設定", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "此則推文只會被所有提到的使用者看見。", - "compose_form.direct_message_warning_learn_more": "Learn more", + "community.column_settings.media_only": "僅媒體", + "compose_form.direct_message_warning": "這條嘟文僅對有被提及的使用者才能看到。", + "compose_form.direct_message_warning_learn_more": "了解更多", "compose_form.hashtag_warning": "此則推文將不會在任何主題標籤中看見,只有公開的推文可以用主題標籤來搜尋。", "compose_form.lock_disclaimer": "你的帳號沒有{locked}。任何人都可以關注你,看到發給關注者的貼文。", "compose_form.lock_disclaimer.lock": "上鎖", @@ -81,11 +81,11 @@ "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "確定要永久性地刪除這個名單嗎?", "confirmations.domain_block.confirm": "隱藏整個網域", - "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或消音幾個特定目標就好。", + "confirmations.domain_block.message": "你真的確定要靜音所有來自 {domain} 的內容嗎? 多數情況下,封鎖或靜音幾個特定用戶應該就能滿足你的需求了。來自該站點的內容將不再出現在你的公共時間軸或通知裡。來自該站點的關注者將會被移除。", "confirmations.mute.confirm": "消音", "confirmations.mute.message": "你確定要消音 {name} ?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.redraft.confirm": "刪除 & 編輯", + "confirmations.redraft.message": "你確定要刪除這條嘟文並重新編輯它嗎? 所有相關的回覆、轉嘟與最愛都會被刪除。", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", "embed.instructions": "要內嵌此貼文,請將以下代碼貼進你的網站。", @@ -98,30 +98,30 @@ "emoji_button.nature": "自然", "emoji_button.not_found": "沒有表情符號吼!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "物件", - "emoji_button.people": "人", + "emoji_button.people": "使用者", "emoji_button.recent": "常用", "emoji_button.search": "搜尋…", "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊與地點", "empty_column.community": "本地時間軸是空的。公開寫點什麼吧!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.direct": "你還沒有使用過私訊。當你發出或著收到私訊時,它會在這裡顯示。", "empty_column.hashtag": "這個主題標籤下什麼都沒有。", "empty_column.home": "你還沒關注任何人。造訪{public}或利用搜尋功能找到其他用者。", "empty_column.home.public_timeline": "公開時間軸", "empty_column.list": "此份清單尚未有東西。當此清單的成員貼出了新的狀態時,它們就會出現在這裡。", "empty_column.notifications": "還沒有任何通知。和別的使用者互動來開始對話。", - "empty_column.public": "這裡什麼都沒有!公開寫些什麼,或是關注其他副本的使用者。", + "empty_column.public": "這裡什麼都沒有! 寫一些公開的嘟文,或著關注其他站點的使用者後,這裡就會有嘟文出現了", "follow_request.authorize": "授權", "follow_request.reject": "拒絕", - "getting_started.developers": "Developers", + "getting_started.developers": "開發", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "尋找 Twitter 好友", "getting_started.heading": "馬上開始", - "getting_started.invite": "Invite people", + "getting_started.invite": "邀請使用者", "getting_started.open_source_notice": "Mastodon 是開源軟體。你可以在 GitHub {github} 上做出貢獻或是回報問題。", - "getting_started.security": "Security", - "getting_started.terms": "Terms of service", + "getting_started.security": "登入資訊", + "getting_started.terms": "使用條款", "home.column_settings.advanced": "進階", "home.column_settings.basic": "基本", "home.column_settings.filter_regex": "以正規表示式過濾", @@ -130,22 +130,22 @@ "home.settings": "欄位設定", "keyboard_shortcuts.back": "回到上一個", "keyboard_shortcuts.boost": "到轉推", - "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.column": "選擇第 X 欄中的嘟文", "keyboard_shortcuts.compose": "焦點移至撰寫文字區塊", "keyboard_shortcuts.description": "描述", - "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.down": "在列表往下移動", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "收藏", "keyboard_shortcuts.heading": "鍵盤快速鍵", "keyboard_shortcuts.hotkey": "快速鍵", - "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.legend": "顯示這個說明", "keyboard_shortcuts.mention": "到提到的作者", "keyboard_shortcuts.reply": "到回應", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toot": "to start a brand new toot", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", + "keyboard_shortcuts.search": "把滑鼠移動到搜尋", + "keyboard_shortcuts.toggle_hidden": "顯示或隱藏被標為敏感的嘟文", + "keyboard_shortcuts.toot": "新的嘟文", + "keyboard_shortcuts.unfocus": "取消輸入", + "keyboard_shortcuts.up": "在列表往上移動", "lightbox.close": "關閉", "lightbox.next": "繼續", "lightbox.previous": "回退", @@ -164,26 +164,26 @@ "mute_modal.hide_notifications": "隱藏來自這個使用者的通知?", "navigation_bar.blocks": "封鎖的使用者", "navigation_bar.community_timeline": "本地時間軸", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "隱藏的域名", - "navigation_bar.edit_profile": "編輯用者資訊", + "navigation_bar.direct": "私訊", + "navigation_bar.discover": "探索", + "navigation_bar.domain_blocks": "隱藏的站點", + "navigation_bar.edit_profile": "編輯使用者資訊", "navigation_bar.favourites": "最愛", "navigation_bar.follow_requests": "關注請求", "navigation_bar.info": "關於本站", - "navigation_bar.keyboard_shortcuts": "快速鍵", + "navigation_bar.keyboard_shortcuts": "快捷鍵", "navigation_bar.lists": "名單", "navigation_bar.logout": "登出", - "navigation_bar.mutes": "消音的使用者", - "navigation_bar.personal": "Personal", - "navigation_bar.pins": "置頂貼文", + "navigation_bar.mutes": "靜音的使用者", + "navigation_bar.personal": "個人", + "navigation_bar.pins": "置頂嘟文", "navigation_bar.preferences": "偏好設定", - "navigation_bar.public_timeline": "聯盟時間軸", - "navigation_bar.security": "Security", - "notification.favourite": "{name}收藏了你的狀態", + "navigation_bar.public_timeline": "其他站點時間軸", + "navigation_bar.security": "登入資訊", + "notification.favourite": "{name}把你的嘟文加入了最愛", "notification.follow": "{name}關注了你", "notification.mention": "{name}提到了你", - "notification.reblog": "{name}推了你的狀態", + "notification.reblog": "{name}轉嘟了你的嘟文", "notifications.clear": "清除通知", "notifications.clear_confirmation": "確定要永久清除你的通知嗎?", "notifications.column_settings.alert": "桌面通知", @@ -192,118 +192,118 @@ "notifications.column_settings.mention": "提到:", "notifications.column_settings.push": "推送通知", "notifications.column_settings.push_meta": "這臺設備", - "notifications.column_settings.reblog": "轉推:", + "notifications.column_settings.reblog": "轉嘟:", "notifications.column_settings.show": "顯示在欄位中", "notifications.column_settings.sound": "播放音效", - "notifications.group": "{count} notifications", + "notifications.group": "{count} 條通知", "onboarding.done": "完成", "onboarding.next": "下一步", - "onboarding.page_five.public_timelines": "本地時間軸顯示 {domain} 上所有人的公開貼文。聯盟時間軸顯示 {domain} 上所有人關注的公開貼文。這就是公開時間軸,發現新朋友的好地方。", - "onboarding.page_four.home": "家時間軸顯示所有你關注的人的貼文。", + "onboarding.page_five.public_timelines": "本站時間軸顯示 {domain} 上所有的公開嘟文。其他站點時間軸顯示 {domain} 上所有人關注的公開嘟文。這就是公開時間軸,發現新朋友的好地方。", + "onboarding.page_four.home": "主頁時間軸顯示所有你關注的人的嘟文。", "onboarding.page_four.notifications": "通知欄顯示別人和你的互動。", - "onboarding.page_one.federation": "Mastodon 是由獨立的伺服器連結起來,形成的大社群網路。我們把這些伺服器稱為副本。", - "onboarding.page_one.full_handle": "Your full handle", - "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", + "onboarding.page_one.federation": "Mastodon 是由獨立的伺服器連結起來,形成的大社群網路。我們把這些伺服器稱為站點。", + "onboarding.page_one.full_handle": "你的完整帳戶名稱", + "onboarding.page_one.handle_hint": "你的朋友們可以從這個帳戶全名找到你。", "onboarding.page_one.welcome": "歡迎來到 Mastodon !", - "onboarding.page_six.admin": "你的副本的管理員是 {admin} 。", + "onboarding.page_six.admin": "你的站點的管理員是 {admin} 。", "onboarding.page_six.almost_done": "快好了…", - "onboarding.page_six.appetoot": "貼口大開!", + "onboarding.page_six.appetoot": "嗷嗚~!", "onboarding.page_six.apps_available": "在 iOS 、 Android 和其他平台上有這些 {apps} 可以用。", - "onboarding.page_six.github": "Mastodon 是自由的開源軟體。你可以在 {github} 上回報臭蟲、請求新功能或是做出貢獻。", + "onboarding.page_six.github": "Mastodon 是自由的開源軟體。你可以在 {github} 上回報問題、請求新功能或是做出貢獻。", "onboarding.page_six.guidelines": "社群指南", "onboarding.page_six.read_guidelines": "請閱讀 {domain} 的 {guidelines} !", "onboarding.page_six.various_app": "行動版應用程式", - "onboarding.page_three.profile": "編輯你的大頭貼、自傳和顯示名稱。你也可以在這邊找到其他設定。", - "onboarding.page_three.search": "利用搜尋列來找到其他人或是主題標籤,像是 {illustration} 或 {introductions} 。用完整的帳號名稱來找不在這個副本上的使用者。", + "onboarding.page_three.profile": "編輯你的頭貼、簡介與顯示名稱。你也可以在這邊找到其他設定。", + "onboarding.page_three.search": "利用搜尋列來找到其他人或是主題標籤,像是 {illustration} 或 {introductions} 。用完整的帳戶名稱來找其他站點上的使用者。", "onboarding.page_two.compose": "在編輯欄寫些什麼。可以上傳圖片、改變隱私設定或是用下面的圖示加上內容警告。", "onboarding.skip": "跳過", "privacy.change": "調整隱私狀態", - "privacy.direct.long": "只貼給提到的使用者", - "privacy.direct.short": "直接貼", - "privacy.private.long": "只貼給關注者", - "privacy.private.short": "關注貼", + "privacy.direct.long": "只有被提到的使用者能看到", + "privacy.direct.short": "私訊", + "privacy.private.long": "只有關注你的使用者能看到", + "privacy.private.short": "僅關注者", "privacy.public.long": "貼到公開時間軸", - "privacy.public.short": "公開貼", - "privacy.unlisted.long": "不要貼到公開時間軸", - "privacy.unlisted.short": "不列出來", + "privacy.public.short": "公開", + "privacy.unlisted.long": "公開,但不會顯示在公開時間軸", + "privacy.unlisted.short": "不公開", "regeneration_indicator.label": "載入中…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!", "relative_time.days": "{number} 天", - "relative_time.hours": "{number} 時", - "relative_time.just_now": "現在", + "relative_time.hours": "{number} 小時", + "relative_time.just_now": "剛剛", "relative_time.minutes": "{number} 分", "relative_time.seconds": "{number} 秒", "reply_indicator.cancel": "取消", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", + "report.forward": "轉寄到 {target}", + "report.forward_hint": "這個帳戶屬於其他站點。要像該站點發送匿名的檢舉訊息嗎?", + "report.hint": "這項訊息會發送到你該站點的管理員。你可以提供檢舉這個帳戶的理由:", "report.placeholder": "更多訊息", "report.submit": "送出", - "report.target": "通報中", + "report.target": "檢舉 {target}", "search.placeholder": "搜尋", "search_popout.search_format": "進階搜尋格式", - "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.full_text": "輸入簡單的文字,搜尋由你撰寫、最愛、轉嘟或提你的嘟文,以及符合使用者名稱、帳戶名稱和標籤。", "search_popout.tips.hashtag": "主題標籤", "search_popout.tips.status": "狀態", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳戶名稱與標籤", "search_popout.tips.user": "使用者", - "search_results.accounts": "人", + "search_results.accounts": "使用者", "search_results.hashtags": "主題標籤", - "search_results.statuses": "推文", + "search_results.statuses": "嘟文", "search_results.total": "{count, number} 項結果", "standalone.public_title": "站點一瞥…", "status.block": "封鎖 @{name}", - "status.cancel_reblog_private": "Unboost", - "status.cannot_reblog": "此貼文無法轉推", + "status.cancel_reblog_private": "取消轉嘟", + "status.cannot_reblog": "這篇嘟文無法被轉嘟", "status.delete": "刪除", - "status.direct": "Direct message @{name}", - "status.embed": "Embed", - "status.favourite": "收藏", + "status.direct": "發送私訊給 @{name}", + "status.embed": "嵌入", + "status.favourite": "最愛", "status.load_more": "載入更多", - "status.media_hidden": "媒體已隱藏", + "status.media_hidden": "隱藏媒體內容", "status.mention": "提到 @{name}", - "status.more": "More", - "status.mute": "Mute @{name}", - "status.mute_conversation": "消音對話", - "status.open": "展開這個狀態", + "status.more": "更多", + "status.mute": "靜音 @{name}", + "status.mute_conversation": "靜音對話", + "status.open": "展開嘟文", "status.pin": "置頂到個人資訊頁", - "status.pinned": "置頂的推文", - "status.reblog": "轉推", - "status.reblog_private": "Boost to original audience", - "status.reblogged_by": "{name} 轉推了", - "status.redraft": "Delete & re-draft", - "status.reply": "回應", - "status.replyAll": "回應這串", - "status.report": "通報 @{name}", - "status.sensitive_toggle": "點來看", + "status.pinned": "置頂嘟文", + "status.reblog": "轉嘟", + "status.reblog_private": "轉嘟給原有關注者", + "status.reblogged_by": "{name} 轉嘟了", + "status.redraft": "刪除 & 編輯", + "status.reply": "回覆", + "status.replyAll": "回覆所有人", + "status.report": "檢舉 @{name}", + "status.sensitive_toggle": "點擊顯示", "status.sensitive_warning": "敏感內容", "status.share": "分享", - "status.show_less": "看少點", - "status.show_less_all": "Show less for all", - "status.show_more": "看更多", - "status.show_more_all": "Show more for all", - "status.unmute_conversation": "不消音對話", + "status.show_less": "減少顯示", + "status.show_less_all": "減少顯示這類嘟文", + "status.show_more": "顯示更多", + "status.show_more_all": "顯示更多這類嘟文", + "status.unmute_conversation": "解除此對話的靜音", "status.unpin": "解除置頂", - "tabs_bar.federated_timeline": "聯盟", - "tabs_bar.home": "家", - "tabs_bar.local_timeline": "本地", + "tabs_bar.federated_timeline": "其他站點", + "tabs_bar.home": "主頁", + "tabs_bar.local_timeline": "本站", "tabs_bar.notifications": "通知", - "tabs_bar.search": "Search", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "tabs_bar.search": "搜尋", + "trends.count_by_accounts": "{count} 位使用者在討論", "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。", "upload_area.title": "拖放來上傳", - "upload_button.label": "增加媒體", - "upload_form.description": "爲視障者加上描述", + "upload_button.label": "上傳媒體檔案", + "upload_form.description": "為視障人士增加文字說明", "upload_form.focus": "裁切", - "upload_form.undo": "復原", + "upload_form.undo": "刪除", "upload_progress.label": "上傳中...", "video.close": "關閉影片", "video.exit_fullscreen": "退出全螢幕", "video.expand": "展開影片", "video.fullscreen": "全螢幕", "video.hide": "隱藏影片", - "video.mute": "消音", + "video.mute": "靜音", "video.pause": "暫停", "video.play": "播放", - "video.unmute": "解除消音" + "video.unmute": "解除靜音" } diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 3cd4281f0..41215c2ca 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -72,7 +72,7 @@ ca: title: Canviar adreça de correu de %{username} confirm: Confirma confirmed: Confirmat - confirming: Confirmando + confirming: Confirmant demote: Degrada disable: Inhabilita disable_two_factor_authentication: Desactiva 2FA @@ -81,7 +81,7 @@ ca: domain: Domini edit: Edita email: Correu electrònic - email_status: Estado del correo electrónico + email_status: Estat del correu electrònic enable: Habilita enabled: Habilitat feed_url: URL del canal @@ -122,7 +122,7 @@ ca: remove_avatar: Eliminar avatar resend_confirmation: already_confirmed: Este usuario ya está confirmado - send: Reenviar el correo electrónico de confirmación + send: Reenviar el correu electrònic de confirmació success: "¡Correo electrónico de confirmación enviado con éxito!" reset: Reinicialitza reset_password: Restableix la contrasenya diff --git a/config/locales/de.yml b/config/locales/de.yml index cd06ef0e6..1b9a02e5a 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -675,6 +675,7 @@ de: disallowed_hashtags: one: 'Enthält den unerlaubten Hashtag: %{tags}' other: 'Enthält die unerlaubten Hashtags: %{tags}' + language_detection: Sprache automatisch erkennen open_in_web: Im Web öffnen over_character_limit: Zeichenlimit von %{max} überschritten pin_errors: diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index 173622bc5..2872140d1 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -39,7 +39,7 @@ sk: title: Overiť emailovú adresu reset_password_instructions: action: Zmeniť heslo - explanation: Vyžiadal/a ste si nové heslo pre svoj účet. + explanation: Vyžiadal/a si si nové heslo pre svoj účet. extra: Pokiaľ si túto akciu nevyžiadal/a, prosím ignoruj tento email. Tvoje heslo nebude zmenené pokiaľ nepostúpiš na adresu uvedenú vyššie a vytvoríš si nové. subject: 'Mastodon: Inštrukcie pre obnovu hesla' title: Nastav nové heslo diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index 976e96be2..571429429 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -2,45 +2,45 @@ zh-TW: devise: confirmations: - confirmed: 您的電子郵件地址確認成功。 + confirmed: 您的 E-mail 驗證成功。 send_instructions: 您將會在幾分鐘內收到驗證信。 - send_paranoid_instructions: 如果您的電子信箱已經存在於我們的資料庫,您將會在幾分鐘內收到信,確認您電子信箱的指示。 + send_paranoid_instructions: 如果您的 E-mail 存在於我們的資料庫,將會在幾分鐘內收到驗證信。 failure: already_authenticated: 您已經登入了。 - inactive: 您的帳號尚未啟用。 + inactive: 您的帳戶尚未啟用。 invalid: 不正確的 %{authentication_keys} 或密碼。 - last_attempt: 若您再次嘗試失敗,我們將鎖定您的帳號,以策安全。 - locked: 您的帳號已被鎖定。 + last_attempt: 您剩下最後一次嘗試機會,如失敗將會進行帳戶鎖定。如有問題請洽詢站點管理員。 + locked: 您的帳戶已被鎖定。 not_found_in_database: 不正確的 %{authentication_keys} 或密碼。 timeout: 您的登入階段已經逾期,請重新登入以繼續使用。 unauthenticated: 您必須先登入或註冊,以繼續使用。 - unconfirmed: 您必須先完成信箱驗證,以繼續使用。 + unconfirmed: 您必須先完成 E-mail 驗證,以繼續使用。 mailer: confirmation_instructions: - action: 驗證電子郵件地址 - explanation: 您已經在 %{host} 上以此電子郵件地址建立了一個帳號。您距離啟用它只剩一次點擊之遙了。如果這不是你,請忽略此電子郵件。 - extra_html: 同時也請看看該實體的規則我們的服務條款。 + action: 驗證 E-mail 地址 + explanation: 您已經在 %{host} 上以此 E-mail 地址建立了一個帳號。您距離啟用它只剩一次點擊之遙了。如果這不是你,請忽略此 E-mail 。 + extra_html: 同時也請看看該站點的規則我們的服務條款。 subject: 'Mastodon: 信箱驗證' - title: 驗證電子郵件地址 + title: 驗證 E-mail 地址 email_changed: - explanation: 您帳號的電子郵件地址被變更為: - extra: 如果您並未變更您的電子郵件,那麼很有可能是某人取得了您帳號的存取權限。請立刻變更您的密碼,或是若您的帳號已被鎖定,請聯絡所使用實體的管理員。 - subject: Mastodon 電子郵件變更 - title: 新電子郵件地址 + explanation: 您帳號的 E-mail 地址被變更為: + extra: 如果您並未變更您的 E-mail ,那麼很有可能是某人取得了你帳號的存取權限。請立刻變更您的密碼,或是若您的帳號已被鎖定,請聯絡站點的管理員。 + subject: Mastodon E-mail 變更 + title: 新 E-mail 地址 password_change: explanation: 您帳號的密碼已變更。 - extra: 如果您並未變更您的密碼,那麼很有可能是某人取得了您帳號的存取權限。請立刻變更您的密碼,或是若您的帳號已被鎖定,請聯絡所使用實體的管理員。 + extra: 如果您並未變更您的密碼,那麼很有可能是某人取得了您帳號的存取權限。請立刻變更您的密碼,或是若您的帳號已被鎖定,請聯絡站點的管理員。 subject: 'Mastodon: 更改密碼' title: 密碼已變更 reconfirmation_instructions: - explanation: 確認新的電子郵件地址以變更您的電子郵件。 - extra: 若此次變更不是由您開啟的,請忽略這個電子郵件。Mastodon 帳號的電子郵件地址在您存取上面的連結前不會變更。 - subject: Mastodon:%{instance} 的確認電子郵件 - title: 驗證電子郵件地址 + explanation: 確認新的 E-mail 地址以變更您的 E-mail 。 + extra: 若此次變更不是由您開啟的,請忽略這個 E-mail 。Mastodon 帳號的 E-mail 地址在您存取上面的連結前不會變更。 + subject: Mastodon:%{instance} 的確認 E-mail + title: 驗證 E-mail 地址 reset_password_instructions: action: 變更密碼 explanation: 您為您的帳號請求了一個新密碼。 - extra: 若您並未請求這個,請忽略此電子郵件。您的密碼在您存取上面的連結並建立一個新的之前不會變更。 + extra: 若您並未請求這個,請忽略此 E-mail 。您的密碼在您存取上面的連結並建立一個新的之前不會變更。 subject: 'Mastodon: 重設密碼' title: 重設密碼 unlock_instructions: diff --git a/config/locales/doorkeeper.sk.yml b/config/locales/doorkeeper.sk.yml index b998d9c37..eb70a1762 100644 --- a/config/locales/doorkeeper.sk.yml +++ b/config/locales/doorkeeper.sk.yml @@ -68,7 +68,7 @@ sk: buttons: revoke: Zrušiť oprávnenie confirmations: - revoke: Ste si istý? + revoke: Si si istý? index: application: Aplikácia created_at: Autorizované diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml index 2aa271785..690fc4513 100644 --- a/config/locales/doorkeeper.zh-TW.yml +++ b/config/locales/doorkeeper.zh-TW.yml @@ -5,7 +5,7 @@ zh-TW: doorkeeper/application: name: 名稱 redirect_uri: 重新導向 URI - scopes: 範圍 + scopes: 權限範圍 website: 應用程式網頁 errors: models: @@ -29,9 +29,9 @@ zh-TW: edit: title: 編輯應用程式 form: - error: 噢!請檢查表單錯誤訊息 + error: 唉呦!請檢查表單錯誤訊息 help: - native_redirect_uri: 使用 %{native_redirect_uri} 作局部測試 + native_redirect_uri: 請使用 %{native_redirect_uri} 作測試 redirect_uri: 每行輸入一個 URI scopes: 請用半形空格分開權限範圍 (scope)。留空表示使用預設的權限範圍。 index: @@ -40,9 +40,9 @@ zh-TW: delete: 刪除 name: 名稱 new: 新增應用程式 - scopes: 範圍 + scopes: 權限範圍 show: 顯示 - title: 您的應用程式 + title: 你的應用程式 new: title: 新增應用程式 show: @@ -54,7 +54,7 @@ zh-TW: title: 應用程式︰ %{name} authorizations: buttons: - authorize: 允許 + authorize: 授權 deny: 拒絕 error: title: 發生錯誤 @@ -66,25 +66,25 @@ zh-TW: title: 複製此授權碼並貼上到應用程式中。 authorized_applications: buttons: - revoke: 取消授權 + revoke: 撤銷授權 confirmations: - revoke: 您確定要取消授權? + revoke: 您確定要撤銷這個授權? index: application: 應用程式 - created_at: 授權於 + created_at: 授權時間 date_format: "%Y-%m-%d %H:%M:%S" scopes: 權限範圍 - title: 已獲您授權的應用程式 + title: 已授權的應用程式 errors: messages: - access_denied: 資源擁有者或授權伺服器不接受請求。 + access_denied: 資源擁有者或認證伺服器不接受請求。 credential_flow_not_configured: 資源擁有者密碼認證程序失敗,由於 Doorkeeper.configure.resource_owner_from_credentials 沒有設定。 invalid_client: 客戶端驗證失敗,可能是未知的客戶端程式、未包含客戶端驗證、或使用了不支援的認證方法。 invalid_grant: 授權申請不正確、逾期、已被取消、與授權請求內的重新導向 URI 不符、或屬於別的客戶端程式。 invalid_redirect_uri: 不正確的重新導向網址。 invalid_request: 請求缺少必要的參數、包含不支援的參數、或其他輸入錯誤。 invalid_resource_owner: 資源擁有者的登入資訊錯誤、或無法找到該資源擁有者 - invalid_scope: 請求的權限範圍不正確、未有定義、或輸入錯誤。 + invalid_scope: 請求的權限範圍無效、未定義、或輸入錯誤。 invalid_token: expired: access token 已過期 revoked: access token 已被取消 @@ -93,8 +93,8 @@ zh-TW: server_error: 認證伺服器發生未知錯誤。 temporarily_unavailable: 認證伺服器暫時無法使用。 unauthorized_client: 客戶端程式無權使用此方法進行請求。 - unsupported_grant_type: 授權伺服器不支援這個授權類型。 - unsupported_response_type: 授權伺服器不支援這個回應類型。 + unsupported_grant_type: 認證伺服器不支援這個授權類型。 + unsupported_response_type: 認證伺服器不支援這個回應類型。 flash: applications: create: @@ -105,7 +105,7 @@ zh-TW: notice: 已更新應用程式。 authorized_applications: destroy: - notice: 已取消應用程式授權。 + notice: 已撤銷應用程式授權。 layouts: admin: nav: @@ -115,5 +115,6 @@ zh-TW: title: 需要 OAuth 授權 scopes: follow: 關注、封鎖、解除封鎖及取消關注帳號 + push: 接收你帳號的推送通知 read: 讀取您的帳號資料 - write: 以您的名義發佈文章 + write: 以您的名義發佈嘟文 diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 78cb82abe..e141f27ee 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -675,6 +675,7 @@ eu: disallowed_hashtags: one: 'debekatutako traola bat zuen: %{tags}' other: 'debekatutako traola hauek zituen: %{tags}' + language_detection: Antzeman hizkuntza automatikoki open_in_web: Ireki web-ean over_character_limit: "%{max}eko karaktere muga gaindituta" pin_errors: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 305d5b17f..f748505d2 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -675,6 +675,7 @@ gl: disallowed_hashtags: one: 'contiña unha etiqueta non permitida: %{tags}' other: 'contiña etiquetas non permitidas: %{tags}' + language_detection: Detección automática do idioma open_in_web: Abrir na web over_character_limit: Excedeu o límite de caracteres %{max} pin_errors: diff --git a/config/locales/it.yml b/config/locales/it.yml index cc79f352b..41f397feb 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -45,7 +45,7 @@ it: people_followed_by: Persone seguite da %{name} people_who_follow: Persone che seguono %{name} posts: Posts - posts_with_replies: Toot e repliche + posts_with_replies: Toot e risposte remote_follow: Segui da remoto reserved_username: Il nome utente è riservato roles: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 0967ef424..2eff09e1b 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1 +1,6 @@ -{} +--- +ms: + about: + about_this: Mengenai + administered_by: 'Ditadbir oleh:' + contact: Hubungi diff --git a/config/locales/nl.yml b/config/locales/nl.yml index d6d2183cf..d143367b6 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -330,8 +330,8 @@ nl: desc_html: Toestaan dat iedereen een account kan registereren title: Open registratie show_known_fediverse_at_about_page: - desc_html: Wanneer ingeschakeld wordt de globale tijdlijn als voorbeeld getoond en wanneer uitgeschakeld de lokale tijdljn. - title: De globale tijdlijn als voorbeeld tonen + desc_html: Wanneer ingeschakeld wordt de globale tijdlijn op de voorpagina getoond en wanneer uitgeschakeld de lokale tijdljn. + title: De globale tijdlijn op de voorpagina tonen show_staff_badge: desc_html: Medewerkersbadge op profielpagina tonen title: Medewerkersbadge tonen @@ -350,7 +350,7 @@ nl: title: Thumbnail Mastodonserver timeline_preview: desc_html: Toon een openbare tijdlijn op de voorpagina - title: Tijdlijn als voorbeeld tonen + title: Tijdlijn op de voorpagina tonen title: Server-instellingen statuses: back_to_account: Terug naar accountpagina diff --git a/config/locales/oc.yml b/config/locales/oc.yml index fdaecbbbf..b69a1e76f 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -755,6 +755,28 @@ oc: reblogged: a partejat sensitive_content: Contengut sensible terms: + body_html: | +

Politica de confidencialitat

+

Quinas informacions reculhèm ?

+ +
  • +
      Inforacions de basa del compte : se vos marcatz sus aqueste servidor, vos podèm demandar de picar un escais-nom, una adreça de corrièl e un senhal. Podètz tanben ajustar d’informacions de perfil addicionalas coma un nom de far veire, una biografia, un imatge de perfil e una banièra. L’escais-nom, lo nom d’afichatge, la biografia, l’imatge de perfil e la banièra son totjorn indicats per èsser vist publicament. +
    • Publicacions, abonaments e autras informacions publicas : La lista del monde que seguètz es visibla publicament, tot parièr per vòstres seguidors. Quand enviatz un messatge, la data e l’ora son gardats, l’aplicacion qu’avètz utilizada tanben. Los messatges pòdon conténer de mèdias juntats coma d’imatge e vidèos. Las publicacions publicas e pas listadas son disponiblas publicament. Quand penjatz una publicacion per vòstre perfil, aquò tanben es visible per tot lo monde. Vòstras publicacions son mandadas a vòstre seguidors, dins qualques cases aquò significa que passaràn per diferents servidors e seràn copiadas e gardadas sus aqueles servidors. Quand escafatz de publicacions, aquò es tanben mandat a vòstre seguidors. L’acion de partejar o d’ajustar als favorits una publicacion es totjorn quicòm de public.
    • +
    • Publicacions dirèctas e solament pels seguidors :
    • totas las publicacions son gardadas e tractadas pel servidor. Las publicacions pas que per vòstres seguidors son enviadas a vòstres seguidors e las personas mencionadas dedins, las publicacions dirèctas son pas qu’enviadas a las personas mencionadas. Dins qualques cases aquò significa que passaràn per diferents servidors, copiadas e gardadas sus eles. Ensagem de limitar l’accès a aquelas publicacions a monde autorizat, mas los demai servidors pòdon fracar a far parièr. A causa d’aquò es fòrça important de repassar los servidors d’apertenéncia de vòstres seguidors. Podètz activar una opcion per autorizar o regetar una demanda de seguiment dins los paramètres. Vos cal pas oblidar que’ls administrators dels servidors e dels servidors de recepcion pòdon veire aqueles messatges, e que’ls destinataris pòdon realizar de captura d’ecran, copiar e tornar partejar los messatges.Partegetz pas cap informacion perilhosa sus Mastodon
    • . +
    • Adreças IP e autras metadonadas : quand vos connectatz, enregistrem l’adreça IP qu’utilizatz per establir la connexion, e tanben lo nom de vòstre navigador. Totas las sessions de connexion son disponiblas per que las repassetz e tiretz dins los paramètres. Las darrièras adreças IP son salvagardas fins a 12 meses. Podèm tanben gardar de jornals d’audit del servidor que pòdon conténer las adreças IP de cada requèstas mandadas a nòstre servidor.
    • +
    + +
    + +

    Qué fasèm de vòstras informacions ?

    + +

    Totas las informacions que collectem de vos pòdon servir dins los cases seguents :

    + +
      +
    • Per provesir la foncionament màger de Mastodon. Podètz pas qu’interagir amb lo contengut del monde e de vòstras publicacions quand sètz connectat. Per exemple, avètz la possibilitat de sègre de monde per veire lors publicacions amassadas dins vòstre flux d’actualitat personalizat.
    • +
    • Per ajudar la moderacion de la comunitat, per exemple en comparant vòstra adreça IP amb d’autras per determinar d’ensages de contornament de bandiment e d’autras violéncias.
    • +
    • Per enviar periodicament de corrièls — Podèm utilizar l’adreça qu’avètz donada per vos enviar d’informacions e de notificacions que demandatz tocant de cambiaments dins los subjèctes del forum o en responsa a vòstre nom d’utilizaire, en responsa a una demanda, e/o tota autra question.
    • +
    title: Condicions d’utilizacion e politica de confidencialitat de %{instance} themes: contrast: Fòrt contrast diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 596d89d81..273103fd6 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -5,17 +5,19 @@ de: defaults: autofollow: Leute die sich über deine Einladung registrieren werden dir automatisch folgen avatar: PNG, GIF oder JPG. Maximal 2 MB. Wird auf 400×400 px herunterskaliert - bot: Dieser Account führt hauptsächlich automatische Aktionen aus und wird möglicherweise nicht überwacht + bot: Dieses Konto führt lediglich automatisierte Aktionen durch und wird möglicherweise nicht überwacht digest: Wenn du lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen in deiner Abwesenheit zugeschickt display_name: one: 1 Zeichen verbleibt other: %{count} Zeichen verbleiben fields: Du kannst bis zu 4 Elemente als Tabelle dargestellt auf deinem Profil anzeigen lassen header: PNG, GIF oder JPG. Maximal 2 MB. Wird auf 700×335 px herunterskaliert + locale: Die Sprache der Oberfläche, E-Mails und Push-Benachrichtigungen locked: Wer dir folgen möchte, muss um deine Erlaubnis bitten note: one: 1 Zeichen verbleibt other: %{count} Zeichen verbleiben + setting_default_language: Die Sprache der Beiträge kann automatisch erkannt werden, aber dies ist nicht immer genau setting_hide_network: Wem du folgst und wer dir folgt wird in deinem Profil nicht angezeigt setting_noindex: Betrifft dein öffentliches Profil und deine Beiträge setting_theme: Wirkt sich darauf aus, wie Mastodon aussieht, egal auf welchem Gerät du eingeloggt bist. @@ -23,6 +25,8 @@ de: data: CSV-Datei, die aus einer anderen Mastodon-Instanz exportiert wurde sessions: otp: 'Gib den Zwei-Faktor-Authentisierungscode von deinem Telefon ein oder benutze einen deiner Wiederherstellungscodes:' + user: + chosen_languages: Wenn dies aktiviert ist, dann werden nur Beiträge in den ausgewählten Sprachen auf der öffentlichen Timeline angezeigt labels: account: fields: @@ -32,6 +36,7 @@ de: autofollow: Einladen, um deinen Account zu folgen avatar: Profilbild bot: Dies ist ein bot Benutzer + chosen_languages: Sprachen filtern confirm_new_password: Neues Passwort bestätigen confirm_password: Passwort bestätigen current_password: Derzeitiges Passwort @@ -41,26 +46,27 @@ de: expires_in: Gültig bis fields: Profil-Metadaten header: Kopfbild - locale: Sprache + locale: Sprache der Benutzeroberfläche locked: Gesperrtes Profil - max_uses: Max Verwendungen + max_uses: Maximale Verwendungen new_password: Neues Passwort note: Über mich otp_attempt: Zwei-Faktor-Authentisierungs-Code password: Passwort setting_auto_play_gif: Animierte GIFs automatisch abspielen setting_boost_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag geteilt wird + setting_default_language: Beitragssprache setting_default_privacy: Beitragssichtbarkeit setting_default_sensitive: Medien immer als heikel markieren setting_delete_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag gelöscht wird setting_display_sensitive_media: Medien, die als heikel markiert sind, immer anzeigen - setting_hide_network: Verstecke dein Netzwerk + setting_hide_network: Blende dein Netzwerk aus setting_noindex: Suchmaschinen-Indexierung verhindern setting_reduce_motion: Bewegung in Animationen verringern setting_system_font_ui: Standardschriftart des Systems verwenden setting_theme: Theme der Website setting_unfollow_modal: Bestätigungsdialog anzeigen, bevor jemand entfolgt wird - severity: Gewichtung + severity: Schweregrad type: Importtyp username: Profilname username_or_email: Profilname oder Email diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 884c3a989..0d0a717b8 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -12,10 +12,12 @@ eo: other: %{count} signoj restas fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo header: Formato PNG, GIF aŭ JPG. Ĝis 2MB. Estos malgrandigita al 700x335px + locale: La lingvo de la uzant-interfaco, retmesaĝoj kaj puŝ-sciigoj locked: Vi devos aprobi ĉiun peton de sekvado mane note: one: 1 signo restas other: %{count} signoj restas + setting_default_language: La lingvo de viaj mesaĝoj povas esti aŭtomate detektitaj, sed tio ne ĉiam ĝustas setting_hide_network: Tiuj, kiujn vi sekvas, kaj tiuj, kiuj sekvas vin ne estos videblaj en via profilo setting_noindex: Influas vian publikan profilon kaj mesaĝajn paĝojn setting_theme: Influas kiel Mastodon aspektas post ensaluto de ajna aparato. @@ -23,6 +25,8 @@ eo: data: CSV-dosiero el alia nodo de Mastodon sessions: otp: 'Enmetu la kodon de dufaktora aŭtentigo el via telefono aŭ uzu unu el viaj realiraj kodoj:' + user: + chosen_languages: Kiam estas elekto, nur mesaĝoj en elektitaj lingvoj aperos en publikaj tempolinioj labels: account: fields: @@ -32,6 +36,7 @@ eo: autofollow: Inviti al sekvi vian konton avatar: Profilbildo bot: Tio estas robota konto + chosen_languages: Filtri lingvojn confirm_new_password: Konfirmi novan pasvorton confirm_password: Konfirmi pasvorton current_password: Nuna pasvorto @@ -41,7 +46,7 @@ eo: expires_in: Eksvalidiĝas post fields: Profilaj metadatumoj header: Fonbildo - locale: Lingvo + locale: Interfaca lingvo locked: Ŝlosi konton max_uses: Maksimuma nombro de uzoj new_password: Nova pasvorto @@ -50,6 +55,7 @@ eo: password: Pasvorto setting_auto_play_gif: Aŭtomate ekigi GIF-ojn setting_boost_modal: Montri fenestron por konfirmi antaŭ ol diskonigi + setting_default_language: Publikada lingvo setting_default_privacy: Mesaĝa videbleco setting_default_sensitive: Ĉiam marki aŭdovidaĵojn tiklaj setting_delete_modal: Montri fenestron por konfirmi antaŭ ol forigi mesaĝon diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index ff34fdf50..2d60030ec 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -12,10 +12,12 @@ eu: other: %{count} karaktere geratzen dira fields: 4 elementu bistaratu ditzakezu taula batean zure profilean header: PNG, GIF edo JPG. Gehienez 2MB. 700x335px eskalara txikituko da + locale: Erabiltzaile-interfazea, e-mail mezuen eta jakinarazpenen hizkuntza locked: Jarraitzaileak eskuz onartu behar dituzu note: one: Karaktere1 geratzen da other: %{count} karaktere geratzen dira + setting_default_language: Zure toot-en hizkuntza automatikoki antzeman daiteke, baina ez da beti zehatza setting_hide_network: Nor jarraitzen duzun eta nork jarraitzen zaituen ez da bistaratuko zure profilean setting_noindex: Zure profil publiko eta toot orrietan eragina du setting_theme: Edozein gailutik konektatzean Mastodon-en itxuran eragiten du. @@ -23,6 +25,8 @@ eu: data: Beste Mastodon instantzia batetik esportatutako CSV fitxategia sessions: otp: 'Sartu zure telefonoko aplikazioak sortutako bi faktoreetako kodea, edo erabili zure berreskuratze kodeetako bat:' + user: + chosen_languages: Ezer markatzekotan, hautatutako hizkuntzetan dauden toot-ak besterik ez dira erakutsiko labels: account: fields: @@ -32,6 +36,7 @@ eu: autofollow: Gonbidatu zure kontua jarraitzera avatar: Abatarra bot: Hau bot kontu bat da + chosen_languages: Iragazi hizkuntzak confirm_new_password: Berretsi pasahitz berria confirm_password: Berretsi pasahitza current_password: Oraingo pasahitza @@ -41,7 +46,7 @@ eu: expires_in: Iraungitzea fields: Profilaren metadatuak header: Goiburua - locale: Hizkuntza + locale: Interfazearen hizkuntza locked: Giltzapetu kontua max_uses: Gehieneko erabiltzaile kopurua new_password: Pasahitz berria @@ -50,6 +55,7 @@ eu: password: Pasahitza setting_auto_play_gif: Erreproduzitu GIF animatuak automatikoki setting_boost_modal: Erakutsi baieztapen elkarrizketa-koadroa bultzada eman aurretik + setting_default_language: Argitalpenen hizkuntza setting_default_privacy: Mezuen pribatutasuna setting_default_sensitive: Beti markatu edukiak hunkigarri gisa setting_delete_modal: Erakutsi baieztapen elkarrizketa-koadroa toot bat ezabatu aurretik diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index e8a2c38aa..a2ef8d439 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -12,10 +12,12 @@ fa: other: %{count} حرف باقی مانده fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۳۳۵×۷۰۰ پیکسل تبدیل خواهد شد + locale: زبان محیط کاربری، ایمیل‌ها، و اعلان‌ها locked: باید پیگیران تازه را خودتان تأیید کنید note: one: 1 حرف باقی مانده other: %{count} حرف باقی مانده + setting_default_language: زبان نوشته‌های شما به طور خودکار تشخیص داده می‌شود، ولی این تشخصی همیشه دقیق نیست setting_hide_network: فهرست پیگیران شما و فهرست کسانی که شما پی می‌گیرید روی نمایهٔ شما دیده نخواهد شد setting_noindex: روی نمایهٔ عمومی و صفحهٔ نوشته‌های شما تأثیر می‌گذارد setting_theme: ظاهر ماستدون را وقتی که از هر دستگاهی به آن وارد می‌شوید تعیین می‌کند. @@ -23,6 +25,8 @@ fa: data: پروندهٔ CSV که از سرور ماستدون دیگری برون‌سپاری شده sessions: otp: 'کد تأیید دومرحله‌ای که اپ روی تلفن شما ساخته را وارد کنید یا یکی از کدهای بازیابی را به کار ببرید:' + user: + chosen_languages: اگر انتخاب کنید، تنها نوشته‌هایی که به زبان‌های برگزیدهٔ شما نوشته شده‌اند در فهرست نوشته‌های عمومی نشان داده می‌شوند labels: account: fields: @@ -32,6 +36,7 @@ fa: autofollow: دعوت از دیگران برای عضو شدن و پیگیری حساب شما avatar: تصویر نمایه bot: این حساب یک ربات است + chosen_languages: جدا کردن زبان‌ها confirm_new_password: تأیید رمز تازه confirm_password: تأیید رمز current_password: رمز فعلی @@ -41,7 +46,7 @@ fa: expires_in: تاریخ انقضا fields: اطلاعات تکمیلی نمایه header: تصویر زمینه - locale: زبان + locale: زبان محیط کاربری locked: خصوصی‌کردن حساب max_uses: بیشترین شمار استفاده new_password: رمز تازه @@ -50,6 +55,7 @@ fa: password: رمز setting_auto_play_gif: پخش خودکار تصویرهای متحرک setting_boost_modal: نمایش پیغام تأیید پیش از بازبوقیدن + setting_default_language: زبان نوشته‌های شما setting_default_privacy: حریم خصوصی نوشته‌ها setting_default_sensitive: همیشه تصاویر را به عنوان حساس علامت بزن setting_delete_modal: نمایش پیغام تأیید پیش از پاک کردن یک نوشته diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 5da562e19..81e10409a 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -12,10 +12,12 @@ fr: other: %{count} caractères restants fields: Vous pouvez avoir jusqu'à 4 éléments affichés en tant que tableau sur votre profil header: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à 700x335px + locale: La langue de l'interface-utilisateur, des courriels, et des notifications locked: Vous devrez approuver chaque abonné⋅e et vos statuts ne s’afficheront qu’à vos abonné⋅es note: one: 1 caractère restant other: %{count} caractères restants + setting_default_language: La langue de vos pouets peut être détectée automatiquement, mais ça n'est pas toujours pertinent setting_hide_network: Ceux que vous suivez et ceux qui vous suivent ne seront pas affichés sur votre profil setting_noindex: Affecte votre profil public ainsi que vos statuts setting_theme: Affecte l’apparence de Mastodon quand vous êtes connecté·e depuis n’importe quel appareil. @@ -23,6 +25,8 @@ fr: data: Un fichier CSV généré par une autre instance de Mastodon sessions: otp: 'Entrez le code d’authentification à deux facteurs généré par votre téléphone ou utilisez un de vos codes de récupération :' + user: + chosen_languages: Lorsque coché, seuls les pouets dans les langues sélectionnées seront affichés sur les fils publics labels: account: fields: @@ -32,6 +36,7 @@ fr: autofollow: Invitation à suivre votre compte avatar: Image de profil bot: Ceci est un robot + chosen_languages: Filtrer les langues confirm_new_password: Confirmation du nouveau mot de passe confirm_password: Confirmation du mot de passe current_password: Mot de passe actuel @@ -41,7 +46,7 @@ fr: expires_in: Expire après fields: Métadonnées du profil header: Image d’en-tête - locale: Langue + locale: Langue de l'interface locked: Verrouiller le compte max_uses: Nombre maximum d'utilisations new_password: Nouveau mot de passe @@ -50,6 +55,7 @@ fr: password: Mot de passe setting_auto_play_gif: Lire automatiquement les GIFs animés setting_boost_modal: Afficher une fenêtre de confirmation avant de partager + setting_default_language: Langue de publication setting_default_privacy: Confidentialité des statuts setting_default_sensitive: Toujours marquer les médias comme sensibles setting_delete_modal: Afficher une fenêtre de confirmation avant de supprimer un pouet diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index f4e1ec640..2bccb2d4f 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -12,10 +12,12 @@ gl: other: %{count} caracteres restantes fields: Pode ter ate 4 elementos no seu perfil mostrados como unha táboa header: PNG, GIF ou JPG. Máximo 2MB. Será reducida a 700x335px + locale: O idioma da interface de usuaria, correos e notificacións locked: Require que vostede acepte as seguidoras de xeito manual note: one: 1 caracter restante other: %{count} caracteres restantes + setting_default_language: Pódese detectar automáticamente o idioma dos seus toots, mais non sempre é preciso setting_hide_network: Non se mostrará no seu perfil quen a segue e quen a está a seguir setting_noindex: Afecta ao seu perfil público e páxinas de estado setting_theme: Afecta ao aspecto de Mastodon en calquer dispositivo cando está conectada. @@ -23,6 +25,8 @@ gl: data: Ficheiro CSV exportado desde outra instancia Mastodon sessions: otp: Introduza o código de doble-factor xerado no aplicativo do seu móbil ou utilice un dos seus códigos de recuperación. + user: + chosen_languages: Si se marca, só os toots nos idiomas seleccionados serán mostrados en liñas temporais públicas labels: account: fields: @@ -32,6 +36,7 @@ gl: autofollow: Convide a seguir a súa conta avatar: Avatar bot: Esta conta é de un bot + chosen_languages: Filtrar idiomas confirm_new_password: Confirme o novo contrasinal confirm_password: Confirme o contrasinal current_password: Contrasinal actual @@ -41,7 +46,7 @@ gl: expires_in: Caducidade despois de fields: Metadatos do perfil header: Cabeceira - locale: Idioma + locale: Idioma da interface locked: Protexer conta max_uses: Número máximo de usos new_password: Novo contrasinal @@ -50,6 +55,7 @@ gl: password: Contrasinal setting_auto_play_gif: Reprodución automática de GIFs animados setting_boost_modal: Pedir confirmación antes de promocionar + setting_default_language: Idioma de publicación setting_default_privacy: Intimidade da publicación setting_default_sensitive: Marcar sempre multimedia como sensible setting_delete_modal: Solicitar confirmación antes de eliminar unha mensaxe diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 948343240..ff3d2c002 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -12,10 +12,12 @@ it: other: %{count} caratteri rimanenti fields: Puoi avere fino a 4 voci visualizzate come una tabella sul tuo profilo header: PNG, GIF o JPG. Al massimo 2MB. Verranno scalate a 700x335px + locale: La lingua dell'interfaccia utente, di email e notifiche push locked: Richiede che approvi i follower manualmente note: one: 1 carattere rimanente other: %{count} caratteri rimanenti + setting_default_language: La lingua dei tuoi toot può essere individuata automaticamente, ma il risultato non è sempre accurato setting_hide_network: Chi segui e chi segue te non saranno mostrati sul tuo profilo setting_noindex: Ha effetto sul tuo profilo pubblico e sulle pagine degli status setting_theme: Ha effetto sul modo in cui Mastodon verrà visualizzato quando sarai collegato da qualsiasi dispositivo. @@ -23,6 +25,8 @@ it: data: File CSV esportato da un'altra istanza di Mastodon sessions: otp: 'Inserisci il codice a due fattori generato dall''app del tuo telefono o usa uno dei codici di recupero:' + user: + chosen_languages: Quando una o più lingue sono contrassegnate, nelle timeline pubbliche vengono mostrati solo i toot nelle lingue selezionate labels: account: fields: @@ -32,6 +36,7 @@ it: autofollow: Invita a seguire il tuo account avatar: Avatar bot: Questo account è un bot + chosen_languages: Filtra lingue confirm_new_password: Conferma nuova password confirm_password: Conferma password current_password: Password corrente @@ -41,7 +46,7 @@ it: expires_in: Scade dopo fields: Metadati del profilo header: Header - locale: Lingua + locale: Lingua dell'interfaccia locked: Blocca account max_uses: Numero massimo di utilizzi new_password: Nuova password @@ -50,6 +55,7 @@ it: password: Password setting_auto_play_gif: Play automatico GIF animate setting_boost_modal: Mostra dialogo di conferma prima del boost + setting_default_language: Lingua dei post setting_default_privacy: Privacy dei post setting_default_sensitive: Segna sempre i media come sensibili setting_delete_modal: Mostra dialogo di conferma prima di eliminare un toot diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 7ebd26630..8ca33528b 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -19,6 +19,7 @@ sk: few: Ostávajú ti %{count} znaky one: Ostáva ti 1 znak other: Ostáva ti %{count} znakov + setting_default_language: Jazyk tvojích príspevkov môže byť zistený automaticky, ale nieje to vždy presné setting_hide_network: Koho následuješ, a kto následuje teba nebude zobrazené na tvojom profile setting_noindex: Ovplyvňuje verejný profil a statusy setting_theme: Toto ovplyvňuje ako Mastodon vyzerá pri prihlásení z hociakého zariadenia. @@ -26,6 +27,8 @@ sk: data: CSV súbor vyexportovaný z inej Mastodon inštancie sessions: otp: 'Napíš sem dvoj-faktorový kód z telefónu, alebo použi jeden z tvojích obnovovacích kódov:' + user: + chosen_languages: Keď je zaškrtnuté, tak iba príspevky vo vybraných jazykoch budú zobrazené vo verejnej osi labels: account: fields: @@ -54,6 +57,7 @@ sk: password: Heslo setting_auto_play_gif: Automaticky prehrávať animované GIFy setting_boost_modal: Zobrazovať potvrdzovacie okno pred re-toot + setting_default_language: Píšeš v jazyku setting_default_privacy: Súkromie príspevkov setting_default_sensitive: Označ všetky mediálne súbory ako chúlostivé setting_delete_modal: Zobrazuj potvrdzovacie okno pred vymazaním toot-u diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 7a1cae68d..0575c09f8 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -3,6 +3,7 @@ zh-HK: simple_form: hints: defaults: + autofollow: 通過邀請網址註冊的用戶將會自動關注你 avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 2MB,會縮裁成 400x400px bot: 提醒用戶本帳號是機械人 digest: 僅在你長時間未登錄,且收到了私信時發送 @@ -11,10 +12,12 @@ zh-HK: other: 尚餘 %{count} 個字 fields: 個人資料頁可顯示多至 4 個項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 2MB,會縮裁成 700x335px + locale: 使用者介面、電郵和通知的語言 locked: 你必須人手核准每個用戶對你的關注請求,而你的文章私隱會被預設為「只有關注你的人能看」 note: one: 尚餘 1 個字 other: 尚餘 %{count} 個字 + setting_default_language: 你文章的語言會被自動偵測,但不一定完全準確 setting_hide_network: 你關注的人和關注你的人將不會在你的個人資料頁上顯示 setting_noindex: 此設定會影響到你的公開個人資料以及文章頁面 setting_theme: 此設置會影響到你從任意設備登入時 Mastodon 的顯示樣式。 @@ -22,14 +25,18 @@ zh-HK: data: 自其他服務站匯出的 CSV 檔案 sessions: otp: 輸入你手機上生成的雙重認證碼,或者任意一個恢復代碼: + user: + chosen_languages: 只有被選擇的語言會在公開時間軸內顯示 labels: account: fields: name: 標籤 value: 內容 defaults: + autofollow: 邀請別人關注你的賬號 avatar: 個人頭像 bot: 這帳號是機械人 + chosen_languages: 語言過濾 confirm_new_password: 確認新密碼 confirm_password: 確認密碼 current_password: 目前密碼 @@ -39,7 +46,7 @@ zh-HK: expires_in: 失效時間 fields: 資料 header: 個人頁面頂部 - locale: 語言 + locale: 介面語言 locked: 將用戶轉為「私人」 max_uses: 最大使用次數 new_password: 新密碼 @@ -48,6 +55,7 @@ zh-HK: password: 密碼 setting_auto_play_gif: 自動播放 GIF setting_boost_modal: 在轉推前詢問我 + setting_default_language: 文章語言 setting_default_privacy: 文章預設為 setting_default_sensitive: 預設我的內容為敏感內容 setting_delete_modal: 刪推前詢問我 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index a3f6627af..6b1dbae91 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -3,53 +3,86 @@ zh-TW: simple_form: hints: defaults: - avatar: 支援 PNG, GIF 或 JPG 圖片,檔案大小上限為 2MB,會被縮小為 400x400px - display_name: 最多 30 個字元 - header: 支援 PNG, GIF 或 JPG 圖片,檔案大小上限為 2MB,會被縮小為 700x335px - locked: 您必須手動核准每個使用者對您的關注請求,而您的文章隱私預設為「只有關注您的人能看」 - note: 最多 160 個字元 + autofollow: 通過邀請網址註冊的使用者將會自動關注你 + avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 2MB,會縮裁成 400x400px + bot: 這個帳號由程式進行自動式操作 + digest: 僅在你長時間未登入,並且收到了私訊時發送 + display_name: + one: 尚餘 1 個字 + other: 尚餘 %{count} 個字 + fields: 個人資訊頁至多可顯示 4 個項目 + header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 2MB,會縮裁成 700x335px + locale: 使用者介面、 E-mail 與通知的語言 + locked: 你必須手動核准每個使用者對你的關注請求,而你的貼文隱私將會被設定為「只有關注你的人能看」 + note: + one: 尚餘 1 個字 + other: 尚餘 %{count} 個字 + setting_default_language: 你嘟文的語言會被自動偵測,但不一定完全準確 + setting_hide_network: 你關注的人與關注你的人將不會在你的個人資料頁上顯示 + setting_noindex: 此設定會影響到你的公開個人資料與嘟文頁面 + setting_theme: 此設定會影響到你從任意設備登入 Mastodon 時的顯示樣式。 imports: - data: 自其他服務站匯出的 CSV 檔案 + data: 自其他站點匯出的 CSV 檔案 + sessions: + otp: 輸入你手機上產生的兩階段認證碼,或著任意一個備用驗證碼: + user: + chosen_languages: 只有被選擇的語言會在公開時間軸內顯示 labels: + account: + fields: + name: 標籤 + value: 內容 defaults: - avatar: 大頭貼 + autofollow: 邀請別人關注你的帳戶 + avatar: 頭像 + bot: 這個帳號是機器人 + chosen_languages: 語言篩選 confirm_new_password: 確認新密碼 confirm_password: 確認密碼 current_password: 目前密碼 data: 資料 display_name: 顯示名稱 - email: 電子信箱 - header: 個人頁面頂部 - locale: 語言 + email: E-mail + expires_in: 失效時間 + fields: 資料 + header: 個人頁面圖片 + locale: 介面語言 locked: 將帳號轉為「私密」 + max_uses: 最大使用次數 new_password: 新密碼 note: 簡介 - otp_attempt: 雙因子驗證碼 + otp_attempt: 兩階段認證碼 password: 密碼 - setting_auto_play_gif: 自動播放 GIFs - setting_boost_modal: 轉推前跳出確認視窗 - setting_default_privacy: 文章預設隱私度 - setting_default_sensitive: 預設我的內容為敏感內容 - setting_delete_modal: 刪推前跳出確認視窗 - setting_noindex: 不被搜尋引擎檢索 + setting_auto_play_gif: 自動播放 GIF + setting_boost_modal: 在轉嘟前先詢問我 + setting_default_language: 嘟文語言 + setting_default_privacy: 嘟文預設為 + setting_default_sensitive: 預設我的媒體檔案為敏感內容 + setting_delete_modal: 刪除嘟文前先詢問我 + setting_display_sensitive_media: 預設我的媒體為敏感內容 + setting_hide_network: 隱藏你的社交網路 + setting_noindex: 阻止搜尋引擎收錄 setting_reduce_motion: 減低動畫效果 - setting_system_font_ui: 使用系統預設字體 - setting_theme: 網站主題 - setting_unfollow_modal: 取消關注前跳出確認視窗 + setting_system_font_ui: 使用系統預設字型 + setting_theme: 主題外觀 + setting_unfollow_modal: 取消關注前先詢問我 + severity: 等級 type: 匯入資料類型 username: 使用者名稱 + username_or_email: 使用者名稱或 E-mail interactions: - must_be_follower: 隱藏沒有關注您的使用者的通知 - must_be_following: 隱藏您不關注的使用者的通知 + must_be_follower: 隱藏沒有關注你的使用者通知 + must_be_following: 隱藏你沒關注的使用者通知 + must_be_following_dm: 隱藏你沒關注的使用者私訊 notification_emails: - digest: 定期摘要信 - favourite: 當有使用者喜歡您的文章時,發信通知 - follow: 當有使用者關注您時,發信通知 - follow_request: 當有使用者要求關注您時,發信通知 - mention: 當有使用者在文章提及您時,發信通知 - reblog: 當有使用者轉推您的文章時,發信通知 + digest: 定期發送摘要郵件 + favourite: 當有使用者喜歡你的嘟文時,發送 E-mail 通知 + follow: 當有使用者關注你時,發送 E-mail 通知 + follow_request: 當有使用者要求關注你時,發送 E-mail 通知 + mention: 當有使用者在嘟文提及你時,發送 E-mail 通知 + reblog: 都有使用者轉嘟你的嘟文時,發送 E-mail 通知 'no': 否 required: mark: "*" - text: 必填 + text: 必須填寫 'yes': 是 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 278191599..77726ba08 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -22,7 +22,7 @@ sk: not_a_product_title: Si človek, nie produkt real_conversation_body: S 500 znakmi a podporou pre varovania pri obrázkoch a videách sa môžeš vyjadriť tak ako budeš chcieť. real_conversation_title: Vytvorený pre reálnu konverzáciu - within_reach_body: Viacero aplikácií pre iOS, Android a iné platformy, ktoré vďaka jednoduchému API ekosystému vám dovoľujú byť online so svojimi priateľmi kdekoľvek. + within_reach_body: Viacero aplikácií pre iOS, Android a iné platformy, ktoré ti vďaka jednoduchému API ekosystému dovoľujú byť online so svojimi priateľmi kdekoľvek. within_reach_title: Stále v dosahu generic_description: "%{domain} je jeden server v sieti" hosted_on: Mastodon hostovaný na %{domain} @@ -60,7 +60,7 @@ sk: delete: Zmazať destroyed_msg: Poznámka moderátora bola úspešne zmazaná! accounts: - are_you_sure: Ste si istý? + are_you_sure: Si si istý? avatar: Maskot by_domain: Doména change_email: @@ -621,11 +621,17 @@ sk: firefox: Mozilla Firefox generic: Neznámy prehliadač ie: Internet Explorer + otter: Prehliadač Otter + safari: Apple Safari + weibo: Sina/Tencent Weibo current_session: Aktuálna sezóna description: "%{browser} na %{platform}" explanation: Tieto sú prehliadače ktoré sú teraz prihlásené na tvoj Mastodon účet. ip: IP adresa platforms: + chrome_os: Google ChromeOS + ios: Apple iOS + linux: GNU/Linux mac: MacOSX other: neznáma platforma revoke: Zamietni diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index dd6541cc9..503a70a15 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -424,7 +424,7 @@ zh-HK: following: 成功!你正在關注: post_follow: close: 你也可以直接關閉這個頁面。 - return: 返回至個人資料頁 + return: 顯示個人資料頁 web: 返回本站 title: 關注 %{acct} datetime: @@ -514,6 +514,7 @@ zh-HK: '86400': 1 天後 expires_in_prompt: 永不過期 generate: 生成邀請連結 + invited_by: 你的邀請人是: max_uses: one: 1 次 other: "%{count} 次" @@ -671,6 +672,7 @@ zh-HK: disallowed_hashtags: one: 包含不允許的標籤: %{tags} other: 包含不允許的標籤: %{tags} + language_detection: 自動偵測語言 open_in_web: 開啟網頁 over_character_limit: 超過了 %{max} 字的限制 pin_errors: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index d8c0f89a9..e2b376a3f 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1,144 +1,431 @@ --- zh-TW: about: - about_mastodon_html: Mastodon (長毛象)是一個自由、開放原始碼的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 服務站,在上面建立帳號,然後您就可以和任一 Mastodon 服務站上的使用者互通,享受無縫的社群網路交流。 - about_this: 關於本服務站 - closed_registrations: 本服務站暫時停止接受註冊。 + about_hashtag_html: 這些是包含「#%{hashtag}」標籤的公開文章。只要你有任何 Mastodon 站點、或者其他站點的使用者,便可以與他們互動。 + about_mastodon_html: Mastodon (長毛象)是一個自由、開放原始碼的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 站點,在上面建立帳號,然後您就可以和任一 Mastodon 站點上的使用者互通,享受無縫的社群網路交流。 + about_this: 關於本站 + administered_by: 管理者: + closed_registrations: 本站暫時停止接受註冊。 contact: 聯絡我們 - description_headline: 關於 %{domain} - domain_count_after: 個服務站相連 + contact_missing: 未設定 + contact_unavailable: 未公開 + description_headline: 關於 %{domain}? + domain_count_after: 個站點相連 domain_count_before: 與其他 - other_instances: 其他服務站 + extended_description_html: | +

    這裡可以寫一些網站規則

    +

    本站點未有詳細介紹

    + features: + humane_approach_body: Mastodon 從其他網路的失敗經驗中汲取教訓,以合乎道德的設計對抗社交媒體的濫用問題。 + humane_approach_title: 以人為本 + not_a_product_body: Mastodon 不是商業網站。沒有廣告,沒有數據挖掘,也沒有中央機構操控。平台完全開放。 + not_a_product_title: 你是用戶,不是商品 + real_conversation_body: Mastodon 的字數限制高達 500 字,並支援仔細的媒體警告選項,令你暢所欲言。 + real_conversation_title: 為真正的交流而生 + within_reach_body: 簡易的 API 系統,令用戶可以透過不同的 iOS、Android 及其他平台的應用軟體,與朋友保持聯繫。 + within_reach_title: 始終觸手可及 + generic_description: "%{domain} 是 Mastodon 網路中其中一個站點" + hosted_on: 在 %{domain} 運作的 Mastodon 站點 + learn_more: 了解詳細 + other_instances: 其他站點 source_code: 原始碼 - status_count_after: 篇文章 - status_count_before: 他們共發佈了 - user_count_after: 位註冊使用者 - user_count_before: 這裡共有 + status_count_after: 條嘟嘟 + status_count_before: 他們共嘟出了 + user_count_after: 位使用者 + user_count_before: 這裡共註冊有 + what_is_mastodon: 什麼是 Mastodon? accounts: follow: 關注 followers: 關注者 following: 正在關注 - nothing_here: 暫時沒有內容可供顯示 + media: 媒體 + moved_html: "%{name} 已經搬遷到 %{new_profile_link}:" + network_hidden: 此訊息不可用 + nothing_here: 暫時沒有內容可供顯示! people_followed_by: "%{name} 關注的人" people_who_follow: 關注 %{name} 的人 - posts: 文章 + posts: 嘟文 + posts_with_replies: 嘟文與回覆 remote_follow: 跨站關注 + reserved_username: 此用戶名已被保留 + roles: + admin: 管理員 + bot: 機器人 + moderator: 版主 unfollow: 取消關注 admin: + account_moderation_notes: + create: 記錄 + created_msg: 已新增管理備忘! + delete: 刪除 + destroyed_msg: 成功刪除管理備忘! accounts: are_you_sure: 您確定嗎? - display_name: 顯示名稱 + avatar: 頭像 + by_domain: 網域 + change_email: + changed_msg: E-mail更改成功! + current_email: 目前的E-mail + label: 更改E-mail + new_email: 新的E-mail + submit: 更改E-mail + title: 為 %{username} 更改E-mail + confirm: 確定 + confirmed: 已確定 + confirming: 確定 + demote: 降級 + disable: 停用 + disable_two_factor_authentication: 停用兩階段認證 + disabled: 已停用 + display_name: 暱稱 domain: 網域 edit: 編輯 - email: 信箱 - feed_url: Feed URL - followers: 追蹤者 - follows: 追蹤的 + email: E-mail + email_status: E-mail狀態 + enable: 啟用 + enabled: 已啟用 + feed_url: 訂閱 URL + followers: 關注者 + followers_url: 關注者(Followers)URL + follows: 正在關注 + inbox_url: 收件箱 (Inbox) URL + ip: IP 位址 location: all: 全部 - local: 本地 + local: 本站 remote: 遠端 title: 位置 + login_status: 登入狀態 media_attachments: 多媒體附件 + memorialize: 設定為追悼帳戶 moderation: all: 全部 - silenced: 靜音 - suspended: 停權 + silenced: 已靜音 + suspended: 已停權 title: 版務 + moderation_notes: 管理備忘 most_recent_activity: 最近活動 - most_recent_ip: 最近 IP + most_recent_ip: 最近 IP 位址 not_subscribed: 未訂閱 order: - alphabetic: 字典序 - most_recent: 時間序 + alphabetic: 按字母 + most_recent: 按時間 title: 排序 + outbox_url: 寄件箱 (Outbox) URL perform_full_suspension: 進行停權 - profile_url: 個人檔案網址 + profile_url: 個人檔案 URL + promote: 晉級 + protocol: 協議 public: 公開 - push_subscription_expires: 推播訂閱過期 - salmon_url: Salmon URL + push_subscription_expires: PuSH 訂閱過期 + redownload: 更新頭像 + remove_avatar: 取消頭像 + resend_confirmation: + already_confirmed: 此用戶已被確認 + send: 重新發送驗證信 + success: 驗證信發送成功! + reset: 重設 + reset_password: 重設密碼 + resubscribe: 重新訂閱 + role: 身份 + roles: + admin: 管理員 + moderator: 版主 + staff: 管理人員 + user: 普通用戶 + salmon_url: Salmon 網址 + search: 搜尋 + shared_inbox_url: 公共收件箱 (Shared Inbox) URL + show: + created_reports: 這個使用者提交的檢舉 + report: 檢舉 + targeted_reports: 針對這個使用者的檢舉 silence: 靜音 - statuses: 狀態 - title: 帳號 + statuses: 嘟文 + subscribe: 訂閱 + title: 帳戶 + unconfirmed_email: 等待驗證的E-mail undo_silenced: 取消靜音 undo_suspension: 取消停權 + unsubscribe: 取消訂閱 username: 使用者名稱 - web: Web + web: 頁面 + action_logs: + actions: + assigned_to_self_report: "%{name} 接受了檢舉 %{target}" + change_email_user: "%{name} 更改了使用者 %{target} 的E-mail" + confirm_user: "%{name} 確認了使用者 %{target} 的E-mail" + create_custom_emoji: "%{name} 加入自訂表情符號 %{target}" + create_domain_block: "%{name} 封鎖了網域 %{target}" + create_email_domain_block: "%{name} 封鎖了E-mail %{target}" + demote_user: "%{name} 把使用者 %{target} 降級" + destroy_domain_block: "%{name} 取消了對網域 %{target} 的封鎖" + destroy_email_domain_block: "%{name} 取消了對E-mail %{target} 的封鎖" + destroy_status: "%{name} 刪除了 %{target} 的嘟文" + disable_2fa_user: "%{name} 停用了使用者 %{target} 的兩階段認證" + disable_custom_emoji: "%{name} 停用了自訂表情符號 %{target}" + disable_user: "%{name} 將使用者 %{target} 設定為禁止登入" + enable_custom_emoji: "%{name} 啟用了自訂表情符號 %{target}" + enable_user: "%{name} 將使用者 %{target} 設定為允許登入" + memorialize_account: "%{name} 將 %{target} 設定為追悼帳戶" + promote_user: "%{name} 對使用者 %{target} 進行了晉級操作" + remove_avatar_user: "%{name} 移除了 %{target} 的頭像" + reopen_report: "%{name} 重新開啟 %{target} 的檢舉" + reset_password_user: "%{name} 重新設定了使用者 %{target} 的密碼" + resolve_report: "%{name} 處理了 %{target} 的檢舉" + silence_account: "%{name} 靜音了使用者 %{target}" + suspend_account: "%{name} 停權了使用者 %{target}" + unassigned_report: "%{name} 取消指派 %{target} 的檢舉" + unsilence_account: "%{name} 取消了使用者 %{target} 的靜音狀態" + unsuspend_account: "%{name} 取消了使用者 %{target} 的停權狀態" + update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}" + update_status: "%{name} 重整了 %{target} 的嘟文" + title: 營運日誌 + custom_emojis: + by_domain: 網域 + copied_msg: 成功將表情複製到本地 + copy: 複製 + copy_failed_msg: 無法將表情複製到本地 + created_msg: 已新增表情符號! + delete: 刪除 + destroyed_msg: 已刪除表情符號! + disable: 停用 + disabled_msg: 已停用表情符號 + emoji: 表情符號 + enable: 啟用 + enabled_msg: 已啟用表情符號 + image_hint: PNG 格式, 最大 50KB + listed: 已顯示 + new: + title: 加入新的自訂表情符號 + overwrite: 覆蓋 + shortcode: 短代碼 + shortcode_hint: 至少 2 個字元,只能使用字母、數字和下劃線 + title: 自訂表情符號 + unlisted: 已隱藏 + update_failed_msg: 無法更新表情符號 + updated_msg: 已更新表情符號! + upload: 上傳新的表情符號 domain_blocks: add_new: 新增 + created_msg: 正在進行網域封鎖 + destroyed_msg: 已撤銷網域封鎖 domain: 網域 new: create: 新增封鎖 - hint: 網域封鎖動作並不會阻止帳號紀錄被新增至資料庫,但會自動回溯性地對那些帳號套用特定管理設定。 + hint: 網域封鎖動作並不會阻止帳戶紀錄被新增至資料庫,但會自動回溯性地對那些帳戶套用特定管理設定。 severity: - desc_html: "靜音將使得未追蹤該帳號的使用者無法看見該帳號之貼文。停權將移除所有該使用者的帳號內容、多媒體檔案、以及個人檔案。" - silence: 靜音 + desc_html: "「自動靜音」令該網域下使用者的嘟文,設定為只對關注者顯示,沒有關注的人會看不到。 「自動刪除」會刪除將該網域下使用者的嘟文、媒體檔案和個人資料。「」則會拒絕接收來自該網域的媒體檔案。" + noop: 無 + silence: 自動靜音 suspend: 停權 - title: 新封鎖網域 + title: 新增封鎖網域 + reject_media: 拒絕媒體檔案 + reject_media_hint: 刪除本地緩存的媒體檔案,並且不再接收來自該網域的任何媒體檔案。與自動封鎖無關 + severities: + noop: 無 + silence: 自動靜音 + suspend: 自動封鎖 severity: 嚴重度 + show: + affected_accounts: + one: 資料庫中有一個使用者受到影響 + other: 資料庫中有%{count}個使用者受影響 + retroactive: + silence: 對此網域的所有使用者取消靜音 + suspend: 對此網域的所有使用者取消封鎖 + title: 撤銷 %{domain} 的網域封鎖 + undo: 撤銷 title: 網域封鎖 + undo: 撤銷 + email_domain_blocks: + add_new: 加入新項目 + created_msg: 已新增E-mail封鎖 + delete: 刪除 + destroyed_msg: 已刪除E-mail封鎖 + domain: 網域 + new: + create: 新增網域 + title: 新增E-mail封鎖 + title: E-mail封鎖 + instances: + account_count: 已知帳戶 + domain_name: 網域 + reset: 重設 + search: 搜尋 + title: 已知站點 + invites: + filter: + all: 全部 + available: 可用 + expired: 已失效 + title: 篩選 + title: 邀請使用者 + report_notes: + created_msg: 檢舉記錄建立成功! + destroyed_msg: 檢舉記錄刪除成功! reports: + account: + note: 條記錄 + report: 條檢舉 + action_taken_by: 操作執行者 + are_you_sure: 你確定嗎? + assign_to_self: 指派給自己 + assigned: 指派負責人 comment: none: 無 + created_at: 日期 id: ID - mark_as_resolved: 標記為已解決 + mark_as_resolved: 標記為「已解決」 + mark_as_unresolved: 標記為「未解決」 + notes: + create: 建立記錄 + create_and_resolve: 建立記錄並標記為「已解決」 + create_and_unresolve: 建立記錄並標記「未解決」 + delete: 刪除 + placeholder: 記錄已執行的動作,或其他相關的更新... + reopen: 重開檢舉 report: '檢舉 #%{id}' - reported_account: 被檢舉帳號 + report_contents: 檢舉內容 + reported_account: 被檢舉使用者 reported_by: 檢舉人 resolved: 已解決 - silence_account: 靜音帳號 + resolved_msg: 檢舉已處理! + silence_account: 靜音使用者 status: 狀態 - suspend_account: 停權帳號 - target: 目標 + suspend_account: 停權使用者 + target: 對象 title: 檢舉 + unassign: 取消指派 unresolved: 未解決 + updated_at: 更新 view: 檢視 settings: + activity_api_enabled: + desc_html: 本站使用者發佈的嘟文數量,以及本站的活躍使用者與一週內新使用者數量 + title: 公開使用者活躍度的統計數據 + bootstrap_timeline_accounts: + desc_html: 以半形逗號分隔多個使用者名。只能加入來自本站且未開啟保護的帳號。如果留空,則預設關注本站所有管理員。 + title: 新使用者預設關注 contact_information: - email: 請輸入輸入一個公開電子信箱 + email: 請輸入一個公開E-mail username: 請輸入使用者名稱 + hero: + desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會預設為站點預覽圖 + title: 主題圖片 + peers_api_enabled: + desc_html: 現在本站點在網路中已發現的網域 + title: 公開已知站點的列表 registrations: closed_message: - desc_html: 關閉註冊時顯示在首頁的內容,可使用 HTML 標籤。 + desc_html: 關閉註冊時顯示在首頁的內容,可使用 HTML 標籤 title: 關閉註冊訊息 + deletion: + desc_html: 允許所有人刪除自己的帳戶 + title: 開放刪除帳戶的權限 + min_invite_role: + disabled: 沒有人 + title: 允許發送邀請的身份 open: + desc_html: 允許所有人建立帳戶 title: 開放註冊 + show_known_fediverse_at_about_page: + desc_html: 如果開啟,就會在時間軸預覽顯示其他站點嘟文,否則就只會顯示本站點嘟文。 + title: 在時間軸預覽顯示其他站點嘟文 + show_staff_badge: + desc_html: 在個人資料頁面上顯示管理人員標誌 + title: 顯示管理人員標誌 site_description: - desc_html: 顯示在首頁並且作為 meta 標籤的短文。
    可使用 HTML 標籤,包括 <a><em>。 - title: 網站描述 + desc_html: "在首頁顯示,及在 meta 標籤中的站點簡介。可以使用 HTML 標籤,包括 1< 2a> 3 4 and 5< 6em> 7 8." + title: 站點描述 site_description_extended: - desc_html: 顯示在資訊頁的長版描述,可使用 HTML 標籤。 - title: 長版網站描述 - site_title: 網站標題 + desc_html: 顯示在資訊頁的長版描述,可使用 HTML 標籤 + title: 本站詳細資訊 + site_terms: + desc_html: 可以填寫自己的隱私權政策、使用條款或其他法律文本。可以使用 HTML 標籤 + title: 自訂使用條款 + site_title: 站點名稱 + thumbnail: + desc_html: 用於在 OpenGraph 和 API 中顯示預覽圖。推薦大小 1200×630px + title: 本站縮圖 + timeline_preview: + desc_html: 在主頁顯示本站時間軸 + title: 時間軸預覽 title: 網站設定 + statuses: + back_to_account: 返回帳戶訊息頁 + batch: + delete: 刪除 + nsfw_off: 標記為非敏感內容 + nsfw_on: 標記為敏感內容 + failed_to_execute: 執行失敗 + media: + title: 媒體檔案 + no_media: 不含媒體檔案 + title: 帳戶嘟文 + with_media: 含有媒體檔案 subscriptions: - callback_url: Callback URL + callback_url: 回傳網址 confirmed: 已確認 expires_in: 期限 last_delivery: 最後遞送 - title: WebSub + title: WebSub 訂閱 topic: 主題 title: 管理介面 + admin_mailer: + new_report: + body: "%{reporter} 檢舉了使用者 %{target}" + body_remote: 來自 %{domain} 的使用者檢舉了使用者 %{target} + subject: 來自 %{instance} 的使用者檢舉(#%{id}) application_mailer: - settings: 修改信箱設定︰ %{link} - view: 進入瀏覽︰ + notification_preferences: 更改E-mail設定 + salutation: "%{name}," + settings: 修改E-mail設定︰ %{link} + view: '進入瀏覽:' + view_profile: 檢視個人資料頁 + view_status: 檢視嘟文 applications: + created: 已建立應用 + destroyed: 已刪除應用 invalid_url: 網址不正確 + regenerate_token: 重設 token + token_regenerated: 已重設 token + warning: 警告,不要把它分享給任何人! + your_token: 你的 token auth: - didnt_get_confirmation: 沒有收到驗證信? + agreement_html: 註冊即表示你同意遵守本站點的規則使用條款。 + change_password: 密碼 + confirm_email: 確認E-mail + delete_account: 刪除帳戶 + delete_account_html: 如果你想刪除你的帳戶,請點擊這裡繼續。你需要確認你的操作。 + didnt_get_confirmation: 沒有收到驗證信? forgot_password: 忘記密碼? + invalid_reset_password_token: 密碼重設 token 無效或已過期。請重新設定密碼。 login: 登入 logout: 登出 migrate_account: 轉移到另一個帳號 - migrate_account_html: 想要將這個帳號指向另一個帳號可到到這裡設定。 + migrate_account_html: 如果你希望引導他人關注另一個帳戶,請到這裡設定。 + or: 或 + or_log_in_with: 或透過其他方式登入 + providers: + cas: CAS + saml: SAML register: 註冊 - resend_confirmation: 重寄驗證信 + register_elsewhere: 在其他站點註冊 + resend_confirmation: 重新寄送E-mail reset_password: 重設密碼 security: 登入資訊 set_new_password: 設定新密碼 authorize_follow: - error: 對不起,搜尋遠端使用者出現錯誤 + already_following: 你已經關注了這個使用者 + error: 對不起,搜尋其他站點使用者出現錯誤 follow: 關注 + follow_request: 關注請求已經發送給: + following: 成功! 你正在關注: + post_follow: + close: 你也可以直接關閉這個頁面。 + return: 顯示個人資料頁 + web: 返回本站 title: 關注 %{acct} datetime: distance_in_words: @@ -149,18 +436,39 @@ zh-TW: half_a_minute: 剛剛 less_than_x_minutes: 小於%{count}分鐘前 less_than_x_seconds: 剛剛 - over_x_years: "%{count}y" + over_x_years: "%{count}年" x_days: "%{count}天" x_minutes: "%{count}分" x_months: "%{count}個月" x_seconds: "%{count}秒" + deletes: + bad_password_msg: 想得美,駭客! 密碼輸入錯誤 + confirm_password: 輸入你現在的密碼來驗證身份 + description_html: 繼續操作將會永久地、不可還原地刪除帳戶中的所有內容,然後凍結帳戶。你的用戶名將會被保留,以防有人冒用你的身份。 + proceed: 刪除帳戶 + success_msg: 你的帳戶已經成功刪除 + warning_html: 我們只能保證本站點上的內容將會被徹底刪除。對於已經被廣泛傳播的內容,它們在本站點以外的某些地方可能仍然可見。此外,失去連接的站點以及停止接收訂閱的站點所儲存的數據亦無法刪除。 + warning_title: 關於已傳播的內容警告 errors: + '403': 你沒有觀看這個頁面的權限。 '404': 您所尋找的網頁不存在。 '410': 您所尋找的網頁已不存在。 '422': - content: 安全驗證失敗。請確定有開啟瀏覽器 Cookies 功能。 + content: 安全驗證失敗。請確定有開啟瀏覽器 Cookies 功能? title: 安全驗證失敗 + '429': 伺服器繁忙 + '500': + content: 抱歉,我們的後台出現問題了。 + title: 這個頁面有問題 + noscript_html: 使用 Mastodon 網頁版應用需要啟用 JavaScript。你也可以選擇適用於你的平台的 Mastodon 應用。 exports: + archive_takeout: + date: 日期 + download: 下載檔案 + hint_html: 你可以下載包含你的文章和媒體的檔案。資料以 ActivityPub 格式儲存,可用於相容的軟體。每次允許存檔的間隔至少7天。 + in_progress: 正在準備你的存檔... + request: 下載存檔 + size: 大小 blocks: 您封鎖的使用者 csv: CSV follows: 您關注的使用者 @@ -168,58 +476,104 @@ zh-TW: storage: 儲存空間大小 followers: domain: 網域 - explanation_html: 為確保個人隱私,您必須知道有哪些使用者正關注你。您的私密內容會被發送到所有您有被關注的服務站上。如果您不信任這些服務站的管理者,您可以選擇檢查或刪除您的關注者。 - followers_count: 關注者數 - lock_link: 鎖住你的帳號 + explanation_html: 為確保個人隱私,您必須知道有哪些使用者正關注你。您的私密內容會被發送到所有您有被關注的站點上。如果您不信任這些站點的管理者,您可以選擇檢查或刪除您的關注者。 + followers_count: 關注者數量 + lock_link: 將你的帳戶設定為私人 purge: 移除關注者 - unlocked_warning_html: 所有人都可以關注並檢索你的隱藏狀態。%{lock_link}以檢查或拒絕關注。 - unlocked_warning_title: 你的帳號是公開的 + success: + one: 正準備軟性封鎖 1 個網域的關注者…… + other: 正準備軟性封鎖 %{count} 個網域的關注者…… + true_privacy_html: 請謹記,唯有點對點加密方可以真正確保你的隱私。 + unlocked_warning_html: 任何人都可以在關注你後立即查看非公開的嘟文。只要%{lock_link},你就可以審核並拒絕關注請求。 + unlocked_warning_title: 你的帳戶是公開的 generic: - changes_saved_msg: 已成功儲存修改 + changes_saved_msg: 已成功儲存修改! powered_by: 網站由 %{link} 開發 save_changes: 儲存修改 validation_errors: one: 送出的資料有問題 other: 送出的資料有 %{count} 個問題 imports: - preface: 您可以在此匯入您在其他服務站所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。 + preface: 您可以在此匯入您在其他站點所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。 success: 資料檔上傳成功,正在匯入,請稍候 types: blocking: 您封鎖的使用者名單 following: 您關注的使用者名單 muting: 您靜音的使用者名單 upload: 上傳 - landing_strip_html: "%{name} 是一個在 %{link_to_root_path} 的使用者。只要您有任何 Mastodon 服務站、或者聯盟網站的帳號,便可以跨站關注此站使用者,或者與他們互動。" - landing_strip_signup_html: 如果您沒有這些帳號,歡迎在這裡註冊。 + in_memoriam_html: 謹此悼念。 + invites: + delete: 停用 + expired: 已失效 + expires_in: + '1800': 30 分鐘後 + '21600': 6 小時後 + '3600': 1 小時後 + '43200': 12 小時後 + '604800': 1 週後 + '86400': 1 天後 + expires_in_prompt: 永不過期 + generate: 建立邀請連結 + invited_by: 你的邀請人是: + max_uses: + one: 1 次 + other: "%{count} 次" + max_uses_prompt: 無限制 + prompt: 建立分享連結,邀請他人在本站點註冊 + table: + expires_at: 失效時間 + uses: 已使用次數 + title: 邀請使用者 + landing_strip_html: "%{name} 是一個在 %{link_to_root_path} 的使用者。只要您有任何 Mastodon 站點、或者聯盟站點的帳戶,便可以跨站關注此站使用者,或者與他們互動。" + landing_strip_signup_html: 如果您沒有這些帳戶,歡迎在這裡註冊。 + lists: + errors: + limit: 你所建立的列表數量已經達到上限 media_attachments: validations: images_and_video: 無法在已有圖片的文章上加入影片 too_many: 無法加入超過 4 個檔案 + migrations: + acct: 新帳戶的 使用者名稱@站點網域 + currently_redirecting: 目前你的個人資料頁顯示的新帳戶是: + proceed: 儲存 + updated_msg: 帳戶搬遷設定更新成功! + moderation: + title: 營運 notification_mailer: digest: - body: 這是自從您在%{since}使用%{instance}以後,您錯過的訊息︰ - mention: "%{name} 在此提及了您︰" + action: 閱覽所有通知 + body: 以下是自%{since}你最後一次登入以來錯過的訊息摘要 + mention: "%{name} 在此提及了你:" new_followers_summary: - one: 您新獲得了 1 位關注者!恭喜! - other: 您新獲得了 %{count} 位關注者!好厲害! + one: 而且,你不在的時候,有一個人關注你! 耶! + other: 而且,你不在的時候,有 %{count} 個人關注你了! 好棒! subject: - one: "自從上次登入以來,您收到 1 則新的通知 \U0001F418" - other: "自從上次登入以來,您收到 %{count} 則新的通知 \U0001F418" + one: "自從上次登入以來,你收到 1 則新的通知 \U0001F418" + other: "自從上次登入以來,你收到 %{count} 則新的通知 \U0001F418" + title: 你不在的時候... favourite: - body: 您的文章被 %{name} 收藏 - subject: "%{name} 將您的文章加入了最愛" + body: '你的嘟文被 %{name} 加入了最愛:' + subject: "%{name} 將你的嘟文加入了最愛" + title: 新的最愛 follow: - body: "%{name} 開始關注您!" - subject: "%{name} 開始關注您" + body: "%{name} 開始關注你!" + subject: "%{name} 開始關注你" + title: 新的關注者 follow_request: - body: "%{name} 要求關注您" - subject: 等待關注您的使用者︰ %{name} + action: 處理關注請求 + body: "%{name} 要求關注你" + subject: 等待關注你的使用者︰ %{name} + title: 新的關注請求 mention: - body: "%{name} 在文章中提及您︰" - subject: "%{name} 在文章中提及您" + action: 回覆 + body: "%{name} 在嘟文中提及你:" + subject: "%{name} 在嘟文中提及你" + title: 新的提及 reblog: - body: 您的文章被 %{name} 轉推 - subject: "%{name} 轉推了您的文章" + body: '你的嘟文被 %{name} 轉嘟:' + subject: "%{name} 轉嘟了你的嘟文" + title: 新的轉嘟 number: human: decimal_units: @@ -232,46 +586,114 @@ zh-TW: trillion: T unit: '' pagination: + newer: 較新 next: 下一頁 + older: 較舊 prev: 上一頁 - truncate: "……" + truncate: '' + preferences: + languages: 語言 + other: 其他 + publishing: 發佈 + web: 站內 remote_follow: - acct: 請輸入您的︰使用者名稱@服務點網域 + acct: 請輸入您的︰使用者名稱@站點網域 missing_resource: 無法找到資源 proceed: 下一步 - prompt: 您希望關注︰ + prompt: '您希望關注:' + remote_unfollow: + error: 錯誤 + title: 標題 + unfollowed: 取消關注 sessions: activity: 最近活動 browser: 瀏覽器 + browsers: + alipay: 支付寶 + blackberry: 黑莓機 + chrome: Chrome 瀏覽器 + edge: Microsoft Edge 瀏覽器 + electron: Electron 瀏覽器 + firefox: Firefox 瀏覽器 + generic: 未知的瀏覽器 + ie: Internet Explorer 瀏覽器 + micro_messenger: 微信 + nokia: Nokia S40 Ovi 瀏覽器 + opera: Opera 瀏覽器 + otter: Otter 瀏覽器 + phantom_js: PhantomJS 瀏覽器 + qq: QQ 瀏覽器 + safari: Safari 瀏覽器 + uc_browser: UC 瀏覽器 + weibo: 新浪微博 current_session: 目前的 session description: "%{platform} 上的 %{browser}" explanation: 這些是現在正登入於你的 Mastodon 帳號的瀏覽器。 + ip: IP 位址 + platforms: + adobe_air: '' + linux: '' + mac: '' + other: 未知平台 revoke: 取消 - revoke_success: Session 取消成功。 + revoke_success: Session 取消成功 + title: 作業階段 settings: authorized_apps: 已授權應用程式 back: 回到 Mastodon + delete: 刪除帳戶 development: 開發 - edit_profile: 修改個人資料 + edit_profile: 編輯使用者資訊 export: 匯出 - followers: 授權追蹤者 + followers: 授權關注者 import: 匯入 + migrate: 帳戶搬遷 notifications: 通知 preferences: 偏好設定 settings: 設定 two_factor_authentication: 兩階段認證 + your_apps: 你的應用程式 statuses: + attached: + description: 附件: %{attached} + image: + one: "%{count} 幅圖片" + other: "%{count} 幅圖片" + video: + one: "%{count} 段影片" + other: "%{count} 段影片" + boosted_from_html: 轉嘟自 %{acct_link} + content_warning: 內容警告: %{warning} + disallowed_hashtags: + one: 包含不允許的標籤: %{tags} + other: 包含不允許的標籤: %{tags} + language_detection: 自動偵測語言 open_in_web: 以網頁開啟 over_character_limit: 超過了 %{max} 字的限制 + pin_errors: + limit: 你所置頂的嘟文數量已經達到上限 + ownership: 不能置頂他人的嘟文 + private: 不能置頂非公開的嘟文 + reblog: 不能置頂轉嘟 show_more: 顯示更多 + title: '%{name}: "%{quote}"' visibilities: - private: 只有關注您的人能看 + private: 僅關注者 + private_long: 只有關注你的人能看到 public: 公開 + public_long: 所有人都能看到 unlisted: 公開,但不在公共時間軸顯示 + unlisted_long: 所有人都能看到,但不會出現在公共時間軸上 stream_entries: click_to_show: 點選顯示 - reblogged: 轉推 + pinned: 置頂嘟文 + reblogged: 轉嘟 sensitive_content: 敏感內容 + terms: + title: "%{instance} 使用條款和隱私權政策" + themes: + contrast: 高對比 + mastodon-light: Mastodon (亮色主題) time: formats: default: "%Y年%-m月%d日 %H:%M" @@ -280,11 +702,43 @@ zh-TW: description_html: 啟用兩階段認證後,登入時將需要使手機、或其他種類認證器產生的代碼。 disable: 停用 enable: 啟用 + enabled: 兩階段認證已啟用 enabled_success: 已成功啟用兩階段認證 + generate_recovery_codes: 產生備用驗證碼 instructions_html: "請用您手機的認證器應用程式(如 Google Authenticator、Authy),掃描這裡的 QR 圖形碼。在兩階段認證啟用後,您登入時將須要使用此應用程式產生的認證碼。" - manual_instructions: 如果您無法掃描 QR 圖形碼,請手動輸入︰ + lost_recovery_codes: 讓你可以在遺失手機時,使用備用驗證碼登入。如果你遺失了備用驗證碼,可以在這裏產生一批新的,舊有的備用驗證碼將會失效。 + manual_instructions: '如果您無法掃描 QR 圖形碼,請手動輸入:' + recovery_codes: 備份備用驗證碼 + recovery_codes_regenerated: 成功產生新的備用驗證碼 + recovery_instructions_html: 如果你的手機無法使用,你可以使用下列任意一個備用驗證碼來重新獲得帳戶的訪問權。請妥善保管好你的備用驗證碼(例如,你可以將它們列印出來,與你的其他重要文件放在一起)。 setup: 設定 - wrong_code: 您輸入的認證碼並不正確!可能伺服器時間和您手機不一致,請檢查您手機的時間,或與本站管理員聯絡。 + wrong_code: 您輸入的認證碼無效! 請確認伺服器時間與設備時間是否正確? + user_mailer: + backup_ready: + explanation: 你要求的 Mastodon 帳號完整備份檔案現已就緒,可供下載! + subject: 你的備份檔已可供下載 + title: 檔案匯出 + welcome: + edit_profile_action: 設定個人資料 + edit_profile_step: 你可以設定你的個人資料,包括上傳頭像、橫幅圖片、更改顯示名稱等等。如果你想在新的關注者關注你之前對他們進行審核,你也可以選擇為你的帳戶設為「私人」。 + explanation: 下面是幾個小幫助,希望它們能幫到你 + final_action: 開始嘟嘟 + final_step: '開始嘟嘟吧! 即使你現在沒有關注者,其他人仍然能在本站時間軸或著話題標籤等地方看到你的公開嘟文。試著用 #introductions 這個話題標籤介紹一下自己吧。' + full_handle: 你的完整帳戶名稱 + full_handle_hint: 你需要把這個告訴你的朋友們,這樣他們就能從另一個站點向你發送訊息或著關注你。 + review_preferences_action: 更改偏好設定 + review_preferences_step: 記得調整你的偏好設定,比如你想接收什麼類型的電子郵件,或著你想把你的嘟文可見範圍預設設定什麼級別。如果你沒有暈車的話,考慮一下啟用「自動播放 GIF 動畫」這個選項吧。 + subject: 歡迎來到 Mastodon + tip_bridge_html: 如果你剛從 Twitter 來到這裡,你可以在橋樑站(bridge app)上尋找你的朋友。當然,前提是他們也登入了橋樑站! + tip_federated_timeline: 跨站公共時間軸可以讓你一窺更廣闊的 Mastodon 網路。不過,由於它們只顯示你的鄰居們所訂閱的內容,所以並不是全部。 + tip_following: 預設情況下,你會自動關注你所在站點的管理員。想結交更多有趣的人的話,記得多逛逛本站時間軸與跨站公共時間軸哦。 + tip_local_timeline: 本站時間軸可以讓你一窺 %{instance} 上的使用者。他們就是離你最近的鄰居! + tip_mobile_webapp: 如果你的行動裝置瀏覽器允許你將 Mastodon 新增到主螢幕,你就能夠接收推送訊息。它就像手機APP一樣好用! + tips: 小幫手 + title: "%{name} 歡迎你的加入!" users: - invalid_email: 信箱地址格式不正確 + invalid_email: E-mail格式不正確 invalid_otp_token: 兩階段認證碼不正確 + otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫 + seamless_external_login: 由於你是從外部系統登入,所以不能設定密碼與電子郵件。 + signed_in_as: 目前登入的帳戶: -- cgit From cdb101340a20183a82889f811d9311c370c855e5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 29 Jun 2018 15:34:36 +0200 Subject: Keyword/phrase filtering (#7905) * Add keyword filtering GET|POST /api/v1/filters GET|PUT|DELETE /api/v1/filters/:id - Irreversible filters can drop toots from home or notifications - Other filters can hide toots through the client app - Filters use a phrase valid in particular contexts, expiration * Make sure expired filters don't get applied client-side * Add missing API methods * Remove "regex filter" from column settings * Add tests * Add test for FeedManager * Add CustomFilter test * Add UI for managing filters * Add streaming API event to allow syncing filters * Fix tests --- app/controllers/api/v1/filters_controller.rb | 48 +++++++++++++ app/controllers/filters_controller.rb | 57 +++++++++++++++ app/javascript/mastodon/actions/filters.js | 26 +++++++ app/javascript/mastodon/actions/streaming.js | 4 ++ app/javascript/mastodon/components/status.js | 15 ++++ app/javascript/mastodon/components/status_list.js | 5 +- .../mastodon/containers/status_container.js | 2 +- .../components/column_settings.js | 16 +---- .../containers/reply_indicator_container.js | 2 +- .../mastodon/features/direct_timeline/index.js | 5 +- .../home_timeline/components/column_settings.js | 16 +---- app/javascript/mastodon/features/status/index.js | 3 +- .../ui/containers/status_list_container.js | 14 ---- app/javascript/mastodon/features/ui/index.js | 2 + app/javascript/mastodon/reducers/filters.js | 11 +++ app/javascript/mastodon/reducers/index.js | 2 + app/javascript/mastodon/selectors/index.js | 42 +++++++++-- app/javascript/styles/mastodon/components.scss | 14 ++++ app/lib/feed_manager.rb | 16 +++++ app/models/account.rb | 1 + app/models/concerns/expireable.rb | 24 +++++++ app/models/custom_filter.rb | 55 +++++++++++++++ app/models/invite.rb | 18 +---- app/serializers/rest/filter_serializer.rb | 5 ++ app/views/filters/_fields.html.haml | 11 +++ app/views/filters/edit.html.haml | 8 +++ app/views/filters/index.html.haml | 20 ++++++ app/views/filters/new.html.haml | 8 +++ config/locales/en.yml | 16 +++++ config/locales/simple_form.en.yml | 6 ++ config/navigation.rb | 1 + config/routes.rb | 2 + db/migrate/20180628181026_create_custom_filters.rb | 13 ++++ db/schema.rb | 14 +++- spec/controllers/api/v1/filter_controller_spec.rb | 81 ++++++++++++++++++++++ spec/fabricators/custom_filter_fabricator.rb | 6 ++ spec/lib/feed_manager_spec.rb | 8 +++ spec/models/custom_filter_spec.rb | 5 ++ 38 files changed, 530 insertions(+), 72 deletions(-) create mode 100644 app/controllers/api/v1/filters_controller.rb create mode 100644 app/controllers/filters_controller.rb create mode 100644 app/javascript/mastodon/actions/filters.js create mode 100644 app/javascript/mastodon/reducers/filters.js create mode 100644 app/models/concerns/expireable.rb create mode 100644 app/models/custom_filter.rb create mode 100644 app/serializers/rest/filter_serializer.rb create mode 100644 app/views/filters/_fields.html.haml create mode 100644 app/views/filters/edit.html.haml create mode 100644 app/views/filters/index.html.haml create mode 100644 app/views/filters/new.html.haml create mode 100644 db/migrate/20180628181026_create_custom_filters.rb create mode 100644 spec/controllers/api/v1/filter_controller_spec.rb create mode 100644 spec/fabricators/custom_filter_fabricator.rb create mode 100644 spec/models/custom_filter_spec.rb (limited to 'config') diff --git a/app/controllers/api/v1/filters_controller.rb b/app/controllers/api/v1/filters_controller.rb new file mode 100644 index 000000000..c89722b85 --- /dev/null +++ b/app/controllers/api/v1/filters_controller.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class Api::V1::FiltersController < Api::BaseController + before_action -> { doorkeeper_authorize! :read }, only: [:index, :show] + before_action -> { doorkeeper_authorize! :write }, except: [:index, :show] + before_action :require_user! + before_action :set_filters, only: :index + before_action :set_filter, only: [:show, :update, :destroy] + + respond_to :json + + def index + render json: @filters, each_serializer: REST::FilterSerializer + end + + def create + @filter = current_account.custom_filters.create!(resource_params) + render json: @filter, serializer: REST::FilterSerializer + end + + def show + render json: @filter, serializer: REST::FilterSerializer + end + + def update + @filter.update!(resource_params) + render json: @filter, serializer: REST::FilterSerializer + end + + def destroy + @filter.destroy! + render_empty + end + + private + + def set_filters + @filters = current_account.custom_filters + end + + def set_filter + @filter = current_account.custom_filters.find(params[:id]) + end + + def resource_params + params.permit(:phrase, :expires_at, :irreversible, context: []) + end +end diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb new file mode 100644 index 000000000..03403a1ba --- /dev/null +++ b/app/controllers/filters_controller.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +class FiltersController < ApplicationController + include Authorization + + layout 'admin' + + before_action :set_filters, only: :index + before_action :set_filter, only: [:edit, :update, :destroy] + + def index + @filters = current_account.custom_filters + end + + def new + @filter = current_account.custom_filters.build + end + + def create + @filter = current_account.custom_filters.build(resource_params) + + if @filter.save + redirect_to filters_path + else + render action: :new + end + end + + def edit; end + + def update + if @filter.update(resource_params) + redirect_to filters_path + else + render action: :edit + end + end + + def destroy + @filter.destroy + redirect_to filters_path + end + + private + + def set_filters + @filters = current_account.custom_filters + end + + def set_filter + @filter = current_account.custom_filters.find(params[:id]) + end + + def resource_params + params.require(:custom_filter).permit(:phrase, :expires_in, :irreversible, context: []) + end +end diff --git a/app/javascript/mastodon/actions/filters.js b/app/javascript/mastodon/actions/filters.js new file mode 100644 index 000000000..7fa1c9a70 --- /dev/null +++ b/app/javascript/mastodon/actions/filters.js @@ -0,0 +1,26 @@ +import api from '../api'; + +export const FILTERS_FETCH_REQUEST = 'FILTERS_FETCH_REQUEST'; +export const FILTERS_FETCH_SUCCESS = 'FILTERS_FETCH_SUCCESS'; +export const FILTERS_FETCH_FAIL = 'FILTERS_FETCH_FAIL'; + +export const fetchFilters = () => (dispatch, getState) => { + dispatch({ + type: FILTERS_FETCH_REQUEST, + skipLoading: true, + }); + + api(getState) + .get('/api/v1/filters') + .then(({ data }) => dispatch({ + type: FILTERS_FETCH_SUCCESS, + filters: data, + skipLoading: true, + })) + .catch(err => dispatch({ + type: FILTERS_FETCH_FAIL, + err, + skipLoading: true, + skipAlert: true, + })); +}; diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index f56853bff..32fc67e67 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -6,6 +6,7 @@ import { disconnectTimeline, } from './timelines'; import { updateNotifications, expandNotifications } from './notifications'; +import { fetchFilters } from './filters'; import { getLocale } from '../locales'; const { messages } = getLocale(); @@ -30,6 +31,9 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null) case 'notification': dispatch(updateNotifications(JSON.parse(data.payload), messages, locale)); break; + case 'filters_changed': + dispatch(fetchFilters()); + break; } }, }; diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index fd08ff3b7..922b609ec 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -157,6 +157,21 @@ export default class Status extends ImmutablePureComponent { ); } + if (status.get('filtered') || status.getIn(['reblog', 'filtered'])) { + const minHandlers = this.props.muted ? {} : { + moveUp: this.handleHotkeyMoveUp, + moveDown: this.handleHotkeyMoveDown, + }; + + return ( + +
    + +
    +
    + ); + } + if (featured) { prepend = (
    diff --git a/app/javascript/mastodon/components/status_list.js b/app/javascript/mastodon/components/status_list.js index 1c34d0640..68c9eef54 100644 --- a/app/javascript/mastodon/components/status_list.js +++ b/app/javascript/mastodon/components/status_list.js @@ -25,6 +25,7 @@ export default class StatusList extends ImmutablePureComponent { prepend: PropTypes.node, emptyMessage: PropTypes.node, alwaysPrepend: PropTypes.bool, + timelineId: PropTypes.string.isRequired, }; static defaultProps = { @@ -70,7 +71,7 @@ export default class StatusList extends ImmutablePureComponent { } render () { - const { statusIds, featuredStatusIds, onLoadMore, ...other } = this.props; + const { statusIds, featuredStatusIds, onLoadMore, timelineId, ...other } = this.props; const { isLoading, isPartial } = other; if (isPartial) { @@ -102,6 +103,7 @@ export default class StatusList extends ImmutablePureComponent { id={statusId} onMoveUp={this.handleMoveUp} onMoveDown={this.handleMoveDown} + contextType={timelineId} /> )) ) : null; @@ -114,6 +116,7 @@ export default class StatusList extends ImmutablePureComponent { featured onMoveUp={this.handleMoveUp} onMoveDown={this.handleMoveDown} + contextType={timelineId} /> )).concat(scrollableContent); } diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js index 3e7b5215b..eb6329fdc 100644 --- a/app/javascript/mastodon/containers/status_container.js +++ b/app/javascript/mastodon/containers/status_container.js @@ -42,7 +42,7 @@ const makeMapStateToProps = () => { const getStatus = makeGetStatus(); const mapStateToProps = (state, props) => ({ - status: getStatus(state, props.id), + status: getStatus(state, props), }); return mapStateToProps; diff --git a/app/javascript/mastodon/features/community_timeline/components/column_settings.js b/app/javascript/mastodon/features/community_timeline/components/column_settings.js index 3a1d19aa8..f4325f58d 100644 --- a/app/javascript/mastodon/features/community_timeline/components/column_settings.js +++ b/app/javascript/mastodon/features/community_timeline/components/column_settings.js @@ -1,15 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import SettingText from '../../../components/setting_text'; +import { injectIntl, FormattedMessage } from 'react-intl'; import SettingToggle from '../../notifications/components/setting_toggle'; -const messages = defineMessages({ - filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' }, - settings: { id: 'home.settings', defaultMessage: 'Column settings' }, -}); - @injectIntl export default class ColumnSettings extends React.PureComponent { @@ -21,19 +15,13 @@ export default class ColumnSettings extends React.PureComponent { }; render () { - const { settings, onChange, intl } = this.props; + const { settings, onChange } = this.props; return (
    } />
    - - - -
    - -
    ); } diff --git a/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js b/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js index 73f394c1a..5eb1eb72a 100644 --- a/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js +++ b/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js @@ -7,7 +7,7 @@ const makeMapStateToProps = () => { const getStatus = makeGetStatus(); const mapStateToProps = state => ({ - status: getStatus(state, state.getIn(['compose', 'in_reply_to'])), + status: getStatus(state, { id: state.getIn(['compose', 'in_reply_to']) }), }); return mapStateToProps; diff --git a/app/javascript/mastodon/features/direct_timeline/index.js b/app/javascript/mastodon/features/direct_timeline/index.js index fda57f69a..63dc41d9e 100644 --- a/app/javascript/mastodon/features/direct_timeline/index.js +++ b/app/javascript/mastodon/features/direct_timeline/index.js @@ -7,7 +7,6 @@ import ColumnHeader from '../../components/column_header'; import { expandDirectTimeline } from '../../actions/timelines'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import ColumnSettingsContainer from './containers/column_settings_container'; import { connectDirectStream } from '../../actions/streaming'; const messages = defineMessages({ @@ -86,9 +85,7 @@ export default class DirectTimeline extends React.PureComponent { onClick={this.handleHeaderClick} pinned={pinned} multiColumn={multiColumn} - > - - + /> @@ -33,12 +27,6 @@ export default class ColumnSettings extends React.PureComponent {
    } />
    - - - -
    - -
    ); } diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index ca792043f..3c66536d4 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -58,7 +58,7 @@ const makeMapStateToProps = () => { const getStatus = makeGetStatus(); const mapStateToProps = (state, props) => { - const status = getStatus(state, props.params.statusId); + const status = getStatus(state, { id: props.params.statusId }); let ancestorsIds = Immutable.List(); let descendantsIds = Immutable.List(); @@ -336,6 +336,7 @@ export default class Status extends ImmutablePureComponent { id={id} onMoveUp={this.handleMoveUp} onMoveDown={this.handleMoveDown} + contextType='thread' /> )); } diff --git a/app/javascript/mastodon/features/ui/containers/status_list_container.js b/app/javascript/mastodon/features/ui/containers/status_list_container.js index e5b1edc4a..3df5b7bea 100644 --- a/app/javascript/mastodon/features/ui/containers/status_list_container.js +++ b/app/javascript/mastodon/features/ui/containers/status_list_container.js @@ -11,15 +11,6 @@ const makeGetStatusIds = () => createSelector([ (state, { type }) => state.getIn(['timelines', type, 'items'], ImmutableList()), (state) => state.get('statuses'), ], (columnSettings, statusIds, statuses) => { - const rawRegex = columnSettings.getIn(['regex', 'body'], '').trim(); - let regex = null; - - try { - regex = rawRegex && new RegExp(rawRegex, 'i'); - } catch (e) { - // Bad regex, don't affect filters - } - return statusIds.filter(id => { if (id === null) return true; @@ -34,11 +25,6 @@ const makeGetStatusIds = () => createSelector([ showStatus = showStatus && (statusForId.get('in_reply_to_id') === null || statusForId.get('in_reply_to_account_id') === me); } - if (showStatus && regex && statusForId.get('account') !== me) { - const searchIndex = statusForId.get('reblog') ? statuses.getIn([statusForId.get('reblog'), 'search_index']) : statusForId.get('search_index'); - showStatus = !regex.test(searchIndex); - } - return showStatus; }); }); diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index 3c1a266e3..56a856230 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -12,6 +12,7 @@ import { debounce } from 'lodash'; import { uploadCompose, resetCompose } from '../../actions/compose'; import { expandHomeTimeline } from '../../actions/timelines'; import { expandNotifications } from '../../actions/notifications'; +import { fetchFilters } from '../../actions/filters'; import { clearHeight } from '../../actions/height_cache'; import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers'; import UploadArea from './components/upload_area'; @@ -297,6 +298,7 @@ export default class UI extends React.PureComponent { this.props.dispatch(expandHomeTimeline()); this.props.dispatch(expandNotifications()); + setTimeout(() => this.props.dispatch(fetchFilters()), 500); } componentDidMount () { diff --git a/app/javascript/mastodon/reducers/filters.js b/app/javascript/mastodon/reducers/filters.js new file mode 100644 index 000000000..33f0c6732 --- /dev/null +++ b/app/javascript/mastodon/reducers/filters.js @@ -0,0 +1,11 @@ +import { FILTERS_FETCH_SUCCESS } from '../actions/filters'; +import { List as ImmutableList, fromJS } from 'immutable'; + +export default function filters(state = ImmutableList(), action) { + switch(action.type) { + case FILTERS_FETCH_SUCCESS: + return fromJS(action.filters); + default: + return state; + } +}; diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js index 3d9a6a132..4a981fada 100644 --- a/app/javascript/mastodon/reducers/index.js +++ b/app/javascript/mastodon/reducers/index.js @@ -26,6 +26,7 @@ import height_cache from './height_cache'; import custom_emojis from './custom_emojis'; import lists from './lists'; import listEditor from './list_editor'; +import filters from './filters'; const reducers = { dropdown_menu, @@ -55,6 +56,7 @@ const reducers = { custom_emojis, lists, listEditor, + filters, }; export default combineReducers(reducers); diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js index e47ec5183..56eca1f02 100644 --- a/app/javascript/mastodon/selectors/index.js +++ b/app/javascript/mastodon/selectors/index.js @@ -19,16 +19,44 @@ export const makeGetAccount = () => { }); }; +const toServerSideType = columnType => { + switch (columnType) { + case 'home': + case 'notifications': + case 'public': + case 'thread': + return columnType; + default: + if (columnType.indexOf('list:') > -1) { + return 'home'; + } else { + return 'public'; // community, account, hashtag + } + } +}; + +const escapeRegExp = string => + string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string + +const regexFromFilters = filters => { + if (filters.size === 0) { + return null; + } + + return new RegExp(filters.map(filter => escapeRegExp(filter.get('phrase'))).join('|'), 'i'); +}; + export const makeGetStatus = () => { return createSelector( [ - (state, id) => state.getIn(['statuses', id]), - (state, id) => state.getIn(['statuses', state.getIn(['statuses', id, 'reblog'])]), - (state, id) => state.getIn(['accounts', state.getIn(['statuses', id, 'account'])]), - (state, id) => state.getIn(['accounts', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'account'])]), + (state, { id }) => state.getIn(['statuses', id]), + (state, { id }) => state.getIn(['statuses', state.getIn(['statuses', id, 'reblog'])]), + (state, { id }) => state.getIn(['accounts', state.getIn(['statuses', id, 'account'])]), + (state, { id }) => state.getIn(['accounts', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'account'])]), + (state, { contextType }) => state.get('filters', ImmutableList()).filter(filter => contextType && filter.get('context').includes(toServerSideType(contextType)) && (filter.get('expires_at') === null || Date.parse(filter.get('expires_at')) > (new Date()))), ], - (statusBase, statusReblog, accountBase, accountReblog) => { + (statusBase, statusReblog, accountBase, accountReblog, filters) => { if (!statusBase) { return null; } @@ -39,9 +67,13 @@ export const makeGetStatus = () => { statusReblog = null; } + const regex = regexFromFilters(filters); + const filtered = regex && regex.test(statusBase.get('reblog') ? statusReblog.get('search_index') : statusBase.get('search_index')); + return statusBase.withMutations(map => { map.set('reblog', statusReblog); map.set('account', accountBase); + map.set('filtered', filtered); }); } ); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index c16cf3437..5fa73d58a 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -725,6 +725,20 @@ vertical-align: middle; } +.status__wrapper--filtered { + color: $dark-text-color; + border: 0; + font-size: inherit; + text-align: center; + line-height: inherit; + margin: 0; + padding: 15px; + box-sizing: border-box; + width: 100%; + clear: both; + border-bottom: 1px solid lighten($ui-base-color, 8%); +} + .status__prepend-icon-wrapper { left: -26px; position: absolute; diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index c18c07b33..ee9185d34 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -153,6 +153,7 @@ class FeedManager def filter_from_home?(status, receiver_id) return false if receiver_id == status.account_id return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) + return true if phrase_filtered?(status, receiver_id, :home) check_for_blocks = status.mentions.pluck(:account_id) check_for_blocks.concat([status.account_id]) @@ -177,6 +178,7 @@ class FeedManager def filter_from_mentions?(status, receiver_id) return true if receiver_id == status.account_id + return true if phrase_filtered?(status, receiver_id, :notifications) # This filter is called from NotifyService, but already after the sender of # the notification has been checked for mute/block. Therefore, it's not @@ -190,6 +192,20 @@ class FeedManager should_filter end + def phrase_filtered?(status, receiver_id, context) + active_filters = Rails.cache.fetch("filters:#{receiver_id}") { CustomFilter.where(account_id: receiver_id).active_irreversible.to_a }.to_a + + active_filters.select! { |filter| filter.context.include?(context.to_s) && !filter.expired? } + active_filters.map! { |filter| Regexp.new(Regexp.escape(filter.phrase), true) } + + return false if active_filters.empty? + + combined_regex = active_filters.reduce { |memo, obj| Regexp.union(memo, obj) } + + !combined_regex.match(status.text).nil? || + (status.spoiler_text.present? && !combined_regex.match(status.spoiler_text).nil?) + end + # Adds a status to an account's feed, returning true if a status was # added, and false if it was not added to the feed. Note that this is # an internal helper: callers must call trim or push updates if diff --git a/app/models/account.rb b/app/models/account.rb index c3eea79cc..40a45b1f8 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -99,6 +99,7 @@ class Account < ApplicationRecord has_many :targeted_reports, class_name: 'Report', foreign_key: :target_account_id has_many :report_notes, dependent: :destroy + has_many :custom_filters, inverse_of: :account, dependent: :destroy # Moderation notes has_many :account_moderation_notes, dependent: :destroy diff --git a/app/models/concerns/expireable.rb b/app/models/concerns/expireable.rb new file mode 100644 index 000000000..444ccdfdb --- /dev/null +++ b/app/models/concerns/expireable.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Expireable + extend ActiveSupport::Concern + + included do + scope :expired, -> { where.not(expires_at: nil).where('expires_at < ?', Time.now.utc) } + + attr_reader :expires_in + + def expires_in=(interval) + self.expires_at = interval.to_i.seconds.from_now unless interval.blank? + @expires_in = interval + end + + def expire! + touch(:expires_at) + end + + def expired? + !expires_at.nil? && expires_at < Time.now.utc + end + end +end diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb new file mode 100644 index 000000000..2c1a54375 --- /dev/null +++ b/app/models/custom_filter.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true +# == Schema Information +# +# Table name: custom_filters +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# expires_at :datetime +# phrase :text default(""), not null +# context :string default([]), not null, is an Array +# irreversible :boolean default(FALSE), not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class CustomFilter < ApplicationRecord + VALID_CONTEXTS = %w( + home + notifications + public + thread + ).freeze + + include Expireable + + belongs_to :account + + validates :phrase, :context, presence: true + validate :context_must_be_valid + validate :irreversible_must_be_within_context + + scope :active_irreversible, -> { where(irreversible: true).where(Arel.sql('expires_at IS NULL OR expires_at > NOW()')) } + + before_validation :clean_up_contexts + after_commit :remove_cache + + private + + def clean_up_contexts + self.context = Array(context).map(&:strip).map(&:presence).compact + end + + def remove_cache + Rails.cache.delete("filters:#{account_id}") + Redis.current.publish("timeline:#{account_id}", Oj.dump(event: :filters_changed)) + end + + def context_must_be_valid + errors.add(:context, I18n.t('filters.errors.invalid_context')) if context.empty? || context.any? { |c| !VALID_CONTEXTS.include?(c) } + end + + def irreversible_must_be_within_context + errors.add(:irreversible, I18n.t('filters.errors.invalid_irreversible')) if irreversible? && !context.include?('home') && !context.include?('notifications') + end +end diff --git a/app/models/invite.rb b/app/models/invite.rb index d0cc427c4..fe2322462 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -15,33 +15,19 @@ # class Invite < ApplicationRecord + include Expireable + belongs_to :user has_many :users, inverse_of: :invite scope :available, -> { where(expires_at: nil).or(where('expires_at >= ?', Time.now.utc)) } - scope :expired, -> { where.not(expires_at: nil).where('expires_at < ?', Time.now.utc) } before_validation :set_code - attr_reader :expires_in - - def expires_in=(interval) - self.expires_at = interval.to_i.seconds.from_now unless interval.blank? - @expires_in = interval - end - def valid_for_use? (max_uses.nil? || uses < max_uses) && !expired? end - def expire! - touch(:expires_at) - end - - def expired? - !expires_at.nil? && expires_at < Time.now.utc - end - private def set_code diff --git a/app/serializers/rest/filter_serializer.rb b/app/serializers/rest/filter_serializer.rb new file mode 100644 index 000000000..07f2516f8 --- /dev/null +++ b/app/serializers/rest/filter_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class REST::FilterSerializer < ActiveModel::Serializer + attributes :id, :phrase, :context, :expires_at +end diff --git a/app/views/filters/_fields.html.haml b/app/views/filters/_fields.html.haml new file mode 100644 index 000000000..af5d648b8 --- /dev/null +++ b/app/views/filters/_fields.html.haml @@ -0,0 +1,11 @@ +.fields-group + = f.input :phrase, as: :string, wrapper: :with_block_label + +.fields-group + = f.input :context, wrapper: :with_block_label, collection: CustomFilter::VALID_CONTEXTS, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', label_method: lambda { |context| I18n.t("filters.contexts.#{context}") }, include_blank: false + +.fields-group + = f.input :irreversible, wrapper: :with_label + +.fields-group + = f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt') diff --git a/app/views/filters/edit.html.haml b/app/views/filters/edit.html.haml new file mode 100644 index 000000000..e971215ac --- /dev/null +++ b/app/views/filters/edit.html.haml @@ -0,0 +1,8 @@ +- content_for :page_title do + = t('filters.edit.title') + += simple_form_for @filter, url: filter_path(@filter), method: :put do |f| + = render 'fields', f: f + + .actions + = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/filters/index.html.haml b/app/views/filters/index.html.haml new file mode 100644 index 000000000..18ebee570 --- /dev/null +++ b/app/views/filters/index.html.haml @@ -0,0 +1,20 @@ +- content_for :page_title do + = t('filters.index.title') + +.table-wrapper + %table.table + %thead + %tr + %th= t('simple_form.labels.defaults.phrase') + %th= t('simple_form.labels.defaults.context') + %th + %tbody + - @filters.each do |filter| + %tr + %td= filter.phrase + %td= filter.context.map { |context| I18n.t("filters.contexts.#{context}") }.join(', ') + %td + = table_link_to 'pencil', t('filters.edit.title'), edit_filter_path(filter) + = table_link_to 'times', t('filters.index.delete'), filter_path(filter), method: :delete + += link_to t('filters.new.title'), new_filter_path, class: 'button' diff --git a/app/views/filters/new.html.haml b/app/views/filters/new.html.haml new file mode 100644 index 000000000..05bec343f --- /dev/null +++ b/app/views/filters/new.html.haml @@ -0,0 +1,8 @@ +- content_for :page_title do + = t('filters.new.title') + += simple_form_for @filter, url: filters_path do |f| + = render 'fields', f: f + + .actions + = f.button :button, t('filters.new.title'), type: :submit diff --git a/config/locales/en.yml b/config/locales/en.yml index 01e5dd2f8..5cb81ebe9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -474,6 +474,22 @@ en: follows: You follow mutes: You mute storage: Media storage + filters: + contexts: + home: Home timeline + notifications: Notifications + public: Public timelines + thread: Conversations + edit: + title: Edit filter + errors: + invalid_context: None or invalid context supplied + invalid_irreversible: Irreversible filtering only works with home or notifications context + index: + delete: Delete + title: Filters + new: + title: Add new filter followers: domain: Domain explanation_html: If you want to ensure the privacy of your statuses, you must be aware of who is following you. Your private statuses are delivered to all instances where you have followers. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances. diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 6783f0045..59133ea73 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -6,17 +6,20 @@ en: autofollow: People who sign up through the invite will automatically follow you avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px bot: This account mainly performs automated actions and might not be monitored + context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence display_name: one: 1 character left other: %{count} characters left fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers note: one: 1 character left other: %{count} characters left + phrase: Will be matched regardless of casing in text or content warning of a toot setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages @@ -39,6 +42,7 @@ en: chosen_languages: Filter languages confirm_new_password: Confirm new password confirm_password: Confirm password + context: Filter contexts current_password: Current password data: Data display_name: Display name @@ -46,6 +50,7 @@ en: expires_in: Expire after fields: Profile metadata header: Header + irreversible: Drop instead of hide locale: Interface language locked: Lock account max_uses: Max number of uses @@ -53,6 +58,7 @@ en: note: Bio otp_attempt: Two-factor code password: Password + phrase: Keyword or phrase setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting setting_default_language: Posting language diff --git a/config/navigation.rb b/config/navigation.rb index 2bee5a4f9..3f2e913c6 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -16,6 +16,7 @@ SimpleNavigation::Configuration.run do |navigation| settings.item :follower_domains, safe_join([fa_icon('users fw'), t('settings.followers')]), settings_follower_domains_url end + primary.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters} primary.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: proc { Setting.min_invite_role == 'user' } primary.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_url do |development| diff --git a/config/routes.rb b/config/routes.rb index a3cba24fc..5fdd3b390 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -114,6 +114,7 @@ Rails.application.routes.draw do resources :tags, only: [:show] resources :emojis, only: [:show] resources :invites, only: [:index, :create, :destroy] + resources :filters, except: [:show] get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy @@ -254,6 +255,7 @@ Rails.application.routes.draw do resources :mutes, only: [:index] resources :favourites, only: [:index] resources :reports, only: [:index, :create] + resources :filters, only: [:index, :create, :show, :update, :destroy] namespace :apps do get :verify_credentials, to: 'credentials#show' diff --git a/db/migrate/20180628181026_create_custom_filters.rb b/db/migrate/20180628181026_create_custom_filters.rb new file mode 100644 index 000000000..d19cf2e9d --- /dev/null +++ b/db/migrate/20180628181026_create_custom_filters.rb @@ -0,0 +1,13 @@ +class CreateCustomFilters < ActiveRecord::Migration[5.2] + def change + create_table :custom_filters do |t| + t.belongs_to :account, foreign_key: { on_delete: :cascade } + t.datetime :expires_at + t.text :phrase, null: false, default: '' + t.string :context, array: true, null: false, default: [] + t.boolean :irreversible, null: false, default: false + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 2853aef94..661fc8179 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2018_06_17_162849) do +ActiveRecord::Schema.define(version: 2018_06_28_181026) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -143,6 +143,17 @@ ActiveRecord::Schema.define(version: 2018_06_17_162849) do t.index ["shortcode", "domain"], name: "index_custom_emojis_on_shortcode_and_domain", unique: true end + create_table "custom_filters", force: :cascade do |t| + t.bigint "account_id" + t.datetime "expires_at" + t.text "phrase", default: "", null: false + t.string "context", default: [], null: false, array: true + t.boolean "irreversible", default: false, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_custom_filters_on_account_id" + end + create_table "domain_blocks", force: :cascade do |t| t.string "domain", default: "", null: false t.datetime "created_at", null: false @@ -561,6 +572,7 @@ ActiveRecord::Schema.define(version: 2018_06_17_162849) do add_foreign_key "blocks", "accounts", name: "fk_4269e03e65", on_delete: :cascade add_foreign_key "conversation_mutes", "accounts", name: "fk_225b4212bb", on_delete: :cascade add_foreign_key "conversation_mutes", "conversations", on_delete: :cascade + add_foreign_key "custom_filters", "accounts", on_delete: :cascade add_foreign_key "favourites", "accounts", name: "fk_5eb6c2b873", on_delete: :cascade add_foreign_key "favourites", "statuses", name: "fk_b0e856845e", on_delete: :cascade add_foreign_key "follow_requests", "accounts", column: "target_account_id", name: "fk_9291ec025d", on_delete: :cascade diff --git a/spec/controllers/api/v1/filter_controller_spec.rb b/spec/controllers/api/v1/filter_controller_spec.rb new file mode 100644 index 000000000..3ffd8f784 --- /dev/null +++ b/spec/controllers/api/v1/filter_controller_spec.rb @@ -0,0 +1,81 @@ +require 'rails_helper' + +RSpec.describe Api::V1::FiltersController, type: :controller do + render_views + + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'GET #index' do + let!(:filter) { Fabricate(:custom_filter, account: user.account) } + + it 'returns http success' do + get :index + expect(response).to have_http_status(200) + end + end + + describe 'POST #create' do + before do + post :create, params: { phrase: 'magic', context: %w(home), irreversible: true } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'creates a filter' do + filter = user.account.custom_filters.first + expect(filter).to_not be_nil + expect(filter.phrase).to eq 'magic' + expect(filter.context).to eq %w(home) + expect(filter.irreversible?).to be true + expect(filter.expires_at).to be_nil + end + end + + describe 'GET #show' do + let(:filter) { Fabricate(:custom_filter, account: user.account) } + + it 'returns http success' do + get :show, params: { id: filter.id } + expect(response).to have_http_status(200) + end + end + + describe 'PUT #update' do + let(:filter) { Fabricate(:custom_filter, account: user.account) } + + before do + put :update, params: { id: filter.id, phrase: 'updated' } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'updates the filter' do + expect(filter.reload.phrase).to eq 'updated' + end + end + + describe 'DELETE #destroy' do + let(:filter) { Fabricate(:custom_filter, account: user.account) } + + before do + delete :destroy, params: { id: filter.id } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'removes the filter' do + expect { filter.reload }.to raise_error ActiveRecord::RecordNotFound + end + end +end diff --git a/spec/fabricators/custom_filter_fabricator.rb b/spec/fabricators/custom_filter_fabricator.rb new file mode 100644 index 000000000..64297a7e3 --- /dev/null +++ b/spec/fabricators/custom_filter_fabricator.rb @@ -0,0 +1,6 @@ +Fabricator(:custom_filter) do + account + expires_at nil + phrase 'discourse' + context %w(home notifications) +end diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index 6ead5bbd9..d1b847675 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -126,6 +126,14 @@ RSpec.describe FeedManager do reblog = Fabricate(:status, reblog: status, account: jeff) expect(FeedManager.instance.filter?(:home, reblog, alice.id)).to be true end + + it 'returns true if status contains irreversibly muted phrase' do + alice.custom_filters.create!(phrase: 'farts', context: %w(home public), irreversible: true) + alice.custom_filters.create!(phrase: 'pop tarts', context: %w(home), irreversible: true) + alice.follow!(jeff) + status = Fabricate(:status, text: 'i sure like POP TARts', account: jeff) + expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true + end end context 'for mentions feed' do diff --git a/spec/models/custom_filter_spec.rb b/spec/models/custom_filter_spec.rb new file mode 100644 index 000000000..1024542e7 --- /dev/null +++ b/spec/models/custom_filter_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe CustomFilter, type: :model do + +end -- cgit From ddd0bb69e1d9ea98a0ea30717e9f25bcd50b41a3 Mon Sep 17 00:00:00 2001 From: MIYAGI Hikaru Date: Fri, 29 Jun 2018 22:36:02 +0900 Subject: Merge `HIDDEN_SERVICE_VIA_TRANSPARENT_PROXY` into `ALLOW_ACCESS_TO_HIDDEN_SERVICE` (#7901) If Mastodon accesses to the hidden service via transparent proxy, it's needed to avoid checking whether it's a private address, since `.onion` is resolved to a private address. I was previously using the `HIDDEN_SERVICE_VIA_TRANSPARENT_PROXY` to provide that function. However, I realized that using `HIDDEN_SERVICE_VIA_TRANSPARENT_PROXY` is redundant, since this specification is always used with `ALLOW_ACCESS_TO_HIDDEN_SERVICE`. Therefore, I decided to integrate the setting of `HIDDEN_SERVICE_VIA_TRANSPARENT_PROXY` into` ALLOW_ACCESS_TO_HIDDEN_SERVICE`. --- .env.production.sample | 2 -- app/lib/request.rb | 2 +- config/initializers/http_client_proxy.rb | 1 - docker-compose.yml | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) (limited to 'config') diff --git a/.env.production.sample b/.env.production.sample index 3047f7595..ebb078878 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -229,5 +229,3 @@ STREAMING_CLUSTER_NUM=1 # http_proxy=http://gateway.local:8118 # Access control for hidden service. # ALLOW_ACCESS_TO_HIDDEN_SERVICE=true -# If you use transparent proxy to access to hidden service, uncomment following for skipping private address check. -# HIDDEN_SERVICE_VIA_TRANSPARENT_PROXY=true diff --git a/app/lib/request.rb b/app/lib/request.rb index 397614fac..576ed23ca 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -154,7 +154,7 @@ class Request alias new open def thru_hidden_service?(host) - Rails.configuration.x.hidden_service_via_transparent_proxy && /\.(onion|i2p)$/.match(host) + Rails.configuration.x.access_to_hidden_service && /\.(onion|i2p)$/.match(host) end end end diff --git a/config/initializers/http_client_proxy.rb b/config/initializers/http_client_proxy.rb index 52c595c5d..e607aff3c 100644 --- a/config/initializers/http_client_proxy.rb +++ b/config/initializers/http_client_proxy.rb @@ -11,7 +11,6 @@ Rails.application.configure do end config.x.access_to_hidden_service = ENV['ALLOW_ACCESS_TO_HIDDEN_SERVICE'] == 'true' - config.x.hidden_service_via_transparent_proxy = ENV['HIDDEN_SERVICE_VIA_TRANSPARENT_PROXY'] == 'true' end module Goldfinger diff --git a/docker-compose.yml b/docker-compose.yml index b31095a54..c54c73e44 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,7 +83,6 @@ services: ## Uncomment to enable federation with tor instances along with adding the following ENV variables ## http_proxy=http://privoxy:8118 ## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true -## HIDDEN_SERVICE_VIA_TRANSPARENT_PROXY=true # tor: # build: https://github.com/usbsnowcrash/docker-tor.git # networks: -- cgit From dfd9cd463d4eca8f023182b0bb2f2536236e1a6e Mon Sep 17 00:00:00 2001 From: Marcin Mikołajczak Date: Sat, 30 Jun 2018 02:42:00 +0200 Subject: i18n: Update Polish translation (#7915) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcin Mikołajczak --- .../mastodon/locales/defaultMessages.json | 53 ++++------------------ app/javascript/mastodon/locales/pl.json | 14 +++--- config/locales/pl.yml | 16 +++++++ config/locales/simple_form.pl.yml | 6 +++ 4 files changed, 36 insertions(+), 53 deletions(-) (limited to 'config') diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index a27ca2dcf..098370d2c 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -334,6 +334,10 @@ }, { "descriptors": [ + { + "defaultMessage": "Filtered", + "id": "status.filtered" + }, { "defaultMessage": "Pinned toot", "id": "status.pinned" @@ -632,21 +636,9 @@ }, { "descriptors": [ - { - "defaultMessage": "Filter out by regular expressions", - "id": "home.column_settings.filter_regex" - }, - { - "defaultMessage": "Column settings", - "id": "home.settings" - }, { "defaultMessage": "Media Only", "id": "community.column_settings.media_only" - }, - { - "defaultMessage": "Advanced", - "id": "home.column_settings.advanced" } ], "path": "app/javascript/mastodon/features/community_timeline/components/column_settings.json" @@ -1019,23 +1011,6 @@ ], "path": "app/javascript/mastodon/features/compose/index.json" }, - { - "descriptors": [ - { - "defaultMessage": "Filter out by regular expressions", - "id": "home.column_settings.filter_regex" - }, - { - "defaultMessage": "Column settings", - "id": "home.settings" - }, - { - "defaultMessage": "Advanced", - "id": "home.column_settings.advanced" - } - ], - "path": "app/javascript/mastodon/features/direct_timeline/components/column_settings.json" - }, { "descriptors": [ { @@ -1221,14 +1196,6 @@ }, { "descriptors": [ - { - "defaultMessage": "Filter out by regular expressions", - "id": "home.column_settings.filter_regex" - }, - { - "defaultMessage": "Column settings", - "id": "home.settings" - }, { "defaultMessage": "Basic", "id": "home.column_settings.basic" @@ -1240,10 +1207,6 @@ { "defaultMessage": "Show replies", "id": "home.column_settings.show_replies" - }, - { - "defaultMessage": "Advanced", - "id": "home.column_settings.advanced" } ], "path": "app/javascript/mastodon/features/home_timeline/components/column_settings.json" @@ -1934,10 +1897,6 @@ "defaultMessage": "Notifications", "id": "tabs_bar.notifications" }, - { - "defaultMessage": "Search", - "id": "tabs_bar.search" - }, { "defaultMessage": "Local", "id": "tabs_bar.local_timeline" @@ -1945,6 +1904,10 @@ { "defaultMessage": "Federated", "id": "tabs_bar.federated_timeline" + }, + { + "defaultMessage": "Search", + "id": "tabs_bar.search" } ], "path": "app/javascript/mastodon/features/ui/components/tabs_bar.json" diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 88fa7bfcb..e5379f8e7 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -59,7 +59,7 @@ "column_header.show_settings": "Pokaż ustawienia", "column_header.unpin": "Cofnij przypięcie", "column_subheading.settings": "Ustawienia", - "community.column_settings.media_only": "Media Only", + "community.column_settings.media_only": "Tylko zawartość multimedialna", "compose_form.direct_message_warning": "Ten wpis będzie widoczny tylko dla wszystkich wspomnianych użytkowników.", "compose_form.direct_message_warning_learn_more": "Dowiedz się więcej", "compose_form.hashtag_warning": "Ten wpis nie będzie widoczny pod podanymi hashtagami, ponieważ jest oznaczony jako niewidoczny. Tylko publiczne wpisy mogą zostać znalezione z użyciem hashtagów.", @@ -114,20 +114,17 @@ "empty_column.public": "Tu nic nie ma! Napisz coś publicznie, lub dodaj ludzi z innych instancji, aby to wyświetlić", "follow_request.authorize": "Autoryzuj", "follow_request.reject": "Odrzuć", - "getting_started.developers": "Developers", + "getting_started.developers": "Dla programistów", "getting_started.documentation": "Dokumentacja", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "Znajdź znajomych z Twittera", "getting_started.heading": "Rozpocznij", - "getting_started.invite": "Invite people", + "getting_started.invite": "Zaproś znajomych", "getting_started.open_source_notice": "Mastodon jest oprogramowaniem o otwartym źródle. Możesz pomóc w rozwoju lub zgłaszać błędy na GitHubie tutaj: {github}.", - "getting_started.security": "Security", + "getting_started.security": "Bezpieczeństwo", "getting_started.terms": "Zasady użytkowania", - "home.column_settings.advanced": "Zaawansowane", "home.column_settings.basic": "Podstawowe", - "home.column_settings.filter_regex": "Filtruj z użyciem wyrażeń regularnych", "home.column_settings.show_reblogs": "Pokazuj podbicia", "home.column_settings.show_replies": "Pokazuj odpowiedzi", - "home.settings": "Ustawienia kolumny", "keyboard_shortcuts.back": "aby cofnąć się", "keyboard_shortcuts.boost": "aby podbić wpis", "keyboard_shortcuts.column": "aby przejść do wpisu z jednej z kolumn", @@ -259,6 +256,7 @@ "status.direct": "Wyślij wiadomość bezpośrednią do @{name}", "status.embed": "Osadź", "status.favourite": "Dodaj do ulubionych", + "status.filtered": "Filtrowany", "status.load_more": "Załaduj więcej", "status.media_hidden": "Zawartość multimedialna ukryta", "status.mention": "Wspomnij o @{name}", diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 94d1e6c7c..290979bc4 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -475,6 +475,22 @@ pl: follows: Śledzeni mutes: Wyciszeni storage: Urządzenie przechowujące dane + filters: + contexts: + home: Strona główna + notifications: Powiadomienia + public: Publiczne osie czasu + thread: Konwersacje + edit: + title: Edytuj filtr + errors: + invalid_context: Nie podano lub podano nieprawidłową treść + invalid_irreversible: Nieodwracalne filtrowanie działa tylko na stronie głównej i w powiadomieniach + index: + delete: Usuń + title: Filtry + new: + title: Dodaj nowy filtr followers: domain: Domena explanation_html: Jeżeli chcesz mieć pewność, kto może przeczytać Twoje wpisy, musisz kontrolować, kto śledzi Twój profil. Twoje prywatne wpisy są dostarczane na te instancje, na których jesteś śledzony. Możesz sprawdzać, kto Cię śledzi i blokować ich, jeśli nie ufasz właścicielom lub oprogramowaniu danej instancji. diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 237bd0342..14558bbc2 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -6,6 +6,7 @@ pl: autofollow: Osoby, które zarejestrują się z Twojego zaproszenia automatycznie zaczną Cię śledzić avatar: PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie zmniejszony do 400x400px bot: To konto wykonuje głównie zautomatyzowane działania i może nie być monitorowane + context: Jedno lub wiele miejsc, w których filtr zostanie zastosowany digest: Wysyłane tylko po długiej nieaktywności, jeżeli w tym czasie otrzymaleś jakąś wiadomość bezpośrednią display_name: few: Pozostały %{count} znaki. @@ -14,6 +15,7 @@ pl: other: Pozostało %{count} znaków fields: Możesz ustawić maksymalnie 4 niestandardowe pola wyświetlane jako tabela na Twoim profilu header: PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie zmniejszony do 700x335px + irreversible: Filtrowane wpisy znikną bezpowrotnie, nawet gdy filtr zostanie usunięty locale: Język interfejsu, wiadomości e-mail i powiadomieniach push locked: Musisz akceptować prośby o śledzenie note: @@ -21,6 +23,7 @@ pl: many: Pozostało %{count} znaków one: Pozostał 1 znak other: Pozostało %{count} znaków + phrase: Zostanie wykryte nawet, gdy znajduje się za ostrzeżeniem o zawartości setting_default_language: Język Twoich wpisów może być wykrywany automatycznie, ale nie zawsze jest to dokładne setting_hide_network: Informacje o tym, kto Cię śledzi i kogo śledzisz nie będą widoczne setting_noindex: Wpływa na widoczność strony profilu i Twoich wpisów @@ -43,6 +46,7 @@ pl: chosen_languages: Filtrowanie języków confirm_new_password: Potwierdź nowe hasło confirm_password: Potwierdź hasło + context: Filtruj zawartość current_password: Obecne hasło data: Dane display_name: Widoczna nazwa @@ -50,6 +54,7 @@ pl: expires_in: Wygaśnie po fields: Metadane profilu header: Nagłówek + irreversible: Usuwaj zamiast ukrywać locale: Język interfejsu locked: Ustaw konto jako prywatne max_uses: Maksymalna liczba użyć @@ -57,6 +62,7 @@ pl: note: Biogram otp_attempt: Kod uwierzytelnienia dwustopniowego password: Hasło + phrase: Słowo kluczowe lub fraza setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy setting_boost_modal: Pytaj o potwierdzenie przed podbiciem setting_default_language: Język wpisów -- cgit From 2092d5c0ad099e8f60eb001ee0cd647fc759aefc Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 1 Jul 2018 04:12:34 +0200 Subject: Improve embeds (#7919) * Make embeds cacheable by reverse proxy * Make follow button on embeds open remote follow modal Instead of web+mastodon://, also, turn the button blue, and add a sign up prompt to the remote follow modal --- app/controllers/remote_follow_controller.rb | 1 + app/controllers/statuses_controller.rb | 5 +++++ app/javascript/packs/public.js | 2 +- app/javascript/styles/mastodon/accounts.scss | 1 + app/javascript/styles/mastodon/stream_entries.scss | 13 +++++++++---- app/views/remote_follow/new.html.haml | 2 ++ app/views/stream_entries/_detailed_status.html.haml | 2 +- config/locales/en.yml | 1 + 8 files changed, 21 insertions(+), 6 deletions(-) (limited to 'config') diff --git a/app/controllers/remote_follow_controller.rb b/app/controllers/remote_follow_controller.rb index 3b988e08d..cd61fd763 100644 --- a/app/controllers/remote_follow_controller.rb +++ b/app/controllers/remote_follow_controller.rb @@ -5,6 +5,7 @@ class RemoteFollowController < ApplicationController before_action :set_account before_action :gone, if: :suspended_account? + before_action :set_body_classes def new @remote_follow = RemoteFollow.new(session_params) diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index 645995c2a..b85341822 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -46,7 +46,12 @@ class StatusesController < ApplicationController end def embed + raise ActiveRecord::RecordNotFound if @status.hidden? + + skip_session! + expires_in 180, public: true response.headers['X-Frame-Options'] = 'ALLOWALL' + render 'stream_entries/embed', layout: 'embedded' end diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index d5e5b7fe0..cc2fed3f1 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -64,7 +64,7 @@ function main() { [].forEach.call(document.querySelectorAll('.logo-button'), (content) => { content.addEventListener('click', (e) => { e.preventDefault(); - window.open(e.target.href, 'mastodon-intent', 'width=400,height=400,resizable=no,menubar=no,status=no,scrollbars=yes'); + window.open(e.target.href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes'); }); }); diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index 14dc5dd62..8033e6418 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -464,6 +464,7 @@ background: $simple-background-color; &__header { + background: $base-shadow-color; background-size: cover; background-position: center center; height: 90px; diff --git a/app/javascript/styles/mastodon/stream_entries.scss b/app/javascript/styles/mastodon/stream_entries.scss index 281cbaf83..369bb4479 100644 --- a/app/javascript/styles/mastodon/stream_entries.scss +++ b/app/javascript/styles/mastodon/stream_entries.scss @@ -324,6 +324,9 @@ .button.button-secondary.logo-button { flex: 0 auto; font-size: 14px; + background: $ui-highlight-color; + color: $primary-text-color; + border: 0; svg { width: 20px; @@ -332,19 +335,21 @@ margin-right: 5px; path:first-child { - fill: $ui-primary-color; + fill: $primary-text-color; } path:last-child { - fill: $simple-background-color; + fill: $ui-highlight-color; } } &:active, &:focus, &:hover { - svg path:first-child { - fill: lighten($ui-primary-color, 4%); + background: lighten($ui-highlight-color, 10%); + + svg path:last-child { + fill: lighten($ui-highlight-color, 10%); } } } diff --git a/app/views/remote_follow/new.html.haml b/app/views/remote_follow/new.html.haml index fc5c4da20..3273c318c 100644 --- a/app/views/remote_follow/new.html.haml +++ b/app/views/remote_follow/new.html.haml @@ -11,3 +11,5 @@ .actions = f.button :button, t('remote_follow.proceed'), type: :submit + + %p.hint.subtle-hint= t('remote_follow.no_account_html', sign_up_path: open_registrations? ? new_user_registration_path : 'https://joinmastodon.org') diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml index c0f1e4f0f..de844818f 100644 --- a/app/views/stream_entries/_detailed_status.html.haml +++ b/app/views/stream_entries/_detailed_status.html.haml @@ -8,7 +8,7 @@ %span= acct(status.account) - if embedded_view? - = link_to "web+mastodon://follow?uri=#{status.account.local_username_and_domain}", class: 'button button-secondary logo-button', target: '_new' do + = link_to account_remote_follow_path(status.account), class: 'button button-secondary logo-button', target: '_new' do = render file: Rails.root.join('app', 'javascript', 'images', 'logo.svg') = t('accounts.follow') diff --git a/config/locales/en.yml b/config/locales/en.yml index 5cb81ebe9..8ab652045 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -615,6 +615,7 @@ en: remote_follow: acct: Enter your username@domain you want to follow from missing_resource: Could not find the required redirect URL for your account + no_account_html: Don't have an account? You can sign up here proceed: Proceed to follow prompt: 'You are going to follow:' remote_unfollow: -- cgit From da8fe8079e13758f45e5ba77cb8023c554ae193c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 3 Jul 2018 01:47:56 +0200 Subject: Re-add follow recommendations API (#7918) * Re-add follow recommendations API GET /api/v1/suggestions Removed in 8efa081f210d72ed450c39ac4cde0fd84fb3d3fb due to Neo4J dependency. The algorithm uses triadic closures, takes into account suspensions, blocks, mutes, domain blocks, excludes locked and moved accounts, and prefers more recently updated accounts. * Track interactions with people you don't follow Replying to, favouriting and reblogging someone you're not following will make them show up in follow recommendations. The interactions have different weights: - Replying is 1 - Favouriting is 10 (decidedly positive interaction, but private) - Reblogging is 20 Following them, muting or blocking will remove them from the list, obviously. * Remove triadic closures, ensure potential friendships are trimmed --- app/controllers/api/v1/suggestions_controller.rb | 21 +++++++ app/lib/potential_friendship_tracker.rb | 39 ++++++++++++ app/models/account.rb | 29 +-------- app/models/concerns/account_interactions.rb | 12 ++++ app/services/favourite_service.rb | 8 +++ app/services/post_status_service.rb | 7 +++ app/services/reblog_service.rb | 7 +++ config/routes.rb | 1 + .../api/v1/suggestions_controller_spec.rb | 35 +++++++++++ spec/models/account_spec.rb | 71 ---------------------- 10 files changed, 131 insertions(+), 99 deletions(-) create mode 100644 app/controllers/api/v1/suggestions_controller.rb create mode 100644 app/lib/potential_friendship_tracker.rb create mode 100644 spec/controllers/api/v1/suggestions_controller_spec.rb (limited to 'config') diff --git a/app/controllers/api/v1/suggestions_controller.rb b/app/controllers/api/v1/suggestions_controller.rb new file mode 100644 index 000000000..3abccedd5 --- /dev/null +++ b/app/controllers/api/v1/suggestions_controller.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class Api::V1::SuggestionsController < Api::BaseController + include Authorization + + before_action -> { doorkeeper_authorize! :read } + before_action :require_user! + before_action :set_accounts + + respond_to :json + + def index + render json: @accounts, each_serializer: REST::AccountSerializer + end + + private + + def set_accounts + @accounts = PotentialFriendshipTracker.get(current_account.id, limit: limit_param(DEFAULT_ACCOUNTS_LIMIT)) + end +end diff --git a/app/lib/potential_friendship_tracker.rb b/app/lib/potential_friendship_tracker.rb new file mode 100644 index 000000000..362482669 --- /dev/null +++ b/app/lib/potential_friendship_tracker.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +class PotentialFriendshipTracker + EXPIRE_AFTER = 90.days.seconds + MAX_ITEMS = 80 + + WEIGHTS = { + reply: 1, + favourite: 10, + reblog: 20, + }.freeze + + class << self + def record(account_id, target_account_id, action) + key = "interactions:#{account_id}" + weight = WEIGHTS[action] + + redis.zincrby(key, weight, target_account_id) + redis.zremrangebyrank(key, 0, -MAX_ITEMS) + redis.expire(key, EXPIRE_AFTER) + end + + def remove(account_id, target_account_id) + redis.zrem("interactions:#{account_id}", target_account_id) + end + + def get(account_id, limit: 20, offset: 0) + account_ids = redis.zrevrange("interactions:#{account_id}", offset, limit) + return [] if account_ids.empty? + Account.searchable.where(id: account_ids) + end + + private + + def redis + Redis.current + end + end +end diff --git a/app/models/account.rb b/app/models/account.rb index 40a45b1f8..1f720bf88 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -127,6 +127,7 @@ class Account < ApplicationRecord scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) } scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) } scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) } + scope :searchable, -> { where(suspended: false).where(moved_to_account_id: nil) } delegate :email, :unconfirmed_email, @@ -309,34 +310,6 @@ class Account < ApplicationRecord DeliveryFailureTracker.filter(urls) end - def triadic_closures(account, limit: 5, offset: 0) - sql = <<-SQL.squish - WITH first_degree AS ( - SELECT target_account_id - FROM follows - WHERE account_id = :account_id - ) - SELECT accounts.* - FROM follows - INNER JOIN accounts ON follows.target_account_id = accounts.id - WHERE - account_id IN (SELECT * FROM first_degree) - AND target_account_id NOT IN (SELECT * FROM first_degree) - AND target_account_id NOT IN (:excluded_account_ids) - AND accounts.suspended = false - GROUP BY target_account_id, accounts.id - ORDER BY count(account_id) DESC - OFFSET :offset - LIMIT :limit - SQL - - excluded_account_ids = account.excluded_from_timeline_account_ids + [account.id] - - find_by_sql( - [sql, { account_id: account.id, excluded_account_ids: excluded_account_ids, limit: limit, offset: offset }] - ) - end - def search_for(terms, limit = 10) textsearch, query = generate_query_for_search(terms) diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index ef59f5d15..ee435f956 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -89,10 +89,13 @@ module AccountInteractions .find_or_create_by!(target_account: other_account) rel.update!(show_reblogs: reblogs) + remove_potential_friendship(other_account) + rel end def block!(other_account, uri: nil) + remove_potential_friendship(other_account) block_relationships.create_with(uri: uri) .find_or_create_by!(target_account: other_account) end @@ -100,10 +103,13 @@ module AccountInteractions def mute!(other_account, notifications: nil) notifications = true if notifications.nil? mute = mute_relationships.create_with(hide_notifications: notifications).find_or_create_by!(target_account: other_account) + remove_potential_friendship(other_account) + # When toggling a mute between hiding and allowing notifications, the mute will already exist, so the find_or_create_by! call will return the existing Mute without updating the hide_notifications attribute. Therefore, we check that hide_notifications? is what we want and set it if it isn't. if mute.hide_notifications? != notifications mute.update!(hide_notifications: notifications) end + mute end @@ -194,4 +200,10 @@ module AccountInteractions lists.joins(account: :user) .where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago) end + + private + + def remove_potential_friendship(other_account) + PotentialFriendshipTracker.remove(id, other_account.id) + end end diff --git a/app/services/favourite_service.rb b/app/services/favourite_service.rb index bc2d1547a..6e1ac3ba9 100644 --- a/app/services/favourite_service.rb +++ b/app/services/favourite_service.rb @@ -15,7 +15,10 @@ class FavouriteService < BaseService return favourite unless favourite.nil? favourite = Favourite.create!(account: account, status: status) + create_notification(favourite) + bump_potential_friendship(account, status) + favourite end @@ -33,6 +36,11 @@ class FavouriteService < BaseService end end + def bump_potential_friendship(account, status) + return if account.following?(status.account_id) + PotentialFriendshipTracker.record(account.id, status.account_id, :favourite) + end + def build_json(favourite) Oj.dump(ActivityPub::LinkedDataSignature.new(ActiveModelSerializers::SerializableResource.new( favourite, diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 735985725..bad82051a 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -47,6 +47,8 @@ class PostStatusService < BaseService redis.setex("idempotency:status:#{account.id}:#{options[:idempotency]}", 3_600, status.id) end + bump_potential_friendship(account, status) + status end @@ -79,4 +81,9 @@ class PostStatusService < BaseService def redis Redis.current end + + def bump_potential_friendship(account, status) + return if !status.reply? || account.following?(status.account_id) + PotentialFriendshipTracker.record(account.id, status.in_reply_to_account_id, :reply) + end end diff --git a/app/services/reblog_service.rb b/app/services/reblog_service.rb index 3c4e5847f..0ee8bac2f 100644 --- a/app/services/reblog_service.rb +++ b/app/services/reblog_service.rb @@ -24,6 +24,8 @@ class ReblogService < BaseService ActivityPub::DistributionWorker.perform_async(reblog.id) create_notification(reblog) + bump_potential_friendship(account, reblog) + reblog end @@ -41,6 +43,11 @@ class ReblogService < BaseService end end + def bump_potential_friendship(account, reblog) + return if account.following?(reblog.reblog.account_id) + PotentialFriendshipTracker.record(account.id, reblog.reblog.account_id, :reblog) + end + def build_json(reblog) Oj.dump(ActivityPub::LinkedDataSignature.new(ActiveModelSerializers::SerializableResource.new( reblog, diff --git a/config/routes.rb b/config/routes.rb index 5fdd3b390..e59325964 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -246,6 +246,7 @@ Rails.application.routes.draw do resources :streaming, only: [:index] resources :custom_emojis, only: [:index] + resources :suggestions, only: [:index] get '/search', to: 'search#index', as: :search diff --git a/spec/controllers/api/v1/suggestions_controller_spec.rb b/spec/controllers/api/v1/suggestions_controller_spec.rb new file mode 100644 index 000000000..17f10b04f --- /dev/null +++ b/spec/controllers/api/v1/suggestions_controller_spec.rb @@ -0,0 +1,35 @@ +require 'rails_helper' + +RSpec.describe Api::V1::SuggestionsController, type: :controller do + render_views + + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'GET #index' do + let(:bob) { Fabricate(:account) } + let(:jeff) { Fabricate(:account) } + + before do + PotentialFriendshipTracker.record(user.account_id, bob.id, :reblog) + PotentialFriendshipTracker.record(user.account_id, jeff.id, :favourite) + + get :index + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'returns accounts' do + json = body_as_json + + expect(json.size).to be >= 1 + expect(json.map { |i| i[:id] }).to include *[bob, jeff].map { |i| i.id.to_s } + end + end +end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index cce659a8a..c50791bcd 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -454,77 +454,6 @@ RSpec.describe Account, type: :model do end end - describe '.triadic_closures' do - let!(:me) { Fabricate(:account) } - let!(:friend) { Fabricate(:account) } - let!(:friends_friend) { Fabricate(:account) } - let!(:both_follow) { Fabricate(:account) } - - before do - me.follow!(friend) - friend.follow!(friends_friend) - - me.follow!(both_follow) - friend.follow!(both_follow) - end - - it 'finds accounts you dont follow which are followed by accounts you do follow' do - expect(described_class.triadic_closures(me)).to eq [friends_friend] - end - - it 'limits by 5 with offset 0 by defualt' do - first_degree = 6.times.map { Fabricate(:account) } - matches = 5.times.map { Fabricate(:account) } - first_degree.each { |account| me.follow!(account) } - matches.each do |match| - first_degree.each { |account| account.follow!(match) } - first_degree.shift - end - - expect(described_class.triadic_closures(me)).to eq matches - end - - it 'accepts arbitrary limits' do - another_friend = Fabricate(:account) - higher_friends_friend = Fabricate(:account) - me.follow!(another_friend) - friend.follow!(higher_friends_friend) - another_friend.follow!(higher_friends_friend) - - expect(described_class.triadic_closures(me, limit: 1)).to eq [higher_friends_friend] - end - - it 'acceps arbitrary offset' do - another_friend = Fabricate(:account) - higher_friends_friend = Fabricate(:account) - me.follow!(another_friend) - friend.follow!(higher_friends_friend) - another_friend.follow!(higher_friends_friend) - - expect(described_class.triadic_closures(me, offset: 1)).to eq [friends_friend] - end - - context 'when you block account' do - before do - me.block!(friends_friend) - end - - it 'rejects blocked accounts' do - expect(described_class.triadic_closures(me)).to be_empty - end - end - - context 'when you mute account' do - before do - me.mute!(friends_friend) - end - - it 'rejects muted accounts' do - expect(described_class.triadic_closures(me)).to be_empty - end - end - end - describe '#statuses_count' do subject { Fabricate(:account) } -- cgit From b2051a6256df203fc11a9a6f7d0f8f46ccfae06e Mon Sep 17 00:00:00 2001 From: "Renato \"Lond\" Cerqueira" Date: Thu, 5 Jul 2018 14:50:16 +0200 Subject: Weblate translations (2018-07-05) (#7950) * Translated using Weblate (Chinese (Hong Kong)) Currently translated at 99.5% (620 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/zh_Hant_HK/ * Translated using Weblate (Chinese (Hong Kong)) Currently translated at 99.6% (306 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/zh_Hant_HK/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.8% (622 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt_BR/ * Translated using Weblate (Slovak) Currently translated at 97.2% (606 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Swedish) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/sv/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt_BR/ * Translated using Weblate (Slovak) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Slovak) Currently translated at 97.5% (608 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Finnish) Currently translated at 96.6% (602 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fi/ * Added translation using Weblate (Danish) * Added translation using Weblate (Danish) * Added translation using Weblate (Danish) * Added translation using Weblate (Danish) * Added translation using Weblate (Danish) * Translated using Weblate (Danish) Currently translated at 100.0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/da/ * Added translation using Weblate (Danish) * Translated using Weblate (Danish) Currently translated at 81.6% (58 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/da/ * Translated using Weblate (Danish) Currently translated at 58.0% (36 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/da/ * Translated using Weblate (Danish) Currently translated at 73.6% (56 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/da/ * Translated using Weblate (Swedish) Currently translated at 100.0% (623 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sv/ * Translated using Weblate (Swedish) Currently translated at 100.0% (623 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sv/ * Translated using Weblate (Swedish) Currently translated at 100.0% (623 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sv/ * Translated using Weblate (Swedish) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sv/ * Translated using Weblate (Swedish) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sv/ * Added translation using Weblate (Swedish) * Translated using Weblate (Swedish) Currently translated at 50.0% (1 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/sv/ * Translated using Weblate (Swedish) Currently translated at 100.0% (71 of 71 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sv/ * Translated using Weblate (Danish) Currently translated at 80.7% (248 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/da/ * Translated using Weblate (Danish) Currently translated at 37.2% (232 of 623 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/da/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.8% (632 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (French) Currently translated at 98.7% (76 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/ * Translated using Weblate (Danish) Currently translated at 78.9% (60 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/da/ * Translated using Weblate (Danish) Currently translated at 87.0% (67 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/da/ * Translated using Weblate (Persian) Currently translated at 98.7% (625 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fa/ * Translated using Weblate (Danish) Currently translated at 81.1% (249 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/da/ * Translated using Weblate (Slovak) Currently translated at 94.8% (73 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (Slovak) Currently translated at 97.4% (617 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Arabic) Currently translated at 96.1% (74 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/ * Translated using Weblate (Arabic) Currently translated at 97.4% (75 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/ * Translated using Weblate (Korean) Currently translated at 99.8% (632 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/ * Translated using Weblate (Korean) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ko/ * Translated using Weblate (Galician) Currently translated at 100.0% (633 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/ * Translated using Weblate (Galician) Currently translated at 100.0% (634 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/ * Translated using Weblate (Galician) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/ * Translated using Weblate (Slovak) Currently translated at 96.1% (74 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (Slovak) Currently translated at 97.4% (617 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Persian) Currently translated at 99.6% (631 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fa/ * Translated using Weblate (Persian) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fa/ * Translated using Weblate (Slovak) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/ * Translated using Weblate (Occitan) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/oc/ * Translated using Weblate (Occitan) Currently translated at 99.8% (632 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/oc/ * Translated using Weblate (German) Currently translated at 99.3% (629 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (Slovak) Currently translated at 97.4% (617 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Slovak) Currently translated at 98.7% (76 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (Danish) Currently translated at 94.8% (73 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/da/ * Translated using Weblate (Danish) Currently translated at 92.1% (283 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/da/ * Translated using Weblate (Danish) Currently translated at 40.9% (259 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/da/ * Translated using Weblate (Italian) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/it/ * Translated using Weblate (Italian) Currently translated at 84.5% (535 of 633 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/it/ * Translated using Weblate (Catalan) Currently translated at 100.0% (634 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/ * Translated using Weblate (Danish) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/da/ * Translated using Weblate (Danish) Currently translated at 86.8% (66 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/da/ * Translated using Weblate (Slovenian) Currently translated at 100.0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/sl/ * Translated using Weblate (Arabic) Currently translated at 96.2% (610 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/ * Translated using Weblate (Esperanto) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eo/ * Translated using Weblate (Esperanto) Currently translated at 99.8% (633 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eo/ * Translated using Weblate (Slovenian) Currently translated at 29.0% (18 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sl/ * Translated using Weblate (Japanese) Currently translated at 93.5% (72 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/ * Translated using Weblate (Japanese) Currently translated at 99.6% (632 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/ * Translated using Weblate (Catalan) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ca/ * Translated using Weblate (Catalan) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ca/ * Translated using Weblate (Greek) Currently translated at 98.1% (622 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/ * Translated using Weblate (Danish) Currently translated at 98.3% (302 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/da/ * Translated using Weblate (Greek) Currently translated at 99.8% (633 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/ * Translated using Weblate (Greek) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Danish) Currently translated at 63.4% (402 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/da/ * Translated using Weblate (Danish) Currently translated at 62.9% (39 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/da/ * Translated using Weblate (Slovak) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Slovak) Currently translated at 97.4% (618 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Japanese) Currently translated at 99.8% (633 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/ * Translated using Weblate (Japanese) Currently translated at 93.5% (72 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/ * Translated using Weblate (Japanese) Currently translated at 93.5% (72 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/ * Added translation using Weblate (Greek) * Added translation using Weblate (Greek) * Translated using Weblate (Danish) Currently translated at 70.6% (448 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/da/ * Translated using Weblate (Galician) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (French) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/ * Translated using Weblate (Greek) Currently translated at 100.0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/el/ * Translated using Weblate (Greek) Currently translated at 61.2% (38 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/el/ * Translated using Weblate (Danish) Currently translated at 98.6% (303 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/da/ * Translated using Weblate (Greek) Currently translated at 72.5% (45 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/el/ * Translated using Weblate (Slovak) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Slovak) Currently translated at 97.4% (618 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Japanese) Currently translated at 93.5% (72 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/ * Translated using Weblate (Greek) Currently translated at 99.8% (633 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/ * Translated using Weblate (Greek) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/el/ * Added translation using Weblate (Greek) * Translated using Weblate (Greek) Currently translated at 99.6% (306 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Greek) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.8% (633 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (Danish) Currently translated at 66.1% (41 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/da/ * Translated using Weblate (Slovak) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Greek) Currently translated at 100.0% (76 of 76 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/el/ * Added translation using Weblate (Greek) * Translated using Weblate (Greek) Currently translated at 14.2% (11 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/el/ * Translated using Weblate (Arabic) Currently translated at 98.7% (76 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/ * Translated using Weblate (Arabic) Currently translated at 96.3% (611 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/ * Translated using Weblate (Greek) Currently translated at 53.2% (41 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/el/ * Translated using Weblate (Greek) Currently translated at 55.8% (43 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/el/ * Translated using Weblate (Greek) Currently translated at 57.1% (44 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/el/ * Translated using Weblate (Greek) Currently translated at 61.0% (47 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/el/ * Translated using Weblate (Greek) Currently translated at 100.0% (77 of 77 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/el/ * Translated using Weblate (Greek) Currently translated at 100.0% (307 of 307 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Greek) Currently translated at 99.8% (633 of 634 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/ * Normalize translations ran yarn build:development && i18n-tasks normalize && yarn manage:translations && i18n-tasks remove-unused * Add Danish language --- app/helpers/settings_helper.rb | 1 + app/javascript/mastodon/locales/ar.json | 4 +- app/javascript/mastodon/locales/bg.json | 4 +- app/javascript/mastodon/locales/ca.json | 14 +- app/javascript/mastodon/locales/co.json | 4 +- app/javascript/mastodon/locales/da.json | 307 +++++++++++++++ app/javascript/mastodon/locales/de.json | 4 +- app/javascript/mastodon/locales/el.json | 42 +- app/javascript/mastodon/locales/en.json | 4 +- app/javascript/mastodon/locales/eo.json | 4 +- app/javascript/mastodon/locales/es.json | 4 +- app/javascript/mastodon/locales/eu.json | 4 +- app/javascript/mastodon/locales/fa.json | 4 +- app/javascript/mastodon/locales/fi.json | 4 +- app/javascript/mastodon/locales/fr.json | 4 +- app/javascript/mastodon/locales/gl.json | 6 +- app/javascript/mastodon/locales/he.json | 4 +- app/javascript/mastodon/locales/hr.json | 4 +- app/javascript/mastodon/locales/hu.json | 4 +- app/javascript/mastodon/locales/hy.json | 4 +- app/javascript/mastodon/locales/id.json | 4 +- app/javascript/mastodon/locales/io.json | 4 +- app/javascript/mastodon/locales/it.json | 4 +- app/javascript/mastodon/locales/ja.json | 4 +- app/javascript/mastodon/locales/ko.json | 4 +- app/javascript/mastodon/locales/nl.json | 4 +- app/javascript/mastodon/locales/no.json | 4 +- app/javascript/mastodon/locales/oc.json | 4 +- app/javascript/mastodon/locales/pt-BR.json | 14 +- app/javascript/mastodon/locales/pt.json | 4 +- app/javascript/mastodon/locales/ru.json | 4 +- app/javascript/mastodon/locales/sk.json | 30 +- app/javascript/mastodon/locales/sl.json | 4 +- app/javascript/mastodon/locales/sr-Latn.json | 4 +- app/javascript/mastodon/locales/sr.json | 4 +- app/javascript/mastodon/locales/sv.json | 38 +- app/javascript/mastodon/locales/te.json | 4 +- app/javascript/mastodon/locales/th.json | 4 +- app/javascript/mastodon/locales/tr.json | 4 +- app/javascript/mastodon/locales/uk.json | 4 +- app/javascript/mastodon/locales/zh-CN.json | 4 +- app/javascript/mastodon/locales/zh-HK.json | 20 +- app/javascript/mastodon/locales/zh-TW.json | 4 +- config/application.rb | 1 + config/locales/activerecord.da.yml | 13 + config/locales/activerecord.el.yml | 13 + config/locales/activerecord.sl.yml | 14 +- config/locales/activerecord.sv.yml | 9 + config/locales/ar.yml | 19 + config/locales/ca.yml | 25 +- config/locales/da.yml | 554 +++++++++++++++++++++++++++ config/locales/de.yml | 14 + config/locales/devise.da.yml | 58 +++ config/locales/devise.el.yml | 82 ++++ config/locales/devise.sk.yml | 4 +- config/locales/devise.sl.yml | 27 +- config/locales/doorkeeper.da.yml | 110 ++++++ config/locales/doorkeeper.el.yml | 120 ++++++ config/locales/doorkeeper.pt-BR.yml | 2 +- config/locales/doorkeeper.sv.yml | 1 + config/locales/el.yml | 132 ++++++- config/locales/eo.yml | 21 +- config/locales/fa.yml | 17 + config/locales/fi.yml | 1 + config/locales/gl.yml | 17 + config/locales/it.yml | 11 + config/locales/ja.yml | 17 + config/locales/ko.yml | 17 + config/locales/oc.yml | 16 + config/locales/pt-BR.yml | 19 + config/locales/simple_form.ar.yml | 5 + config/locales/simple_form.ca.yml | 6 + config/locales/simple_form.da.yml | 94 +++++ config/locales/simple_form.el.yml | 94 +++++ config/locales/simple_form.eo.yml | 6 + config/locales/simple_form.fa.yml | 6 + config/locales/simple_form.fr.yml | 6 + config/locales/simple_form.gl.yml | 6 + config/locales/simple_form.it.yml | 6 + config/locales/simple_form.ja.yml | 8 +- config/locales/simple_form.ko.yml | 6 + config/locales/simple_form.oc.yml | 6 + config/locales/simple_form.pt-BR.yml | 24 +- config/locales/simple_form.sk.yml | 8 +- config/locales/simple_form.sv.yml | 8 + config/locales/sk.yml | 50 ++- config/locales/sv.yml | 90 ++++- config/locales/zh-HK.yml | 10 +- 88 files changed, 2135 insertions(+), 246 deletions(-) create mode 100644 app/javascript/mastodon/locales/da.json create mode 100644 config/locales/activerecord.da.yml create mode 100644 config/locales/activerecord.el.yml create mode 100644 config/locales/activerecord.sv.yml create mode 100644 config/locales/da.yml create mode 100644 config/locales/devise.da.yml create mode 100644 config/locales/devise.el.yml create mode 100644 config/locales/doorkeeper.da.yml create mode 100644 config/locales/doorkeeper.el.yml create mode 100644 config/locales/simple_form.da.yml create mode 100644 config/locales/simple_form.el.yml (limited to 'config') diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index ba728eb32..740f7bf77 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -7,6 +7,7 @@ module SettingsHelper bg: 'Български', ca: 'Català', co: 'Corsu', + da: 'Dansk', de: 'Deutsch', el: 'Ελληνικά', eo: 'Esperanto', diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 88f592a09..a8a87c729 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "ماستدون برنامج مفتوح المصدر. يمكنك المساهمة، أو الإبلاغ عن تقارير الأخطاء، على جيت هب {github}.", "getting_started.security": "الأمان", "getting_started.terms": "شروط الخدمة", - "home.column_settings.advanced": "متقدمة", "home.column_settings.basic": "أساسية", - "home.column_settings.filter_regex": "تصفية حسب التعبيرات العادية", "home.column_settings.show_reblogs": "عرض الترقيات", "home.column_settings.show_replies": "عرض الردود", - "home.settings": "إعدادات العمود", "keyboard_shortcuts.back": "للعودة", "keyboard_shortcuts.boost": "للترقية", "keyboard_shortcuts.column": "للتركيز على منشور على أحد الأعمدة", @@ -259,6 +256,7 @@ "status.direct": "رسالة خاصة إلى @{name}", "status.embed": "إدماج", "status.favourite": "أضف إلى المفضلة", + "status.filtered": "Filtered", "status.load_more": "حمّل المزيد", "status.media_hidden": "الصورة مستترة", "status.mention": "أذكُر @{name}", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 37590d86f..7b38f9dde 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon е софтуер с отворен код. Можеш да помогнеш или да докладваш за проблеми в Github: {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", - "home.column_settings.filter_regex": "Filter out by regular expressions", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", - "home.settings": "Column settings", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Предпочитани", + "status.filtered": "Filtered", "status.load_more": "Load more", "status.media_hidden": "Media hidden", "status.mention": "Споменаване", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index e2fb1bb99..aa80ed555 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -59,7 +59,7 @@ "column_header.show_settings": "Mostra la configuració", "column_header.unpin": "No fixis", "column_subheading.settings": "Configuració", - "community.column_settings.media_only": "Media Only", + "community.column_settings.media_only": "Només multimèdia", "compose_form.direct_message_warning": "Aquest toot només serà enviat als usuaris esmentats. De totes maneres, els operadors de la teva o de qualsevol de les instàncies receptores poden inspeccionar aquest missatge.", "compose_form.direct_message_warning_learn_more": "Aprèn més", "compose_form.hashtag_warning": "Aquest toot no es mostrarà en cap etiqueta ja que no està llistat. Només els toots públics poden ser cercats per etiqueta.", @@ -114,20 +114,17 @@ "empty_column.public": "No hi ha res aquí! Escriu alguna cosa públicament o segueix manualment usuaris d'altres instàncies per omplir-ho", "follow_request.authorize": "Autoritzar", "follow_request.reject": "Rebutjar", - "getting_started.developers": "Developers", + "getting_started.developers": "Desenvolupadors", "getting_started.documentation": "Documentació", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "Troba amics de Twitter", "getting_started.heading": "Començant", - "getting_started.invite": "Invite people", + "getting_started.invite": "Convida gent", "getting_started.open_source_notice": "Mastodon és un programari de codi obert. Pots contribuir o informar de problemes a GitHub a {github}.", - "getting_started.security": "Security", + "getting_started.security": "Seguretat", "getting_started.terms": "Termes del servei", - "home.column_settings.advanced": "Avançat", "home.column_settings.basic": "Bàsic", - "home.column_settings.filter_regex": "Filtrar per expressió regular", "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respostes", - "home.settings": "Ajustos de columna", "keyboard_shortcuts.back": "navegar enrera", "keyboard_shortcuts.boost": "impulsar", "keyboard_shortcuts.column": "per centrar un estat en una de les columnes", @@ -259,6 +256,7 @@ "status.direct": "Missatge directe @{name}", "status.embed": "Incrustar", "status.favourite": "Favorit", + "status.filtered": "Filtered", "status.load_more": "Carrega més", "status.media_hidden": "Multimèdia amagat", "status.mention": "Esmentar @{name}", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index da1b45d73..09207287a 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon ghjè un lugiziale liberu. Pudete cuntribuisce à u codice o a traduzione, o palisà un bug, nant'à GitHub: {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Avanzati", "home.column_settings.basic": "Bàsichi", - "home.column_settings.filter_regex": "Filtrà cù spressione regulare (regex)", "home.column_settings.show_reblogs": "Vede e spartere", "home.column_settings.show_replies": "Vede e risposte", - "home.settings": "Parametri di a colonna", "keyboard_shortcuts.back": "rivultà", "keyboard_shortcuts.boost": "sparte", "keyboard_shortcuts.column": "fucalizà un statutu indè una colonna", @@ -259,6 +256,7 @@ "status.direct": "Mandà un missaghju @{name}", "status.embed": "Integrà", "status.favourite": "Aghjunghje à i favuriti", + "status.filtered": "Filtered", "status.load_more": "Vede di più", "status.media_hidden": "Media piattata", "status.mention": "Mintuvà @{name}", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json new file mode 100644 index 000000000..d1857cd19 --- /dev/null +++ b/app/javascript/mastodon/locales/da.json @@ -0,0 +1,307 @@ +{ + "account.badges.bot": "Robot", + "account.block": "Bloker @{name}", + "account.block_domain": "Skjul alt fra {domain}", + "account.blocked": "Blokeret", + "account.direct": "Send en direkte besked til @{name}", + "account.disclaimer_full": "Nedenstående oplysninger reflekterer ikke nødvendigvis brugerens profil fuldstændigt.", + "account.domain_blocked": "Domænet er blevet skjult", + "account.edit_profile": "Rediger profil", + "account.follow": "Følg", + "account.followers": "Følgere", + "account.follows": "Følger", + "account.follows_you": "Følger dig", + "account.hide_reblogs": "Skjul fremhævelserne fra @{name}", + "account.media": "Multimedier", + "account.mention": "Nævn @{name}", + "account.moved_to": "{name} er flyttet til:", + "account.mute": "Dæmp @{name}", + "account.mute_notifications": "Dæmp notifikationer fra @{name}", + "account.muted": "Dæmpet", + "account.posts": "Dyt", + "account.posts_with_replies": "Toots og svar", + "account.report": "Rapporter @{name}", + "account.requested": "Afventer godkendelse. Tryk for at annullere følgeanmodning", + "account.share": "Del @{name}s profil", + "account.show_reblogs": "Vis fremhævelserne fra @{name}", + "account.unblock": "Fjern blokeringen af @{name}", + "account.unblock_domain": "Skjul ikke længere {domain}", + "account.unfollow": "Følg ikke længere", + "account.unmute": "Fjern dæmpningen af @{name}", + "account.unmute_notifications": "Fjern dæmpningen af notifikationer fra @{name}", + "account.view_full_profile": "Se fuld profil", + "alert.unexpected.message": "Der opstod en uventet fejl.", + "alert.unexpected.title": "Ups!", + "boost_modal.combo": "Du kan trykke {combo} for at springe dette over næste gang", + "bundle_column_error.body": "Noget gik galt under indlæsningen af dette komponent.", + "bundle_column_error.retry": "Prøv igen", + "bundle_column_error.title": "Netværksfejl", + "bundle_modal_error.close": "Luk", + "bundle_modal_error.message": "Noget gik galt under indlæsningen af dette komponent.", + "bundle_modal_error.retry": "Prøv igen", + "column.blocks": "Blokerede brugere", + "column.community": "Lokal tidslinje", + "column.direct": "Direkte beskeder", + "column.domain_blocks": "Skjulte domæner", + "column.favourites": "Favoritter", + "column.follow_requests": "Anmodning om at følge", + "column.home": "Hjem", + "column.lists": "Lister", + "column.mutes": "Dæmpede brugere", + "column.notifications": "Notifikationer", + "column.pins": "Fastgjorte toots", + "column.public": "Fælles tidslinje", + "column_back_button.label": "Tilbage", + "column_header.hide_settings": "Skjul indstillinger", + "column_header.moveLeft_settings": "Flyt kolonne til venstre", + "column_header.moveRight_settings": "Flyt kolonne til højre", + "column_header.pin": "Fastgør", + "column_header.show_settings": "Vis indstillinger", + "column_header.unpin": "Fastgør ikke længere", + "column_subheading.settings": "Indstillinger", + "community.column_settings.media_only": "Kun multimedier", + "compose_form.direct_message_warning": "Dette toot vil kun blive sendt til de nævnte brugere.", + "compose_form.direct_message_warning_learn_more": "Lær mere", + "compose_form.hashtag_warning": "Dette toot vil ikke blive vist under noget hashtag da det ikke er listet. Kun offentlige toots kan blive vist under søgninger med hashtags.", + "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Alle kan følge dig for at se dine følger-kun indlæg.", + "compose_form.lock_disclaimer.lock": "låst", + "compose_form.placeholder": "Hvad har du på hjertet?", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.marked": "Multimedie er markeret som værende følsomt", + "compose_form.sensitive.unmarked": "Multimediet er ikke markeret som værende følsomt", + "compose_form.spoiler.marked": "Teksten er skjult bag en advarsel", + "compose_form.spoiler.unmarked": "Teksten er ikke skjult", + "compose_form.spoiler_placeholder": "Skriv din advarsel her", + "confirmation_modal.cancel": "Annuller", + "confirmations.block.confirm": "Bloker", + "confirmations.block.message": "Er du sikker på, du vil blokere {name}?", + "confirmations.delete.confirm": "Slet", + "confirmations.delete.message": "Er du sikker på, du vil slette denne status?", + "confirmations.delete_list.confirm": "Slet", + "confirmations.delete_list.message": "Er du sikker på, du vil slette denne liste?", + "confirmations.domain_block.confirm": "Skjul helt domæne", + "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.mute.confirm": "Dæmp", + "confirmations.mute.message": "Er du sikker på, du vil dæmpe {name}?", + "confirmations.redraft.confirm": "Slet & omskriv", + "confirmations.redraft.message": "Er du sikker på, du vil slette denne status og omskrive den? Du vil miste alle svar, fremhævelser og favoritter der medfølger.", + "confirmations.unfollow.confirm": "Følg ikke længere", + "confirmations.unfollow.message": "Er du sikker på, du ikke længere vil følge {name}?", + "embed.instructions": "Indlejre denne status på din side ved at kopiere nedenstående kode.", + "embed.preview": "Det kommer til at se således ud:", + "emoji_button.activity": "Aktivitet", + "emoji_button.custom": "Bruger defineret", + "emoji_button.flags": "Flag", + "emoji_button.food": "Mad og drikke", + "emoji_button.label": "Indsæt humørikon", + "emoji_button.nature": "Natur", + "emoji_button.not_found": "Ingen emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objekter", + "emoji_button.people": "Mennesker", + "emoji_button.recent": "Oftest brugt", + "emoji_button.search": "Søg...", + "emoji_button.search_results": "Søgeresultat", + "emoji_button.symbols": "Symboler", + "emoji_button.travel": "Rejser & steder", + "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at starte lavinen!", + "empty_column.direct": "Du har endnu ingen direkte beskeder. Når du sender eller modtager en, vil den vises her.", + "empty_column.hashtag": "Dette hashtag indeholder endnu ikke noget.", + "empty_column.home": "Din hjemme tidslinje er tom! Besøg {public} eller brug søgningen for at komme igang og møde andre brugere.", + "empty_column.home.public_timeline": "den offentlige tidslinje", + "empty_column.list": "Der er endnu intet i denne liste. Når medlemmer af denne liste poster nye statusser, vil de vises her.", + "empty_column.notifications": "Du har endnu ingen notifikationer. Tag ud og bland dig med folkemængden for at starte samtalen.", + "empty_column.public": "Der er ikke noget at se her! Skriv noget offentligt eller start ud med manuelt at følge brugere fra andre instanser for st udfylde tomrummet", + "follow_request.authorize": "Godkend", + "follow_request.reject": "Afvis", + "getting_started.developers": "Udviklere", + "getting_started.documentation": "Dokumentation", + "getting_started.find_friends": "Find venner fra Twitter", + "getting_started.heading": "Kom igang", + "getting_started.invite": "Inviter folk", + "getting_started.open_source_notice": "Mastodon er et open source software. Du kan bidrage eller rapporterer fejl på GitHub {github}.", + "getting_started.security": "Sikkerhed", + "getting_started.terms": "Vilkår", + "home.column_settings.basic": "Grundlæggende", + "home.column_settings.show_reblogs": "Vis fremhævelser", + "home.column_settings.show_replies": "Vis svar", + "keyboard_shortcuts.back": "for at navigere dig tilbage", + "keyboard_shortcuts.boost": "for at fremhæve", + "keyboard_shortcuts.column": "for at fokusere på en status i en af kolonnerne", + "keyboard_shortcuts.compose": "for at fokusere på skriveområdet", + "keyboard_shortcuts.description": "Beskrivelse", + "keyboard_shortcuts.down": "for at rykke ned ad listen", + "keyboard_shortcuts.enter": "for at åbne status", + "keyboard_shortcuts.favourite": "for at favorisere", + "keyboard_shortcuts.heading": "Tastaturgenveje", + "keyboard_shortcuts.hotkey": "Hurtigtast", + "keyboard_shortcuts.legend": "for at vise denne legende", + "keyboard_shortcuts.mention": "for at nævne forfatteren", + "keyboard_shortcuts.reply": "for at svare", + "keyboard_shortcuts.search": "for at fokusere søgningen", + "keyboard_shortcuts.toggle_hidden": "for at vise/skjule tekst bag CW", + "keyboard_shortcuts.toot": "for at påbegynde en helt ny toot", + "keyboard_shortcuts.unfocus": "for at fjerne fokus fra skriveområde/søgning", + "keyboard_shortcuts.up": "for at bevæge dig op ad listen", + "lightbox.close": "Luk", + "lightbox.next": "Næste", + "lightbox.previous": "Forrige", + "lists.account.add": "Tilføj til liste", + "lists.account.remove": "Fjern fra liste", + "lists.delete": "Slet liste", + "lists.edit": "Rediger liste", + "lists.new.create": "Tilføj liste", + "lists.new.title_placeholder": "Ny liste titel", + "lists.search": "Søg iblandt folk du følger", + "lists.subheading": "Dine lister", + "loading_indicator.label": "Indlæser...", + "media_gallery.toggle_visible": "Ændre synlighed", + "missing_indicator.label": "Ikke fundet", + "missing_indicator.sublabel": "Denne ressource kunne ikke blive fundet", + "mute_modal.hide_notifications": "Skjul notifikationer fra denne bruger?", + "navigation_bar.blocks": "Blokerede brugere", + "navigation_bar.community_timeline": "Lokal tidslinje", + "navigation_bar.direct": "Direkte beskeder", + "navigation_bar.discover": "Opdag", + "navigation_bar.domain_blocks": "Skjulte domæner", + "navigation_bar.edit_profile": "Rediger profil", + "navigation_bar.favourites": "Favoritter", + "navigation_bar.follow_requests": "Følgeanmodninger", + "navigation_bar.info": "Om denne instans", + "navigation_bar.keyboard_shortcuts": "Hurtigtast", + "navigation_bar.lists": "Lister", + "navigation_bar.logout": "Logud", + "navigation_bar.mutes": "Dæmpede brugere", + "navigation_bar.personal": "Personligt", + "navigation_bar.pins": "Fastgjorte toots", + "navigation_bar.preferences": "Indstillinger", + "navigation_bar.public_timeline": "Fælles tidslinje", + "navigation_bar.security": "Sikkerhed", + "notification.favourite": "{name} favoriserede din status", + "notification.follow": "{name} fulgte dig", + "notification.mention": "{name} nævnte dig", + "notification.reblog": "{name} fremhævede din status", + "notifications.clear": "Ryd notifikationer", + "notifications.clear_confirmation": "Er du sikker på, du vil rydde alle dine notifikationer permanent?", + "notifications.column_settings.alert": "Skrivebords notifikationer", + "notifications.column_settings.favourite": "Favoritter:", + "notifications.column_settings.follow": "Nye følgere:", + "notifications.column_settings.mention": "Omtale:", + "notifications.column_settings.push": "Push notifikationer", + "notifications.column_settings.push_meta": "Denne enhed", + "notifications.column_settings.reblog": "Fremhævelser:", + "notifications.column_settings.show": "Vis i kolonne", + "notifications.column_settings.sound": "Afspil lyd", + "notifications.group": "{count} notifikationer", + "onboarding.done": "Færdig", + "onboarding.next": "Næste", + "onboarding.page_five.public_timelines": "Den lokale tidslinje viser offentlige opslag fra alle i {domain}. Den fælles tidslinje viser opslag fra alle der følges af folk i {domain}. Disse er de offentlige tidslinjer, hvilket er en god måde at møde nye mennesker på.", + "onboarding.page_four.home": "Hjem tidslinjen viser opslag fra folk som du følger.", + "onboarding.page_four.notifications": "Notifikations kolonnen viser når nogen interagerer med dig.", + "onboarding.page_one.federation": "Mastodon er et netværk af uafhængige serverer der forbindes til at udgøre et større socialt netværk. Vi kalder disse servere for instanser.", + "onboarding.page_one.full_handle": "Dit fulde brugernavn", + "onboarding.page_one.handle_hint": "Dette er hvad du vil fortælle dine venner hvad de skal søge efter.", + "onboarding.page_one.welcome": "Velkommen til Mastodon!", + "onboarding.page_six.admin": "Administratoren for denne instans er {admin}.", + "onboarding.page_six.almost_done": "Næsten færdig...", + "onboarding.page_six.appetoot": "God Appetoot!", + "onboarding.page_six.apps_available": "Der er {apps} tilgængelige for iOS, Android og andre platforme.", + "onboarding.page_six.github": "Mastodon er frit open-source software. Du kan rapportere fejl, anmode om features, eller bidrage til koden ved at gå til {github}.", + "onboarding.page_six.guidelines": "retningslinjer for fællesskabet", + "onboarding.page_six.read_guidelines": "Læs venligst {domain}s {guidelines}!", + "onboarding.page_six.various_app": "apps til mobilen", + "onboarding.page_three.profile": "Rediger din profil for at ændre profilbillede, beskrivelse og visningsnavn. Der vil du også finde andre indstillinger.", + "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.", + "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", + "onboarding.skip": "Spring over", + "privacy.change": "Ændre status privatliv", + "privacy.direct.long": "Post til kun de nævnte brugere", + "privacy.direct.short": "Direkte", + "privacy.private.long": "Post kun til følgere", + "privacy.private.short": "Kun for følgere", + "privacy.public.long": "Post til offentlige tidslinjer", + "privacy.public.short": "Offentligt", + "privacy.unlisted.long": "Post ikke til offentlige tidslinjer", + "privacy.unlisted.short": "Ikke listet", + "regeneration_indicator.label": "Indlæser…", + "regeneration_indicator.sublabel": "Din startside er ved at blive forberedt!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}t", + "relative_time.just_now": "nu", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Annuller", + "report.forward": "Videresend til {target}", + "report.forward_hint": "Kontoen er fra en anden server. Vil du også sende en anonym kopi af anmeldelsen dertil?", + "report.hint": "Anmeldelsen vil blive sendt til moderatorene af din instans. Du kan give en forklaring for hvorfor du anmelder denne konto nedenfor:", + "report.placeholder": "Yderligere kommentarer", + "report.submit": "Indsend", + "report.target": "Anmelder {target}", + "search.placeholder": "Søg", + "search_popout.search_format": "Avanceret søgeformat", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "emnetag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simpelt tekst returnerer passende visningsnavne, brugernavne og hashtags", + "search_popout.tips.user": "bruger", + "search_results.accounts": "Folk", + "search_results.hashtags": "Emnetags", + "search_results.statuses": "Toote", + "search_results.total": "{count, number} {count, plural, et {result} andre {results}}", + "standalone.public_title": "Et kig indenfor...", + "status.block": "Bloker @{name}", + "status.cancel_reblog_private": "Fremhæv ikke længere", + "status.cannot_reblog": "Denne post kan ikke fremhæves", + "status.delete": "Slet", + "status.direct": "Send direkte besked til @{name}", + "status.embed": "Indlejre", + "status.favourite": "Favorit", + "status.filtered": "Filtered", + "status.load_more": "Indlæs mere", + "status.media_hidden": "Multimedia skjult", + "status.mention": "Nævn @{name}", + "status.more": "Mere", + "status.mute": "Dæmp @{name}", + "status.mute_conversation": "Dæmp samtale", + "status.open": "Udvid denne status", + "status.pin": "Fastgør til profil", + "status.pinned": "Fastgjort toot", + "status.reblog": "Fremhæv", + "status.reblog_private": "Fremhæv til oprindeligt publikum", + "status.reblogged_by": "{name} fremhævede", + "status.redraft": "Slet og omskriv", + "status.reply": "Svar", + "status.replyAll": "Svar tråd", + "status.report": "Anmeld @{name}", + "status.sensitive_toggle": "Tryk for at se", + "status.sensitive_warning": "Følsomt indhold", + "status.share": "Del", + "status.show_less": "Vis mindre", + "status.show_less_all": "Vis mindre for alle", + "status.show_more": "Vis mere", + "status.show_more_all": "Vis mere for alle", + "status.unmute_conversation": "Fjern dæmpningen fra samtale", + "status.unpin": "Fjern som fastgjort fra profil", + "tabs_bar.federated_timeline": "Fælles", + "tabs_bar.home": "Hjem", + "tabs_bar.local_timeline": "Lokal", + "tabs_bar.notifications": "Notifikationer", + "tabs_bar.search": "Søg", + "trends.count_by_accounts": "{count} {rawCount, flere, en {person} flere {people}} snakker", + "ui.beforeunload": "Din kladde vil gå tabt hvis du forlader Mastodon.", + "upload_area.title": "Træk og slip for at uploade", + "upload_button.label": "Tilføj multimedier", + "upload_form.description": "Beskrivelse for de svagtseende", + "upload_form.focus": "Beskær", + "upload_form.undo": "Slet", + "upload_progress.label": "Uploader...", + "video.close": "Luk video", + "video.exit_fullscreen": "Gå ud af fuldskærm", + "video.expand": "Udvid video", + "video.fullscreen": "Fuldskærm", + "video.hide": "Skjul video", + "video.mute": "Dæmp lyd", + "video.pause": "Sæt på pause", + "video.play": "Afspil", + "video.unmute": "Fjern dæmpningen af lyd" +} diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 2e32c86a4..ac14f037d 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon ist quelloffene Software. Du kannst auf GitHub unter {github} dazu beitragen oder Probleme melden.", "getting_started.security": "Sicherheit", "getting_started.terms": "Nutzungsbedingungen", - "home.column_settings.advanced": "Erweitert", "home.column_settings.basic": "Einfach", - "home.column_settings.filter_regex": "Mit regulären Ausdrücken filtern", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", - "home.settings": "Spalteneinstellungen", "keyboard_shortcuts.back": "zurück navigieren", "keyboard_shortcuts.boost": "boosten", "keyboard_shortcuts.column": "einen Status in einer der Spalten fokussieren", @@ -259,6 +256,7 @@ "status.direct": "Direktnachricht @{name}", "status.embed": "Einbetten", "status.favourite": "Favorisieren", + "status.filtered": "Filtered", "status.load_more": "Weitere laden", "status.media_hidden": "Medien versteckt", "status.mention": "@{name} erwähnen", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 936fba71e..b9bc474eb 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -3,7 +3,7 @@ "account.block": "Απόκλεισε τον/την @{name}", "account.block_domain": "Απόκρυψε τα πάντα από τον/την", "account.blocked": "Αποκλεισμένος/η", - "account.direct": "Άμεσο μήνυμα προς @{name}", + "account.direct": "Προσωπικό μήνυμα προς @{name}", "account.disclaimer_full": "Οι παρακάτω πληροφορίες μπορει να μην αντανακλούν το προφίλ του χρήστη επαρκως.", "account.domain_blocked": "Κρυμμένος τομέας", "account.edit_profile": "Επεξεργάσου το προφίλ", @@ -21,7 +21,7 @@ "account.posts": "Τουτ", "account.posts_with_replies": "Τουτ και απαντήσεις", "account.report": "Κατάγγειλε τον/την @{name}", - "account.requested": "Εκκρεμεί έγκριση. Κάνε κλικ για να ακυρώσεις το αίτημα ακολούθησης", + "account.requested": "Εκκρεμεί έγκριση. Κάνε κλικ για να ακυρώσεις το αίτημα παρακολούθησης", "account.share": "Μοιράσου το προφίλ του/της @{name}", "account.show_reblogs": "Δείξε τις προωθήσεις του/της @{name}", "account.unblock": "Ξεμπλόκαρε τον/την @{name}", @@ -41,7 +41,7 @@ "bundle_modal_error.retry": "Δοκίμασε ξανά", "column.blocks": "Αποκλεισμένοι χρήστες", "column.community": "Τοπική ροή", - "column.direct": "Απευθείας μηνύματα", + "column.direct": "Προσωπικά μηνύματα", "column.domain_blocks": "Κρυμμένοι τομείς", "column.favourites": "Αγαπημένα", "column.follow_requests": "Αιτήματα ακολούθησης", @@ -59,13 +59,13 @@ "column_header.show_settings": "Εμφάνιση ρυθμίσεων", "column_header.unpin": "Ξεκαρφίτσωμα", "column_subheading.settings": "Ρυθμίσεις", - "community.column_settings.media_only": "Media Only", + "community.column_settings.media_only": "Μόνο πολυμέσα", "compose_form.direct_message_warning": "Αυτό το τουτ θα σταλεί μόνο στους αναφερόμενους χρήστες.", "compose_form.direct_message_warning_learn_more": "Μάθετε περισσότερα", "compose_form.hashtag_warning": "Αυτό το τουτ δεν θα εμφανίζεται κάτω από κανένα hashtag καθώς είναι αφανές. Μόνο τα δημόσια τουτ μπορούν να αναζητηθούν ανά hashtag.", "compose_form.lock_disclaimer": "Ο λογαριασμός σου δεν είναι {locked}. Οποιοσδήποτε μπορεί να σε ακολουθήσει για να δει τις δημοσιεύσεις σας προς τους ακολούθους σας.", "compose_form.lock_disclaimer.lock": "κλειδωμένος", - "compose_form.placeholder": "Τι σκέφτεσαι;", + "compose_form.placeholder": "Τι έχεις στο μυαλό σου;", "compose_form.publish": "Τουτ", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.marked": "Το πολυμέσο έχει σημειωθεί ως ευαίσθητο", @@ -105,7 +105,7 @@ "emoji_button.symbols": "Σύμβολα", "emoji_button.travel": "Ταξίδια & Τοποθεσίες", "empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσιο παραμύθι ν' αρχινίσει!", - "empty_column.direct": "Δεν έχεις απευθείας μηνύματα ακόμα. Όταν στείλεις ή λάβεις κανένα, θα εμφανιστεί εδώ.", + "empty_column.direct": "Δεν έχεις προσωπικά μηνύματα ακόμα. Όταν στείλεις ή λάβεις κανένα, θα εμφανιστεί εδώ.", "empty_column.hashtag": "Δεν υπάρχει ακόμα κάτι για αυτή την ταμπέλα.", "empty_column.home": "Η τοπική σου ροή είναι κενή! Πήγαινε στο {public} ή κάνε αναζήτηση για να ξεκινήσεις και να γνωρίσεις άλλους χρήστες.", "empty_column.home.public_timeline": "η δημόσια ροή", @@ -114,20 +114,17 @@ "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλα instances για να τη γεμίσεις", "follow_request.authorize": "Ενέκρινε", "follow_request.reject": "Απέρριψε", - "getting_started.developers": "Developers", + "getting_started.developers": "Προγραμματιστές", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "Βρες φίλους/ες από το Twitter", "getting_started.heading": "Ξεκινώντας", - "getting_started.invite": "Invite people", + "getting_started.invite": "Προσκάλεσε κόσμο", "getting_started.open_source_notice": "Το Mastodon είναι ελεύθερο λογισμικό. Μπορείς να συνεισφέρεις ή να αναφέρεις ζητήματα στο GitHub στο {github}.", - "getting_started.security": "Security", + "getting_started.security": "Ασφάλεια", "getting_started.terms": "Όροι χρήσης", - "home.column_settings.advanced": "Προχωρημένα", "home.column_settings.basic": "Βασικά", - "home.column_settings.filter_regex": "Φιλτράρετε μέσω regular expressions", "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων", - "home.settings": "Ρυθμίσεις στηλών", "keyboard_shortcuts.back": "για επιστροφή πίσω", "keyboard_shortcuts.boost": "για προώθηση", "keyboard_shortcuts.column": "για εστίαση μιας κατάστασης σε μια από τις στήλες", @@ -164,7 +161,7 @@ "mute_modal.hide_notifications": "Απόκρυψη ειδοποιήσεων αυτού του χρήστη;", "navigation_bar.blocks": "Αποκλεισμένοι χρήστες", "navigation_bar.community_timeline": "Τοπική ροή", - "navigation_bar.direct": "Απευθείας μηνύματα", + "navigation_bar.direct": "Προσωπικά μηνύματα", "navigation_bar.discover": "Ανακάλυψη", "navigation_bar.domain_blocks": "Κρυφοί τομείς", "navigation_bar.edit_profile": "Επεξεργασία προφίλ", @@ -219,7 +216,7 @@ "onboarding.skip": "Παράληψη", "privacy.change": "Προσαρμογή ιδιωτικότητας δημοσίευσης", "privacy.direct.long": "Δημοσίευση μόνο σε όσους και όσες αναφέρονται", - "privacy.direct.short": "Απευθείας", + "privacy.direct.short": "Προσωπικά", "privacy.private.long": "Δημοσίευση μόνο στους ακόλουθους", "privacy.private.short": "Μόνο ακόλουθοι", "privacy.public.long": "Δημοσίευσε στις δημόσιες ροές", @@ -238,7 +235,7 @@ "report.forward_hint": "Ο λογαριασμός είναι από διαφορετικό διακομιστή. Να σταλεί ανώνυμο αντίγραφο της καταγγελίας κι εκεί;", "report.hint": "Η καταγγελία θα σταλεί στους διαχειριστές του κόμβου σου. Μπορείς να περιγράψεις γιατί καταγγέλεις το λογαριασμό παρακάτω:", "report.placeholder": "Επιπλέον σχόλια", - "report.submit": "Submit", + "report.submit": "Υποβολή", "report.target": "Καταγγελία {target}", "search.placeholder": "Αναζήτηση", "search_popout.search_format": "Προχωρημένη αναζήτηση", @@ -256,9 +253,10 @@ "status.cancel_reblog_private": "Ακύρωσε την προώθηση", "status.cannot_reblog": "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί", "status.delete": "Διαγραφή", - "status.direct": "Απευθείας μήνυμα προς @{name}", + "status.direct": "Προσωπικό μήνυμα προς @{name}", "status.embed": "Ενσωμάτωσε", "status.favourite": "Σημείωσε ως αγαπημένο", + "status.filtered": "Filtered", "status.load_more": "Φόρτωσε περισσότερα", "status.media_hidden": "Κρυμμένο πολυμέσο", "status.mention": "Ανέφερε τον/την @{name}", @@ -269,7 +267,7 @@ "status.pin": "Καρφίτσωσε στο προφίλ", "status.pinned": "Καρφιτσωμένο τουτ", "status.reblog": "Προώθησε", - "status.reblog_private": "Προώθησε στο αρχικό κοινό", + "status.reblog_private": "Προώθησε στους αρχικούς παραλήπτες", "status.reblogged_by": "{name} προώθησε", "status.redraft": "Σβήσε & ξαναγράψε", "status.reply": "Απάντησε", @@ -298,12 +296,12 @@ "upload_form.undo": "Διαγραφή", "upload_progress.label": "Ανεβαίνει...", "video.close": "Κλείσε το βίντεο", - "video.exit_fullscreen": "Έξοδος πλήρης οθόνης", + "video.exit_fullscreen": "Έξοδος από πλήρη οθόνη", "video.expand": "Επέκταση βίντεο", "video.fullscreen": "Πλήρης οθόνη", "video.hide": "Κρύψε βίντεο", - "video.mute": "Mute sound", + "video.mute": "Σίγαση ήχου", "video.pause": "Pause", - "video.play": "Play", - "video.unmute": "Unmute sound" + "video.play": "Αναπαραγωγή", + "video.unmute": "Αναπαραγωγή ήχου" } diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index d1160adc0..b1b24644c 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", - "home.column_settings.filter_regex": "Filter out by regular expressions", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", - "home.settings": "Column settings", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Favourite", + "status.filtered": "Filtered", "status.load_more": "Load more", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index c160ec0fb..93bf53b9f 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon estas malfermitkoda programo. Vi povas kontribui aŭ raporti problemojn en GitHub je {github}.", "getting_started.security": "Sekureco", "getting_started.terms": "Uzkondiĉoj", - "home.column_settings.advanced": "Precizaj agordoj", "home.column_settings.basic": "Bazaj agordoj", - "home.column_settings.filter_regex": "Filtri per regulesprimoj", "home.column_settings.show_reblogs": "Montri diskonigojn", "home.column_settings.show_replies": "Montri respondojn", - "home.settings": "Kolumnaj agordoj", "keyboard_shortcuts.back": "por reveni", "keyboard_shortcuts.boost": "por diskonigi", "keyboard_shortcuts.column": "por fokusigi mesaĝon en unu el la kolumnoj", @@ -259,6 +256,7 @@ "status.direct": "Rekte mesaĝi @{name}", "status.embed": "Enkorpigi", "status.favourite": "Stelumi", + "status.filtered": "Filtered", "status.load_more": "Ŝargi pli", "status.media_hidden": "Aŭdovidaĵo kaŝita", "status.mention": "Mencii @{name}", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index f1f370bbb..a56620e2b 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon es software libre. Puedes contribuir o reportar errores en {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Avanzado", "home.column_settings.basic": "Básico", - "home.column_settings.filter_regex": "Filtrar con expresiones regulares", "home.column_settings.show_reblogs": "Mostrar retoots", "home.column_settings.show_replies": "Mostrar respuestas", - "home.settings": "Ajustes de columna", "keyboard_shortcuts.back": "volver atrás", "keyboard_shortcuts.boost": "retootear", "keyboard_shortcuts.column": "enfocar un estado en una de las columnas", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Incrustado", "status.favourite": "Favorito", + "status.filtered": "Filtered", "status.load_more": "Cargar más", "status.media_hidden": "Contenido multimedia oculto", "status.mention": "Mencionar", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index c92adcf4e..e67dd02ef 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon software librea da. Ekarpenak egin ditzakezu edo akatsen berri eman GitHub bidez: {github}.", "getting_started.security": "Segurtasuna", "getting_started.terms": "Erabilera baldintzak", - "home.column_settings.advanced": "Aurreratua", "home.column_settings.basic": "Oinarrizkoa", - "home.column_settings.filter_regex": "Iragazi adierazpen erregularren bidez", "home.column_settings.show_reblogs": "Erakutsi bultzadak", "home.column_settings.show_replies": "Erakutsi erantzunak", - "home.settings": "Zutabearen ezarpenak", "keyboard_shortcuts.back": "atzera nabigatzeko", "keyboard_shortcuts.boost": "bultzada ematea", "keyboard_shortcuts.column": "mezu bat zutabe batean fokatzea", @@ -259,6 +256,7 @@ "status.direct": "Mezu zuzena @{name}(r)i", "status.embed": "Txertatu", "status.favourite": "Gogokoa", + "status.filtered": "Filtered", "status.load_more": "Kargatu gehiago", "status.media_hidden": "Multimedia ezkutatua", "status.mention": "Aipatu @{name}", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index ff039324d..d6aea20d5 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "ماستدون یک نرم‌افزار آزاد است. می‌توانید در ساخت آن مشارکت کنید یا مشکلاتش را در {github} گزارش دهید.", "getting_started.security": "امنیت", "getting_started.terms": "شرایط استفاده", - "home.column_settings.advanced": "پیشرفته", "home.column_settings.basic": "اصلی", - "home.column_settings.filter_regex": "با عبارت‌های باقاعده (regexp) فیلتر کنید", "home.column_settings.show_reblogs": "نمایش بازبوق‌ها", "home.column_settings.show_replies": "نمایش پاسخ‌ها", - "home.settings": "تنظیمات ستون", "keyboard_shortcuts.back": "برای بازگشت", "keyboard_shortcuts.boost": "برای بازبوقیدن", "keyboard_shortcuts.column": "برای برجسته‌کردن یک نوشته در یکی از ستون‌ها", @@ -259,6 +256,7 @@ "status.direct": "پیغام مستقیم به @{name}", "status.embed": "جاگذاری", "status.favourite": "پسندیدن", + "status.filtered": "Filtered", "status.load_more": "بیشتر نشان بده", "status.media_hidden": "تصویر پنهان شده", "status.mention": "نام‌بردن از @{name}", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index b4678c1d2..009938d5e 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon on avoimen lähdekoodin ohjelma. Voit avustaa tai raportoida ongelmia GitHubissa: {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Lisäasetukset", "home.column_settings.basic": "Perusasetukset", - "home.column_settings.filter_regex": "Suodata säännöllisillä lausekkeilla", "home.column_settings.show_reblogs": "Näytä buustaukset", "home.column_settings.show_replies": "Näytä vastaukset", - "home.settings": "Sarakeasetukset", "keyboard_shortcuts.back": "liiku taaksepäin", "keyboard_shortcuts.boost": "buustaa", "keyboard_shortcuts.column": "siirrä fokus tietyn sarakkeen tilapäivitykseen", @@ -259,6 +256,7 @@ "status.direct": "Viesti käyttäjälle @{name}", "status.embed": "Upota", "status.favourite": "Tykkää", + "status.filtered": "Filtered", "status.load_more": "Lataa lisää", "status.media_hidden": "Media piilotettu", "status.mention": "Mainitse @{name}", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 1e9756d05..22ebc5df5 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon est un logiciel libre. Vous pouvez contribuer et envoyer vos commentaires et rapports de bogues via {github} sur GitHub.", "getting_started.security": "Sécurité", "getting_started.terms": "Conditions d’utilisation", - "home.column_settings.advanced": "Avancé", "home.column_settings.basic": "Basique", - "home.column_settings.filter_regex": "Filtrer avec une expression rationnelle", "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", - "home.settings": "Paramètres de la colonne", "keyboard_shortcuts.back": "revenir en arrière", "keyboard_shortcuts.boost": "partager", "keyboard_shortcuts.column": "focaliser un statut dans l'une des colonnes", @@ -259,6 +256,7 @@ "status.direct": "Envoyer un message direct à @{name}", "status.embed": "Intégrer", "status.favourite": "Ajouter aux favoris", + "status.filtered": "Filtered", "status.load_more": "Charger plus", "status.media_hidden": "Média caché", "status.mention": "Mentionner", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index da4fa83b5..7693c7671 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -65,7 +65,7 @@ "compose_form.hashtag_warning": "Esta mensaxe non será listada baixo ningunha etiqueta xa que está marcada como non listada. Só os toots públicos poden buscarse por etiquetas.", "compose_form.lock_disclaimer": "A súa conta non está {locked}. Calquera pode seguila para ver as súas mensaxes só-para-seguidoras.", "compose_form.lock_disclaimer.lock": "bloqueado", - "compose_form.placeholder": "A qué andas?", + "compose_form.placeholder": "Qué contas?", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.marked": "Medios marcados como sensibles", @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon é software de código aberto. Pode contribuír ou informar de fallos en GitHub en {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Avanzado", "home.column_settings.basic": "Básico", - "home.column_settings.filter_regex": "Filtrar expresións regulares", "home.column_settings.show_reblogs": "Mostrar repeticións", "home.column_settings.show_replies": "Mostrar respostas", - "home.settings": "Axustes da columna", "keyboard_shortcuts.back": "voltar atrás", "keyboard_shortcuts.boost": "promover", "keyboard_shortcuts.column": "destacar un estado en unha das columnas", @@ -259,6 +256,7 @@ "status.direct": "Mensaxe directa @{name}", "status.embed": "Incrustar", "status.favourite": "Favorita", + "status.filtered": "Filtered", "status.load_more": "Cargar máis", "status.media_hidden": "Medios ocultos", "status.mention": "Mencionar @{name}", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 4457e2a9b..61a5700e1 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "מסטודון היא תוכנה חופשית (בקוד פתוח). ניתן לתרום או לדווח על בעיות בגיטהאב: {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "למתקדמים", "home.column_settings.basic": "למתחילים", - "home.column_settings.filter_regex": "סינון באמצעות ביטויים רגולריים (regular expressions)", "home.column_settings.show_reblogs": "הצגת הדהודים", "home.column_settings.show_replies": "הצגת תגובות", - "home.settings": "הגדרות טור", "keyboard_shortcuts.back": "ניווט חזרה", "keyboard_shortcuts.boost": "להדהד", "keyboard_shortcuts.column": "להתמקד בהודעה באחד מהטורים", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "הטמעה", "status.favourite": "חיבוב", + "status.filtered": "Filtered", "status.load_more": "עוד", "status.media_hidden": "מדיה מוסתרת", "status.mention": "פניה אל @{name}", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 110246e8a..dcef385da 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon je softver otvorenog koda. Možeš pridonijeti ili prijaviti probleme na GitHubu {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Napredno", "home.column_settings.basic": "Osnovno", - "home.column_settings.filter_regex": "Filtriraj s regularnim izrazima", "home.column_settings.show_reblogs": "Pokaži boostove", "home.column_settings.show_replies": "Pokaži odgovore", - "home.settings": "Postavke Stupca", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Označi omiljenim", + "status.filtered": "Filtered", "status.load_more": "Učitaj više", "status.media_hidden": "Sakriven media sadržaj", "status.mention": "Spomeni @{name}", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 187ce7c42..2072b740a 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon egy nyílt forráskódú szoftver. Hozzájárulás vagy problémák jelentése a GitHub-on {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Fejlett", "home.column_settings.basic": "Alap", - "home.column_settings.filter_regex": "Szűrje ki reguláris kifejezésekkel", "home.column_settings.show_reblogs": "Ismétlések mutatása", "home.column_settings.show_replies": "Válaszok mutatása", - "home.settings": "Oszlop beállításai", "keyboard_shortcuts.back": "vissza navigálás", "keyboard_shortcuts.boost": "ismétlés", "keyboard_shortcuts.column": "összpontosítson egy státuszra az egyik oszlopban", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Beágyaz", "status.favourite": "Kedvenc", + "status.filtered": "Filtered", "status.load_more": "Többet", "status.media_hidden": "Média elrejtve", "status.mention": "Említés", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 5d5ceb46b..d06d1c302 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Մաստոդոնը բաց ելատեքստով ծրագրակազմ է։ Կարող ես ներդրում անել կամ վրեպներ զեկուցել ԳիթՀաբում՝ {github}։", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Առաջադեմ", "home.column_settings.basic": "Հիմնական", - "home.column_settings.filter_regex": "Զտել օրինաչափ արտահայտությամբ", "home.column_settings.show_reblogs": "Ցուցադրել տարածածները", "home.column_settings.show_replies": "Ցուցադրել պատասխանները", - "home.settings": "Սյան կարգավորումներ", "keyboard_shortcuts.back": "ետ նավարկելու համար", "keyboard_shortcuts.boost": "տարածելու համար", "keyboard_shortcuts.column": "սյուներից մեկի վրա սեւեռվելու համար", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Ներդնել", "status.favourite": "Հավանել", + "status.filtered": "Filtered", "status.load_more": "Բեռնել ավելին", "status.media_hidden": "մեդիաբովանդակությունը թաքցված է", "status.mention": "Նշել @{name}֊ին", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 2b337fa20..fe98cf00b 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon adalah perangkat lunak yang bersifat terbuka. Anda dapat berkontribusi atau melaporkan permasalahan/bug di Github {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Tingkat Lanjut", "home.column_settings.basic": "Dasar", - "home.column_settings.filter_regex": "Saring dengan regular expressions", "home.column_settings.show_reblogs": "Tampilkan boost", "home.column_settings.show_replies": "Tampilkan balasan", - "home.settings": "Pengaturan kolom", "keyboard_shortcuts.back": "untuk kembali", "keyboard_shortcuts.boost": "untuk menyebarkan", "keyboard_shortcuts.column": "untuk fokus kepada sebuah status di sebuah kolom", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Difavoritkan", + "status.filtered": "Filtered", "status.load_more": "Tampilkan semua", "status.media_hidden": "Media disembunyikan", "status.mention": "Balasan @{name}", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 7789c9994..24758bd2e 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon esas programaro kun apertita kodexo. Tu povas kontributar o signalar problemi en GitHub ye {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Komplexa", "home.column_settings.basic": "Simpla", - "home.column_settings.filter_regex": "Ekfiltrar per reguloza expresuri", "home.column_settings.show_reblogs": "Montrar repeti", "home.column_settings.show_replies": "Montrar respondi", - "home.settings": "Aranji di la kolumno", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Favorizar", + "status.filtered": "Filtered", "status.load_more": "Kargar pluse", "status.media_hidden": "Kontenajo celita", "status.mention": "Mencionar @{name}", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 61eba2f5a..287549769 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon è un software open source. Puoi contribuire o segnalare errori su GitHub all'indirizzo {github}.", "getting_started.security": "Sicurezza", "getting_started.terms": "Condizioni del servizio", - "home.column_settings.advanced": "Avanzato", "home.column_settings.basic": "Semplice", - "home.column_settings.filter_regex": "Filtra con espressioni regolari", "home.column_settings.show_reblogs": "Mostra post condivisi", "home.column_settings.show_replies": "Mostra risposte", - "home.settings": "Impostazioni colonna", "keyboard_shortcuts.back": "per tornare indietro", "keyboard_shortcuts.boost": "per condividere", "keyboard_shortcuts.column": "per portare il focus su uno status in una delle colonne", @@ -259,6 +256,7 @@ "status.direct": "Messaggio diretto @{name}", "status.embed": "Incorpora", "status.favourite": "Apprezzato", + "status.filtered": "Filtered", "status.load_more": "Mostra di più", "status.media_hidden": "Allegato nascosto", "status.mention": "Nomina @{name}", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index bb43df44e..b689278ba 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodonはオープンソースソフトウェアです。誰でもGitHub({github})から開発に参加したり、問題を報告したりできます。", "getting_started.security": "セキュリティ", "getting_started.terms": "プライバシーポリシー", - "home.column_settings.advanced": "高度な設定", "home.column_settings.basic": "基本設定", - "home.column_settings.filter_regex": "正規表現でフィルター", "home.column_settings.show_reblogs": "ブースト表示", "home.column_settings.show_replies": "返信表示", - "home.settings": "カラム設定", "keyboard_shortcuts.back": "戻る", "keyboard_shortcuts.boost": "ブースト", "keyboard_shortcuts.column": "左からn番目のカラム内最新トゥートに移動", @@ -259,6 +256,7 @@ "status.direct": "@{name}さんにダイレクトメッセージ", "status.embed": "埋め込み", "status.favourite": "お気に入り", + "status.filtered": "Filtered", "status.load_more": "もっと見る", "status.media_hidden": "非表示のメディア", "status.mention": "@{name}さんにトゥート", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 1a3a4d23f..10da7d358 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon은 오픈 소스 소프트웨어입니다. 누구나 GitHub({github})에서 개발에 참여하거나, 문제를 보고할 수 있습니다.", "getting_started.security": "보안", "getting_started.terms": "이용 약관", - "home.column_settings.advanced": "고급 사용자용", "home.column_settings.basic": "기본 설정", - "home.column_settings.filter_regex": "정규 표현식으로 필터링", "home.column_settings.show_reblogs": "부스트 표시", "home.column_settings.show_replies": "답글 표시", - "home.settings": "컬럼 설정", "keyboard_shortcuts.back": "뒤로가기", "keyboard_shortcuts.boost": "부스트", "keyboard_shortcuts.column": "해당 열에 포커스", @@ -259,6 +256,7 @@ "status.direct": "@{name}에게 다이렉트 메시지", "status.embed": "공유하기", "status.favourite": "즐겨찾기", + "status.filtered": "Filtered", "status.load_more": "더 보기", "status.media_hidden": "미디어 숨겨짐", "status.mention": "답장", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index a6cba4b47..ac785fb24 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon is vrije software. Je kunt bijdragen of problemen melden op GitHub via {github}.", "getting_started.security": "Beveiliging", "getting_started.terms": "Voorwaarden", - "home.column_settings.advanced": "Geavanceerd", "home.column_settings.basic": "Algemeen", - "home.column_settings.filter_regex": "Wegfilteren met reguliere expressies", "home.column_settings.show_reblogs": "Boosts tonen", "home.column_settings.show_replies": "Reacties tonen", - "home.settings": "Kolom-instellingen", "keyboard_shortcuts.back": "om terug te gaan", "keyboard_shortcuts.boost": "om te boosten", "keyboard_shortcuts.column": "om op een toot te focussen in één van de kolommen", @@ -259,6 +256,7 @@ "status.direct": "Directe toot @{name}", "status.embed": "Embed", "status.favourite": "Favoriet", + "status.filtered": "Filtered", "status.load_more": "Meer laden", "status.media_hidden": "Media verborgen", "status.mention": "Vermeld @{name}", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 0491d3f7a..295d44ae8 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon er fri programvare. Du kan bidra eller rapportere problemer på GitHub på {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Avansert", "home.column_settings.basic": "Enkel", - "home.column_settings.filter_regex": "Filtrér med regulære uttrykk", "home.column_settings.show_reblogs": "Vis fremhevinger", "home.column_settings.show_replies": "Vis svar", - "home.settings": "Kolonneinnstillinger", "keyboard_shortcuts.back": "for å navigere tilbake", "keyboard_shortcuts.boost": "å fremheve", "keyboard_shortcuts.column": "å fokusere en status i en av kolonnene", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Bygge inn", "status.favourite": "Lik", + "status.filtered": "Filtered", "status.load_more": "Last mer", "status.media_hidden": "Media skjult", "status.mention": "Nevn @{name}", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index e2b107d1e..cb9ff8713 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon es un logicial liure. Podètz contribuir e mandar vòstres comentaris e rapòrt de bug via {github} sus GitHub.", "getting_started.security": "Seguretat", "getting_started.terms": "Condicions d’utilizacion", - "home.column_settings.advanced": "Avançat", "home.column_settings.basic": "Basic", - "home.column_settings.filter_regex": "Filtrar amb una expression racionala", "home.column_settings.show_reblogs": "Mostrar los partatges", "home.column_settings.show_replies": "Mostrar las responsas", - "home.settings": "Paramètres de la colomna", "keyboard_shortcuts.back": "anar enrèire", "keyboard_shortcuts.boost": "partejar", "keyboard_shortcuts.column": "centrar un estatut a una colomna", @@ -259,6 +256,7 @@ "status.direct": "Messatge per @{name}", "status.embed": "Embarcar", "status.favourite": "Apondre als favorits", + "status.filtered": "Filtered", "status.load_more": "Cargar mai", "status.media_hidden": "Mèdia rescondut", "status.mention": "Mencionar", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 0697d9ab9..37684efb7 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -59,7 +59,7 @@ "column_header.show_settings": "Mostrar configurações", "column_header.unpin": "Desafixar", "column_subheading.settings": "Configurações", - "community.column_settings.media_only": "Media Only", + "community.column_settings.media_only": "Apenas mídia", "compose_form.direct_message_warning": "Este toot só será enviado aos usuários mencionados.", "compose_form.direct_message_warning_learn_more": "Saber mais", "compose_form.hashtag_warning": "Esse toot não será listado em nenhuma hashtag por ser não listado. Somente toots públicos podem ser pesquisados por hashtag.", @@ -114,20 +114,17 @@ "empty_column.public": "Não há nada aqui! Escreva algo publicamente ou siga manualmente usuários de outras instâncias", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rejeitar", - "getting_started.developers": "Developers", + "getting_started.developers": "Desenvolvedores", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "Encontre amizades do Twitter", "getting_started.heading": "Primeiros passos", - "getting_started.invite": "Invite people", + "getting_started.invite": "Convide pessoas", "getting_started.open_source_notice": "Mastodon é um software de código aberto. Você pode contribuir ou reportar problemas na página do GitHub do projeto: {github}.", - "getting_started.security": "Security", + "getting_started.security": "Segurança", "getting_started.terms": "Termos de serviço", - "home.column_settings.advanced": "Avançado", "home.column_settings.basic": "Básico", - "home.column_settings.filter_regex": "Filtrar com uma expressão regular", "home.column_settings.show_reblogs": "Mostrar compartilhamentos", "home.column_settings.show_replies": "Mostrar as respostas", - "home.settings": "Configurações de colunas", "keyboard_shortcuts.back": "para navegar de volta", "keyboard_shortcuts.boost": "para compartilhar", "keyboard_shortcuts.column": "Focar um status em uma das colunas", @@ -259,6 +256,7 @@ "status.direct": "Enviar mensagem direta a @{name}", "status.embed": "Incorporar", "status.favourite": "Adicionar aos favoritos", + "status.filtered": "Filtered", "status.load_more": "Carregar mais", "status.media_hidden": "Mídia escondida", "status.mention": "Mencionar @{name}", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index fb0cfc445..bda1020aa 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon é software de fonte aberta. Podes contribuir ou repostar problemas no GitHub do projecto: {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Avançado", "home.column_settings.basic": "Básico", - "home.column_settings.filter_regex": "Filtrar com uma expressão regular", "home.column_settings.show_reblogs": "Mostrar as partilhas", "home.column_settings.show_replies": "Mostrar as respostas", - "home.settings": "Parâmetros da listagem", "keyboard_shortcuts.back": "para voltar", "keyboard_shortcuts.boost": "para partilhar", "keyboard_shortcuts.column": "para focar uma publicação numa das colunas", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Incorporar", "status.favourite": "Adicionar aos favoritos", + "status.filtered": "Filtered", "status.load_more": "Carregar mais", "status.media_hidden": "Media escondida", "status.mention": "Mencionar @{name}", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 57bd413ea..8bf6012e2 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon - программа с открытым исходным кодом. Вы можете помочь проекту или сообщить о проблемах на GitHub по адресу {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Дополнительные", "home.column_settings.basic": "Основные", - "home.column_settings.filter_regex": "Отфильтровать регулярным выражением", "home.column_settings.show_reblogs": "Показывать продвижения", "home.column_settings.show_replies": "Показывать ответы", - "home.settings": "Настройки колонки", "keyboard_shortcuts.back": "перейти назад", "keyboard_shortcuts.boost": "продвинуть пост", "keyboard_shortcuts.column": "фокус на одном из столбцов", @@ -259,6 +256,7 @@ "status.direct": "Написать @{name}", "status.embed": "Встроить", "status.favourite": "Нравится", + "status.filtered": "Filtered", "status.load_more": "Показать еще", "status.media_hidden": "Медиаконтент скрыт", "status.mention": "Упомянуть @{name}", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 648e5c598..839ef70f9 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -4,7 +4,7 @@ "account.block_domain": "Ukry všetko z {domain}", "account.blocked": "Blokovaný/á", "account.direct": "Súkromná správa pre @{name}", - "account.disclaimer_full": "Inofrmácie nižšie nemusia byť úplným odrazom uživateľovho účtu.", + "account.disclaimer_full": "Inofrmácie uvedené nižšie nemusia byť úplným odrazom uživateľovho účtu.", "account.domain_blocked": "Doména ukrytá", "account.edit_profile": "Upraviť profil", "account.follow": "Následovať", @@ -65,8 +65,8 @@ "compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.", "compose_form.lock_disclaimer": "Váš účet nie je zamknutý. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.", "compose_form.lock_disclaimer.lock": "zamknutý", - "compose_form.placeholder": "Na čo myslíš?", - "compose_form.publish": "Toot", + "compose_form.placeholder": "Čo máš na mysli?", + "compose_form.publish": "Pošli", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.marked": "Médiálny obsah je označený ako chúlostivý", "compose_form.sensitive.unmarked": "Médiálny obsah nieje označený ako chúlostivý", @@ -81,7 +81,7 @@ "confirmations.delete_list.confirm": "Vymazať", "confirmations.delete_list.message": "Si si istý/á, že chceš navždy vymazať tento zoznam?", "confirmations.domain_block.confirm": "Skryť celú doménu", - "confirmations.domain_block.message": "Si si naozaj istý, že chceš blokovať celú {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych používateľov, čo sa doporučuje. Neuvidíš obsah z tejto domény v žiadnej verejnej časovej osi, ani v oznámeniach. Tvoji následovníci pochádzajúci z tejto domény budú odstránení.", + "confirmations.domain_block.message": "Si si naozaj istý, že chceš blokovať celú {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych užívateľov, čo sa doporučuje. Neuvidíš obsah z tejto domény v žiadnej verejnej časovej osi, ani v oznámeniach. Tvoji následovníci pochádzajúci z tejto domény budú odstránení.", "confirmations.mute.confirm": "Ignoruj", "confirmations.mute.message": "Naozaj chcete ignorovať {name}?", "confirmations.redraft.confirm": "Vyčistiť a prepísať", @@ -107,11 +107,11 @@ "empty_column.community": "Lokálna časová os je prázdna. Napíšte niečo, aby sa to tu začalo hýbať!", "empty_column.direct": "Ešte nemáš žiadne súkromné správy. Keď nejakú pošleš, alebo dostaneš, ukáže sa tu.", "empty_column.hashtag": "Pod týmto hashtagom sa ešte nič nenachádza.", - "empty_column.home": "Vaša lokálna osa je zatiaľ prázdna! Pre začiatok pozrite {public} alebo použite vyhľadávanie a nájdite tak ostatných používateľov.", + "empty_column.home": "Tvoja lokálna osa je zatiaľ prázdna! Pre začiatok navštív {public}, alebo použi vyhľadávanie a nájdi tak aj iných užívateľov.", "empty_column.home.public_timeline": "verejná časová os", "empty_column.list": "Tento zoznam je ešte prázdny. Keď ale členovia tohoto zoznamu napíšu nové správy, tak tie sa objavia priamo tu.", "empty_column.notifications": "Nemáš ešte žiadne oznámenia. Zapoj sa s niekym do debaty a komunikuj s ostatnými aby diskusia mohla začať.", - "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne alebo začnite sledovať používateľov z iných Mastodon serverov aby tu niečo pribudlo", + "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne alebo začnite sledovať užívateľov z iných Mastodon serverov, aby tu tak niečo pribudlo", "follow_request.authorize": "Povoľ prístup", "follow_request.reject": "Odmietni", "getting_started.developers": "Vývojári", @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon je softvér s otvoreným kódom. Nahlásiť chyby, alebo prispievať môžeš na GitHube v {github}.", "getting_started.security": "Zabezpečenie", "getting_started.terms": "Podmienky prevozu", - "home.column_settings.advanced": "Pokročilé", "home.column_settings.basic": "Základné", - "home.column_settings.filter_regex": "Filtrovať použitím regulárnych výrazov", "home.column_settings.show_reblogs": "Zobraziť povýšené", "home.column_settings.show_replies": "Ukázať odpovede", - "home.settings": "Nastavenia stĺpcov", "keyboard_shortcuts.back": "dostať sa naspäť", "keyboard_shortcuts.boost": "vyzdvihnúť", "keyboard_shortcuts.column": "zamerať sa na status v jednom zo stĺpcov", @@ -156,8 +153,8 @@ "lists.new.create": "Pridať zoznam", "lists.new.title_placeholder": "Názov nového zoznamu", "lists.search": "Vyhľadávajte medzi užívateľmi ktorých sledujete", - "lists.subheading": "Vaše zoznamy", - "loading_indicator.label": "Nahrávam...", + "lists.subheading": "Tvoje zoznamy", + "loading_indicator.label": "Načítam...", "media_gallery.toggle_visible": "Zapnúť/Vypnúť viditeľnosť", "missing_indicator.label": "Nenájdené", "missing_indicator.sublabel": "Tento zdroj sa nepodarilo nájsť", @@ -203,9 +200,9 @@ "onboarding.page_four.notifications": "Stĺpec s notifikáciami zobrazí keď budete s niekým komunikovať.", "onboarding.page_one.federation": "Mastodon je sieť nezávislých serverov, spojením ktorých vzniká jedna veľká federovaná sociálna sieť.", "onboarding.page_one.full_handle": "Vaša celá prezývka aj s adresou", - "onboarding.page_one.handle_hint": "Toto je čo by ste povedali vaším priateľom že majú hľadať.", - "onboarding.page_one.welcome": "Vitajte na Mastodone!", - "onboarding.page_six.admin": "Správca tohto servera je {admin}.", + "onboarding.page_one.handle_hint": "Toto je čo by si povedal/a vaším kamarátom, že majú hľadať.", + "onboarding.page_one.welcome": "Vitaj na Mastodone!", + "onboarding.page_six.admin": "Správcom tvojej instancie je {admin}.", "onboarding.page_six.almost_done": "Takmer hotovo...", "onboarding.page_six.appetoot": "Bon Appetoot!", "onboarding.page_six.apps_available": "Aplikácie {apps} sú dostupné na pre iOS, Android and ďalšie platformy.", @@ -259,7 +256,8 @@ "status.direct": "Súkromná správa @{name}", "status.embed": "Vložiť", "status.favourite": "Páči sa mi", - "status.load_more": "Zobraz viac", + "status.filtered": "Filtered", + "status.load_more": "Ukáž viac", "status.media_hidden": "Skryté médiá", "status.mention": "Spomeň @{name}", "status.more": "Viac", @@ -280,7 +278,7 @@ "status.share": "Zdieľať", "status.show_less": "Zobraz menej", "status.show_less_all": "Všetkým ukáž menej", - "status.show_more": "Zobraziť viac", + "status.show_more": "Ukáž viac", "status.show_more_all": "Všetkým ukáž viac", "status.unmute_conversation": "Prestať ignorovať konverzáciu", "status.unpin": "Odopnúť z profilu", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 7e4307c2a..f738274db 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon je odprtokodna programska oprema. V GitHubu na {github} lahko prispevate ali poročate o napakah.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Napredno", "home.column_settings.basic": "Osnovno", - "home.column_settings.filter_regex": "Filtrirajte z navadnimi izrazi", "home.column_settings.show_reblogs": "Pokaži sunke", "home.column_settings.show_replies": "Pokaži odgovore", - "home.settings": "Nastavitve stolpcev", "keyboard_shortcuts.back": "za krmarjenje nazaj", "keyboard_shortcuts.boost": "suniti", "keyboard_shortcuts.column": "osredotočiti status v enega od stolpcev", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Favourite", + "status.filtered": "Filtered", "status.load_more": "Load more", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 7a72ba6fb..6c7e56fe8 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodont je softver otvorenog koda. Možete mu doprineti ili prijaviti probleme preko GitHub-a na {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Napredno", "home.column_settings.basic": "Osnovno", - "home.column_settings.filter_regex": "Filtriraj regularnim izrazima", "home.column_settings.show_reblogs": "Prikaži i podržavanja", "home.column_settings.show_replies": "Prikaži odgovore", - "home.settings": "Postavke kolone", "keyboard_shortcuts.back": "da odete nazad", "keyboard_shortcuts.boost": "da podržite", "keyboard_shortcuts.column": "da se prebacite na status u jednoj od kolona", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Ugradi na sajt", "status.favourite": "Omiljeno", + "status.filtered": "Filtered", "status.load_more": "Učitaj još", "status.media_hidden": "Multimedija sakrivena", "status.mention": "Pomeni korisnika @{name}", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index c699bd8fd..6a9e80559 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Мастoдонт је софтвер отвореног кода. Можете му допринети или пријавити проблеме преко GitHub-а на {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Напредно", "home.column_settings.basic": "Основно", - "home.column_settings.filter_regex": "Филтрирај регуларним изразима", "home.column_settings.show_reblogs": "Прикажи и подржавања", "home.column_settings.show_replies": "Прикажи одговоре", - "home.settings": "Поставке колоне", "keyboard_shortcuts.back": "да одете назад", "keyboard_shortcuts.boost": "да подржите", "keyboard_shortcuts.column": "да се пребаците на статус у једној од колона", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Угради на сајт", "status.favourite": "Омиљено", + "status.filtered": "Filtered", "status.load_more": "Учитај још", "status.media_hidden": "Мултимедија сакривена", "status.mention": "Помени корисника @{name}", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 00d2fee8e..0701bf925 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -1,5 +1,5 @@ { - "account.badges.bot": "Bot", + "account.badges.bot": "Robot", "account.block": "Blockera @{name}", "account.block_domain": "Dölj allt från {domain}", "account.blocked": "Blockerad", @@ -59,9 +59,9 @@ "column_header.show_settings": "Visa inställningar", "column_header.unpin": "Ångra fäst", "column_subheading.settings": "Inställningar", - "community.column_settings.media_only": "Media Only", + "community.column_settings.media_only": "Enbart media", "compose_form.direct_message_warning": "Denna toot kommer endast att skickas nämnda nämnda användare.", - "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.direct_message_warning_learn_more": "Visa mer", "compose_form.hashtag_warning": "Denna toot kommer inte att listas under någon hashtag eftersom den är onoterad. Endast offentliga toots kan sökas med hashtag.", "compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vemsomhelst kan följa dig och även se dina inlägg skrivna för endast dina följare.", "compose_form.lock_disclaimer.lock": "låst", @@ -81,11 +81,11 @@ "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "Är du säker på att du vill radera denna lista permanent?", "confirmations.domain_block.confirm": "Blockera hela domänen", - "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade tillräckligt och föredras.", + "confirmations.domain_block.message": "Är du verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer sluta se innehåll från {domain}-domänen i den allmänna tidslinjen och i dina egna notifieringar. Du kommer även sluta följa alla eventuella följare du har från {domain}.", "confirmations.mute.confirm": "Tysta", "confirmations.mute.message": "Är du säker du vill tysta ner {name}?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.redraft.confirm": "Radera och gör om", + "confirmations.redraft.message": "Är du säker på att du vill radera meddelandet och göra om det? Du kommer förlora alla svar, knuffar och favoriter som hänvisar till meddelandet.", "confirmations.unfollow.confirm": "Sluta följa", "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?", "embed.instructions": "Bädda in den här statusen på din webbplats genom att kopiera koden nedan.", @@ -114,20 +114,17 @@ "empty_column.public": "Det finns inget här! Skriv något offentligt, eller följ manuellt användarna från andra instanser för att fylla på det", "follow_request.authorize": "Godkänn", "follow_request.reject": "Avvisa", - "getting_started.developers": "Developers", + "getting_started.developers": "Utvecklare", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "Hitta vänner från Twitter", "getting_started.heading": "Kom igång", - "getting_started.invite": "Invite people", + "getting_started.invite": "Skicka inbjudningar", "getting_started.open_source_notice": "Mastodon är programvara med öppen källkod. Du kan bidra eller rapportera problem via GitHub på {github}.", - "getting_started.security": "Security", - "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Avancerad", + "getting_started.security": "Säkerhet", + "getting_started.terms": "Användarvillkor", "home.column_settings.basic": "Grundläggande", - "home.column_settings.filter_regex": "Filtrera ut med regelbundna uttryck", "home.column_settings.show_reblogs": "Visa knuffar", "home.column_settings.show_replies": "Visa svar", - "home.settings": "Kolumninställningar", "keyboard_shortcuts.back": "att navigera tillbaka", "keyboard_shortcuts.boost": "att knuffa", "keyboard_shortcuts.column": "att fokusera en status i en av kolumnerna", @@ -165,7 +162,7 @@ "navigation_bar.blocks": "Blockerade användare", "navigation_bar.community_timeline": "Lokal tidslinje", "navigation_bar.direct": "Direktmeddelanden", - "navigation_bar.discover": "Discover", + "navigation_bar.discover": "Upptäck", "navigation_bar.domain_blocks": "Dolda domäner", "navigation_bar.edit_profile": "Redigera profil", "navigation_bar.favourites": "Favoriter", @@ -179,7 +176,7 @@ "navigation_bar.pins": "Nålade inlägg (toots)", "navigation_bar.preferences": "Inställningar", "navigation_bar.public_timeline": "Förenad tidslinje", - "navigation_bar.security": "Security", + "navigation_bar.security": "Säkerhet", "notification.favourite": "{name} favoriserade din status", "notification.follow": "{name} följer dig", "notification.mention": "{name} nämnde dig", @@ -195,7 +192,7 @@ "notifications.column_settings.reblog": "Knuffar:", "notifications.column_settings.show": "Visa i kolumnen", "notifications.column_settings.sound": "Spela upp ljud", - "notifications.group": "{count} notifications", + "notifications.group": "{count} aviseringar", "onboarding.done": "Klart", "onboarding.next": "Nästa", "onboarding.page_five.public_timelines": "Den lokala tidslinjen visar offentliga inlägg från alla på {domain}. Den förenade tidslinjen visar offentliga inlägg från alla personer på {domain} som följer. Dom här offentliga tidslinjerna är ett bra sätt att upptäcka nya människor.", @@ -259,6 +256,7 @@ "status.direct": "Direktmeddela @{name}", "status.embed": "Bädda in", "status.favourite": "Favorit", + "status.filtered": "Filtered", "status.load_more": "Ladda fler", "status.media_hidden": "Media dold", "status.mention": "Omnämn @{name}", @@ -271,7 +269,7 @@ "status.reblog": "Knuff", "status.reblog_private": "Knuffa till de ursprungliga åhörarna", "status.reblogged_by": "{name} knuffade", - "status.redraft": "Delete & re-draft", + "status.redraft": "Radera & gör om", "status.reply": "Svara", "status.replyAll": "Svara på tråden", "status.report": "Rapportera @{name}", @@ -289,7 +287,7 @@ "tabs_bar.local_timeline": "Lokal", "tabs_bar.notifications": "Meddelanden", "tabs_bar.search": "Sök", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "trends.count_by_accounts": "{count} {rawCount, plural, en {person} andra {people}} pratar", "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.", "upload_area.title": "Dra & släpp för att ladda upp", "upload_button.label": "Lägg till media", @@ -300,7 +298,7 @@ "video.close": "Stäng video", "video.exit_fullscreen": "Stäng helskärm", "video.expand": "Expandera video", - "video.fullscreen": "Fullskärm", + "video.fullscreen": "Helskärm", "video.hide": "Dölj video", "video.mute": "Stäng av ljud", "video.pause": "Pause", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index a89734ce6..8928bfb9b 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "మాస్టొడొన్ ఓపెన్ సోర్స్ సాఫ్ట్వేర్. మీరు {github} వద్ద GitHub పై సమస్యలను నివేదించవచ్చు లేదా తోడ్పడచ్చు.", "getting_started.security": "భద్రత", "getting_started.terms": "సేవా నిబంధనలు", - "home.column_settings.advanced": "అధునాతన", "home.column_settings.basic": "ప్రాథమిక", - "home.column_settings.filter_regex": "రెగ్యులర్ ఎక్స్ప్రెషన్ల ద్వారా ఫిల్టర్ చేయండి", "home.column_settings.show_reblogs": "బూస్ట్ లను చూపించు", "home.column_settings.show_replies": "ప్రత్యుత్తరాలను చూపించు", - "home.settings": "నిలువు వరుస అమర్పులు", "keyboard_shortcuts.back": "వెనక్కి తిరిగి వెళ్ళడానికి", "keyboard_shortcuts.boost": "బూస్ట్ చేయడానికి", "keyboard_shortcuts.column": "నిలువు వరుసలలో ఒకదానిపై దృష్టి పెట్టడానికి", @@ -259,6 +256,7 @@ "status.direct": "@{name}కు నేరుగా సందేశం పంపు", "status.embed": "ఎంబెడ్", "status.favourite": "ఇష్టపడు", + "status.filtered": "Filtered", "status.load_more": "మరిన్ని లోడ్ చేయి", "status.media_hidden": "మీడియా దాచబడింది", "status.mention": "@{name}ను ప్రస్తావించు", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 07cce99d5..57a0bb01f 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", - "home.column_settings.filter_regex": "Filter out by regular expressions", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", - "home.settings": "Column settings", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Favourite", + "status.filtered": "Filtered", "status.load_more": "Load more", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index e46084467..475ee4f05 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon açık kaynaklı bir yazılımdır. Github {github}. {apps} üzerinden katkıda bulunabilir, hata raporlayabilirsiniz.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Gelişmiş", "home.column_settings.basic": "Temel", - "home.column_settings.filter_regex": "Regex kullanarak filtrele", "home.column_settings.show_reblogs": "Boost edilenleri göster", "home.column_settings.show_replies": "Cevapları göster", - "home.settings": "Kolon ayarları", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Favorilere ekle", + "status.filtered": "Filtered", "status.load_more": "Daha fazla", "status.media_hidden": "Gizli görsel", "status.mention": "Bahset @{name}", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index a73c04e5b..bf3262558 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon - програма з відкритим вихідним кодом. Ви можете допомогти проекту, або повідомити про проблеми на GitHub за адресою {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Додаткові", "home.column_settings.basic": "Основні", - "home.column_settings.filter_regex": "Відфільтрувати регулярним виразом", "home.column_settings.show_reblogs": "Показувати передмухи", "home.column_settings.show_replies": "Показувати відповіді", - "home.settings": "Налаштування колонок", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -259,6 +256,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Подобається", + "status.filtered": "Filtered", "status.load_more": "Завантажити більше", "status.media_hidden": "Медіаконтент приховано", "status.mention": "Згадати", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index de3cd0090..1b1997cff 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon 是一个开源软件。欢迎前往 GitHub({github})贡献代码或反馈问题。", "getting_started.security": "帐户安全", "getting_started.terms": "使用条款", - "home.column_settings.advanced": "高级设置", "home.column_settings.basic": "基本设置", - "home.column_settings.filter_regex": "使用正则表达式(regex)过滤", "home.column_settings.show_reblogs": "显示转嘟", "home.column_settings.show_replies": "显示回复", - "home.settings": "栏目设置", "keyboard_shortcuts.back": "返回上一页", "keyboard_shortcuts.boost": "转嘟", "keyboard_shortcuts.column": "选择第 X 栏中的嘟文", @@ -259,6 +256,7 @@ "status.direct": "发送私信给 @{name}", "status.embed": "嵌入", "status.favourite": "收藏", + "status.filtered": "Filtered", "status.load_more": "加载更多", "status.media_hidden": "隐藏媒体内容", "status.mention": "提及 @{name}", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index c65d8ed38..9e964ee88 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -59,7 +59,7 @@ "column_header.show_settings": "顯示設定", "column_header.unpin": "取下", "column_subheading.settings": "設定", - "community.column_settings.media_only": "Media Only", + "community.column_settings.media_only": "僅媒體", "compose_form.direct_message_warning": "這文章只有被提及的用戶才可以看到。", "compose_form.direct_message_warning_learn_more": "了解更多", "compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。", @@ -84,8 +84,8 @@ "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。你從此將不會再看到該站的內容和通知。來自該站的關注者亦會被移除。", "confirmations.mute.confirm": "靜音", "confirmations.mute.message": "你確定要將{name}靜音嗎?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.redraft.confirm": "刪除並編輯", + "confirmations.redraft.message": "你確定要刪除並重新編輯嗎?所有相關的回覆、轉推與最愛都會被刪除。", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", @@ -114,20 +114,17 @@ "empty_column.public": "跨站時間軸暫時沒有內容!快寫一些公共的文章,或者關注另一些服務站的用戶吧!你和本站、友站的交流,將決定這裏出現的內容。", "follow_request.authorize": "批准", "follow_request.reject": "拒絕", - "getting_started.developers": "Developers", + "getting_started.developers": "開發者", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "尋找 Twitter 好友", "getting_started.heading": "開始使用", - "getting_started.invite": "Invite people", + "getting_started.invite": "邀請使用者", "getting_started.open_source_notice": "Mastodon(萬象)是一個開放源碼的軟件。你可以在官方 GitHub ({github}) 貢獻或者回報問題。", - "getting_started.security": "Security", + "getting_started.security": "帳戶安全", "getting_started.terms": "服務條款", - "home.column_settings.advanced": "進階", "home.column_settings.basic": "基本", - "home.column_settings.filter_regex": "使用正規表達式 (regular expression) 過濾", "home.column_settings.show_reblogs": "顯示被轉推的文章", "home.column_settings.show_replies": "顯示回應文章", - "home.settings": "欄位設定", "keyboard_shortcuts.back": "後退", "keyboard_shortcuts.boost": "轉推", "keyboard_shortcuts.column": "把標示移動到其中一列", @@ -259,6 +256,7 @@ "status.direct": "私訊 @{name}", "status.embed": "鑲嵌", "status.favourite": "收藏", + "status.filtered": "Filtered", "status.load_more": "載入更多", "status.media_hidden": "隱藏媒體內容", "status.mention": "提及 @{name}", @@ -271,7 +269,7 @@ "status.reblog": "轉推", "status.reblog_private": "轉推到原讀者", "status.reblogged_by": "{name} 轉推", - "status.redraft": "Delete & re-draft", + "status.redraft": "刪除並編輯", "status.reply": "回應", "status.replyAll": "回應所有人", "status.report": "舉報 @{name}", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 0eca30158..7221d3383 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon 是開源軟體。你可以在 GitHub {github} 上做出貢獻或是回報問題。", "getting_started.security": "登入資訊", "getting_started.terms": "使用條款", - "home.column_settings.advanced": "進階", "home.column_settings.basic": "基本", - "home.column_settings.filter_regex": "以正規表示式過濾", "home.column_settings.show_reblogs": "顯示轉推", "home.column_settings.show_replies": "顯示回應", - "home.settings": "欄位設定", "keyboard_shortcuts.back": "回到上一個", "keyboard_shortcuts.boost": "到轉推", "keyboard_shortcuts.column": "選擇第 X 欄中的嘟文", @@ -259,6 +256,7 @@ "status.direct": "發送私訊給 @{name}", "status.embed": "嵌入", "status.favourite": "最愛", + "status.filtered": "Filtered", "status.load_more": "載入更多", "status.media_hidden": "隱藏媒體內容", "status.mention": "提到 @{name}", diff --git a/config/application.rb b/config/application.rb index 729d4dafc..b100d7fcc 100644 --- a/config/application.rb +++ b/config/application.rb @@ -41,6 +41,7 @@ module Mastodon :bg, :ca, :co, + :da, :de, :el, :eo, diff --git a/config/locales/activerecord.da.yml b/config/locales/activerecord.da.yml new file mode 100644 index 000000000..5e7266ef1 --- /dev/null +++ b/config/locales/activerecord.da.yml @@ -0,0 +1,13 @@ +--- +da: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: kun tal, bogstaver og understreger + status: + attributes: + reblog: + taken: af allerede eksisterende status diff --git a/config/locales/activerecord.el.yml b/config/locales/activerecord.el.yml new file mode 100644 index 000000000..86672b21d --- /dev/null +++ b/config/locales/activerecord.el.yml @@ -0,0 +1,13 @@ +--- +el: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: μόνο γράμματα, αριθμοί και κάτω παύλες + status: + attributes: + reblog: + taken: της κατάστασης ήδη υπάρχει diff --git a/config/locales/activerecord.sl.yml b/config/locales/activerecord.sl.yml index 0967ef424..d98e3b676 100644 --- a/config/locales/activerecord.sl.yml +++ b/config/locales/activerecord.sl.yml @@ -1 +1,13 @@ -{} +--- +sl: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: samo črke, številke in podčrtaji + status: + attributes: + reblog: + taken: od statusa že obstajajo diff --git a/config/locales/activerecord.sv.yml b/config/locales/activerecord.sv.yml new file mode 100644 index 000000000..0ae4906d7 --- /dev/null +++ b/config/locales/activerecord.sv.yml @@ -0,0 +1,9 @@ +--- +sv: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: enbart bokstäver, siffror och understreck diff --git a/config/locales/ar.yml b/config/locales/ar.yml index bea04e942..c1d7cca58 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -448,6 +448,7 @@ ar: confirm_password: قم بإدخال كلمتك السرية الحالية للتحقق من هويتك proceed: حذف حساب success_msg: تم حذف حسابك بنجاح + warning_title: توافر المحتوى المنشور و المبعثَر errors: '403': ليس لك الصلاحيات الكافية لعرض هذه الصفحة. '404': إنّ الصفحة التي تبحث عنها لا وجود لها أصلا. @@ -459,6 +460,7 @@ ar: '500': content: نحن متأسفون، لقد حدث خطأ ما مِن جانبنا. title: هذه الصفحة خاطئة + noscript_html: يرجى تفعيل الجافا سكريبت لاستخدام تطبيق الويب لماستدون، أو عِوض ذلك قوموا بتجريب إحدى التطبيقات الأصلية الدّاعمة لماستدون على منصّتكم. exports: archive_takeout: date: التاريخ @@ -472,6 +474,19 @@ ar: follows: أنت تتبع mutes: قُمتَ بكتم storage: ذاكرة التخزين + filters: + contexts: + home: الخيط الزمني الرئيسي + notifications: الإخطارات + public: الخيوط الزمنية العامة + thread: المحادثات + edit: + title: تعديل عامل التصفية + index: + delete: إزالة + title: عوامل التصفية + new: + title: إضافة عامل تصفية جديد followers: domain: النطاق followers_count: عدد المتابِعين @@ -531,6 +546,7 @@ ar: acct: username@domain للحساب الجديد currently_redirecting: 'تم تحويل رابط ملفك الشخصي إلى :' proceed: حفظ + updated_msg: تم تحديث إعدادات ترحيل حسابك بنجاح ! moderation: title: الإشراف notification_mailer: @@ -548,6 +564,7 @@ ar: favourite: body: 'أُعجب %{name} بمنشورك :' subject: أُعجِب %{name} بمنشورك + title: مفضّلة جديدة follow: body: "%{name} من متتبعيك الآن !" subject: "%{name} من متتبعيك الآن" @@ -561,6 +578,7 @@ ar: action: الرد body: 'أشار إليك %{name} في :' subject: لقد قام %{name} بذِكرك + title: إشارة جديدة reblog: body: 'قام %{name} بترقية منشورك :' subject: قام %{name} بترقية منشورك @@ -590,6 +608,7 @@ ar: remote_follow: acct: قم بإدخال عنوان حسابك username@domain الذي من خلاله تود المتابعة missing_resource: تعذر العثور على رابط التحويل المطلوب الخاص بحسابك + no_account_html: أليس عندك حساب بعدُ ؟ يُمْكنك التسجيل مِن هنا proceed: أكمل المتابعة prompt: 'إنك بصدد متابعة :' remote_unfollow: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 41215c2ca..45430f541 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -474,6 +474,22 @@ ca: follows: Persones que segueixes mutes: Persones silenciades storage: Emmagatzematge + filters: + contexts: + home: Línia de temps Inici + notifications: Notificacions + public: Línies de temps públiques + thread: Converses + edit: + title: Editar filtre + errors: + invalid_context: Cap o el context proporcionat no és vàlid + invalid_irreversible: El filtratge irreversible només funciona amb el contextos inici o notificacions + index: + delete: Esborra + title: Filtres + new: + title: Afegir nou filtre followers: domain: Domini explanation_html: Si desitges garantir la privacitat de les teves publicacions, has de ser conscient de qui t'està seguint. Les publicacions privades es lliuren a totes les instàncies on tens seguidors . És possible que vulguis revisar-los i eliminar seguidors si no confies en que la teva privacitat sigui respectada pel personal o el programari d'aquestes instàncies. @@ -599,6 +615,7 @@ ca: remote_follow: acct: Escriu el teu usuari@domini des del qual vols seguir missing_resource: No s'ha pogut trobar la URL de redirecció necessaria per al compte + no_account_html: No tens cap compte? Pots registrar-te aquí proceed: Comença a seguir prompt: 'Seguiràs a:' remote_unfollow: @@ -762,9 +779,13 @@ ca:
    -

    Compliment de la Llei de protecció de la privacitat en línia dels nens

    +

    Ús del lloc dels nens

    + +

    Si el servidor és a EU o EEA: el nostre lloc, productes i serveis estan dirigits a persones que tenen almenys 16 anys. Si tens menys de 16 anys, seguint els requisits del GDPR (Reglament General de Protecció de Dades) no utilitzis aquest lloc.

    + +

    Si aquest servidor es troba als EUA: el nostre lloc, productes i serveis estan dirigits a persones que tenen almenys 13 anys. Si tens menys de 13 anys, segons els requisits de COPPA (Children's Online Privacy Protection Act) no utilitzis aquest lloc.

    -

    El nostre lloc, productes i serveis estan dirigits a persones que tenen almenys 13 anys. Si aquest servidor es troba als EUA, i tens menys de 13 anys, segons els requisits de COPPA (Children's Online Privacy Protection Act) no utilitzis aquest lloc.

    +

    Els requisits legals poden ser diferents si aquest servidor està en una altra jurisdicció.


    diff --git a/config/locales/da.yml b/config/locales/da.yml new file mode 100644 index 000000000..d76730b33 --- /dev/null +++ b/config/locales/da.yml @@ -0,0 +1,554 @@ +--- +da: + about: + about_hashtag_html: Disse er offentlige toots der indeholder tagget #%{hashtag}. Du kan interagere med dem hvis du har en konto hvor som helst i fediverset. + about_mastodon_html: Mastodon er et socialt netværk der er baseret på åbne web protokoller og frit, open-source source software. Der er decentraliseret ligesom e-mail tjenester. + about_this: Om + administered_by: 'Administreret af:' + closed_registrations: Registreringer er på nuværrende tidspunkt lukkede for denne instans. Du kan dog finde andre instanser du kan oprette dig på og få adgang til det samme netværk derfra. + contact: Kontakt + contact_missing: Ikke sat + contact_unavailable: Ikke tilgængeligt + description_headline: Hvad er %{domain}? + domain_count_after: andre instancer + domain_count_before: Forbundet til + extended_description_html: | +

    Et godt sted for regler

    +

    Den udvidede beskrivelse er endnu ikke blevet opsat.

    + features: + humane_approach_body: Ved at lære fra fejl fra andre netværk, sigter Mastodon for at tage etisk designmæssig valg for at bekæmpe misbrug af sociale medier. + humane_approach_title: En mere human tilgang + not_a_product_body: Mastodon er ikke et kommercielt netværk. Ingen reklamer, ingen datamining, ingen indhegnet haver. Der er ingen central regering. + not_a_product_title: Du er en person, ikke et produkt + real_conversation_body: Med 500 tegn til din rådighed og understøttelse af granulært indhold og multimedie advarsler, kan du udtrykke dig på en hvilken som helst måde du ønsker. + real_conversation_title: Bygget til rigtige samtaler + within_reach_body: Adskillige apps for iOS, Android og andre platforme takket være et udviklervenligt API økosystem tillader dig at holde kontakten med dine venner hvor som helst. + within_reach_title: Altid indenfor rækkevidde + generic_description: "%{domain} er en server i netværket" + hosted_on: Mostodon hostet på %{domain} + learn_more: Lær mere + other_instances: Liste over instancer + source_code: Kildekode + status_count_after: statusser + status_count_before: Som har skrevet + user_count_after: brugere + user_count_before: Hjem til + what_is_mastodon: Hvad er Mastodon? + accounts: + follow: Følg + followers: Følgere + following: Følger + media: Multimedia + moved_html: "%{name} er flyttet til %{new_profile_link}:" + network_hidden: Denne information er ikke tilgængelig + nothing_here: Der er intet her! + people_followed_by: Folk some %{name} følger + people_who_follow: Folk der følger %{name} + posts: Dyt + posts_with_replies: Toots og svar + remote_follow: Følg fra andre instancer + reserved_username: Brugernavnet er reserveret + roles: + admin: Administrator + bot: Robot + moderator: Moderator + unfollow: Følg ikke længere + admin: + account_moderation_notes: + create: Læg en kommentar + created_msg: Moderator notat succesfuldt oprettet! + delete: Slet + destroyed_msg: Moderator notat succesfuldt destrueret! + accounts: + are_you_sure: Er du sikker? + avatar: Profilbillede + by_domain: Domæne + change_email: + changed_msg: Email til konto succesfuldt ændret! + current_email: Nuværende email + label: Ændre email + new_email: Ny email + submit: Ændre email + title: Ændre email for %{username} + confirm: Bekræft + confirmed: Bekræftet + confirming: Bekræfter + demote: Degrader + disable: Deaktiver + disable_two_factor_authentication: Deaktiver 2FA + disabled: Deaktiveret + display_name: Visningsnavn + domain: Domæne + edit: Rediger + email: Email + email_status: Email status + enable: Aktiver + enabled: Aktiveret + feed_url: Link til feed + followers: Følgere + followers_url: Link til følgere + follows: Følger + inbox_url: Link til indbakke + ip: IP-adresse + location: + all: Alle + local: Lokalt + remote: Fjernt + title: Placering + login_status: Status på login + media_attachments: Multimedie bilag + memorialize: Omdan til et memoriam + moderation: + all: Alle + silenced: Dæmpet + suspended: Udelukket + title: Moderasion + moderation_notes: Moderator notater + most_recent_activity: Seneste aktivitet + most_recent_ip: Senest IP + not_subscribed: Ikke abonneret + order: + alphabetic: Alfabetisk + most_recent: Seneste + title: Rækkefølge + outbox_url: Link til udgående + perform_full_suspension: Udfør fuld udelukkelse + profile_url: Link til profil + promote: Forfrem + protocol: Protokol + public: Offentligt + push_subscription_expires: PuSH abonnement udløber + redownload: Opdater profilbillede + remove_avatar: Fjern profilbillede + resend_confirmation: + already_confirmed: Denne bruger er allerede blevet bekræftet + send: Gensend bekræftelsesmail + success: Bekræftelsesmail sendt succesfuldt! + reset: Nulstil + reset_password: Nulstil kodeord + resubscribe: Abonner igen + role: Tilladelser + roles: + admin: Admin + moderator: Mod + staff: Personale + user: Bruger + salmon_url: Salmon-URL + search: Søg + shared_inbox_url: Link til delt indbakke + show: + created_reports: Rapporter oprettet af denne konto + report: rapporter + targeted_reports: Anmeldelser fra denne konto + silence: Dæmp + statuses: Statusser + subscribe: Abonner + title: Konti + unconfirmed_email: Ikke-bekræftet email + undo_silenced: Fortryd dæmpning + undo_suspension: Fortryd udelukkelse + unsubscribe: Abonner ikke længere + username: Brugernavn + web: Web + action_logs: + actions: + assigned_to_self_report: "%{name} tildelte anmeldelsen %{target} til sig selv" + change_email_user: "%{name} ændrede email adressen for brugeren %{target}" + confirm_user: "%{name} bekræftede %{target}s email adresse" + create_custom_emoji: "%{name} uploadede humørikonet %{target}" + create_domain_block: "%{name} blokerede domænet %{target}" + create_email_domain_block: "%{name} sortlistede email domænet %{target}" + demote_user: "%{name} degraderede %{target}" + destroy_domain_block: "%{name} fjernede blokeringen af domænet %{target}" + destroy_email_domain_block: "%{name} hvid-listede email domænet %{target}" + destroy_status: "%{name} fjernede statussen fra %{target}" + disable_2fa_user: "%{name} deaktiverede to faktor kravet for brugeren %{target}" + disable_custom_emoji: "%{name} deaktiverede humørikonet %{target}" + disable_user: "%{name} deaktiverede login for brugeren %{target}" + enable_custom_emoji: "%{name} aktiverede humørikonet %{target}" + enable_user: "%{name} aktiverede login for brugeren %{target}" + memorialize_account: "%{name} omdannede %{target}s konto til en mindeside" + promote_user: "%{name} forfremmede brugeren %{target}" + remove_avatar_user: "%{name} fjernede %{target}s profilbillede" + reopen_report: "%{name} genåbnede anmeldelsen %{target}" + reset_password_user: "%{name} nulstillede kodeordet for brugeren %{target}" + resolve_report: "%{name} løste anmeldelsen %{target}" + silence_account: "%{name} dæmpede %{target}s konto" + suspend_account: "%{name} udelukkede %{target}s konto" + unassigned_report: "%{name} fjernede tildelingen af rapporten %{target}" + unsilence_account: "%{name} fjernede dæmpningen fra %{target}s konto" + unsuspend_account: "%{name} fjernede udelukkelsen fra %{target}s konto" + update_custom_emoji: "%{name} opdaterede humørikonet %{target}" + update_status: "%{name} opdaterede status for %{target}" + title: Revisionslog + custom_emojis: + by_domain: Domæne + copied_msg: Succesfuldt oprettede en lokal kopi af humørikonet + copy: Kopier + copy_failed_msg: Kunne ikke oprette en lokal kopi af dette humørikon + created_msg: Humørikon succesfuldt oprettet! + delete: Slet + destroyed_msg: Emojo succesfuldt destrueret! + disable: Deaktiver + disabled_msg: Succesfuldt deaktiverede det humørikon + emoji: Humørikon + enable: Aktiver + enabled_msg: Succesfuldt aktiverede det humørikon + image_hint: PNG op til 50KB + listed: Listet + new: + title: Tilføj nyt brugerdefineret humørikon + overwrite: Overskriv + shortcode: Kortkode + shortcode_hint: Mindst 2 tegn, kun alfabetiske tegn og understreger + title: Brugerdefinerede humørikoner + unlisted: Ikke listet + update_failed_msg: Kunne ikke opdatere det humørikon + updated_msg: Humørikon succesfuldt opdateret! + upload: Læg op + domain_blocks: + add_new: Tilføj ny + created_msg: Domæne blokade bliver nu behandlet + destroyed_msg: Domæne blokade er blevet annulleret + domain: Domæne + new: + create: Opret blokering + severity: + noop: Ingen + silence: Dæmp + suspend: Udeluk + title: Ny domæne blokering + reject_media: Afvis multimedie filer + severities: + noop: Ingen + silence: Dæmp + suspend: Udeluk + severity: Alvorlighed + show: + affected_accounts: + one: En konto i databasen påvirket + other: "%{count} konti i databasen påvirket" + title: Annuller domæne blokeringen for domænet %{domain} + undo: Fortryd + title: Domæne blokeringer + undo: Fortryd + email_domain_blocks: + add_new: Tilføj ny + delete: Slet + domain: Domæne + new: + create: Tilføj domæne + title: Email sortliste + instances: + account_count: Kendte konti + domain_name: Domæne + reset: Nulstil + search: Søg + title: Kendte instanser + invites: + filter: + all: Alle + available: Tilgængelig + expired: Udløbet + title: Filtre + title: Invitationer + reports: + account: + note: notat + report: anmeld + action_taken_by: Handling udført af + are_you_sure: Er du sikker? + assign_to_self: Tildel til mig + assigned: Tildelt moderator + comment: + none: Ingen + created_at: Anmeldt + id: ID + mark_as_resolved: Marker som værende løst + mark_as_unresolved: Marker som værende uløst + notes: + create: Tilføj notat + create_and_unresolve: Genåbne med notat + delete: Slet + reopen: Genåben anmeldelse + report: 'Anmeldelse #%{id}' + report_contents: Indhold + reported_account: Anmeldt konto + reported_by: Anmeldt af + resolved: Løst + silence_account: Dæmp konto + status: Status + suspend_account: Udeluk konto + target: Mål + title: Anmeldelser + unresolved: Uløst + updated_at: Opdateret + view: Se + settings: + hero: + title: Billede af helt + registrations: + deletion: + desc_html: Tillad alle at slette deres konto + title: Åben konto sletning + min_invite_role: + disabled: Ingen + title: Tillad invitationer af + open: + desc_html: Tillad alle at oprette en konto + title: Åben registrering + show_staff_badge: + desc_html: Vis personale emblem på en brugerside + title: Vis personale emblem + site_description: + title: Beskrivelse af instans + site_title: Navn på instans + timeline_preview: + desc_html: Vis offentlig tidslinje på landingssiden + title: Indstillinger for side + statuses: + back_to_account: Tilbage til kontosiden + batch: + delete: Slet + nsfw_off: Marker som værende ikke følsomt + nsfw_on: Marker som værende følsomt + failed_to_execute: Udførelsen kunne ikke lade sig gøre + media: + title: Multimedier + no_media: Ingen multimedier + title: Konto statusser + with_media: Med multimedier + subscriptions: + confirmed: Bekræftet + expires_in: Udløber om + last_delivery: Sidste levering + topic: Emne + title: Administration + admin_mailer: + new_report: + body: "%{reporter} har anmeldt %{target}" + body_remote: Nogen fra %{domain} har anmeldt %{target} + application_mailer: + notification_preferences: Ændre email indstillinger + salutation: "%{name}," + settings: 'Ændre email indstillinger: %{link}' + view: 'Se:' + view_profile: Se profil + view_status: Se status + applications: + invalid_url: Det angivne URL er ugyldigt + warning: Vær meget forsigtig med disse data. Del dem aldrig med nogen! + auth: + change_password: Kodeord + confirm_email: Bekræft email + delete_account: Slet konto + didnt_get_confirmation: Har du endnu ikke modtaget instrukser for bekræftelse? + forgot_password: Glemt dit kodeord? + login: Log ind + logout: Log ud + migrate_account: Flyt til en anden konto + or: eller + or_log_in_with: Eller log in med + register: Opret dig + register_elsewhere: Opret dig på en anden server + reset_password: Nulstil kodeord + security: Sikkerhed + set_new_password: Sæt et nyt kodeord + authorize_follow: + already_following: Du følger allerede denne konto + follow: Følg + following: 'Succes! Du følger nu:' + post_follow: + close: Du kan også bare lukke dette vindue. + return: Vis brugerens profil + web: Gå til web + title: Følg %{acct} + datetime: + distance_in_words: + about_x_hours: "%{count}t" + about_x_months: "%{count} måneder" + half_a_minute: Lige nu + less_than_x_seconds: Lige nu + x_seconds: "%{count}s" + deletes: + bad_password_msg: Godt forsøg, hackere! Forkert kodeord + proceed: Slet konto + success_msg: Din konto er nu blevet slettet + errors: + '403': Du har ikke tilladelse til at se denne side. + '404': Den side du leder efter findes ikke. + '410': Den side du leder efter findes ikke mere. + '422': + title: Sikkerheds godkendelse mislykkedes + '500': + content: Beklager men der gik noget galt i vores ende. + title: Siden er ikke korrekt + exports: + archive_takeout: + date: Dato + download: Hent dit arkiv + size: Størrelse + blocks: Du blokerer + follows: Du følger + mutes: Du dæmper + filters: + contexts: + home: Hjemme tidslinje + notifications: Notifikationer + public: Offentlig tidslinje + thread: Samtaler + edit: + title: Rediger filter + index: + delete: Slet + title: Filtrer + new: + title: Tilføj nyt filter + followers: + domain: Domæne + followers_count: Antal følgere + lock_link: Lås din konto + purge: Fjern fra følgere + unlocked_warning_title: Din konto er ikke låst + generic: + changes_saved_msg: Ændringerne blev gemt! + powered_by: drevet af %{link} + save_changes: Gem ændringer + imports: + types: + blocking: Blokeringsliste + following: Følgningsliste + upload: Læg op + invites: + delete: Deaktiver + expired: Udløbet + expires_in: + '1800': 30 minutter + '21600': 6 timer + '3600': 1 time + '43200': 12 timer + '604800': 1 uge + '86400': 1 dag + expires_in_prompt: Aldrig + generate: Generer + invited_by: 'Du er blevet inviteret af:' + max_uses_prompt: Ubegrænset + table: + expires_at: Udløber + title: Inviter folk + media_attachments: + validations: + too_many: Kan ikke vedhæfte mere en 4 filer + migrations: + proceed: Gem + moderation: + title: Moderatering + notification_mailer: + digest: + action: Se alle notifikationer + mention: "%{name} nævnte dig i:" + title: Mens du var væk... + follow: + body: "%{name} følger dig nu!" + subject: "%{name} følger dig nu" + title: Ny følger + mention: + action: Svar + body: 'Du blev nævnt af %{name} i:' + subject: Du blev nævnt af %{name} + title: Ny omtale + reblog: + body: 'Din status blev fremhævet af %{name}:' + subject: "%{name} fremhævede din status" + title: Ny fremhævelse + pagination: + newer: Nyere + next: Næste + older: Ældre + prev: Forrige + preferences: + languages: Sprog + other: Andet + remote_unfollow: + error: Fejl + title: Titel + unfollowed: Følger ikke længere + sessions: + browsers: + generic: Ukendt browser + description: "%{browser} på %{platform}" + ip: IP + platforms: + other: ukendt platform + settings: + authorized_apps: Godkendte apps + back: Tilbage til Mastodon + delete: Sletning af konto + development: Udvikling + edit_profile: Rediger profil + followers: Godkendte følgere + import: Importer + notifications: Notifikationer + preferences: Indstillinger + settings: Indstillinger + your_apps: Dine applikationer + statuses: + attached: + description: 'Vedhæftede: %{attached}' + image: + one: "%{count} billede" + other: "%{count} billeder" + video: + one: "%{count} video" + other: "%{count} videoer" + pin_errors: + ownership: Dun kan ikke fastgøre en anden persons toot + show_more: Vis mere + visibilities: + private: Kun-følgere + private_long: Vis kun til følgere + public: Offentlig + public_long: Alle kan se + unlisted: Ikke listet + stream_entries: + click_to_show: Tryk for at vise + pinned: Fastgjort toot + sensitive_content: Følsomt indhold + themes: + contrast: Høj kontrast + default: Mastodon + mastodon-light: Mastodon (lys) + two_factor_authentication: + disable: Deaktiver + enable: Aktiver + enabled: To-faktor godkendelse er aktiveret + enabled_success: To-faktor godkendelse succesfuldt aktiveret + generate_recovery_codes: Generer gendannelseskoder + recovery_codes: Reserve koder + recovery_codes_regenerated: Reserve koder blev succesfuldt regenereret + setup: Sæt op + wrong_code: Den indtastede kode var ugyldig! Er serverens tid og enhedens tid korrekte? + user_mailer: + backup_ready: + explanation: Din anmodning for fuld backup af din Mastodon konto. Den er nu klar til at blive hentet! + subject: Dit arkiv er klar til at blive hentet ned + title: Udpluk af arkiv + welcome: + edit_profile_action: Opsæt profil + explanation: Her er nogle råd til at starte med + final_action: Kom igang med at poste + full_handle: Dit fulde brugernavn + full_handle_hint: Dette er hvad du vil fortælle dine venner så de kan sende dig beskeder eller følge dig fra andre instanser. + review_preferences_action: Ændre præferencer + subject: Velkommen til Mastodon + tip_following: Du følger som standard administratoren(e) for den server du er på. For at finde flere folk, tjek både den lokale og fælles tidslinje. + tip_local_timeline: Den lokale tidslinje er et have af folk i %{instance}. Disse er dine umiddelbare naboer! + tip_mobile_webapp: Hvis din mobil browser tilbyder dig at tilføje Mastodon til din hjemmeskærm, kan du modtage push meddelelser. Dette opfører sig på mange måder ligesom en almindelig app! + tips: Råd + title: Velkommen ombord, %{name}! + users: + invalid_email: E-mail adressen er ugyldig + invalid_otp_token: Ugyldig to-faktor kode + otp_lost_help_html: Hvis du har mistet adgang til begge, kan du få kontakt via %{email} + seamless_external_login: Du er logget ind via en ekstern service, så er kodeord og e-mail indstillinger ikke tilgængelige. + signed_in_as: 'Logget ind som:' diff --git a/config/locales/de.yml b/config/locales/de.yml index 1b9a02e5a..b39ca957c 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -474,6 +474,20 @@ de: follows: Du folgst mutes: Du hast stummgeschaltet storage: Medienspeicher + filters: + contexts: + notifications: Benachrichtigungen + thread: Gespräche + edit: + title: Filter bearbeiten + errors: + invalid_context: Ungültiger oder fehlender Kontext übergeben + invalid_irreversible: Unwiderrufliche Filterung funktioniert nur mit Heim- oder Benachrichtigungskontext + index: + delete: Löschen + title: Filter + new: + title: Neuen Filter hinzufügen followers: domain: Instanz explanation_html: Wenn du sicherstellen willst, dass deine Beiträge privat sind, musst du wissen, wer dir folgt. Deine privaten Beiträge werden an alle Instanzen weitergegeben, auf denen Menschen registriert sind, die dir folgen. Wenn du den Betreibenden einer Instanz misstraust und du befürchtest, dass sie deine Privatsphäre missachten könnten, kannst du sie hier entfernen. diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml new file mode 100644 index 000000000..61b40fade --- /dev/null +++ b/config/locales/devise.da.yml @@ -0,0 +1,58 @@ +--- +da: + devise: + confirmations: + confirmed: Din email adresse er blevet succesfuldt bekræftet. + send_instructions: Du vil modtage en mail med instrukser for hvordan du bekræfter din email adresse om få minutter. Tjek venligst din spam mappe hvis du ikke har modtaget denne email. + failure: + already_authenticated: Du er allerede logget ind. + inactive: Din konto er endnu ikke aktiveret. + invalid: Ugyldig %{authentication_keys} eller ugyldigt kodeord. + last_attempt: Du har et forsøg tilbage før din konto låses. + locked: Din konto er låst. + not_found_in_database: Ugyldig %{authentication_keys} eller ugyldigt kodeord. + timeout: Din session er udløbet. Log venligst ind igen for at fortsætte. + unauthenticated: Du er nødt til at logge ind eller oprette dig for at fortsætte. + unconfirmed: Du er nødt til at bekræfte din email adresse for at fortsætte. + mailer: + confirmation_instructions: + action: Bekræft email adresse + explanation: Du har oprettet en konto på %{host} med denne email adresse. Du er et klik fra at aktivere din konto. Hvis du ikke har oprettet dig, ignorer venligst denne email. + subject: 'Mastodon: Bekræftelses instrukser for %{instance}' + title: Bekræft email adresse + email_changed: + explanation: 'Email adressen for din konto bliver ændret til:' + extra: Hvis du ikke har ændret din email adresse er det muligt, at nogen har fået adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren på instansen hvis du er låst ude af din konto. + subject: 'Mastodon: Email ændret' + title: Ny email adresse + password_change: + explanation: Kodeordet for din konto er blevet ændret. + extra: Hvis du ikke har ændret dit kodeord er det muligt, at nogen har fået adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren på instansen hvis du er låst ude af din konto. + subject: 'Mastodon: Kodeord ændret' + title: Kodeordet er blevet ændret + reconfirmation_instructions: + explanation: Bekræft den nye adresse for at ændre din email. + subject: 'Mastodon: Bekræft email for %{instance}' + title: Bekræft email adresse + reset_password_instructions: + action: Ændre kodeord + explanation: Du anmodede om et nyt kodeord for din konto. + title: Kodeordet er blevet nulstillet + registrations: + signed_up: Velkommen! Du har nu tilmeldt dig. + sessions: + signed_in: Du er nu logget ind. + signed_out: Du er nu logget ud. + unlocks: + send_paranoid_instructions: Hvis din konto findes, vil du modtage en email med instrukser for hvordan du låser op for den om få minutter. Tjek venligst din spam mappe hvis du ikke har modtaget denne mail. + unlocked: Din konto er succesfuldt blevet låst op. Log venligst ind for at fortsætte. + errors: + messages: + already_confirmed: er allerede blevet bekræftet, prøv venligst at logge ind + confirmation_period_expired: skal bekræftes indenfor %{period}, anmod venligst om en ny + expired: er udløbet, anmod venligst en ny + not_found: ikke fundet + not_locked: blev ikke låst + not_saved: + one: '1 fejl forhindrede denne %{resource} fra at blive gemt:' + other: "%{count} fejl forhindrede denne %{resource} fra at blive gemt:" diff --git a/config/locales/devise.el.yml b/config/locales/devise.el.yml new file mode 100644 index 000000000..523d1fb88 --- /dev/null +++ b/config/locales/devise.el.yml @@ -0,0 +1,82 @@ +--- +el: + devise: + confirmations: + confirmed: Η διεύθυνση email σου επιβεβαιώθηκε με επιτυχία. + send_instructions: Σε μερικά λεπτά θα λάβεις ένα email με οδηγίες για την επιβεβαίωση της διεύθυνσης email σου. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα αν δεν το έχεις λάβει. + send_paranoid_instructions: Αν η διεύθυνση email σου υπάρχει στη βάση μας, θα λάβεις σε μερικά λεπτά ένα email με οδηγίες επιβεβαίωσης της διεύθυνσής σου. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα αν δεν το έχεις λάβει. + failure: + already_authenticated: Έχεις ήδη συνδεθεί. + inactive: Ο λογαριασμός σου δεν έχει ενεργοποιηθεί ακόμα. + invalid: Λάθος %{authentication_keys} ή συνθηματικό. + last_attempt: Έχεις μια ακόμα προσπάθεια πριν κλειδωθεί ο λογαριασμός σου. + locked: Ο λογαριασμός σου κλειδώθηκε. + not_found_in_database: Λάθος %{authentication_keys} ή συνθηματικό. + timeout: Η τρέχουσα σύνδεσή σου έληξε. Παρακαλούμε συνδέσου ξανά για να συνεχίσεις. + unauthenticated: Πρέπει να συνδεθείς ή να εγγραφείς για να συνεχίσεις. + unconfirmed: Πρέπει να επιβεβαιώσεις τη διεύθυνση email σου για να συνεχίσεις. + mailer: + confirmation_instructions: + action: Επιβεβαίωσε διεύθυνση email + explanation: Δημιούργησες έναν λογαριασμό στο %{host} με αυτή τη διεύθυνση email. Με ένα κλικ θα τον ενεργοποιήσεις. Αν δεν το έκανες εσύ, παρακαλούμε αγνόησε αυτό το email. + extra_html: Παρακαλούμε να διαβάσεις του κανόνες αυτού του κόμβου και τους όρους χρήσης της υπηρεσίας μας. + subject: 'Mastodon: Οδηγίες επιβεβαίωσης για %{instance}' + title: Επιβεβαίωσε διεύθυνση email + email_changed: + explanation: 'Αλλάζεις τη διεύθυνση email για τον λογαριασμό σου στην:' + extra: Αν δεν άλλαξες εσύ το email σου, ίσως κάποιος να έχει αποκτήσει πρόσβαση στο λογαριασμό σου. Παρακαλούμε άλλαξε το συνθηματικό σου άμεσα ή επικοινώνησε με τον διαχειριστή του κόμβου σου αν έχεις κλειδωθεί απ' έξω. + subject: 'Mastodon: Αλλαγή διεύθυνσης email' + title: Νέα διεύθυνση email + password_change: + explanation: Το συνθηματικό του λογαριασμού σου άλλαξε. + extra: Αν δεν άλλαξες εσύ το συνθηματικό σου, ίσως κάποιος να έχει αποκτήσει πρόσβαση στο λογαριασμό σου. Παρακαλούμε άλλαξε το συνθηματικό σου άμεσα ή επικοινώνησε με τον διαχειριστή του κόμβου σου αν έχεις κλειδωθεί απ' έξω. + subject: 'Mastodon: Αλλαγή συνθηματικού' + title: Αλλαγή συνθηματικού + reconfirmation_instructions: + explanation: Επιβεβαίωσε τη νέα διεύθυνση για να αλλάξεις το email σου. + extra: Αν δεν ζήτησες εσύ αυτή την αλλαγή, παρακαλούμε αγνόησε αυτό το email. Η διεύθυνση email για τον λογαριασμό σου στο Mastodon δεν θα αλλάξει μέχρι να επισκεφτείς τον παραπάνω σύνδεσμο. + subject: 'Mastodon: Επιβεβαίωση email για %{instance}' + title: Επιβεβαίωση διεύθυνσης email + reset_password_instructions: + action: Αλλαγή συνθηματικού + explanation: Ζήτησες ένα νέο συνθηματικό για τον λογαριασμό σου. + extra: Αν δεν ζήτησες εσύ αυτή την αλλαγή, παρακαλούμε αγνόησε αυτό το email. Το συνθηματικό σου δεν θα αλλάξει μέχρι να επισκεφτείς τον παραπάνω σύνδεσμο και να δημιουργήσεις ένα καινούριο. + subject: 'Mastodon: Οδηγίες επαναφοράς συνθηματικού' + title: Επαναφορά συνθηματικού + unlock_instructions: + subject: 'Mastodon: Οδηγίες ξεκλειδώματος' + omniauth_callbacks: + failure: Δεν μπόρεσαμε να σε πιστοποιήσουμε μέσω %{kind} γιατί "%{reason}". + success: Επιτυχημένη πιστοποίηση μέσω %{kind} λογαριασμού. + passwords: + no_token: Δεν μπορείς να επισκεφτείς αυτή τη σελίδα αν δεν έρχεσαι από email επαναφοράς συνθηματικού. Αν όντως έρχεσαι από email επαναφοράς συνθηματικού, σιγουρέψου πως χρησιμοποίησες το πλήρες URL που σου στάλθηκε. + send_instructions: Αν η email διεύθυνσή σου υπάρχει ήδη στη βάση μας, θα λάβεις σύντομα έναν σύνδεσμο ανάκτησης συνθηματικού. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + send_paranoid_instructions: Αν η email διεύθυνσή σου υπάρχει ήδη στη βάση μας, θα λάβεις σύντομα έναν σύνδεσμο ανάκτησης συνθηματικού. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + updated: Το συνθηματικό σου άλλαξε. Πλέον έχεις συνδεθεί. + updated_not_active: Το συνθηματικό σου άλλαξε. + registrations: + destroyed: Στο καλό! Ο λογαριασμός σου ακυρώθηκε με επιτυχία. Ελπίζουμε να σε ξαναδούμε σύντομα. + signed_up: Καλώς ήρθες! Εγγράφηκες με επιτυχία. + signed_up_but_inactive: Εγγράφηκες με επιτυχία. Όμως δε μπορέσαμε να σε συνδέσουμε γιατί ο λογαριασμός σου δεν έχει ενεργοποιηθεί ακόμα. + signed_up_but_locked: Εγγράφηκες με επιτυχία. Όμως δε μπορέσαμε να σε συνδέσουμε γιατί ο λογαριασμός σου είναι κλειδωμένος. + signed_up_but_unconfirmed: Σου στείλαμε ένα μήνυμα με σύνδεσμο επιβεβαίωσης στη διεύθυνση email σου. Παρακαλούμε ακολούθησε το σύνδεσμο για να ενεργοποιήσεις το λογαριασμό σου. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + update_needs_confirmation: Ενημέρωσες το λογαριασμό σου με επιτυχία αλλά χρειαζόμαστε να επιβεβαιώσουμε τη νέα διεύθυνση email σου. Παρακαλούμε έλεγξε τα email σου και ακολούθησε το σύνδεσμο για να την επιβεβαιώσεις. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + updated: Ο λογαριασμός σου επιβεβαιώθηκε με επιτυχία. + sessions: + already_signed_out: Αποσυνδέθηκες με επιτυχία. + signed_in: Συνδέθηκες με επιτυχία. + signed_out: Αποσυνδέθηκες με επιτυχία. + unlocks: + send_instructions: Σε μερικά λεπτά θα λάβεις ένα email με οδηγίες για το πως να ξεκλειδώσεις το λογαριασμό σου. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + send_paranoid_instructions: Αν ο λογαριασμός σου υπάρχει, σε μερικά λεπτά θα λάβεις ένα email με οδηγίες για το πως να τον ξεκλειδώσεις. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + unlocked: Ο λογαριασμός σου ξεκλειδώθηκε με επιτυχία. Παρακαλούμε συνδέσου για να συνεχίσεις. + errors: + messages: + already_confirmed: έχει ήδη επιβεβαιωθεί, προσπάθησε να συνδεθείς + confirmation_period_expired: πρέπει να επιβεβαιωθεί εντός %{period}, παρακαλούμε αιτηθείτε το ξανά + expired: έληξε, παρακαλούμε ζητήστε ένα νέο + not_found: δε βρέθηκε + not_locked: δεν ήταν κλειδωμένος + not_saved: + one: '1 σφάλμα απέτρεψε αυτό το %{resource} να αποθηκευτεί:' + other: "%{count} σφάλματα απέτρεψαν το %{resource} να αποθηκευτεί:" diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index 2872140d1..a32fbe03b 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -28,7 +28,7 @@ sk: subject: 'Mastodon: Emailová adresa bola zmenená' title: Nová emailová adresa password_change: - explanation: Heslo k vašemu účtu bolo zmenené. + explanation: Heslo k tvojmu účtu bolo zmenené. extra: Pokiaľ si nezmenil/a svoje heslo, je pravdepodobné že niekto iný získal prístup k tvojmu účtu. Naliehavo preto prosím zmeň svoje heslo, alebo kontaktuj administrátora tohto serveru pokiaľ si vymknutý/á zo svojho účtu. subject: 'Mastodon: Heslo bolo zmenené' title: Heslo bolo zmenené @@ -38,7 +38,7 @@ sk: subject: 'Mastodon: Potvrďenie emailu pre %{instance}' title: Overiť emailovú adresu reset_password_instructions: - action: Zmeniť heslo + action: Zmeň svoje heslo explanation: Vyžiadal/a si si nové heslo pre svoj účet. extra: Pokiaľ si túto akciu nevyžiadal/a, prosím ignoruj tento email. Tvoje heslo nebude zmenené pokiaľ nepostúpiš na adresu uvedenú vyššie a vytvoríš si nové. subject: 'Mastodon: Inštrukcie pre obnovu hesla' diff --git a/config/locales/devise.sl.yml b/config/locales/devise.sl.yml index 0967ef424..ecbaaf91a 100644 --- a/config/locales/devise.sl.yml +++ b/config/locales/devise.sl.yml @@ -1 +1,26 @@ -{} +--- +sl: + devise: + confirmations: + confirmed: Vaš e-poštni naslov je bil uspešno potrjen. + send_instructions: V nekaj minutah boste prejeli e-poštno sporočilo z navodili za potrditev vašega e-poštnega naslova. Če niste prejeli e-poštnega sporočila, preverite mapo neželena pošta. + send_paranoid_instructions: Če vaš e-poštni naslov obstaja v naši podatkovni bazi, boste v nekaj minutah prejeli e-poštno sporočilo z navodili za potrditev vašega e-poštnega naslova. Če niste prejeli e-poštnega sporočila, preverite mapo neželena pošta. + failure: + already_authenticated: Prijavljeni ste že. + inactive: Vaš račun še ni aktiviran. + invalid: Neveljavno %{authentication_keys} ali geslo. + last_attempt: Pred zaklepom računa imate še en poskus. + locked: Vaš račun je zaklenjen. + not_found_in_database: Neveljavno %{authentication_keys} ali geslo. + timeout: Vaša seja je potekla. Če želite nadaljevati, se znova prijavite. + unauthenticated: Pred nadaljevanjem se morate prijaviti ali vpisati. + unconfirmed: Pred nadaljevanjem morate potrditi svoj e-poštni naslov. + mailer: + confirmation_instructions: + action: Potrdi e-poštni naslov + explanation: S tem e-poštnim naslovom ste ustvarili račun na %{host}. Z enim samim klikom ga aktivirate. Če to niste bili vi, prosimo, prezrite to e-poštno sporočilo. + extra_html: Preverite tudi pravila vozlišča in naše pogoje storitve. + subject: 'Mastodon: Navodila za potrditev za %{instance}' + title: Potrdi e-poštni naslov + email_changed: + explanation: 'E-poštni naslov za vaš račun je spremenjen na:' diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml new file mode 100644 index 000000000..5e7ac0035 --- /dev/null +++ b/config/locales/doorkeeper.da.yml @@ -0,0 +1,110 @@ +--- +da: + activerecord: + attributes: + doorkeeper/application: + name: Navn på program + redirect_uri: Link + scopes: Områder + website: Webside for applikation + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: kan ikke indeholde et fragment. + invalid_uri: skal være et gyldigt URI. + relative_uri: skal være en absolut URI. + secured_uri: skal være en HTTPS/SSL URI. + doorkeeper: + applications: + buttons: + authorize: Godkend + cancel: Annuller + destroy: Destruer + edit: Rediger + submit: Indsend + confirmations: + destroy: Er du sikker? + edit: + title: Rediger applikation + form: + error: Ups! Tjek din form for mulige fejl + help: + native_redirect_uri: Brug %{native_redirect_uri} for lokale tests + redirect_uri: Brug en linje per URI + scopes: Adskil omfang med mellemrum. Lad være blankt for at bruge standard omfang. + index: + application: Applikation + callback_url: Callback-URL + delete: Slet + name: Navn + new: Ny applikation + scopes: Omfang + show: Vis + title: Dine applikationer + new: + title: Ny applikation + show: + actions: Handlinger + application_id: Klient nøgle + callback_urls: Callback-URLs + scopes: Omfang + secret: Secret + title: 'Applikation: %{name}' + authorizations: + buttons: + authorize: Godkend + deny: Afvis + error: + title: Der opstod en fejl + new: + able_to: Den vil være i stand til + prompt: Applikationen %{client_name} anmoder om adgang til din konto + title: Godkendelse påkræves + show: + title: Kopiere denne godkendelseskode og indsæt den i applikationen. + authorized_applications: + buttons: + revoke: Ophæv + confirmations: + revoke: Er du sikker? + index: + application: Applikation + created_at: Godkendt + date_format: "%Y-%m-%d %H:%M:%S" + scopes: Omfang + title: Dine godkendte applikationer + errors: + messages: + access_denied: Ejeren af ressourcen eller godkendelses serveren afviste anmodningen. + invalid_redirect_uri: Ormdirigerings-uri'en der blev angivet er ikke gyldig. + invalid_token: + expired: Adgangs-beviset er udløbet + revoked: Adgangs-beviset er blevet ophævet + unknown: Adgangs-beviset er ugyldigt + unauthorized_client: Klienten er ikke godkendt til at udføre denne anmodning ved at bruge denne metode. + unsupported_response_type: Godkendelses serveren understøtter ikke denne type respons. + flash: + applications: + create: + notice: Applikationen blev oprettet. + destroy: + notice: Applikationen blev slettet. + update: + notice: Applikationen blev opdateret. + authorized_applications: + destroy: + notice: Applikationen blev ophævet. + layouts: + admin: + nav: + applications: Applikationer + oauth2_provider: OAuth Udbyder + application: + title: OAuth godkendelse påkrævet + scopes: + follow: følge, blokere, afblokete og affølge kontoer + push: modtage push notifikationer for din konto + read: læse din kontos data + write: indsende på dine vegne diff --git a/config/locales/doorkeeper.el.yml b/config/locales/doorkeeper.el.yml new file mode 100644 index 000000000..b81814650 --- /dev/null +++ b/config/locales/doorkeeper.el.yml @@ -0,0 +1,120 @@ +--- +el: + activerecord: + attributes: + doorkeeper/application: + name: Όνομα εφαρμογής + redirect_uri: URI Ανακατεύθυνσης (Ενιαίο Αναγνωριστικό Πόρων) + scopes: Εύρος εφαρμογής + website: Ιστότοπος εφαρμογής + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: δεν μπορεί να περιέχει τμήμα διεύθυνσης. + invalid_uri: πρέπει να είναι έγκυρο URI (Ενιαίο Αναγνωριστικό Πόρων). + relative_uri: πρέπει να είναι απόλυτο URI (Ενιαίο Αναγνωριστικό Πόρων). + secured_uri: πρέπει να είναι HTTPS/SSL URI (Ενιαίο Αναγνωριστικό Πόρων). + doorkeeper: + applications: + buttons: + authorize: Ενέκρινε + cancel: Άκυρο + destroy: Καταστροφή + edit: Αλλαγή + submit: Υποβολή + confirmations: + destroy: Σίγουρα; + edit: + title: Αλλαγή εφαρμογής + form: + error: Ώπα! Έλεγξε τη φόρμα σου για πιθανά λάθη + help: + native_redirect_uri: Χρησιμοποίησε το %{native_redirect_uri} για τοπικές δοκιμές + redirect_uri: Χρησιμοποίησε μια γραμμή ανά URI + scopes: Διαχώρησε το κάθε εύρος εφαρμογής με κενά. Άστο κενό για χρήση των προεπιλεγμένων ευρών εφαρμογής. + index: + application: Εφαρμογή + callback_url: URL επιστροφής (Callback) + delete: Διαγραφή + name: Όνομα + new: Νέα εφαρμογή + scopes: Εύρος εφαρμογής + show: Εμφάνισε + title: Οι εφαρμογές σου + new: + title: Νέα εφαρμογή + show: + actions: Ενέργειες + application_id: Κλειδί πελάτη + callback_urls: URL επιστροφής (Callback) + scopes: Εύρος εφαρμογής + secret: Μυστικό πελάτη + title: 'Εφαρμογή: %{name}' + authorizations: + buttons: + authorize: Ενέκρινε + deny: Απόρριψε + error: + title: Εμφανίστηκε σφάλμα + new: + able_to: Θα μπορεί να + prompt: Η εφαρμογή %{client_name} ζητάει πρόσβαση στο λογαριασμό σου + title: Απαιτείται έγκριση + show: + title: Αντέγραψε αυτό τον κωδικό έγκρισης στην εφαρμογή. + authorized_applications: + buttons: + revoke: Ανακάλεσε + confirmations: + revoke: Σίγουρα; + index: + application: Εφαρμογή + created_at: Εγκεκριμένη + date_format: "%H:%M:%S, %d/%m/%Y" + scopes: Εύρος εφαρμογής + title: Οι εφαρμογές που έχεις εγκρίνει + errors: + messages: + access_denied: Ο ιδιοκτήτης του πόρου ή του παρόχου έγκρισης απέρριψε το αίτημα. + credential_flow_not_configured: Η ροή Resource Owner Password Credentials απέτυχε επειδή το Doorkeeper.configure.resource_owner_from_credentials δεν έχει ρυθμιστεί. + invalid_client: Η ταυτοποίηση του πελάτη απέτυχε είτε λόγω άγνωστου πελάτη, είτε λόγω έλλειψης ταυτοποιημένου πελάτη ή λόγω μη υποστηριζόμενης μεθόδου ταυτοποίησης. + invalid_grant: Η άδεια πιστοποίησης που δόθηκε είναι άκυρη, ληγμένη, έχει ανακληθεί, δεν συμφωνεί με το URI ανακατεύθυνσης που δόθηκε στο αίτημα πιστοποίησης ή εκδόθηκε προς άλλο πελάτη. + invalid_redirect_uri: Το URI ανακατεύθυνσης που δόθηκε δεν είναι έγκυρο. + invalid_request: Το αίτημα δεν έχει κάποια απαιτούμενη παράμετρο, περιέχει κάποια μη υποστηριζόμενη τιμή παραμέτρου ή είναι μη σωστά δομημένη. + invalid_resource_owner: Τα διαπιστευτήρια που έδωσε ο ιδιοκτήτης του πόρου δεν είναι έγκυρα, ή δεν βρέθηκε ο ιδιοκτήτης του πόρου + invalid_scope: Το αιτούμενο εύρος εφαρμογής είναι άκυρο, άγνωστο ή λάθος διατυπωμένο. + invalid_token: + expired: Το διακριτικό πρόσβασης έληξε + revoked: Το διακριτικό πρόσβασης ανακλήθηκε + unknown: Το διακριτικό πρόσβασης δεν είναι έγκυρο + resource_owner_authenticator_not_configured: Η αναζήτηση του ιδιοκτήτη του πόρου απέτυχε επειδή το Doorkeeper.configure.resource_owner_authenticator δεν έχει ρυθμιστεί. + server_error: Ο εξυπηρετητής έγκρισης (authorization server) αντιμετώπισε μια απροσδόκητη συνθήκη που τον απέτρεψε να ικανοποιήσει το αίτημα. + temporarily_unavailable: Ο εξυπηρετητής έγκρισης (authorization server) προς το παρόν δεν είναι διαθέσιμος να αναλάβει το αίτημα λόγω προσωρινής υπερφόρτωσης ή συντήρησής του. + unauthorized_client: Ο πελάτης δεν έχει άδεια να εκτελέσει αυτό το αίτημα χρησιμοποιώντας αυτή τη μέθοδο. + unsupported_grant_type: Το είδος άδειας έγκρισης δεν υποστηρίζεται από τον εξυπηρετητή έγκρισης (authorization server). + unsupported_response_type: Ο εξυπηρετητής έγκρισης (authorization server) δεν υποστηρίζει αυτό το είδος απάντησης. + flash: + applications: + create: + notice: Η εφαρμογή δημιουργήθηκε. + destroy: + notice: Η εφαρμογή διαγράφηκε. + update: + notice: Η εφαρμογή ενημερώθηκε. + authorized_applications: + destroy: + notice: Η εφαρμογή ανακλήθηκε. + layouts: + admin: + nav: + applications: Εφαρμογές + oauth2_provider: Πάροχος OAuth2 + application: + title: Απαιτείται έγκριση OAuth + scopes: + follow: παρακολούθηση, αποκλεισμός, άρση αποκλεισμού και άρση παρακολούθησης λογαριασμών + push: λήψη ειδοποιήσεων ώθησης για τον λογαριασμό σου + read: ανάγνωση στοιχείων του λογαριασμού σου + write: δημοσίευση εξ' ονόματός σου diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml index 8d3ce8a29..afacfd7f7 100644 --- a/config/locales/doorkeeper.pt-BR.yml +++ b/config/locales/doorkeeper.pt-BR.yml @@ -115,6 +115,6 @@ pt-BR: title: Autorização OAuth obrigatória scopes: follow: seguir, bloquear, desbloquear e deixar de seguir outras contas - push: receber notificações push para a sua conta + push: receber notificações push na sua conta read: ler os dados da sua conta write: postar em seu nome diff --git a/config/locales/doorkeeper.sv.yml b/config/locales/doorkeeper.sv.yml index 96a343c92..25440cbb0 100644 --- a/config/locales/doorkeeper.sv.yml +++ b/config/locales/doorkeeper.sv.yml @@ -115,5 +115,6 @@ sv: title: OAuth-behörighet krävs scopes: follow: följa, blockera, ta bort blockerade och sluta följa konton + push: ta emot push aviseringar för ditt konto read: läsa dina kontodata write: posta åt dig diff --git a/config/locales/el.yml b/config/locales/el.yml index e160396f3..4b2fe6075 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1,7 +1,7 @@ --- el: about: - about_hashtag_html: Αυτά είναι δημόσια τουτ σημειωμένα με #%{hashtag}. Μπορείς να αλληλεπιδράσεις με αυτά αν έχεις λογαριασμό οπουδήποτε στο fediverse. + about_hashtag_html: Αυτά είναι κάποια από τα δημόσια τουτ σημειωμένα με #%{hashtag}. Μπορείς να αλληλεπιδράσεις με αυτά αν έχεις λογαριασμό οπουδήποτε στο fediverse. about_mastodon_html: Το Mastodon είναι ένα κοινωνικό δίκτυο που βασίζεται σε ανοιχτά δικτυακά πρωτόκολλα και ελεύθερο λογισμικό ανοιχτού κώδικα. Είναι αποκεντρωμένο όπως το e-mail. about_this: Σχετικά administered_by: 'Διαχειρίζεται από:' @@ -10,7 +10,7 @@ el: contact_missing: Δεν έχει οριστεί contact_unavailable: Μ/Δ description_headline: Τι είναι το %{domain}; - domain_count_after: άλλοι διακομιστές + domain_count_after: άλλους διακομιστές domain_count_before: Συνδέεται με extended_description_html: |

    Ένα καλό σημείο για κανόνες

    @@ -18,8 +18,8 @@ el: features: humane_approach_body: Μαθαίνοντας από τις αποτυχίες άλλων δικτύων, το Mastodon στοχεύει να κάνει σχεδιαστικά ηθικές επιλογές για να καταπολεμήσει την κακόβουλη χρήση των κοινωνικών δικτύων. humane_approach_title: Μια πιο ανθρώπινη προσέγγιση - not_a_product_body: Το Mastodon δεν είναι εμπορικό δίκτυο. Δεν έχει διαφημίσεις, δεν έχει εξόρυξη δεδομένων, δεν έχει φραγμένες περιοχές. Δεν υπάρχει κεντρικό σημείο ελέγχου. - not_a_product_title: Είσαι άνθρωπος, όχι προϊόν + not_a_product_body: Το Mastodon δεν είναι ένα εμπορικό δίκτυο. Δεν έχει διαφημίσεις, δεν έχει εξόρυξη δεδομένων, δεν έχει περιφραγμένους κήπους. Δεν υπάρχει κεντρικό σημείο ελέγχου. + not_a_product_title: Είσαι ένας άνθρωπος, όχι κάποιο προϊόν real_conversation_body: Με 500 χαρακτήρες στη διάθεσή σου και υποστήριξη για λεπτομερή έλεγχο και προειδοποιήσεις πολυμέσων, μπορείς να εκφραστείς με τον τρόπο που θέλεις. real_conversation_title: Φτιαγμένο για αληθινή συζήτηση within_reach_body: Οι πολλαπλές εφαρμογές για το iOS, το Android και τις υπόλοιπες πλατφόρμες, χάρη σε ένα φιλικό προς τους προγραμματιστές οικοσύστημα API, σου επιτρέπουν να κρατάς επαφή με τους φίλους και τις φίλες σου οπουδήποτε. @@ -30,9 +30,9 @@ el: other_instances: Λίστα κόμβων source_code: Πηγαίος κώδικας status_count_after: καταστάσεις - status_count_before: Ποιός συνέγραψε + status_count_before: Που έχουν γράψει user_count_after: χρήστες - user_count_before: Σπίτι + user_count_before: Σπίτι για what_is_mastodon: Τι είναι το Mastodon; accounts: follow: Ακολούθησε @@ -91,11 +91,11 @@ el: inbox_url: URL εισερχομένων ip: IP location: - all: Όλα + all: Όλες local: Τοπικά remote: Απομακρυσμένα title: Τοποθεσία - login_status: Κατάσταση εισόδου + login_status: Κατάσταση σύνδεσης media_attachments: Συνημμένα πολυμέσα memorialize: Μετατροπή σε νεκρολογία moderation: @@ -106,13 +106,13 @@ el: moderation_notes: Σημειώσεις μεσολάβησης most_recent_activity: Πιο πρόσφατη δραστηριότητα most_recent_ip: Πιο πρόσφατη IP - not_subscribed: Άνευ εγγραφής + not_subscribed: Άνευ συνδρομής order: alphabetic: Αλφαβητικά most_recent: Πιο πρόσφατα title: Ταξινόμηση outbox_url: URL εξερχομένων - perform_full_suspension: Πλήρης αναστολή + perform_full_suspension: Κάνε πλήρη αναστολή profile_url: URL προφίλ promote: Προβίβασε protocol: Πρωτόκολλο @@ -138,7 +138,7 @@ el: shared_inbox_url: URL κοινόχρηστων εισερχομένων show: created_reports: Αναφορές από αυτόν το λογαριασμό - report: κατάγγειλε + report: καταγγελία targeted_reports: Αναφορές για αυτόν το λογαριασμό silence: Αποσιώπησε statuses: Καταστάσεις @@ -215,7 +215,7 @@ el: create: Δημιουργία αποκλεισμού hint: Ο αποκλεισμός τομέα δεν θα αποτρέψει νέες καταχωρίσεις λογαριασμών στην βάση δεδομένων, αλλά θα εφαρμόσει αναδρομικά και αυτόματα συγκεκριμένες πολιτικές μεσολάβησης σε αυτούς τους λογαριασμούς. severity: - desc_html: Η αποσιώπηση θα κάνει αόρατες τις δημοσιεύσεις ενός λογαριασμού σε όσους δεν τον ακολουθούν. Η αναστολή θα αφαιρέσει όλο το περιεχόμενο, τα πολυμέσα και τα στοιχεία προφίλ ενός λογαριασμού. Το κανένα απλά απορρίπτει τα αρχεία πολυμέσων. + desc_html: Η αποσιώπηση θα κάνει αόρατες τις δημοσιεύσεις ενός λογαριασμού σε όσους δεν τον ακολουθούν. Η αναστολή θα αφαιρέσει όλο το περιεχόμενο, τα πολυμέσα και τα στοιχεία προφίλ ενός λογαριασμού. Χρησιμοποίησε το κανένα αν θέλεις απλά να απορρίψεις τα αρχεία πολυμέσων. noop: Κανένα silence: Σίγαση suspend: Αναστολή @@ -294,7 +294,7 @@ el: silence_account: Αποσιώπηση λογαριασμού status: Κατάσταση suspend_account: Ανέστειλε λογαριασμό - target: Στόχος + target: Αποδέκτης title: Αναφορές unassign: Αποσύνδεση unresolved: Άλυτη @@ -306,7 +306,7 @@ el: title: Δημοσίευση συγκεντρωτικών στατιστικών για τη δραστηριότητα χρηστών bootstrap_timeline_accounts: desc_html: Διαχωρίστε πολλαπλά ονόματα χρηστών με κόμματα. Λειτουργεί μόνο με τοπικούς και ανοιχτούς λογαριασμούς. Αν είναι κενό, περιλαμβάνει όλους τους τοπικούς διαχειριστές. - title: Προεπιλεγμένοι λογαριασμοί για ακολούθηση από τους νέους χρήστες + title: Προεπιλεγμένοι λογαριασμοί για παρακολούθηση από τους νέους χρήστες contact_information: email: Επαγγελματικό email username: Όνομα χρήστη επικοινωνίας @@ -314,7 +314,7 @@ el: desc_html: Εμφανίζεται στην μπροστινή σελίδα. Συνίσταται τουλάχιστον 600x100px. Όταν λείπει, χρησιμοποιείται η μικρογραφία του κόμβου title: Εικόνα ήρωα peers_api_enabled: - desc_html: Ονόματα τομέων που αυτός ο κόμβος έχει πετύχει στο fediverse + desc_html: Ονόματα τομέων που αυτός ο κόμβος έχει ήδη συναντήσει στο fediverse title: Δημοσίευση λίστας κόμβων που έχουν ανακαλυφθεί registrations: closed_message: @@ -333,8 +333,8 @@ el: desc_html: Όταν αντιστραφεί, θα δείχνει τα τουτ από όλο το γνωστό fediverse στην προεπισκόπηση. Διαφορετικά θα δείχνει μόνο τοπικά τουτ. title: Εμφάνιση του γνωστού fediverse στην προεπισκόπηση ροής show_staff_badge: - desc_html: Δείξε ένα σήμα προσωπικού σε μια σελίδα χρήστη - title: Δείξε σήμα προσωπικού + desc_html: Δείξε ένα σήμα προσωπικού στη σελίδα ενός χρήστη + title: Δείξε διακριτικό προσωπικού site_description: desc_html: Εισαγωγική παράγραφος στην αρχική σελίδα και στα meta tags. Μπορείς να χρησιμοποιήσεις HTML tags, συγκεκριμένα < a> και < em>. title: Περιγραφή κόμβου @@ -474,6 +474,22 @@ el: follows: Ακολουθείς mutes: Αποσιωπάς storage: Αποθήκευση πολυμέσων + filters: + contexts: + home: Αρχική ροή + notifications: Ειδοποιήσεις + public: Δημόσιες ροές + thread: Συζητήσεις + edit: + title: Ενημέρωση φίλτρου + errors: + invalid_context: Έδωσες λάθος ή ανύπαρκτο πλαίσιο + invalid_irreversible: Τα μη αντιστρέψιμα φίλτρα δουλεύουν μόνο στα πλαίσια της αρχικής ροής και των ειδοποιήσεων + index: + delete: Διαγραφή + title: Φίλτρα + new: + title: Πρόσθεσε νέο φίλτρο followers: domain: Τομέας explanation_html: Αν θέλεις να διασφαλίσεις την ιδιωτικότητα των ενημερώσεών σου, πρέπει να ξέρεις ποιος σε ακολουθεί. Οι ιδιωτικές ενημερώσεις σου μεταφέρονται σε όλους τους κόμβους στους οποίους έχεις ακόλουθους. Ίσως να θέλεις να κάνεις μια ανασκόπηση σε αυτούς και να αφαιρέσεις ακολούθους αν δεν εμπιστεύεσαι το προσωπικό αυτών των κόμβων πως θα σεβαστούν την ιδιωτικότητά σου. @@ -598,6 +614,7 @@ el: remote_follow: acct: Γράψε το ΌνομαΧρήστη@τομέας από όπου θέλεις να ακολουθήσεις missing_resource: Δεν βρέθηκε το απαιτούμενο URL ανακατεύθυνσης για το λογαριασμό σου + no_account_html: Δεν έχεις λογαριασμό; Μπορείς να γραφτείς εδώ proceed: Συνέχισε για να ακολουθήσεις prompt: 'Θα ακολουθήσεις:' remote_unfollow: @@ -697,6 +714,87 @@ el: reblogged: προωθημένο sensitive_content: Ευαίσθητο περιεχόμενο terms: + body_html: | +

    Πολιτική Απορρήτου

    +

    Ποιες πληροφορίες συλλέγουμε;

    + +
      +
    • Βασικά στοιχεία λογαριασμού: Όταν εγγραφείς σε αυτό τον διακομιστή, μπορεί να σου ζητηθεί όνομα χρήστη, διεύθυνση email και ένας κωδικός. Μπορεί επίσης να εισάγεις επιπλέον πληροφορίες λογαριασμού όπως ένα όνομα λογαριασμού και σύντομο βιογραφικό και να ανεβάσεις εικόνα προφίλ και επικεφαλίδας. Το όνομα χρήστη, το όνομα λογαριασμού, το βιογραφικό και οι εικόνες προφίλ και επικεφαλίδας είναι πάντα δημόσια εμφανείς.
    • +
    • Δημοσιεύσεις, ακόλουθοι και λοιπά δημόσια στοιχεία: Η λίστα των ανθρώπων που ακολουθείς εμφανίζεται δημόσια, το ίδιο και οι ακόλουθοί σου. Όταν υποβάλλεις ένα μήνυμα, η ημερομηνία και ώρα αποθηκεύονται καθώς και η εφαρμογή που χρησιμοποίησες για την υποβολή του. Τα μηνύματα μπορεί να περιέχουν συνημμένα πολυμέσα όπως εικόνες και βίντεο. Τα δημόσια και τα μη καταχωρημένα μηνύματα είναι δημόσια διαθέσιμα. Όταν προβάλεις μια δημοσίευση στο προφίλ σου, είναι και αυτό δημόσια διαθέσιμο. Οι δημοσιεύσεις σου παραδίδονται στους ακολούθους σου, σε κάποιες περιπτώσεις αυτό σημαίνει ότι παραδίδονται σε διαφορετικούς διακομιστές (servers) και αντίγραφά τους αποθηκεύονται σε αυτούς. Παρομοίως, όταν διαγράψεις δημοσιεύσεις, αυτό μεταφέρεται στους ακόλουθους σου. Η αναδημοσίευση και η σημείωση ως αγαπημένης μιας δημοσίευσης είναι πάντα δημόσια.
    • +
    • Προσωπικές δημοσιεύσεις και προς ακόλουθους: Όλες οι δημοσιεύσεις αποθηκεύονται και επεξεργάζονται στον διακομιστή. Οι δημοσιεύσεις προς τους ακόλουθους παραδίδονται στους ακόλουθους σου και σε όσους χρήστες αναφέρονται σε αυτές. Σε κάποιες περιπτώσεις αυτό σημαίνει πως παραδίδονται σε διαφορετικούς διακομιστές και αντίγραφά τους αποθηκεύονται σε αυτούς. Καταβάλουμε ειλικρινή προσπάθεια περιορισμού πρόσβασης σε αυτές τις δημοσιεύσεις μόνο σε εγκεκριμένα άτομα, όμως διαφορετικοί διακομιστές μπορεί να μην το πετυχαίνουν αυτό. Για αυτό, είναι σημαντικό να ελέγχεις τους διακομιστές στους οποίους ανήκουν οι ακόλουθοί σου. Μπορείς να ενεργοποιήσεις την επιλογή χειροκίνητης αποδοχής ή απόρριψης των νέων ακόλουθών σου στις ρυθμίσεις. Παρακαλούμε έχε υπόψιν σου πως οι διαχειριστές του διακομιστή και των αποδεκτών διακομιστών πιθανόν να κοιτάνε αυτά τα μηνύματα, και πως οι τελικοί αποδέκτες μπορούν να αποθηκεύσουν την οθόνη, το μήνυμα ή να το αναμεταδώσουν με άλλους τρόπους. Μην μοιράζεσαι επικύνδυνες πληροφορίες μέσω του Mastodon.
    • +
    • Διευθύνσεις IP και άλλα metadata: Όταν συνδέεσαι, καταγράφουμε την διεύθυνση IP σου, καθώς και το όνομα της εφαρμογής του φυλλομετρητή σου (browser). Όλες οι τρέχουσες συνδέσεις στον λογαριασμό σου είναι διαθέσιμες προς ανασκόπηση στις ρυθμίσεις. Η πιο πρόσφατη διεύθυνση IP αποθηκεύεται για μέχρι 12 μήνες. Επίσης μπορεί να διατηρήσουμε ιστορικό του διακομιστή (log files) που να περιέχει την διεύθυνση ΙΡ κάθε κλήσης προς τον διακομιστή μας.
    • +
    + +
    + +

    Πως χρησιμοποιούμε τις πληροφορίες σου;

    + +

    Οι πληροφορίες σου που συλλέγουμε μπορεί να χρησιμοποιηθούν με τους ακόλουθους τρόπους:

    + +
      +
    • Για να παρέχουμε την βασική λειτουργικότητα του Mastodon. Μπορείς να αλληλεπιδράσεις με τις δημοσιεύσεις άλλων και να κάνεις τις δικές σου μόνο αφού συνδεθείς. Για παράδειγμα, μπορείς να ακολουθήσεις άλλους χρήστες για να βλέπεις τις συνολικές δημοσιεύσεις τους στη δική σου, προσωπική αρχική ροή.
    • +
    • Για να διευκολύνουμε τη διαχείριση της κοινότητας, για παράδειγμα συγκρίνοντας τη δική σου διεύθυνση IP με άλλες γνωστές διευθύνσεις για να καθορίσουμε περιπτώσεις αποφυγής αποκλεισμού ή άλλων παραβάσεων.
    • +
    • Η διεύθυνση email που δίνεις μπορεί να χρησιμοποιηθεί για να σου στείλουμε πληροφορίες, ειδοποιήσεις για αλληλεπιδράσεις άλλων χρηστών με τις δημοσιεύσεις σου και να ανταποκριθούμε σε ερωτήματά σου.
    • +
    + +
    + +

    Πως προστατεύουμε τις πληροφορίες σου;

    + +

    Εφαρμόζουμε μια σειρά μεθόδων ασφαλείας για να διασφαλίσουμε τις προσωπικές πληροφορίες που εισάγεις, καταθέτεις ή κοιτάζεις. Μεταξύ άλλων, η σύνδεση του φυλλομετρητή σου καθώς και οι ανταλασσόμενες πληροφορίες μεταξύ των εφαρμογών σου και του API είναι κρυπτογραφημένες μέσω SSL και το συνθηματικό σου κωδικοποιείται με ισχυρό, μη αντιστρέψιμο αλγόριθμο. Μπορείς να ενεργοποιήσεις την ταυτοπόίηση 2 παραγόντων (2FA) για επιπλέον ασφαλή πρόσβαση στο λογαριασμό σου.

    + +
    + +

    Ποια είναι η πολιτική διατήρησης πληροφοριών μας;

    + +

    Καταβάλουμε κάθε δυνατή προσπάθεια να:

    + +
      +
    • Διατηρήσουμε αρχεία ενεργειών των διακομιστών (servers) για όλα τα αιτήματα σε αυτόν τον διακομιστή, και αυτά τα αρχεία διατηρούνται για μέγιστο χρόνο 90 ημερών.
    • +
    • Διατηρήσουμε τις διευθύνσεις IP που σχετίζονται με εγγεγραμμένους χρήστες για μέγιστο χρόνο 12 μηνών.
    • +
    + +

    Μπορείς να αιτηθείς και να αποθηκεύσεις τοπικά ένα αρχείο του περιεχομένου σου που περιλαμβάνει τις δημοσιεύσεις, τα συνημμένα πολυμέσα, την εικόνα προφίλ και την εικόνα επικεφαλίδας.

    + +

    Μπορείς ανά πάσα στιγμή να διαγράψεις οριστικά και αμετάκλητα το λογαριασμό σου.

    + +
    + +

    Χρησιμοποιούμε cookies;

    + +

    Ναι. Τα cookies είναι μικρά αρχεία που ένας ιστοτοπος (site) ή πάροχος υπηρεσίας μεταφέρει στον σκληρό δίσκο του υπολογιστή μέσω του φυλλομετρητή (αν το επιτρέψεις). Τα cookies αυτά επιτρέπουν στον ιστότοπο να αναγνωρίζει τον φυλλομετρητή σου και, αν έχεις λογαριασμό, να τον συνδέσει με αυτόν.

    + +

    Χρησιμοποιούμε τα cookies για να αναγνωρίσουμε και αποθηκεύσουμε τις προτιμήσεις σου για τις μελλοντικές σου επισκέψεις.

    + +
    + +

    Αποκαλύπτουμε πληροφορίες σε τρίτους;

    + +

    Δεν πουλάμε, ανταλλάσσουμε ή με άλλο τρόπο μεταφέρουμε σε τρίτα μέρη πληροφορίες που σε προσωποποιούν. Αυτό δεν περιλαμβάνει αξιόπιστα τρίτα μέρη που μας βοηθούν να λειτουργούμε τον ιστότοπό μας, να διεξάγουμε τις εργασίες μας ή να σε εξυπηρετούμε, στο βαθμό που αυτά τα τρίτα μέρη συμφωνούν να διατηρούν αυτές τις πληροφορίες εμπιστευτικές. Επίσης μπορεί να μοιραστούμε τις πληροφορίες σου όταν θεωρήσουμε πως αυτό είναι σύμφωνο με τον νόμο, με την πολιτική του ιστότοπου μας ή διαφυλάσσει τα δικά μας δικαιώματα ή τρίτων, την ιδιοκτησία ή την ασφάλεια.

    + +

    Το δημόσιο περιεχόμενο σου μπορεί να αποθηκευτεί από άλλους διακομιστές (servers) στο δίκτυο. Οι δημόσιες και οι προς ακόλουθους δημοσιεύσεις σου παραδίδονται στους διακομιστές των ακολούθων σου και τα προσωπικά μηνύματα στους διακομιστές των παραληπτών, όταν αυτοί βρίσκονται σε διαφορετικό διακομιστή.

    + +

    Όταν επιτρέψεις σε μια εφαρμογή να χρησιμοποιήσει τον λογαριασμό σου, ανάλογα με το εύρος των δικαιωμάτων που εγκρίνεις, μπορεί να έχει πρόσβαση στις πληροφορίες του δημόσιου προφιλ σου, στη λίστα των ακολούθων σου, στους ακόλουθούς σου, στις λίστες σου, σε όλες τις δημοσιεύσεις σου και στα αγαπημένα σου. Οι εφαρμογές ποτέ δεν έχουν πρόσβαση στις διευθύνσεις email και στα συνθηματικά σου.

    + +
    + +

    Χρήση από παιδιά

    + +

    Αν αυτός ο διακομιστής βρίσκεται στην ΕΕ (Ευρωπαϊκή Ένωση) ή στον ΕΟΧ (Ευρωπαϊκός Οικονομικός Χώρος): Ο ιστότοπός μας, τα προϊόντα και οι υπηρεσίες μας απευθύνονται σε άτομα ηλικίας άνω των 16. Αν είσαι κάτω των 16, σύμφωνα με τις απαιτήσεις του Γενικού Κανονισμού Προστασίας Δεδομένων "GDPR" (General Data Protection Regulation) μην χρησιμοποιήσεις αυτόν τον ιστότοπο.

    + +

    Αν αυτός ο διακομιστής βρίσκεται στις ΗΠΑ: Ο ιστότοπός μας, τα προϊόντα και οι υπηρεσίες μας απευθύνονται σε άτομα ηλικίας τουλάχιστον 13 ετών. Αν είσαι κάτω των 13, σύμφωνα με τις απαιτήσεις του COPPA (Children's Online Privacy Protection Act) μην χρησιμοποιήσεις αυτόν τον ιστότοπο.

    + +

    Οι νομικές απαιτήσεις μπορεί να είναι διαφορετικές αν ο διακομιστής αυτός βρίσκεται σε άλλη δικαιοδοσία.

    + +
    + +

    Αλλαγές στην πολιτική απορρήτου μας

    + +

    Αν αποφασίσουμε να κάνουμε αλλαγές στην πολιτική απορρήτου μας, θα τις δηλώσουμε σε αυτήν εδώ τη σελίδα.

    + +

    Η άδεια χρήσης αυτού του κειμένου είναι κατάCC-BY-SA. Ενημερώθηκε τελευταία φορά στις 7 Μαρτίου, 2018.

    + +

    Οι παραπάνω όροι έχουν προσαρμοστεί από τους αντίστοιχους όρους του Discourse.

    title: Όροι Χρήσης και Πολιτική Απορρήτου του κόμβου %{instance} themes: contrast: Υψηλή αντίθεση diff --git a/config/locales/eo.yml b/config/locales/eo.yml index f1a9ff79d..389819f7f 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -424,7 +424,7 @@ eo: following: 'Sukceson! Vi nun sekvas:' post_follow: close: Aŭ, vi povas simple fermi ĉi tiun fenestron. - return: Reveni al la profilo de uzanto + return: Montri la profilon de la uzanto web: Iri al reto title: Sekvi %{acct} datetime: @@ -476,6 +476,22 @@ eo: follows: Vi sekvas mutes: Vi silentigas storage: Aŭdovidaĵa konservado + filters: + contexts: + home: Hejma tempolinio + notifications: Sciigoj + public: Publikaj tempolinioj + thread: Konversacioj + edit: + title: Ŝanĝi filtrilojn + errors: + invalid_context: Neniu aŭ nevalida kunteksto donita + invalid_irreversible: Nemalfarebla filtrado funkcias nur por hejma aŭ sciiga kuntekstoj + index: + delete: Forigi + title: Filtriloj + new: + title: Aldoni novan filtrilon followers: domain: Domajno explanation_html: Se vi volas esti certa pri la privateco de viaj mesaĝoj, vi bezonas esti atenta pri tiuj, kiuj sekvas vin. Viaj privataj mesaĝoj estas liveritaj al ĉiuj nodoj, kie vi havas sekvantojn. Eble vi ŝatus kontroli ilin, kaj forigi la sekvantojn de la nodoj, kie vi ne certas ĉu via privateco estos respektita de la tiea teamo aŭ programo. @@ -516,6 +532,7 @@ eo: '86400': 1 tago expires_in_prompt: Neniam generate: Krei + invited_by: 'Vi estis invitita de:' max_uses: one: 1 uzo other: "%{count} uzoj" @@ -600,6 +617,7 @@ eo: remote_follow: acct: Enmetu vian uzantnomo@domajno de kie vi volas sekvi missing_resource: La URL de plusendado ne estis trovita + no_account_html: Ĉu vi ne havas konton? Vi povas registriĝi tie proceed: Daŭrigi por eksekvi prompt: 'Vi eksekvos:' remote_unfollow: @@ -676,6 +694,7 @@ eo: disallowed_hashtags: one: 'enhavas malpermesitan kradvorton: %{tags}' other: 'enhavis malpermesitan kradvorton: %{tags}' + language_detection: Aŭtomate detekti la lingvon open_in_web: Malfermi retumile over_character_limit: limo de %{max} signoj transpasita pin_errors: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 61e7509c5..cc1148019 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -474,6 +474,22 @@ fa: follows: حساب‌های پی‌گرفته mutes: حساب‌های بی‌صداشده storage: تصویرهای ذخیره‌شده + filters: + contexts: + home: خانه + notifications: اعلان‌ها + public: فهرست عمومی + thread: گفتگوها + edit: + title: ویرایش فیلتر + errors: + invalid_context: زمینه‌ای موجود نیست یا نامعتبر است + invalid_irreversible: فیلترهای برگشت‌ناپذیر تنها در زمینهٔ پیگیری‌ها یا اعلان‌ها کار می‌کنند + index: + delete: پاک‌کردن + title: فیلترها + new: + title: افزودن فیلتر تازه followers: domain: دامین explanation_html: اگر می‌خواهید از خصوصی‌بودن نوشته‌های خود مطمئن شوید، باید بدانید که چه کسانی پیگیر شما هستند. نوشته‌های خصوصی شما به همهٔ سرورهایی که در آن‌ها پیگیر دارید فرستاده می‌شود. شاید بخواهید این سرورها را بررسی کنید، و اگر به مسئولان یا نرم‌افزارهای آن‌ها در رعایت حریم خصوصی خود اعتماد ندارید، می‌توانید آن‌ها را حذف کنید. @@ -675,6 +691,7 @@ fa: disallowed_hashtags: one: 'دارای هشتگ غیرمجاز: %{tags}' other: 'دارای هشتگ‌های غیرمجاز: %{tags}' + language_detection: زبان نوشته خودبه‌خود شناخته شود open_in_web: بازکردن در وب over_character_limit: از حد مجاز %{max} حرف فراتر رفتید pin_errors: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 1e02efbd2..6c9076919 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -40,6 +40,7 @@ fi: following: Seuratut media: Media moved_html: "%{name} on muuttanut osoitteeseen %{new_profile_link}:" + network_hidden: Nämä tiedot eivät ole käytettävissä nothing_here: Täällä ei ole mitään! people_followed_by: Henkilöt, joita %{name} seuraa people_who_follow: Käyttäjän %{name} seuraajat diff --git a/config/locales/gl.yml b/config/locales/gl.yml index f748505d2..bd851df2f 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -474,6 +474,22 @@ gl: follows: A seguir mutes: Acalou storage: Almacenamento de medios + filters: + contexts: + home: Liña temporal inicial + notifications: Avisos + public: Liñas temporais públicas + thread: Conversas + edit: + title: Editar filtro + errors: + invalid_context: Non se proporcionou un contexto válido + invalid_irreversible: O filtrado non reversible só funciona con contexto de avisos ou Inicio + index: + delete: Eliminar + title: Filtros + new: + title: Engadir novo filtro followers: domain: Dominio explanation_html: Se quere asegurar a intimidade dos seus estados, debe ser consciente de quen a está a seguir. Os seus estados privados son enviados a todas as instancias onde ten seguidoras. Podería querer revisalas, e elminar seguidoras si non confía que a súa intimidade sexa respetada polos administradores ou o software de esa instancia. @@ -599,6 +615,7 @@ gl: remote_follow: acct: Introduza o seu nomedeusuaria@dominio desde onde quere facer seguimento missing_resource: Non se puido atopar o URL de redirecionamento requerido para a súa conta + no_account_html: Non ten unha conta? Pode rexistrarse aquí proceed: Proceda para seguir prompt: 'Vostede vai seguir:' remote_unfollow: diff --git a/config/locales/it.yml b/config/locales/it.yml index 41f397feb..7478fbab7 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -554,8 +554,10 @@ it: generic: Browser sconosciuto current_session: Sessione corrente description: "%{browser} su %{platform}" + explanation: Questi sono i browser da cui attualmente è avvenuto l'accesso al tuo account Mastodon. platforms: other: piattaforma sconosciuta + title: Sessioni settings: authorized_apps: Applicazioni autorizzate back: Torna a Mastodon @@ -573,9 +575,18 @@ it: your_apps: Le tue applicazioni statuses: attached: + description: 'Allegato: %{attached}' + image: + one: "%{count} immagine" + other: "%{count} immagini" video: one: "%{count} video" other: "%{count} video" + boosted_from_html: Condiviso da %{acct_link} + disallowed_hashtags: + one: 'contiene un hashtag non permesso: %{tags}' + other: 'contiene gli hashtags non permessi: %{tags}' + language_detection: Individua lingua automaticamente open_in_web: Apri sul Web over_character_limit: Limite caratteri superato di %{max} pin_errors: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index ffc450038..c61d77809 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -474,6 +474,22 @@ ja: follows: フォロー mutes: ミュート storage: メディア + filters: + contexts: + home: ホームタイムライン + notifications: 通知 + public: 公開タイムライン + thread: 会話 + edit: + title: フィルターを編集 + errors: + invalid_context: 対象がないか無効です + invalid_irreversible: この機能はホームタイムラインまたは通知と一緒に指定する場合のみ機能します + index: + delete: 削除 + title: フィルター + new: + title: 新規フィルターを追加 followers: domain: ドメイン explanation_html: あなたの投稿のプライバシーを確保したい場合、誰があなたをフォローしているのかを把握している必要があります。 プライベート投稿は、あなたのフォロワーがいる全てのインスタンスに配信されます。 フォロワーのインスタンスの管理者やソフトウェアがあなたのプライバシーを尊重してくれるかどうか怪しい場合は、そのフォロワーを削除した方がよいかもしれません。 @@ -599,6 +615,7 @@ ja: remote_follow: acct: あなたの ユーザー名@ドメイン を入力してください missing_resource: リダイレクト先が見つかりませんでした + no_account_html: アカウントをお持ちではないですか?こちらからサインアップできます proceed: フォローする prompt: 'フォローしようとしています:' remote_unfollow: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 68a044eb5..368d389ca 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -476,6 +476,22 @@ ko: follows: 팔로우 mutes: 뮤트 storage: 미디어 + filters: + contexts: + home: 홈 타임라인 + notifications: 알림 + public: 퍼블릭 타임라인 + thread: 대화 + edit: + title: 필터 편집 + errors: + invalid_context: 컨텍스트가 없거나 올바르지 않습니다 + invalid_irreversible: 되돌릴 수 없는 필터링은 홈 타임라인과 알림에서만 동작합니다 + index: + delete: 삭제 + title: 필터 + new: + title: 필터 추가 followers: domain: 도메인 explanation_html: 프라이버시를 확보하고 싶은 경우, 누가 여러분을 팔로우 하고 있는지 파악해둘 필요가 있습니다. 프라이빗 포스팅은 여러분의 팔로워가 소속하는 모든 인스턴스로 배달됩니다. 팔로워가 소속된 인스턴스 관리자나 소프트웨어가 여러분의 프라이버시를 존중하고 있는지 잘 모를 경우, 그 팔로워를 삭제하는 것이 좋을 수도 있습니다. @@ -677,6 +693,7 @@ ko: disallowed_hashtags: one: '허용 되지 않은 해시태그를 포함하고 있습니다: %{tags}' other: '허용되지 않은 해시태그를 포함하고 있습니다: %{tags}' + language_detection: 자동으로 언어 감지 open_in_web: Web으로 열기 over_character_limit: 최대 %{max}자까지 입력할 수 있습니다 pin_errors: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index b69a1e76f..30c9de2e7 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -531,6 +531,22 @@ oc: follows: Personas que seguètz mutes: Personas rescondudas storage: Mèdias gardats + filters: + contexts: + home: Flux d’acuèlh + notifications: Notificacions + public: Flux public + thread: Conversacions + edit: + title: Modificar lo filtre + errors: + invalid_context: Cap de contèxte o contèxte invalid fornit + invalid_irreversible: Lo filtratge irreversible fonciona pas qu’amb lo flux d’actualitat o en contèxte de notificacion + index: + delete: Suprimir + title: Filtres + new: + title: Ajustar un nòu filtre followers: domain: Domeni explanation_html: Se volètz vos assegurar de la confidencialitat de vòstres estatuts, vos cal saber qual sèc vòstre compte. Vòstres estatuts privats son enviats a totas las instàncias qu’an de monde que vos sègon.. Benlèu que volètz repassar vòstra lista e tirar los seguidors s’avètz de dobtes tocant las politicas de confidencialitat dels gestionaris de lor instància o sul logicial qu’utilizan. diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index b01e27f41..ff7c5e24d 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -474,6 +474,22 @@ pt-BR: follows: Você segue mutes: Você silenciou storage: Armazenamento de mídia + filters: + contexts: + home: Página inicial + notifications: Notificações + public: Timelines públicas + thread: Conversas + edit: + title: Editar filtro + errors: + invalid_context: Contexto inválido ou nenhum contexto informado + invalid_irreversible: O filtro irreversível só funciona com contexto de página inicial ou notificações + index: + delete: Remover + title: Filtros + new: + title: Adicionar novo filtro followers: domain: Domínio explanation_html: Se você quer garantir a privacidade de suas postagens, você deve ficar atento a quem está te seguindo.Suas postagens privadas são enviadas para todas as instâncias em que você tem seguidores. Convém revisá-las e remover seguidores se você acredita que a sua privacidade não será respeitada pela equipe ou software destas instâncias. @@ -514,6 +530,7 @@ pt-BR: '86400': 1 dia expires_in_prompt: Nunca generate: Gerar + invited_by: 'Você recebeu um convite de:' max_uses: one: 1 uso other: "%{count} usos" @@ -598,6 +615,7 @@ pt-BR: remote_follow: acct: Insira o seu usuário@domínio do qual você quer seguir missing_resource: Não foi possível encontrar a URL de direcionamento para a sua conta + no_account_html: Não tem uma conta? Você pode cadastrar-se aqui proceed: Prosseguir para seguir prompt: 'Você irá seguir:' remote_unfollow: @@ -674,6 +692,7 @@ pt-BR: disallowed_hashtags: one: 'continha a hashtag não permitida: %{tags}' other: 'continha as hashtags não permitidas: %{tags}' + language_detection: Detectar idioma automaticamente open_in_web: Abrir na web over_character_limit: limite de caracteres de %{max} excedido pin_errors: diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index d560a9228..d0dda5334 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -6,12 +6,14 @@ ar: autofollow: سوف يتابعك تلقائيًا الأشخاص الذين يقومون بالتسجيل من خلال الدعوة avatar: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير 2MB. سيتم تصغيره إلى 400x400px bot: يُعلِم أنّ هذا الحساب لا يمثل شخصًا + context: واحد أو أكثر من السياقات التي يجب أن ينطبق عليها عامل التصفية digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة display_name: one: 1 حرف باق other: %{count} حرف باق fields: يُمكنك عرض 4 عناصر على شكل جدول في ملفك الشخصي header: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير 2MB. سيتم تصغيره إلى 700x335px + irreversible: التبويقات التي تم تصفيتها ستختفي لا محالة حتى و إن تمت إزالة عامِل التصفية لاحقًا locale: لغة واجهة المستخدم و الرسائل الإلكترونية و الإشعارات locked: يتطلب منك الموافقة يدويا على طلبات المتابعة note: @@ -39,6 +41,7 @@ ar: chosen_languages: تصفية اللغات confirm_new_password: تأكيد كلمة السر الجديدة confirm_password: تأكيد كلمة السر + context: تصفية السياقات current_password: كلمة السر الحالية data: البيانات display_name: الإسم المعروض @@ -46,6 +49,7 @@ ar: expires_in: تنتهي مدة صلاحيته بعد fields: واصفات بيانات الملف الشخصي header: الرأسية + irreversible: إسقاط بدلا من إخفائها locale: لغة الواجهة locked: تجميد الحساب max_uses: عدد مرات استخدام الرابط @@ -53,6 +57,7 @@ ar: note: السيرة الذاتية otp_attempt: رمز المصادقة بخطوتين password: كلمة السر + phrase: كلمة مفتاح أو عبارة setting_auto_play_gif: تشغيل تلقائي لِوَسائط جيف المتحركة setting_boost_modal: إظهار مربع حوار للتأكيد قبل ترقية أي تبويق setting_default_language: لغة النشر diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index eb0d67dfd..482ddd7be 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -6,17 +6,20 @@ ca: autofollow: Les persones que es registrin a través de la invitació et seguiran automàticament avatar: PNG, GIF o JPG. Màxim 2MB. S'escalarà a 400x400px bot: Aquest compte realitza principalment accions automatitzades i pot no estar controlat per cap persona + context: Un o diversos contextos on s'ha d'aplicar el filtre digest: Només s'envia després d'un llarg període d'inactivitat amb un resum de les mencions que has rebut en la teva absència display_name: one: 1 càracter restant other: %{count} càracters restans fields: Pots tenir fins a 4 elements que es mostren com a taula al teu perfil header: PNG, GIF o JPG. Màxim 2MB. S'escalarà a 700x335px + irreversible: Els nodes filtrats desapareixeran de manera irreversible, fins i tot si el filtre es retira més tard locale: El llenguatge de l’interfície d’usuari, els correus i les notificacions push locked: Requereix que aprovis manualment els seguidors note: one: 1 càracter restant other: %{count} caràcters restants + phrase: Es combinarà independentment del format en el text o l'avís de contingut d'un toot setting_default_language: La llengua dels teus toots pot ser detectada automàticament però no sempre acuradament setting_hide_network: Qui tu segueixes i els que et segueixen a tu no es mostraran en el teu perfil setting_noindex: Afecta el teu perfil públic i les pàgines d'estat @@ -39,6 +42,7 @@ ca: chosen_languages: Filtrar llengües confirm_new_password: Confirma la contrasenya nova confirm_password: Confirma la contrasenya + context: Filtre els contextos current_password: Contrasenya actual data: Informació display_name: Nom visible @@ -46,6 +50,7 @@ ca: expires_in: Expira després fields: Metadades del perfil header: Capçalera + irreversible: Cau en lloc d'ocultar locale: Llengua de la interfície locked: Fes aquest compte privat max_uses: Nombre màxim d'usos @@ -53,6 +58,7 @@ ca: note: Biografia otp_attempt: Codi de dos factors password: Contrasenya + phrase: Paraula clau o frase setting_auto_play_gif: Reproducció automàtica de GIFs animats setting_boost_modal: Mostra la finestra de confirmació abans d'un retoot setting_default_language: Llengua de les publicacions diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml new file mode 100644 index 000000000..aaa556fa1 --- /dev/null +++ b/config/locales/simple_form.da.yml @@ -0,0 +1,94 @@ +--- +da: + simple_form: + hints: + defaults: + autofollow: Folk der har oprettet sig gennem invitationen vil automatisk følge dig + avatar: PNG, GIF eller JPG. Højest 2MB. Vil blive skaleret ned til 400x400px + bot: Denne konto udfører hovedsageligt automatiserede handlinger og bliver muligvis ikke overvåget + context: En eller flere sammenhænge hvor filteret skal være gældende + digest: Sendes kun efter en lang periode med inaktivitet og kun hvis du har modtaget nogle personlige beskeder mens du er væk + display_name: + one: 1 tegn tilbage + other: %{count}tegn tilbage + fields: Du kan have op til 4 ting vist som en tabel på din profil + header: PNG, GIF eller JPG. Højest 2MB. Vil blive skaleret ned til 700x335px + irreversible: Filtrerede toots vil forsvinde fulstændigt, selv hvis filteret senere skulle blive fjernet + locale: Sproget på interfacet, emails og push beskeder + locked: Kræver, at du godkender følgere manuelt + note: + one: 1 tegn tilbage + other: %{count} tegn tilbage + phrase: Vil blive parret uanset om der er store eller små bogstaver i teksten eller om der er en advarsel om en toot + setting_default_language: Sproget for dine toots kan blive fundet automatisk, men det er ikke altid præcist + setting_hide_network: Hvem du følger og hvem der følger dig vil ikke blive vist på din profil + setting_noindex: Påvirker din offentlige profil og status sider + setting_theme: Påvirker hvordan Mastodon ser ud nåt du er logget ind via en hvilken som helst enhed. + imports: + data: CSV fil eksporteret fra en anden Mastodon instans + sessions: + otp: 'Indtast to-faktor koden der generes af appen på din fon eller brug en af din genoprettelses koder:' + user: + chosen_languages: Når markeret, vil kun toots i de valgte sprog blive vist på offentlige tidslinjer + labels: + account: + fields: + name: Etiket + value: Indhold + defaults: + autofollow: Inviter til at følge din konto + avatar: Profilbillede + bot: Dette er en bot konto + chosen_languages: Filtrer sprog + confirm_new_password: Bekræft dit nye kodeord + confirm_password: Bekræft kodeord + context: Filtrer sammenhænge + current_password: Nuværende kodeord + data: Data + display_name: Visningsnavn + email: E-mail adresse + expires_in: Udløber efter + fields: Profil metadata + header: Overskrift + irreversible: Ignorer istedet for at skjule + locale: Sprog på interface + locked: Lås konto + max_uses: Højeste antal benyttelser + new_password: Nyt kodeord + note: Biografi + otp_attempt: To-faktor kode + password: Kodeord + phrase: Nøgleord eller sætning + setting_auto_play_gif: Afspil automatisk animerede GIFs + setting_boost_modal: Vis bekræftelses dialog før du fremhæver + setting_default_language: Sprog for opslag + setting_default_privacy: Privatliv + setting_default_sensitive: Marker altid multimedia som værende følsomt + setting_delete_modal: Vis bekræftelses dialog før du sletter et toot + setting_display_sensitive_media: Vis altid multimedier markeret som værende følsomt + setting_hide_network: Skjul dit netværk + setting_noindex: Frameld dig søgemaskiners indeksering + setting_reduce_motion: Reducer animationers bevægelse + setting_system_font_ui: Brug systemets standard font + setting_theme: Tema for side + setting_unfollow_modal: Vis bekræftelses dialog før du stopper med at følge nogen + severity: Omfang + type: Importtype + username: Brugernavn + username_or_email: Brugernavn eller Email + interactions: + must_be_follower: Bloker notifikationer fra folk der ikke følger dig + must_be_following: Bloker notifikationer fra folk du ikke følger + must_be_following_dm: Bloker direkte beskeder fra folk du ikke følger + notification_emails: + digest: Send sammendrag via emails + favourite: Send email når nogen favoriserer din status + follow: Send e-mail når nogen følger dig + follow_request: Send email når nogen anmoder om at følge dig + mention: Send e-mail når nogen nævner dig + reblog: Send email når nogen fremhæver din status + 'no': Nej + required: + mark: "*" + text: påkrævet + 'yes': Ja diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml new file mode 100644 index 000000000..0954ed4b9 --- /dev/null +++ b/config/locales/simple_form.el.yml @@ -0,0 +1,94 @@ +--- +el: + simple_form: + hints: + defaults: + autofollow: Όσοι εγγραφούν μέσω της πρόσκλησης θα σε ακολουθούν αυτόματα + avatar: PNG, GIF ή JPG. Έως 2MB. Θα μειωθεί σε διάσταση 400x400px + bot: Ο λογαριασμός αυτός εκτελεί κυρίως αυτοματοποιημένες ενέργειες και ίσως να μην παρακολουθείται + context: Ένα ή περισσότερα πλαίσια στα οποία μπορεί να εφαρμόζεται αυτό το φίλτρο + digest: Αποστέλλεται μόνο μετά από μακρά περίοδο αδράνειας και μόνο αν έχεις λάβει προσωπικά μηνύματα κατά την απουσία σου + display_name: + one: απομένει 1 χαρακτήρας + other: απομένουν %{count} χαρακτήρες + fields: Μπορείς να έχεις έως 4 σημειώσεις σε μορφή πίνακα στο προφίλ σου + header: PNG, GIF ή JPG. Έως 2MB. Θα μειωθεί σε διάσταση 700x335px + irreversible: Τα φιλτραρισμένα τουτ θα εξαφανιστούν αμετάκλητα, ακόμα και αν το φίλτρο αργότερα αφαιρεθεί + locale: Η γλώσσα του περιβάλλοντος χρήσης, των email και των ειδοποιήσεων ώθησης + locked: Απαιτεί να εγκρίνεις χειροκίνητα τους ακόλουθούς σου + note: + one: απομένει 1 χαρακτήρας + other: απομένουν %{count} χαρακτήρες + phrase: Θα ταιριάζει ανεξαρτήτως πεζών/κεφαλαίων ή προειδοποίησης περιεχομένου του τουτ + setting_default_language: Η γλώσσα των τουτ σου μπορεί να ανιχνευτεί αυτόματα αλλά δεν είναι πάντα ακριβές + setting_hide_network: Το ποιους ακολουθείς και το ποιοι σε ακολουθούν δε θα φαίνεται στο προφίλ σου + setting_noindex: Επηρεάζει το δημόσιο προφίλ και τις δημοσιεύσεις σου + setting_theme: Επηρεάζει την εμφάνιση του Mastodon όταν συνδέεται από οποιαδήποτε συσκευή. + imports: + data: Αρχείο CSV που έχει εξαχθεί από διαφορετικό κόμβο Mastodon + sessions: + otp: 'Βάλε τον κωδικό δυο παραγόντων (2FA) από την εφαρμογή του τηλεφώνου σου ή χρησιμοποίησε κάποιον από τους κωδικούς ανάκτησης σου:' + user: + chosen_languages: Όταν ενεργοποιηθεί, στη δημόσια ροή θα εμφανίζονται τουτ μόνο από τις επιλεγμένες γλώσσες + labels: + account: + fields: + name: Ταμπέλα + value: Περιεχόμενο + defaults: + autofollow: Προσκάλεσε για να ακολουθήσουν το λογαριασμό σου + avatar: Αβατάρ + bot: Αυτός είναι ένας αυτοματοποιημένος λογαριασμός (bot) + chosen_languages: Φίλτραρε γλώσσες + confirm_new_password: Επιβεβαίωσε νέο συνθηματικό + confirm_password: Επιβεβαίωσε συνθηματικό + context: Πλαίσια φιλτραρίσματος + current_password: Τρέχον συνθηματικό + data: Δεδομένα + display_name: Όνομα εμφάνισης + email: Διεύθυνση email + expires_in: Λήξη μετά από + fields: Μετεδεδομένα προφίλ + header: Επικεφαλίδα + irreversible: Απόρριψη αντί για κρύψιμο + locale: Γλώσσα περιβάλλοντος + locked: Κλείδωμα λογαριασμού + max_uses: Μέγιστος αριθμός χρήσεων + new_password: Νέο συνθηματικό + note: Βιογραφικό + otp_attempt: Κωδικός δυο παραγόντων + password: Συνθηματικό + phrase: Λέξη ή φράση κλειδί + setting_auto_play_gif: Αυτόματη αναπαραγωγή των GIF + setting_boost_modal: Εμφάνιση ερώτησης επιβεβαίωσης πριν την προώθηση + setting_default_language: Γλώσσα δημοσιεύσεων + setting_default_privacy: Ιδιωτικότητα δημοσιεύσεων + setting_default_sensitive: Σημείωνε πάντα τα πολυμέσα ως ευαίσθητου περιεχομένου + setting_delete_modal: Εμφάνιση ερώτησης επιβεβαίωσης πριν διαγράψεις ένα τουτ + setting_display_sensitive_media: Εμφάνιση πάντα των πολυμέσων σημειωμένων ως ευαίσθητων + setting_hide_network: Κρύψε τις διασυνδέσεις σου + setting_noindex: Επέλεξε να μην συμμετέχεις στα αποτελέσματα μηχανών αναζήτησης + setting_reduce_motion: Μείωση κίνησης κινουμένων στοιχείων + setting_system_font_ui: Χρησιμοποίησε την προεπιλεγμένη γραμματοσειρά του συστήματος + setting_theme: Θέμα ιστότοπου + setting_unfollow_modal: Εμφάνιση ερώτησης επιβεβαίωσης πριν διακόψεις την παρακολούθηση κάποιου + severity: Αυστηρότητα + type: Τύπος εισαγωγής + username: Όνομα χρηστη + username_or_email: Όνομα ή διεύθυνση email χρήστη + interactions: + must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς + must_be_following: Μπλόκαρε τις ειδοποιήσεις που προέρχονται από άτομα που δεν τα ακολουθείς + must_be_following_dm: Μπλόκαρε τα προσωπικά μηνύματα από όσους δεν ακολουθείς + notification_emails: + digest: Στέλνε συνοπτικά email + favourite: Στελνε email όταν κάποιος σημειώνει ως αγαπημένη τη δημοσίευσή σου + follow: Στελνε email όταν κάποιος σε ακολουθεί + follow_request: Στέλνε email όταν κάποιος ζητάει να σε ακολουθήσει + mention: Στέλνε email όταν κάποιος σε αναφέρει + reblog: Στέλνε email όταν κάποιος προωθεί τη δημοσίευση σου + 'no': Όχι + required: + mark: "*" + text: απαιτείται + 'yes': Ναι diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 0d0a717b8..a46fcc42e 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -6,17 +6,20 @@ eo: autofollow: Homoj, kiuj registriĝos per la invito aŭtomate sekvos vin avatar: Formato PNG, GIF aŭ JPG. Ĝis 2MB. Estos malgrandigita al 400x400px bot: Tiu konto ĉefe faras aŭtomatajn agojn, kaj povas esti ne kontrolata + context: Unu ol pluraj kuntekstoj kie la filtrilo devus agi digest: Sendita nur post longa tempo de neaktiveco, kaj nur se vi ricevis personan mesaĝon en via foresto display_name: one: 1 signo restas other: %{count} signoj restas fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo header: Formato PNG, GIF aŭ JPG. Ĝis 2MB. Estos malgrandigita al 700x335px + irreversible: Elfiltritaj mesaĝoj malaperos por ĉiam, eĉ se la filtrilo estas poste forigita locale: La lingvo de la uzant-interfaco, retmesaĝoj kaj puŝ-sciigoj locked: Vi devos aprobi ĉiun peton de sekvado mane note: one: 1 signo restas other: %{count} signoj restas + phrase: Estos provita senzorge pri la uskleco de teksto aŭ averto pri enhavo de mesaĝo setting_default_language: La lingvo de viaj mesaĝoj povas esti aŭtomate detektitaj, sed tio ne ĉiam ĝustas setting_hide_network: Tiuj, kiujn vi sekvas, kaj tiuj, kiuj sekvas vin ne estos videblaj en via profilo setting_noindex: Influas vian publikan profilon kaj mesaĝajn paĝojn @@ -39,6 +42,7 @@ eo: chosen_languages: Filtri lingvojn confirm_new_password: Konfirmi novan pasvorton confirm_password: Konfirmi pasvorton + context: Filtri kuntekstojn current_password: Nuna pasvorto data: Datumoj display_name: Publika nomo @@ -46,6 +50,7 @@ eo: expires_in: Eksvalidiĝas post fields: Profilaj metadatumoj header: Fonbildo + irreversible: Forĵeti anstataŭ kaŝi locale: Interfaca lingvo locked: Ŝlosi konton max_uses: Maksimuma nombro de uzoj @@ -53,6 +58,7 @@ eo: note: Sinprezento otp_attempt: Kodo de dufaktora aŭtentigo password: Pasvorto + phrase: Vorto aŭ frazo setting_auto_play_gif: Aŭtomate ekigi GIF-ojn setting_boost_modal: Montri fenestron por konfirmi antaŭ ol diskonigi setting_default_language: Publikada lingvo diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index a2ef8d439..2a2cc6731 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -6,17 +6,20 @@ fa: autofollow: کسانی که از راه دعوت‌نامه عضو می‌شوند به طور خودکار پیگیر شما خواهند شد avatar: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۴۰۰×۴۰۰ پیکسل تبدیل خواهد شد bot: این حساب بیشتر به طور خودکار فعالیت می‌کند و نظارت پیوسته‌ای روی آن وجود ندارد + context: یک یا چند زمینه که فیلتر باید در آن‌ها اعمال شود digest: تنها وقتی فرستاده می‌شود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصی‌ای نوشته شده باشد display_name: one: 1 حرف باقی مانده other: %{count} حرف باقی مانده fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۳۳۵×۷۰۰ پیکسل تبدیل خواهد شد + irreversible: بوق‌های فیلترشده به طور برگشت‌ناپذیری ناپدید می‌شوند، حتی اگر فیلتر را بعداً بردارید locale: زبان محیط کاربری، ایمیل‌ها، و اعلان‌ها locked: باید پیگیران تازه را خودتان تأیید کنید note: one: 1 حرف باقی مانده other: %{count} حرف باقی مانده + phrase: مستقل از کوچکی و بزرگی حروف، با متن اصلی یا هشدار محتوای بوق‌ها مقایسه می‌شود setting_default_language: زبان نوشته‌های شما به طور خودکار تشخیص داده می‌شود، ولی این تشخصی همیشه دقیق نیست setting_hide_network: فهرست پیگیران شما و فهرست کسانی که شما پی می‌گیرید روی نمایهٔ شما دیده نخواهد شد setting_noindex: روی نمایهٔ عمومی و صفحهٔ نوشته‌های شما تأثیر می‌گذارد @@ -39,6 +42,7 @@ fa: chosen_languages: جدا کردن زبان‌ها confirm_new_password: تأیید رمز تازه confirm_password: تأیید رمز + context: زمینه‌های فیلترکردن current_password: رمز فعلی data: داده‌ها display_name: نمایش به نام @@ -46,6 +50,7 @@ fa: expires_in: تاریخ انقضا fields: اطلاعات تکمیلی نمایه header: تصویر زمینه + irreversible: به جای پنهان‌سازی، حذف کن locale: زبان محیط کاربری locked: خصوصی‌کردن حساب max_uses: بیشترین شمار استفاده @@ -53,6 +58,7 @@ fa: note: دربارهٔ شما otp_attempt: کد ورود دومرحله‌ای password: رمز + phrase: کلیدواژه یا عبارت setting_auto_play_gif: پخش خودکار تصویرهای متحرک setting_boost_modal: نمایش پیغام تأیید پیش از بازبوقیدن setting_default_language: زبان نوشته‌های شما diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 81e10409a..c1de721b4 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -6,17 +6,20 @@ fr: autofollow: Les personnes qui s'inscrivent grâce à l'invitation vous suivront automatiquement avatar: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à 400x400px bot: Ce compte exécute principalement des actions automatisées et pourrait ne pas être surveillé + context: Un ou plusieurs contextes où le filtre devrait s'appliquer digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence display_name: one: 1 caractère restant other: %{count} caractères restants fields: Vous pouvez avoir jusqu'à 4 éléments affichés en tant que tableau sur votre profil header: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à 700x335px + irreversible: Les pouets filtrés disparaîtront irrémédiablement, même si le filtre est supprimé plus tard locale: La langue de l'interface-utilisateur, des courriels, et des notifications locked: Vous devrez approuver chaque abonné⋅e et vos statuts ne s’afficheront qu’à vos abonné⋅es note: one: 1 caractère restant other: %{count} caractères restants + phrase: Sera trouvé sans que la case ou l'avertissement de contenu du pouet soit pris en compte setting_default_language: La langue de vos pouets peut être détectée automatiquement, mais ça n'est pas toujours pertinent setting_hide_network: Ceux que vous suivez et ceux qui vous suivent ne seront pas affichés sur votre profil setting_noindex: Affecte votre profil public ainsi que vos statuts @@ -39,6 +42,7 @@ fr: chosen_languages: Filtrer les langues confirm_new_password: Confirmation du nouveau mot de passe confirm_password: Confirmation du mot de passe + context: Contextes du filtre current_password: Mot de passe actuel data: Données display_name: Nom public @@ -46,6 +50,7 @@ fr: expires_in: Expire après fields: Métadonnées du profil header: Image d’en-tête + irreversible: Supprimer plutôt que de cacher locale: Langue de l'interface locked: Verrouiller le compte max_uses: Nombre maximum d'utilisations @@ -53,6 +58,7 @@ fr: note: Présentation otp_attempt: Code d’identification à deux facteurs password: Mot de passe + phrase: Mot de passe ou phrase setting_auto_play_gif: Lire automatiquement les GIFs animés setting_boost_modal: Afficher une fenêtre de confirmation avant de partager setting_default_language: Langue de publication diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 2bccb2d4f..6401671a7 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -6,17 +6,20 @@ gl: autofollow: As persoas que se conectaron a través de un convite seguirana automáticamente a vostede avatar: PNG, GIF ou JPG. Máximo 2MB. Será reducida a 400x400px bot: Esta conta realiza principalmente accións automatizadas e podería non estar monitorizada + context: Un ou varios contextos onde se debería aplicar o filtro digest: Enviar só tras un longo período de inactividade e só si recibeu algunha mensaxe personal na súa ausencia display_name: one: 1 caracter restante other: %{count} caracteres restantes fields: Pode ter ate 4 elementos no seu perfil mostrados como unha táboa header: PNG, GIF ou JPG. Máximo 2MB. Será reducida a 700x335px + irreversible: Os toots filtrados desaparecerán de xeito irreversible, incluso si despois se elimina o filtro locale: O idioma da interface de usuaria, correos e notificacións locked: Require que vostede acepte as seguidoras de xeito manual note: one: 1 caracter restante other: %{count} caracteres restantes + phrase: Concordará independentemente das maiúsculas ou avisos de contido no toot setting_default_language: Pódese detectar automáticamente o idioma dos seus toots, mais non sempre é preciso setting_hide_network: Non se mostrará no seu perfil quen a segue e quen a está a seguir setting_noindex: Afecta ao seu perfil público e páxinas de estado @@ -39,6 +42,7 @@ gl: chosen_languages: Filtrar idiomas confirm_new_password: Confirme o novo contrasinal confirm_password: Confirme o contrasinal + context: Contextos do filtro current_password: Contrasinal actual data: Datos display_name: Nome mostrado @@ -46,6 +50,7 @@ gl: expires_in: Caducidade despois de fields: Metadatos do perfil header: Cabeceira + irreversible: Soltar en lugar de agochar locale: Idioma da interface locked: Protexer conta max_uses: Número máximo de usos @@ -53,6 +58,7 @@ gl: note: Sobre vostede otp_attempt: Código de Doble-Factor password: Contrasinal + phrase: Palabra chave ou frase setting_auto_play_gif: Reprodución automática de GIFs animados setting_boost_modal: Pedir confirmación antes de promocionar setting_default_language: Idioma de publicación diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index ff3d2c002..6e4df665e 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -6,17 +6,20 @@ it: autofollow: Le persone che si iscrivono attraverso l'invito ti seguiranno automaticamente avatar: PNG, GIF o JPG. Al massimo 2MB. Verranno scalate a 400x400px bot: Questo account esegue principalmente operazioni automatiche e potrebbe non essere tenuto sotto controllo da una persona + context: Uno o più contesti nei quali il filtro dovrebbe essere applicato digest: Inviata solo dopo un lungo periodo di inattività e solo se hai ricevuto qualche messaggio personale in tua assenza display_name: one: 1 carattere rimanente other: %{count} caratteri rimanenti fields: Puoi avere fino a 4 voci visualizzate come una tabella sul tuo profilo header: PNG, GIF o JPG. Al massimo 2MB. Verranno scalate a 700x335px + irreversible: I toot filtrati scompariranno in modo irreversibile, anche se il filtro viene eliminato locale: La lingua dell'interfaccia utente, di email e notifiche push locked: Richiede che approvi i follower manualmente note: one: 1 carattere rimanente other: %{count} caratteri rimanenti + phrase: Il confronto sarà eseguito ignorando minuscole/maiuscole e i content warning setting_default_language: La lingua dei tuoi toot può essere individuata automaticamente, ma il risultato non è sempre accurato setting_hide_network: Chi segui e chi segue te non saranno mostrati sul tuo profilo setting_noindex: Ha effetto sul tuo profilo pubblico e sulle pagine degli status @@ -39,6 +42,7 @@ it: chosen_languages: Filtra lingue confirm_new_password: Conferma nuova password confirm_password: Conferma password + context: Contesti del filtro current_password: Password corrente data: Data display_name: Nome visualizzato @@ -46,6 +50,7 @@ it: expires_in: Scade dopo fields: Metadati del profilo header: Header + irreversible: Elimina invece di nascondere locale: Lingua dell'interfaccia locked: Blocca account max_uses: Numero massimo di utilizzi @@ -53,6 +58,7 @@ it: note: Bio otp_attempt: Codice due-fattori password: Password + phrase: Parola chiave o frase setting_auto_play_gif: Play automatico GIF animate setting_boost_modal: Mostra dialogo di conferma prima del boost setting_default_language: Lingua dei post diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index dcd9ff5b4..58bd97f7e 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -6,13 +6,16 @@ ja: autofollow: 招待から登録した人が自動的にあなたをフォローするようになります avatar: 2MBまでのPNG、GIF、JPGが利用可能です。400x400pxまで縮小されます bot: このアカウントは主に自動で動作し、人が見ていない可能性があります + context: フィルターを適用する対象 digest: 長期間使用していない場合と不在時に返信を受けた場合のみ送信されます display_name: あと%{count}文字入力できます。 fields: プロフィールに表として4つまでの項目を表示することができます header: 2MBまでのPNG、GIF、JPGが利用可能です。 700x335pxまで縮小されます + irreversible: フィルターが後で削除されても、除外されたトゥートは元に戻せなくなります locale: ユーザーインターフェース、メールやプッシュ通知の言語 locked: フォロワーを手動で承認する必要があります note: あと%{count}文字入力できます。 + phrase: トゥートの大文字小文字や閲覧注意に関係なく一致 setting_default_language: トゥートの言語は自動的に検出されますが、必ずしも正確とは限りません setting_hide_network: フォローとフォロワーの情報がプロフィールページで見られないようにします setting_noindex: 公開プロフィールおよび各投稿ページに影響します @@ -29,12 +32,13 @@ ja: name: ラベル value: 内容 defaults: - autofollow: あなたのアカウントに招待する + autofollow: 招待から参加後、あなたをフォロー avatar: アイコン bot: これは BOT アカウントです chosen_languages: 表示する言語 confirm_new_password: 新しいパスワード(確認用) confirm_password: パスワード(確認用) + context: フィルター対象 current_password: 現在のパスワード data: データ display_name: 表示名 @@ -42,6 +46,7 @@ ja: expires_in: 有効期限 fields: プロフィール補足情報 header: ヘッダー + irreversible: 隠すのではなく除外する locale: 言語 locked: 承認制アカウントにする max_uses: 使用できる回数 @@ -49,6 +54,7 @@ ja: note: プロフィール otp_attempt: 二段階認証コード password: パスワード + phrase: 単語または語句 setting_auto_play_gif: アニメーションGIFを自動再生する setting_boost_modal: ブーストする前に確認ダイアログを表示する setting_default_language: 投稿する言語 diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 7eb0da8b1..e0a6a7405 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -6,17 +6,20 @@ ko: autofollow: 이 초대를 통해 가입하는 사람은 당신을 자동으로 팔로우 하게 됩니다 avatar: PNG, GIF 혹은 JPG. 최대 2MB. 400x400px로 다운스케일 될 것임 bot: 사람들에게 계정이 사람이 아님을 알립니다 + context: 필터를 적용 할 한 개 이상의 컨텍스트 digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기 display_name: one: 1 글자 남음 other: %{count} 글자 남음 fields: 당신의 프로파일에 최대 4개까지 표 형식으로 나타낼 수 있습니다 header: PNG, GIF 혹은 JPG. 최대 2MB. 700x335px로 다운스케일 됨 + irreversible: 필터링 된 툿은 나중에 필터가 사라지더라도 돌아오지 않게 됩니다 locale: 유저 인터페이스, 이메일, 푸시 알림 언어 locked: 수동으로 팔로워를 승인하고, 기본 툿 프라이버시 설정을 팔로워 전용으로 변경 note: one: 1 글자 남음 other: %{count} 글자 남음 + phrase: 툿 내용이나 CW 내용 안에서 대소문자 구분 없이 매칭 됩니다 setting_default_language: 작성한 툿의 언어는 자동으로 인식할 수 있지만, 언제나 정확한 건 아닙니다 setting_hide_network: 나를 팔로우 하는 사람들과 내가 팔로우 하는 사람들이 내 프로필에 표시되지 않게 합니다 setting_noindex: 공개 프로필 및 각 툿페이지에 영향을 미칩니다 @@ -39,6 +42,7 @@ ko: chosen_languages: 언어 필터링 confirm_new_password: 새로운 비밀번호 다시 입력 confirm_password: 현재 비밀번호 다시 입력 + context: 필터 컨텍스트 current_password: 현재 비밀번호 입력 data: 데이터 display_name: 표시되는 이름 @@ -46,6 +50,7 @@ ko: expires_in: 만료시각 fields: 프로필 메타데이터 header: 헤더 + irreversible: 숨기는 대신 삭제 locale: 인터페이스 언어 locked: 계정 잠금 max_uses: 사용 횟수 제한 @@ -53,6 +58,7 @@ ko: note: 자기소개 otp_attempt: 2단계 인증 코드 password: 비밀번호 + phrase: 키워드 또는 문장 setting_auto_play_gif: 애니메이션 GIF를 자동 재생 setting_boost_modal: 부스트 전 확인 창을 표시 setting_default_language: 게시물 언어 diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index df3ffe793..5a3eb8c7c 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -6,17 +6,20 @@ oc: autofollow: Lo monde que se marcan gràcia a l’invitacion vos segràn automaticament avatar: PNG, GIF o JPG. Maximum 2 Mo. Serà retalhat en 400x400px bot: Avisar lo monde qu’aqueste compte es pas d’una persona + context: Un o mai de contèxtes ont lo filtre deuriá s’aplicar digest: Solament enviat aprèp un long moment d’inactivitat e solament s’avètz recebut de messatges personals pendent vòstra abséncia display_name: one: Demòra encara 1 caractèr other: Demòran encara %{count} caractèrs fields: Podètz far veire cap a 4 elements sus vòstre perfil header: PNG, GIF o JPG. Maximum 2 Mo. Serà retalhada en 700x335px + irreversible: Los tuts filtrats desapareisseràn irreversiblament, encara que lo filtre siá suprimit mai tard locale: La lenga de l’interfàcia d’utilizacion, los messatges e las notificacions locked: Demanda qu’acceptetz manualament lo mond que vos sègon e botarà la visibilitat de vòstras publicacions coma accessiblas a vòstres seguidors solament note: one: Demòra encara 1 caractèr other: Demòran encara %{count} caractèrs + phrase: Serà pres en compte que siá en majuscula o minuscula o dins un avertiment de contengut sensible setting_default_language: La lenga de vòstres tuts pòt èsser detectada automaticament, mas de còps es pas corrèctament determinada setting_hide_network: Vòstre perfil mostrarà pas los que vos sègon e lo monde que seguètz setting_noindex: Aquò es destinat a vòstre perfil public e vòstra pagina d’estatuts @@ -39,6 +42,7 @@ oc: chosen_languages: Filtrar las lengas confirm_new_password: Confirmacion del nòu senhal confirm_password: Confirmatz lo nòu senhal + context: Contèxte del filtre current_password: Senhal actual data: Data display_name: Escais @@ -46,6 +50,7 @@ oc: expires_in: Expira aprèp fields: Metadonada del perfil header: Bandièra + irreversible: Suprimir allòc de rescondre locale: Lenga de l’interfàcia locked: Far venir lo compte privat max_uses: Limit d’utilizacions @@ -53,6 +58,7 @@ oc: note: Bio otp_attempt: Còdi Two-factor password: Senhal + phrase: Senhal o frasa setting_auto_play_gif: Lectura automatica dels GIFS animats setting_boost_modal: Afichar una fenèstra de confirmacion abans de partejar un estatut setting_default_language: Lenga de publicacion diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index cec96739f..7f316a767 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -3,35 +3,46 @@ pt-BR: simple_form: hints: defaults: + autofollow: Pessoas que se cadastrarem através de seu convite te seguirão automaticamente avatar: PNG, GIF or JPG. Arquivos de até 2MB. Eles serão diminuídos para 400x400px bot: Essa conta executa principalmente ações automatizadas e pode não ser monitorada + context: Um ou mais contextos onde o filtro deve ser aplicado digest: Enviado após um longo período de inatividade com um resumo das menções que você recebeu em sua ausência display_name: one: 1 caracter restante other: %{count} caracteres restantes fields: Você pode ter até 4 itens exibidos em forma de tabela no seu perfil header: PNG, GIF or JPG. Arquivos de até 2MB. Eles serão diminuídos para 700x335px + irreversible: Os toots filtrados vão desaparecer irreversivelmente, mesmo se o filtro for removido depois + locale: O idioma das telas de usuário, e-mails e notificações push locked: Requer aprovação manual de seguidores note: one: 1 caracter restante other: %{count} caracteres restantes - setting_hide_network: Quem você segue e quem segue você não aparecerá no seu perfil + phrase: Vai coincidir, independente de maiúsculas ou minúsculas, no texto ou no aviso de conteúdo de um toot + setting_default_language: O idioma de seus toots pode ser detectado automaticamente, mas isso nem sempre é preciso + setting_hide_network: Quem você segue e quem segue você não serão exibidos no seu perfil setting_noindex: Afeta seu perfil público e as páginas de suas postagens setting_theme: Afeta a aparência do Mastodon quando em sua conta em qualquer aparelho. imports: data: Arquivo CSV exportado de outra instância do Mastodon sessions: otp: 'Insira o código de autenticação gerado pelo app no seu celular ou use um dos códigos de recuperação:' + user: + chosen_languages: Ao marcar, apenas toots dos idiomas selecionados serão exibidos nas timelines públicas labels: account: fields: name: Rótulo value: Conteúdo defaults: + autofollow: Convite para seguir a sua conta avatar: Avatar - bot: Essa é a conta de um robô + bot: Esta é uma conta-robô + chosen_languages: Filtros de idioma confirm_new_password: Confirmar nova senha confirm_password: Confirmar senha + context: Contextos de filtro current_password: Senha atual data: Dados display_name: Nome de exibição @@ -39,20 +50,23 @@ pt-BR: expires_in: Expira em fields: Metadados do perfil header: Cabeçalho - locale: Idioma + irreversible: Ignorar ao invés de esconder + locale: Idioma das telas locked: Trancar conta max_uses: Número máximo de usos new_password: Nova senha note: Bio otp_attempt: Código de autenticação em dois passos password: Senha + phrase: Palavra-chave ou frase setting_auto_play_gif: Reproduzir GIFs automaticamente setting_boost_modal: Mostrar diálogo de confirmação antes de compartilhar postagem + setting_default_language: Idioma das postagens setting_default_privacy: Privacidade das postagens setting_default_sensitive: Sempre marcar mídia como sensível setting_delete_modal: Mostrar diálogo de confirmação antes de deletar uma postagem - setting_display_sensitive_media: Sempre mostrar mídia marcada como sensível - setting_hide_network: Esconder suas conexões + setting_display_sensitive_media: Sempre exibir mídia marcada como sensível + setting_hide_network: Esconder as suas redes setting_noindex: Não quero ser indexado por mecanismos de busca setting_reduce_motion: Reduz movimento em animações setting_system_font_ui: Usar a fonte padrão de seu sistema diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 8ca33528b..74eacf08e 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -6,6 +6,7 @@ sk: autofollow: Ľudia ktorí sa zaregistrujú prostredníctvom pozvánky, ťa budú inheď následovať avatar: PNG, GIF alebo JPG. Maximálne 2MB. Bude zmenšený na 400x400px bot: Tento účet vykonáva hlavne automatizované akcie, a je pravdepodobne nespravovaný + context: Jedno, alebo viac kritérií, v ktorých má byť filtrovanie uplatnené digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak si obdŕžal/a nejaké osobné správy kým si bol/a preč display_name: few: Ostávajú ti %{count} znaky @@ -13,12 +14,14 @@ sk: other: Ostáva ti %{count} znakov fields: Môžeš mať 4 položky na svojom profile zobrazené vo forme tabuľky header: PNG, GIF alebo JPG. Maximálne 2MB. Bude zmenšený na 700x335px + irreversible: Vytriedené príspevky zmiznú nenávratne, aj keď triedenie neskôr zrušíš locale: Jazyk užívateľského rozhrania, emailových a nástenkových oboznámení locked: Vyžaduje manuálne schvalovať sledujúcich note: few: Ostávajú ti %{count} znaky one: Ostáva ti 1 znak other: Ostáva ti %{count} znakov + phrase: Zhoda sa nájde nezávisle od toho, či je text napísaný, veľkými, alebo malými písmenami, či už v tele, alebo v hlavičke setting_default_language: Jazyk tvojích príspevkov môže byť zistený automaticky, ale nieje to vždy presné setting_hide_network: Koho následuješ, a kto následuje teba nebude zobrazené na tvojom profile setting_noindex: Ovplyvňuje verejný profil a statusy @@ -40,7 +43,8 @@ sk: bot: Toto je automatizovaný bot účet chosen_languages: Filtruj jazyky confirm_new_password: Znovu tvoje nové heslo, pre potvrdenie - confirm_password: Potvrď heslo + confirm_password: Over heslo + context: Triedenie kontextov current_password: Súčasné heslo data: Dáta display_name: Meno @@ -48,6 +52,7 @@ sk: expires_in: Expirovať po fields: Metadáta profilu header: Obrázok v hlavičke + irreversible: Zahoď, namiesto skritia locale: Jazyk rozhrania locked: Zamknúť účet max_uses: Maximálne možno použiť @@ -55,6 +60,7 @@ sk: note: O tebe otp_attempt: Dvoj-faktorový overovací (2FA) kód password: Heslo + phrase: Kľúčové slovo, alebo fráza setting_auto_play_gif: Automaticky prehrávať animované GIFy setting_boost_modal: Zobrazovať potvrdzovacie okno pred re-toot setting_default_language: Píšeš v jazyku diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 346ab3931..e761f3d99 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -3,6 +3,7 @@ sv: simple_form: hints: defaults: + autofollow: Användarkonton som skapas genom din inbjudan kommer automatiskt följa dig avatar: Högst 2 MB. Kommer att skalas ner till 400x400px bot: Detta konto utför huvudsakligen automatiserade åtgärder och kanske inte övervakas digest: Skickas endast efter en lång period av inaktivitet och endast om du har fått några personliga meddelanden i din frånvaro @@ -11,10 +12,12 @@ sv: other: %{count} tecken kvar fields: Du kan ha upp till 4 objekt visade som en tabell på din profil header: NG, GIF eller JPG. Högst 2 MB. Kommer nedskalas till 700x335px + locale: Användargränssnittets språk, e-post och push aviseringar locked: Kräver att du manuellt godkänner följare note: one: 1 tecken kvar other: %{count} tecken kvar + setting_default_language: Språket av dina inlägg kan upptäckas automatiskt, men det är inte alltid rätt setting_hide_network: Vem du följer och vilka som följer dig kommer inte att visas på din profilsida setting_noindex: Påverkar din offentliga profil och statussidor setting_theme: Påverkar hur Mastodon ser ut oavsett från vilken enhet du är inloggad. @@ -22,14 +25,18 @@ sv: data: CSV-fil som exporteras från en annan Mastodon-instans sessions: otp: 'Ange tvåfaktorkoden genererad från din telefonapp eller använd någon av dina återställningskoder:' + user: + chosen_languages: När aktiverat så visas bara inlägg i dina valda språk i den offentliga tidslinjen labels: account: fields: name: Etikett value: Innehåll defaults: + autofollow: Bjud in till att följa ditt konto avatar: Avatar bot: Detta är ett botkonto + chosen_languages: Filtrera språk confirm_new_password: Bekräfta nytt lösenord confirm_password: Bekräfta lösenord current_password: Nuvarande lösenord @@ -48,6 +55,7 @@ sv: password: Lösenord setting_auto_play_gif: Auto-play animerade GIF-filer setting_boost_modal: Visa bekräftelsedialog innan du knuffar + setting_default_language: Språk setting_default_privacy: Postintegritet setting_default_sensitive: Markera alltid media som känsligt setting_delete_modal: Visa bekräftelsedialog innan du raderar en toot diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 77726ba08..53ec30de9 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -31,7 +31,7 @@ sk: source_code: Zdrojový kód status_count_after: príspevkov status_count_before: Ktorí napísali - user_count_after: používateľov + user_count_after: užívateľov user_count_before: Domov pre what_is_mastodon: Čo je Mastodon? accounts: @@ -270,8 +270,8 @@ sk: note: poznámka report: nahlás action_taken_by: Zákrok vykonal/a - are_you_sure: Ste si istý/á? - assign_to_self: Priraď sebe + are_you_sure: Si si istý/á? + assign_to_self: Priraď k sebe assigned: Priradený moderátor comment: none: Žiadne @@ -400,12 +400,12 @@ sk: delete_account: Vymazať účet delete_account_html: Pokiaľ chceš vymazať svoj účet, môžeš tak urobiť tu. Budeš požiadaný/á o potvrdenie tohto kroku. didnt_get_confirmation: Neobdŕžal/a si kroky pre potvrdenie? - forgot_password: Zabudli ste heslo? - invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítajte si nový. + forgot_password: Zabudnuté heslo? + invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítaj si nový. login: Prihlás sa logout: Odhlás sa migrate_account: Presunúť sa na iný účet - migrate_account_html: Pokiaľ si želáte presmerovať tento účet na nejaký iný, môžete tak urobiť tu. + migrate_account_html: Pokiaľ si želáš presmerovať tento účet na nejaký iný, môžeš to urobiť tu. or: alebo or_log_in_with: Alebo prihlásiť z providers: @@ -426,8 +426,8 @@ sk: post_follow: close: Alebo môžete iba zatvoriť toto okno. return: Ukáž užívateľov profil - web: Ísť na web - title: Následovať %{acct} + web: Prejdi do siete + title: Následuj %{acct} datetime: distance_in_words: about_x_hours: "%{count}hod" @@ -449,11 +449,11 @@ sk: proceed: Vymazať účet success_msg: Váš účet bol úspešne vymazaný warning_html: Iba vymazanie obsahu z tejto konkrétnej instancie je garantované. Obsah ktorý bol zdieľaný široko-ďaleko pravdepodobne zanechá nejaké stopy. Servery ktoré sú offline a tie ktoré ignorujú tvoje zmeny teda nezaktualizujú svoje databázy. - warning_title: Dostupnosť distribuovaného obsahu + warning_title: O dostupnosti distribuovaného obsahu errors: '403': Nemáte dostatočné povolenie na zobrazenie tejto stránky. '404': Stránka ktorú si hľadal/a sa tu nenachádza. - '410': Stránka ktorú tu hľadáš už viac neexistuje. + '410': Stránka ktorú si tu hľadal/a už viac neexistuje. '422': content: Bezpečtnostné overenie zlyhalo. Blokuješ cookies? title: Bezpečtnostné overenie zlyhalo @@ -473,8 +473,24 @@ sk: blocks: Blokujete csv: CSV follows: Následujete - mutes: Stíšili ste - storage: Úložisko médii + mutes: Stíšil/a si + storage: Úložisko médií + filters: + contexts: + home: Domáca os + notifications: Oboznámenia + public: Verejné osi + thread: Konverzácie + edit: + title: Uprav triedenie + errors: + invalid_context: Nebola poskytnutá žiadna, alebo ide o neplatnú súvislosť + invalid_irreversible: Nezvratné filtrovanie funguje iba so súvislostiami domovskej osi a oboznámení + index: + delete: Vymazať + title: Triedenia + new: + title: Pridaj nové triedenie followers: domain: Doména explanation_html: Pokiaľ chceš zaručiť súkromie svojích príspevkov, musíš mať na vedomí, kto ťa sleduje. Tvoje súkromné príspevky sú doručené na každý server z ktorého ťa niekto následuje. Takže možno by si ich chcel/a skontrolovať, a odstrániť tých následovníkov, čo sú na serveroch ktorím nedôveruješ, že ich moderátori, alebo úpravbuy kódu budú tiež rešpektovať tvoje súkromie. @@ -527,8 +543,8 @@ sk: table: expires_at: Vyprší uses: Používa - title: Pozvať ľudí - landing_strip_html: "%{name} je užívateľ na serveri %{link_to_root_path}. Ty ich môžeš následovať a môžeš s nimi interaktovať pokiaľ máš účet hocikde v rámci fediversa." + title: Pozvi ľudí + landing_strip_html: "%{name} je užívateľ na serveri %{link_to_root_path}. Ty ich môžeš následovať a môžeš s nimi interaktovať pokiaľ máš účet kdekoľvek v rámci fediversa." landing_strip_signup_html: Pokiaľ ešte nemáš, môžeš si tu vytvoriť účet. lists: errors: @@ -574,8 +590,8 @@ sk: mention: action: Odpovedať body: "%{name} ťa spomenul/a v:" - subject: Boli ste spomenutí užívateľom %{name} - title: Nové spomenutie + subject: Bol/a si spomenutý/á užívateľom %{name} + title: Novo spomenutý/á reblog: body: 'Tvoj príspevok bol pozdvihnutý užívateľom %{name}:' subject: "%{name} pozdvihli tvoj príspevok" @@ -622,6 +638,7 @@ sk: generic: Neznámy prehliadač ie: Internet Explorer otter: Prehliadač Otter + qq: QQ Prehliadač safari: Apple Safari weibo: Sina/Tencent Weibo current_session: Aktuálna sezóna @@ -634,6 +651,7 @@ sk: linux: GNU/Linux mac: MacOSX other: neznáma platforma + windows: Microsoft Windows revoke: Zamietni revoke_success: Sezóna úspešne zamietnutá title: Sezóna diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 23ea7ddd1..76b26c24f 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -424,7 +424,7 @@ sv: following: 'Succé! Du följer nu:' post_follow: close: Eller så kan du stänga detta fönster. - return: Återgå till användarens profil + return: Visa användarens profil web: Gå till webb title: Följ %{acct} datetime: @@ -514,6 +514,7 @@ sv: '86400': 1 dag expires_in_prompt: Aldrig generate: Skapa + invited_by: 'Du blev inbjuden av:' max_uses: one: 1 användning other: "%{count} användningar" @@ -550,7 +551,7 @@ sv: subject: one: "1 nytt meddelande sedan ditt senaste besök \U0001F418" other: "%{count} nya meddelanden sedan ditt senaste besök \U0001F418" - title: I din frånvaro… + title: I din frånvaro... favourite: body: 'Din status favoriserades av %{name}:' subject: "%{name} favoriserade din status" @@ -583,7 +584,7 @@ sv: quadrillion: Q thousand: K trillion: T - unit: '' + unit: " " pagination: newer: Nyare next: Nästa @@ -674,6 +675,7 @@ sv: disallowed_hashtags: one: 'innehöll en otillåten hashtag: %{tags}' other: 'innehöll de otillåtna hashtagarna: %{tags}' + language_detection: Lista ut språk automatiskt open_in_web: Öppna på webben over_character_limit: teckengräns på %{max} har överskridits pin_errors: @@ -696,10 +698,92 @@ sv: reblogged: boostad sensitive_content: Känsligt innehåll terms: + body_html: | +

    Integritetspolicy

    +

    Vilken information samlar vi in?

    + +
      +
    • Grundläggande kontoinformation: Det användarnamn du väljer, visningsnamn, biografi, avatar/profilbild och bakgrundsbild kommer alltid vara tillgängliga för alla som kan nå webbsidan.
    • +
    • Inlägg, vem du följer och annan tillgänglig information: Dina följare och de konton du följer är alltid tillgängliga. När du skapar ett nytt inlägg sparas datum och tid för meddelandet, samt vilket program du använde för att skapa inlägget. Detta gäller även bilder och media som inlägg kan innehålla.Både "Publika" och "Olistade" inlägg kan vara tillgängliga för alla som har åtkomst till webbsidan. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
    • +
    • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
    • +
    • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
    • +
    + +
    + +

    What do we use your information for?

    + +

    Any of the information we collect from you may be used in the following ways:

    + +
      +
    • To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
    • +
    • To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.
    • +
    • The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.
    • +
    + +
    + +

    How do we protect your information?

    + +

    We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL, and your password is hashed using a strong one-way algorithm. You may enable two-factor authentication to further secure access to your account.

    + +
    + +

    What is our data retention policy?

    + +

    We will make a good faith effort to:

    + +
      +
    • Retain server logs containing the IP address of all requests to this server, in so far as such logs are kept, no more than 90 days.
    • +
    • Retain the IP addresses associated with registered users no more than 12 months.
    • +
    + +

    You can request and download an archive of your content, including your posts, media attachments, profile picture, and header image.

    + +

    You may irreversibly delete your account at any time.

    + +
    + +

    Do we use cookies?

    + +

    Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.

    + +

    We use cookies to understand and save your preferences for future visits.

    + +
    + +

    Do we disclose any information to outside parties?

    + +

    We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety.

    + +

    Your public content may be downloaded by other servers in the network. Your public and followers-only posts are delivered to the servers where your followers reside, and direct messages are delivered to the servers of the recipients, in so far as those followers or recipients reside on a different server than this.

    + +

    When you authorize an application to use your account, depending on the scope of permissions you approve, it may access your public profile information, your following list, your followers, your lists, all your posts, and your favourites. Applications can never access your e-mail address or password.

    + +
    + +

    Site usage by children

    + +

    If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

    + +

    If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

    + +

    Law requirements can be different if this server is in another jurisdiction.

    + +
    + +

    Changes to our Privacy Policy

    + +

    If we decide to change our privacy policy, we will post those changes on this page.

    + +

    This document is CC-BY-SA. It was last updated March 7, 2018.

    + +

    Originally adapted from the Discourse privacy policy.

    title: "%{instance} Användarvillkor och Sekretesspolicy" themes: contrast: Hög kontrast default: Mastodon + mastodon-light: Mastodon (ljust) time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 503a70a15..a5e997536 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -610,14 +610,16 @@ zh-HK: browsers: alipay: 支付寶 blackberry: Blackberry - chrome: Chrome - edge: Microsoft Edge - firefox: Firefox + chrome: Chrome 瀏覽器 + edge: Microsoft Edge 瀏覽器 + electron: Electron 瀏覽器 + firefox: Firefox 瀏覽器 generic: 未知的瀏覽器 - ie: Internet Explorer + ie: Internet Explorer 瀏覽器 micro_messenger: 微信 nokia: Nokia S40 Ovi 瀏覽器 opera: Opera + otter: Otter 瀏覽器 phantom_js: PhantomJS qq: QQ瀏覽器 safari: Safari -- cgit From 1f6ed4f86ab2aa98bb271b40bf381370fab4fdf2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 5 Jul 2018 18:31:35 +0200 Subject: Add more granular OAuth scopes (#7929) * Add more granular OAuth scopes * Add human-readable descriptions of the new scopes * Ensure new scopes look good on the app UI * Add tests * Group scopes in screen and color-code dangerous ones * Fix wrong extra scope --- app/controllers/api/base_controller.rb | 4 ++ .../api/v1/accounts/credentials_controller.rb | 4 +- .../v1/accounts/follower_accounts_controller.rb | 2 +- .../v1/accounts/following_accounts_controller.rb | 2 +- .../api/v1/accounts/lists_controller.rb | 2 +- .../api/v1/accounts/relationships_controller.rb | 2 +- .../api/v1/accounts/search_controller.rb | 2 +- .../api/v1/accounts/statuses_controller.rb | 2 +- app/controllers/api/v1/accounts_controller.rb | 7 +++- app/controllers/api/v1/blocks_controller.rb | 2 +- app/controllers/api/v1/domain_blocks_controller.rb | 3 +- app/controllers/api/v1/favourites_controller.rb | 2 +- app/controllers/api/v1/filters_controller.rb | 4 +- .../api/v1/follow_requests_controller.rb | 3 +- app/controllers/api/v1/follows_controller.rb | 2 +- .../api/v1/lists/accounts_controller.rb | 4 +- app/controllers/api/v1/lists_controller.rb | 4 +- app/controllers/api/v1/media_controller.rb | 2 +- app/controllers/api/v1/mutes_controller.rb | 2 +- app/controllers/api/v1/notifications_controller.rb | 3 +- app/controllers/api/v1/reports_controller.rb | 4 +- app/controllers/api/v1/search_controller.rb | 2 +- .../statuses/favourited_by_accounts_controller.rb | 7 +--- .../api/v1/statuses/favourites_controller.rb | 2 +- .../api/v1/statuses/mutes_controller.rb | 2 +- app/controllers/api/v1/statuses/pins_controller.rb | 2 +- .../statuses/reblogged_by_accounts_controller.rb | 7 +--- .../api/v1/statuses/reblogs_controller.rb | 2 +- app/controllers/api/v1/statuses_controller.rb | 9 +---- .../api/v1/timelines/direct_controller.rb | 2 +- .../api/v1/timelines/home_controller.rb | 2 +- .../api/v1/timelines/list_controller.rb | 2 +- app/helpers/application_helper.rb | 10 +++++ app/javascript/styles/mastodon/forms.scss | 4 ++ app/views/settings/applications/_fields.html.haml | 17 +++----- config/initializers/doorkeeper.rb | 27 ++++++++++++- config/locales/doorkeeper.en.yml | 30 +++++++++++++-- config/locales/simple_form.en.yml | 1 + .../api/v1/accounts/credentials_controller_spec.rb | 6 ++- .../accounts/follower_accounts_controller_spec.rb | 2 +- .../accounts/following_accounts_controller_spec.rb | 2 +- .../api/v1/accounts/lists_controller_spec.rb | 2 +- .../v1/accounts/relationships_controller_spec.rb | 2 +- .../api/v1/accounts/search_controller_spec.rb | 2 +- .../api/v1/accounts/statuses_controller_spec.rb | 2 +- .../controllers/api/v1/accounts_controller_spec.rb | 45 ++++++++++++++++++++-- spec/controllers/api/v1/blocks_controller_spec.rb | 14 ++++++- .../api/v1/domain_blocks_controller_spec.rb | 22 ++++++++++- .../api/v1/favourites_controller_spec.rb | 2 +- spec/controllers/api/v1/filter_controller_spec.rb | 8 +++- .../api/v1/follow_requests_controller_spec.rb | 8 +++- spec/controllers/api/v1/follows_controller_spec.rb | 2 +- .../api/v1/lists/accounts_controller_spec.rb | 7 +++- spec/controllers/api/v1/lists_controller_spec.rb | 12 +++++- spec/controllers/api/v1/media_controller_spec.rb | 2 +- spec/controllers/api/v1/mutes_controller_spec.rb | 2 +- .../api/v1/notifications_controller_spec.rb | 10 ++++- spec/controllers/api/v1/reports_controller_spec.rb | 5 ++- spec/controllers/api/v1/search_controller_spec.rb | 2 +- .../favourited_by_accounts_controller_spec.rb | 2 +- .../api/v1/statuses/favourites_controller_spec.rb | 2 +- .../api/v1/statuses/mutes_controller_spec.rb | 2 +- .../api/v1/statuses/pins_controller_spec.rb | 2 +- .../reblogged_by_accounts_controller_spec.rb | 2 +- .../api/v1/statuses/reblogs_controller_spec.rb | 2 +- .../controllers/api/v1/statuses_controller_spec.rb | 7 +++- .../api/v1/timelines/home_controller_spec.rb | 2 +- .../api/v1/timelines/list_controller_spec.rb | 2 +- spec/controllers/api/v2/search_controller_spec.rb | 22 +++++++++++ 69 files changed, 292 insertions(+), 102 deletions(-) create mode 100644 spec/controllers/api/v2/search_controller_spec.rb (limited to 'config') diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index b5c084e14..770a69921 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -78,4 +78,8 @@ class Api::BaseController < ApplicationController def render_empty render json: {}, status: 200 end + + def authorize_if_got_token!(*scopes) + doorkeeper_authorize!(*scopes) if doorkeeper_token + end end diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb index 2d0737ee4..dcd41b35c 100644 --- a/app/controllers/api/v1/accounts/credentials_controller.rb +++ b/app/controllers/api/v1/accounts/credentials_controller.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class Api::V1::Accounts::CredentialsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read }, except: [:update] - before_action -> { doorkeeper_authorize! :write }, only: [:update] + before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, except: [:update] + before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:update] before_action :require_user! def show diff --git a/app/controllers/api/v1/accounts/follower_accounts_controller.rb b/app/controllers/api/v1/accounts/follower_accounts_controller.rb index 4578cf6ca..daa35769e 100644 --- a/app/controllers/api/v1/accounts/follower_accounts_controller.rb +++ b/app/controllers/api/v1/accounts/follower_accounts_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Accounts::FollowerAccountsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:accounts' } before_action :set_account after_action :insert_pagination_headers diff --git a/app/controllers/api/v1/accounts/following_accounts_controller.rb b/app/controllers/api/v1/accounts/following_accounts_controller.rb index ce2bbda85..6be97b87e 100644 --- a/app/controllers/api/v1/accounts/following_accounts_controller.rb +++ b/app/controllers/api/v1/accounts/following_accounts_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Accounts::FollowingAccountsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:accounts' } before_action :set_account after_action :insert_pagination_headers diff --git a/app/controllers/api/v1/accounts/lists_controller.rb b/app/controllers/api/v1/accounts/lists_controller.rb index a7ba89ce2..72392453c 100644 --- a/app/controllers/api/v1/accounts/lists_controller.rb +++ b/app/controllers/api/v1/accounts/lists_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Accounts::ListsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:lists' } before_action :require_user! before_action :set_account diff --git a/app/controllers/api/v1/accounts/relationships_controller.rb b/app/controllers/api/v1/accounts/relationships_controller.rb index 70236d1a8..ab8a0461f 100644 --- a/app/controllers/api/v1/accounts/relationships_controller.rb +++ b/app/controllers/api/v1/accounts/relationships_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Accounts::RelationshipsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:follows' } before_action :require_user! respond_to :json diff --git a/app/controllers/api/v1/accounts/search_controller.rb b/app/controllers/api/v1/accounts/search_controller.rb index 7649da433..91c9f1547 100644 --- a/app/controllers/api/v1/accounts/search_controller.rb +++ b/app/controllers/api/v1/accounts/search_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Accounts::SearchController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:accounts' } before_action :require_user! respond_to :json diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index c40155cb5..06fa6c762 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Accounts::StatusesController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:statuses' } before_action :set_account after_action :insert_pagination_headers diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index b7133ca8e..1d5372a8c 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -1,8 +1,11 @@ # frozen_string_literal: true class Api::V1::AccountsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read }, except: [:follow, :unfollow, :block, :unblock, :mute, :unmute] - before_action -> { doorkeeper_authorize! :follow }, only: [:follow, :unfollow, :block, :unblock, :mute, :unmute] + before_action -> { authorize_if_got_token! :read, :'read:accounts' }, except: [:follow, :unfollow, :block, :unblock, :mute, :unmute] + before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, only: [:follow, :unfollow] + before_action -> { doorkeeper_authorize! :follow, :'write:mutes' }, only: [:mute, :unmute] + before_action -> { doorkeeper_authorize! :follow, :'write:blocks' }, only: [:block, :unblock] + before_action :require_user!, except: [:show] before_action :set_account before_action :check_account_suspension, only: [:show] diff --git a/app/controllers/api/v1/blocks_controller.rb b/app/controllers/api/v1/blocks_controller.rb index a39701340..99c53d59a 100644 --- a/app/controllers/api/v1/blocks_controller.rb +++ b/app/controllers/api/v1/blocks_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::BlocksController < Api::BaseController - before_action -> { doorkeeper_authorize! :follow } + before_action -> { doorkeeper_authorize! :follow, :'read:blocks' } before_action :require_user! after_action :insert_pagination_headers diff --git a/app/controllers/api/v1/domain_blocks_controller.rb b/app/controllers/api/v1/domain_blocks_controller.rb index e55d622c3..af9e7a20f 100644 --- a/app/controllers/api/v1/domain_blocks_controller.rb +++ b/app/controllers/api/v1/domain_blocks_controller.rb @@ -3,7 +3,8 @@ class Api::V1::DomainBlocksController < Api::BaseController BLOCK_LIMIT = 100 - before_action -> { doorkeeper_authorize! :follow } + before_action -> { doorkeeper_authorize! :follow, :'read:blocks' }, only: :show + before_action -> { doorkeeper_authorize! :follow, :'write:blocks' }, except: :show before_action :require_user! after_action :insert_pagination_headers, only: :show diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb index b4265ed34..ab5204355 100644 --- a/app/controllers/api/v1/favourites_controller.rb +++ b/app/controllers/api/v1/favourites_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::FavouritesController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:favourites' } before_action :require_user! after_action :insert_pagination_headers diff --git a/app/controllers/api/v1/filters_controller.rb b/app/controllers/api/v1/filters_controller.rb index c89722b85..02efd323b 100644 --- a/app/controllers/api/v1/filters_controller.rb +++ b/app/controllers/api/v1/filters_controller.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class Api::V1::FiltersController < Api::BaseController - before_action -> { doorkeeper_authorize! :read }, only: [:index, :show] - before_action -> { doorkeeper_authorize! :write }, except: [:index, :show] + before_action -> { doorkeeper_authorize! :read, :'read:filters' }, only: [:index, :show] + before_action -> { doorkeeper_authorize! :write, :'write:filters' }, except: [:index, :show] before_action :require_user! before_action :set_filters, only: :index before_action :set_filter, only: [:show, :update, :destroy] diff --git a/app/controllers/api/v1/follow_requests_controller.rb b/app/controllers/api/v1/follow_requests_controller.rb index d5c7c565a..313fe2f81 100644 --- a/app/controllers/api/v1/follow_requests_controller.rb +++ b/app/controllers/api/v1/follow_requests_controller.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true class Api::V1::FollowRequestsController < Api::BaseController - before_action -> { doorkeeper_authorize! :follow } + before_action -> { doorkeeper_authorize! :follow, :'read:follows' }, only: :index + before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, except: :index before_action :require_user! after_action :insert_pagination_headers, only: :index diff --git a/app/controllers/api/v1/follows_controller.rb b/app/controllers/api/v1/follows_controller.rb index 5a2b2f32f..5420c0533 100644 --- a/app/controllers/api/v1/follows_controller.rb +++ b/app/controllers/api/v1/follows_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::FollowsController < Api::BaseController - before_action -> { doorkeeper_authorize! :follow } + before_action -> { doorkeeper_authorize! :follow, :'write:follows' } before_action :require_user! respond_to :json diff --git a/app/controllers/api/v1/lists/accounts_controller.rb b/app/controllers/api/v1/lists/accounts_controller.rb index f2bded851..19de56732 100644 --- a/app/controllers/api/v1/lists/accounts_controller.rb +++ b/app/controllers/api/v1/lists/accounts_controller.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class Api::V1::Lists::AccountsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read }, only: [:show] - before_action -> { doorkeeper_authorize! :write }, except: [:show] + before_action -> { doorkeeper_authorize! :read, :'read:lists' }, only: [:show] + before_action -> { doorkeeper_authorize! :write, :'write:lists' }, except: [:show] before_action :require_user! before_action :set_list diff --git a/app/controllers/api/v1/lists_controller.rb b/app/controllers/api/v1/lists_controller.rb index 180a91d81..b42b8b971 100644 --- a/app/controllers/api/v1/lists_controller.rb +++ b/app/controllers/api/v1/lists_controller.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class Api::V1::ListsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read }, only: [:index, :show] - before_action -> { doorkeeper_authorize! :write }, except: [:index, :show] + before_action -> { doorkeeper_authorize! :read, :'read:lists' }, only: [:index, :show] + before_action -> { doorkeeper_authorize! :write, :'write:lists' }, except: [:index, :show] before_action :require_user! before_action :set_list, except: [:index, :create] diff --git a/app/controllers/api/v1/media_controller.rb b/app/controllers/api/v1/media_controller.rb index d4e6337e7..aaa93b615 100644 --- a/app/controllers/api/v1/media_controller.rb +++ b/app/controllers/api/v1/media_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::MediaController < Api::BaseController - before_action -> { doorkeeper_authorize! :write } + before_action -> { doorkeeper_authorize! :write, :'write:media' } before_action :require_user! include ObfuscateFilename diff --git a/app/controllers/api/v1/mutes_controller.rb b/app/controllers/api/v1/mutes_controller.rb index c457408ba..faa7d16cd 100644 --- a/app/controllers/api/v1/mutes_controller.rb +++ b/app/controllers/api/v1/mutes_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::MutesController < Api::BaseController - before_action -> { doorkeeper_authorize! :follow } + before_action -> { doorkeeper_authorize! :follow, :'read:mutes' } before_action :require_user! after_action :insert_pagination_headers diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index ebbe0b292..593c8f9a9 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true class Api::V1::NotificationsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, except: [:clear, :dismiss] + before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: [:clear, :dismiss] before_action :require_user! after_action :insert_pagination_headers, only: :index diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/reports_controller.rb index f5095e073..a954101cb 100644 --- a/app/controllers/api/v1/reports_controller.rb +++ b/app/controllers/api/v1/reports_controller.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class Api::V1::ReportsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read }, except: [:create] - before_action -> { doorkeeper_authorize! :write }, only: [:create] + before_action -> { doorkeeper_authorize! :read, :'read:reports' }, except: [:create] + before_action -> { doorkeeper_authorize! :write, :'write:reports' }, only: [:create] before_action :require_user! respond_to :json diff --git a/app/controllers/api/v1/search_controller.rb b/app/controllers/api/v1/search_controller.rb index 05754d0f2..dc1a37599 100644 --- a/app/controllers/api/v1/search_controller.rb +++ b/app/controllers/api/v1/search_controller.rb @@ -5,7 +5,7 @@ class Api::V1::SearchController < Api::BaseController RESULTS_LIMIT = 5 - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:search' } before_action :require_user! respond_to :json diff --git a/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb b/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb index 3fe304153..8f4070bc7 100644 --- a/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb +++ b/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb @@ -3,7 +3,7 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController include Authorization - before_action :authorize_if_got_token + before_action -> { authorize_if_got_token! :read, :'read:accounts' } before_action :set_status after_action :insert_pagination_headers @@ -71,11 +71,6 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController raise ActiveRecord::RecordNotFound end - def authorize_if_got_token - request_token = Doorkeeper::OAuth::Token.from_request(request, *Doorkeeper.configuration.access_token_methods) - doorkeeper_authorize! :read if request_token - end - def pagination_params(core_params) params.slice(:limit).permit(:limit).merge(core_params) end diff --git a/app/controllers/api/v1/statuses/favourites_controller.rb b/app/controllers/api/v1/statuses/favourites_controller.rb index 35f8a48cd..cceee9060 100644 --- a/app/controllers/api/v1/statuses/favourites_controller.rb +++ b/app/controllers/api/v1/statuses/favourites_controller.rb @@ -3,7 +3,7 @@ class Api::V1::Statuses::FavouritesController < Api::BaseController include Authorization - before_action -> { doorkeeper_authorize! :write } + before_action -> { doorkeeper_authorize! :write, :'write:favourites' } before_action :require_user! respond_to :json diff --git a/app/controllers/api/v1/statuses/mutes_controller.rb b/app/controllers/api/v1/statuses/mutes_controller.rb index a4bf0acdd..b02469b4f 100644 --- a/app/controllers/api/v1/statuses/mutes_controller.rb +++ b/app/controllers/api/v1/statuses/mutes_controller.rb @@ -3,7 +3,7 @@ class Api::V1::Statuses::MutesController < Api::BaseController include Authorization - before_action -> { doorkeeper_authorize! :write } + before_action -> { doorkeeper_authorize! :write, :'write:mutes' } before_action :require_user! before_action :set_status before_action :set_conversation diff --git a/app/controllers/api/v1/statuses/pins_controller.rb b/app/controllers/api/v1/statuses/pins_controller.rb index 54f8be667..4118a8ce4 100644 --- a/app/controllers/api/v1/statuses/pins_controller.rb +++ b/app/controllers/api/v1/statuses/pins_controller.rb @@ -3,7 +3,7 @@ class Api::V1::Statuses::PinsController < Api::BaseController include Authorization - before_action -> { doorkeeper_authorize! :write } + before_action -> { doorkeeper_authorize! :write, :'write:accounts' } before_action :require_user! before_action :set_status diff --git a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb index b065db2c7..93b83ce48 100644 --- a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb +++ b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb @@ -3,7 +3,7 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController include Authorization - before_action :authorize_if_got_token + before_action -> { authorize_if_got_token! :read, :'read:accounts' } before_action :set_status after_action :insert_pagination_headers @@ -68,11 +68,6 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController raise ActiveRecord::RecordNotFound end - def authorize_if_got_token - request_token = Doorkeeper::OAuth::Token.from_request(request, *Doorkeeper.configuration.access_token_methods) - doorkeeper_authorize! :read if request_token - end - def pagination_params(core_params) params.slice(:limit).permit(:limit).merge(core_params) end diff --git a/app/controllers/api/v1/statuses/reblogs_controller.rb b/app/controllers/api/v1/statuses/reblogs_controller.rb index 634af474f..04847a6b7 100644 --- a/app/controllers/api/v1/statuses/reblogs_controller.rb +++ b/app/controllers/api/v1/statuses/reblogs_controller.rb @@ -3,7 +3,7 @@ class Api::V1::Statuses::ReblogsController < Api::BaseController include Authorization - before_action -> { doorkeeper_authorize! :write } + before_action -> { doorkeeper_authorize! :write, :'write:statuses' } before_action :require_user! respond_to :json diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 289d91045..c6925d462 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -3,8 +3,8 @@ class Api::V1::StatusesController < Api::BaseController include Authorization - before_action :authorize_if_got_token, except: [:create, :destroy] - before_action -> { doorkeeper_authorize! :write }, only: [:create, :destroy] + before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :destroy] + before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :destroy] before_action :require_user!, except: [:show, :context, :card] before_action :set_status, only: [:show, :context, :card] @@ -84,9 +84,4 @@ class Api::V1::StatusesController < Api::BaseController def pagination_params(core_params) params.slice(:limit).permit(:limit).merge(core_params) end - - def authorize_if_got_token - request_token = Doorkeeper::OAuth::Token.from_request(request, *Doorkeeper.configuration.access_token_methods) - doorkeeper_authorize! :read if request_token - end end diff --git a/app/controllers/api/v1/timelines/direct_controller.rb b/app/controllers/api/v1/timelines/direct_controller.rb index ef64078be..d8a76d153 100644 --- a/app/controllers/api/v1/timelines/direct_controller.rb +++ b/app/controllers/api/v1/timelines/direct_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Timelines::DirectController < Api::BaseController - before_action -> { doorkeeper_authorize! :read }, only: [:show] + before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: [:show] before_action :require_user!, only: [:show] after_action :insert_pagination_headers, unless: -> { @statuses.empty? } diff --git a/app/controllers/api/v1/timelines/home_controller.rb b/app/controllers/api/v1/timelines/home_controller.rb index cde4e8420..4412aaaa3 100644 --- a/app/controllers/api/v1/timelines/home_controller.rb +++ b/app/controllers/api/v1/timelines/home_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Timelines::HomeController < Api::BaseController - before_action -> { doorkeeper_authorize! :read }, only: [:show] + before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: [:show] before_action :require_user!, only: [:show] after_action :insert_pagination_headers, unless: -> { @statuses.empty? } diff --git a/app/controllers/api/v1/timelines/list_controller.rb b/app/controllers/api/v1/timelines/list_controller.rb index 06d596c08..cfc5f3b5e 100644 --- a/app/controllers/api/v1/timelines/list_controller.rb +++ b/app/controllers/api/v1/timelines/list_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::Timelines::ListController < Api::BaseController - before_action -> { doorkeeper_authorize! :read } + before_action -> { doorkeeper_authorize! :read, :'read:lists' } before_action :require_user! before_action :set_list before_action :set_statuses diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 95863ab1f..327901e4e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,6 +1,12 @@ # frozen_string_literal: true module ApplicationHelper + DANGEROUS_SCOPES = %w( + read + write + follow + ).freeze + def active_nav_class(path) current_page?(path) ? 'active' : '' end @@ -43,6 +49,10 @@ module ApplicationHelper Rails.env.production? ? site_title : "#{site_title} (Dev)" end + def class_for_scope(scope) + 'scope-danger' if DANGEROUS_SCOPES.include?(scope.to_s) + end + def can?(action, record) return false if record.nil? policy(record).public_send("#{action}?") diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index e4fd6c1f1..458eb86e9 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -612,3 +612,7 @@ code { display: block; } } + +.scope-danger { + color: $warning-red; +} diff --git a/app/views/settings/applications/_fields.html.haml b/app/views/settings/applications/_fields.html.haml index b21f3cca6..db90df349 100644 --- a/app/views/settings/applications/_fields.html.haml +++ b/app/views/settings/applications/_fields.html.haml @@ -8,14 +8,9 @@ %p.hint= t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: Doorkeeper.configuration.native_redirect_uri) .field-group - = f.input :scopes, - label: t('activerecord.attributes.doorkeeper/application.scopes'), - collection: Doorkeeper.configuration.scopes, - wrapper: :with_label, - include_blank: false, - label_method: lambda { |scope| safe_join([scope, content_tag(:span, t("doorkeeper.scopes.#{scope}"), class: 'hint')]) }, - selected: f.object.scopes.all, - required: false, - as: :check_boxes, - collection_wrapper_tag: 'ul', - item_wrapper_tag: 'li' + .input.with_block_label + %label= t('activerecord.attributes.doorkeeper/application.scopes') + %span.hint= t('simple_form.hints.defaults.scopes') + + - Doorkeeper.configuration.scopes.group_by { |s| s.split(':').first }.each do |k, v| + = f.input :scopes, label: false, hint: false, collection: v.sort, wrapper: :with_block_label, include_blank: false, label_method: lambda { |scope| safe_join([content_tag(:samp, scope, class: class_for_scope(scope)), content_tag(:span, t("doorkeeper.scopes.#{scope}"), class: 'hint')]) }, selected: f.object.scopes.all, required: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 469553803..fe2490b32 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -55,7 +55,32 @@ Doorkeeper.configure do # For more information go to # https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes default_scopes :read - optional_scopes :write, :follow, :push + optional_scopes :write, + :'write:accounts', + :'write:blocks', + :'write:favourites', + :'write:filters', + :'write:follows', + :'write:lists', + :'write:media', + :'write:mutes', + :'write:notifications', + :'write:reports', + :'write:statuses', + :read, + :'read:accounts', + :'read:blocks', + :'read:favourites', + :'read:filters', + :'read:follows', + :'read:lists', + :'read:mutes', + :'read:notifications', + :'read:reports', + :'read:search', + :'read:statuses', + :follow, + :push # Change the way client credentials are retrieved from the request object. # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml index eca1fc675..f1fe03716 100644 --- a/config/locales/doorkeeper.en.yml +++ b/config/locales/doorkeeper.en.yml @@ -114,7 +114,29 @@ en: application: title: OAuth authorization required scopes: - follow: follow, block, unblock and unfollow accounts - push: receive push notifications for your account - read: read your account's data - write: post on your behalf + follow: modify account relationships + push: receive your push notifications + read: read all your account's data + read:accounts: see accounts information + read:blocks: see your blocks + read:favourites: see your favourites + read:filters: see your filters + read:follows: see your follows + read:lists: see your lists + read:mutes: see your mutes + read:notifications: see your notifications + read:reports: see your reports + read:search: search on your behalf + read:statuses: see all statuses + write: modify all your account's data + write:accounts: modify your profile + write:blocks: block accounts and domains + write:favourites: favourite statuses + write:filters: create filters + write:follows: follow people + write:lists: create lists + write:media: upload media files + write:mutes: mute people and conversations + write:notifications: clear your notifications + write:reports: report other people + write:statuses: publish statuses diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 59133ea73..49d94bcde 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -20,6 +20,7 @@ en: one: 1 character left other: %{count} characters left phrase: Will be matched regardless of casing in text or content warning of a toot + scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages diff --git a/spec/controllers/api/v1/accounts/credentials_controller_spec.rb b/spec/controllers/api/v1/accounts/credentials_controller_spec.rb index 9a52fd14c..727669886 100644 --- a/spec/controllers/api/v1/accounts/credentials_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/credentials_controller_spec.rb @@ -4,7 +4,7 @@ describe Api::V1::Accounts::CredentialsController do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } context 'with an oauth token' do before do @@ -12,6 +12,8 @@ describe Api::V1::Accounts::CredentialsController do end describe 'GET #show' do + let(:scopes) { 'read:accounts' } + it 'returns http success' do get :show expect(response).to have_http_status(200) @@ -19,6 +21,8 @@ describe Api::V1::Accounts::CredentialsController do end describe 'PATCH #update' do + let(:scopes) { 'write:accounts' } + describe 'with valid data' do before do allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async) diff --git a/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb b/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb index b47af4963..75e0570e9 100644 --- a/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb @@ -4,7 +4,7 @@ describe Api::V1::Accounts::FollowerAccountsController do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') } before do Fabricate(:follow, target_account: user.account) diff --git a/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb b/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb index 29fd7cd5b..7f7105ad3 100644 --- a/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb @@ -4,7 +4,7 @@ describe Api::V1::Accounts::FollowingAccountsController do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') } before do Fabricate(:follow, account: user.account) diff --git a/spec/controllers/api/v1/accounts/lists_controller_spec.rb b/spec/controllers/api/v1/accounts/lists_controller_spec.rb index df9fe0e34..baafea8e6 100644 --- a/spec/controllers/api/v1/accounts/lists_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/lists_controller_spec.rb @@ -4,7 +4,7 @@ describe Api::V1::Accounts::ListsController do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:lists') } let(:account) { Fabricate(:account) } let(:list) { Fabricate(:list, account: user.account) } diff --git a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb index 7e350da7e..fe715ff62 100644 --- a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb @@ -4,7 +4,7 @@ describe Api::V1::Accounts::RelationshipsController do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:follows') } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/accounts/search_controller_spec.rb b/spec/controllers/api/v1/accounts/search_controller_spec.rb index dbc4b9f3e..8ff2b17de 100644 --- a/spec/controllers/api/v1/accounts/search_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/search_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Api::V1::Accounts::SearchController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb b/spec/controllers/api/v1/accounts/statuses_controller_spec.rb index 09bb46937..693cd1ac6 100644 --- a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/statuses_controller_spec.rb @@ -4,7 +4,7 @@ describe Api::V1::Accounts::StatusesController do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses') } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/accounts_controller_spec.rb b/spec/controllers/api/v1/accounts_controller_spec.rb index 7a9e0f8e4..3e54e88a5 100644 --- a/spec/controllers/api/v1/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts_controller_spec.rb @@ -3,21 +3,38 @@ require 'rails_helper' RSpec.describe Api::V1::AccountsController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow read') } + let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:scopes) { '' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } before do allow(controller).to receive(:doorkeeper_token) { token } end + shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + expect(response).to have_http_status(403) + end + end + describe 'GET #show' do - it 'returns http success' do + let(:scopes) { 'read:accounts' } + + before do get :show, params: { id: user.account.id } + end + + it 'returns http success' do expect(response).to have_http_status(200) end + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' end describe 'POST #follow' do + let(:scopes) { 'write:follows' } let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', locked: locked)).account } before do @@ -41,6 +58,8 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it 'creates a following relation between user and target user' do expect(user.account.following?(other_account)).to be true end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' end context 'with locked account' do @@ -60,10 +79,13 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it 'creates a follow request relation between user and target user' do expect(user.account.requested?(other_account)).to be true end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' end end describe 'POST #unfollow' do + let(:scopes) { 'write:follows' } let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } before do @@ -78,9 +100,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it 'removes the following relation between user and target user' do expect(user.account.following?(other_account)).to be false end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' end describe 'POST #block' do + let(:scopes) { 'write:blocks' } let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } before do @@ -99,9 +124,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it 'creates a blocking relation' do expect(user.account.blocking?(other_account)).to be true end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' end describe 'POST #unblock' do + let(:scopes) { 'write:blocks' } let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } before do @@ -116,9 +144,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it 'removes the blocking relation between user and target user' do expect(user.account.blocking?(other_account)).to be false end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' end describe 'POST #mute' do + let(:scopes) { 'write:mutes' } let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } before do @@ -141,9 +172,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it 'mutes notifications' do expect(user.account.muting_notifications?(other_account)).to be true end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' end describe 'POST #mute with notifications set to false' do + let(:scopes) { 'write:mutes' } let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } before do @@ -166,9 +200,12 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it 'does not mute notifications' do expect(user.account.muting_notifications?(other_account)).to be false end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' end describe 'POST #unmute' do + let(:scopes) { 'write:mutes' } let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account } before do @@ -183,5 +220,7 @@ RSpec.describe Api::V1::AccountsController, type: :controller do it 'removes the muting relation between user and target user' do expect(user.account.muting?(other_account)).to be false end + + it_behaves_like 'forbidden for wrong scope', 'read:accounts' end end diff --git a/spec/controllers/api/v1/blocks_controller_spec.rb b/spec/controllers/api/v1/blocks_controller_spec.rb index eff5fb9da..818f76c92 100644 --- a/spec/controllers/api/v1/blocks_controller_spec.rb +++ b/spec/controllers/api/v1/blocks_controller_spec.rb @@ -3,8 +3,9 @@ require 'rails_helper' RSpec.describe Api::V1::BlocksController, type: :controller do render_views - let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') } + let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:scopes) { 'read:blocks' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } before { allow(controller).to receive(:doorkeeper_token) { token } } @@ -49,5 +50,14 @@ RSpec.describe Api::V1::BlocksController, type: :controller do get :index expect(response).to have_http_status(200) end + + context 'with wrong scopes' do + let(:scopes) { 'write:blocks' } + + it 'returns http forbidden' do + get :index + expect(response).to have_http_status(403) + end + end end end diff --git a/spec/controllers/api/v1/domain_blocks_controller_spec.rb b/spec/controllers/api/v1/domain_blocks_controller_spec.rb index bae4612a2..6a7a35c7a 100644 --- a/spec/controllers/api/v1/domain_blocks_controller_spec.rb +++ b/spec/controllers/api/v1/domain_blocks_controller_spec.rb @@ -4,14 +4,24 @@ RSpec.describe Api::V1::DomainBlocksController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } before do user.account.block_domain!('example.com') allow(controller).to receive(:doorkeeper_token) { token } end + shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + expect(response).to have_http_status(403) + end + end + describe 'GET #show' do + let(:scopes) { 'read:blocks' } + before do get :show, params: { limit: 1 } end @@ -23,9 +33,13 @@ RSpec.describe Api::V1::DomainBlocksController, type: :controller do it 'returns blocked domains' do expect(body_as_json.first).to eq 'example.com' end + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' end describe 'POST #create' do + let(:scopes) { 'write:blocks' } + before do post :create, params: { domain: 'example.org' } end @@ -37,9 +51,13 @@ RSpec.describe Api::V1::DomainBlocksController, type: :controller do it 'creates a domain block' do expect(user.account.domain_blocking?('example.org')).to be true end + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' end describe 'DELETE #destroy' do + let(:scopes) { 'write:blocks' } + before do delete :destroy, params: { domain: 'example.com' } end @@ -51,5 +69,7 @@ RSpec.describe Api::V1::DomainBlocksController, type: :controller do it 'deletes a domain block' do expect(user.account.domain_blocking?('example.com')).to be false end + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' end end diff --git a/spec/controllers/api/v1/favourites_controller_spec.rb b/spec/controllers/api/v1/favourites_controller_spec.rb index 46cf70f4d..2bdf927f2 100644 --- a/spec/controllers/api/v1/favourites_controller_spec.rb +++ b/spec/controllers/api/v1/favourites_controller_spec.rb @@ -45,7 +45,7 @@ RSpec.describe Api::V1::FavouritesController, type: :controller do context 'with read scope and valid resource owner' do before do allow(controller).to receive(:doorkeeper_token) do - Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') + Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:favourites') end end diff --git a/spec/controllers/api/v1/filter_controller_spec.rb b/spec/controllers/api/v1/filter_controller_spec.rb index 3ffd8f784..5948809e3 100644 --- a/spec/controllers/api/v1/filter_controller_spec.rb +++ b/spec/controllers/api/v1/filter_controller_spec.rb @@ -4,13 +4,14 @@ RSpec.describe Api::V1::FiltersController, type: :controller do render_views let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } before do allow(controller).to receive(:doorkeeper_token) { token } end describe 'GET #index' do + let(:scopes) { 'read:filters' } let!(:filter) { Fabricate(:custom_filter, account: user.account) } it 'returns http success' do @@ -20,6 +21,8 @@ RSpec.describe Api::V1::FiltersController, type: :controller do end describe 'POST #create' do + let(:scopes) { 'write:filters' } + before do post :create, params: { phrase: 'magic', context: %w(home), irreversible: true } end @@ -39,6 +42,7 @@ RSpec.describe Api::V1::FiltersController, type: :controller do end describe 'GET #show' do + let(:scopes) { 'read:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } it 'returns http success' do @@ -48,6 +52,7 @@ RSpec.describe Api::V1::FiltersController, type: :controller do end describe 'PUT #update' do + let(:scopes) { 'write:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } before do @@ -64,6 +69,7 @@ RSpec.describe Api::V1::FiltersController, type: :controller do end describe 'DELETE #destroy' do + let(:scopes) { 'write:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } before do diff --git a/spec/controllers/api/v1/follow_requests_controller_spec.rb b/spec/controllers/api/v1/follow_requests_controller_spec.rb index 3c0b84af8..87292d9ce 100644 --- a/spec/controllers/api/v1/follow_requests_controller_spec.rb +++ b/spec/controllers/api/v1/follow_requests_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice', locked: true)) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:follower) { Fabricate(:account, username: 'bob') } before do @@ -13,6 +13,8 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do end describe 'GET #index' do + let(:scopes) { 'read:follows' } + before do get :index, params: { limit: 1 } end @@ -23,6 +25,8 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do end describe 'POST #authorize' do + let(:scopes) { 'write:follows' } + before do post :authorize, params: { id: follower.id } end @@ -37,6 +41,8 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do end describe 'POST #reject' do + let(:scopes) { 'write:follows' } + before do post :reject, params: { id: follower.id } end diff --git a/spec/controllers/api/v1/follows_controller_spec.rb b/spec/controllers/api/v1/follows_controller_spec.rb index 38badb80a..089e0fe5e 100644 --- a/spec/controllers/api/v1/follows_controller_spec.rb +++ b/spec/controllers/api/v1/follows_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Api::V1::FollowsController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:follows') } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/lists/accounts_controller_spec.rb b/spec/controllers/api/v1/lists/accounts_controller_spec.rb index c37a481d6..08c22de56 100644 --- a/spec/controllers/api/v1/lists/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/lists/accounts_controller_spec.rb @@ -4,7 +4,7 @@ describe Api::V1::Lists::AccountsController do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:list) { Fabricate(:list, account: user.account) } before do @@ -14,6 +14,8 @@ describe Api::V1::Lists::AccountsController do end describe 'GET #index' do + let(:scopes) { 'read:lists' } + it 'returns http success' do get :show, params: { list_id: list.id } @@ -22,6 +24,7 @@ describe Api::V1::Lists::AccountsController do end describe 'POST #create' do + let(:scopes) { 'write:lists' } let(:bob) { Fabricate(:account, username: 'bob') } before do @@ -39,6 +42,8 @@ describe Api::V1::Lists::AccountsController do end describe 'DELETE #destroy' do + let(:scopes) { 'write:lists' } + before do delete :destroy, params: { list_id: list.id, account_ids: [list.accounts.first.id] } end diff --git a/spec/controllers/api/v1/lists_controller_spec.rb b/spec/controllers/api/v1/lists_controller_spec.rb index 213429581..e92213789 100644 --- a/spec/controllers/api/v1/lists_controller_spec.rb +++ b/spec/controllers/api/v1/lists_controller_spec.rb @@ -4,12 +4,14 @@ RSpec.describe Api::V1::ListsController, type: :controller do render_views let!(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') } + let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let!(:list) { Fabricate(:list, account: user.account) } before { allow(controller).to receive(:doorkeeper_token) { token } } describe 'GET #index' do + let(:scopes) { 'read:lists' } + it 'returns http success' do get :index expect(response).to have_http_status(200) @@ -17,6 +19,8 @@ RSpec.describe Api::V1::ListsController, type: :controller do end describe 'GET #show' do + let(:scopes) { 'read:lists' } + it 'returns http success' do get :show, params: { id: list.id } expect(response).to have_http_status(200) @@ -24,6 +28,8 @@ RSpec.describe Api::V1::ListsController, type: :controller do end describe 'POST #create' do + let(:scopes) { 'write:lists' } + before do post :create, params: { title: 'Foo bar' } end @@ -39,6 +45,8 @@ RSpec.describe Api::V1::ListsController, type: :controller do end describe 'PUT #update' do + let(:scopes) { 'write:lists' } + before do put :update, params: { id: list.id, title: 'Updated title' } end @@ -53,6 +61,8 @@ RSpec.describe Api::V1::ListsController, type: :controller do end describe 'DELETE #destroy' do + let(:scopes) { 'write:lists' } + before do delete :destroy, params: { id: list.id } end diff --git a/spec/controllers/api/v1/media_controller_spec.rb b/spec/controllers/api/v1/media_controller_spec.rb index ce260eb90..f01fcd942 100644 --- a/spec/controllers/api/v1/media_controller_spec.rb +++ b/spec/controllers/api/v1/media_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:media') } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/mutes_controller_spec.rb b/spec/controllers/api/v1/mutes_controller_spec.rb index dc4a9753a..f9603b7ff 100644 --- a/spec/controllers/api/v1/mutes_controller_spec.rb +++ b/spec/controllers/api/v1/mutes_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Api::V1::MutesController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:mutes') } before do Fabricate(:mute, account: user.account, hide_notifications: false) diff --git a/spec/controllers/api/v1/notifications_controller_spec.rb b/spec/controllers/api/v1/notifications_controller_spec.rb index 2e6163fcd..9f679cb8a 100644 --- a/spec/controllers/api/v1/notifications_controller_spec.rb +++ b/spec/controllers/api/v1/notifications_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:other) { Fabricate(:user, account: Fabricate(:account, username: 'bob')) } before do @@ -12,6 +12,8 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do end describe 'GET #show' do + let(:scopes) { 'read:notifications' } + it 'returns http success' do notification = Fabricate(:notification, account: user.account) get :show, params: { id: notification.id } @@ -21,6 +23,8 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do end describe 'POST #dismiss' do + let(:scopes) { 'write:notifications' } + it 'destroys the notification' do notification = Fabricate(:notification, account: user.account) post :dismiss, params: { id: notification.id } @@ -31,6 +35,8 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do end describe 'POST #clear' do + let(:scopes) { 'write:notifications' } + it 'clears notifications for the account' do notification = Fabricate(:notification, account: user.account) post :clear @@ -41,6 +47,8 @@ RSpec.describe Api::V1::NotificationsController, type: :controller do end describe 'GET #index' do + let(:scopes) { 'read:notifications' } + before do first_status = PostStatusService.new.call(user.account, 'Test') @reblog_of_first_status = ReblogService.new.call(other.account, first_status) diff --git a/spec/controllers/api/v1/reports_controller_spec.rb b/spec/controllers/api/v1/reports_controller_spec.rb index 1e1ef9308..ac93998c6 100644 --- a/spec/controllers/api/v1/reports_controller_spec.rb +++ b/spec/controllers/api/v1/reports_controller_spec.rb @@ -6,13 +6,15 @@ RSpec.describe Api::V1::ReportsController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } before do allow(controller).to receive(:doorkeeper_token) { token } end describe 'GET #index' do + let(:scopes) { 'read:reports' } + it 'returns http success' do get :index @@ -21,6 +23,7 @@ RSpec.describe Api::V1::ReportsController, type: :controller do end describe 'POST #create' do + let(:scopes) { 'write:reports' } let!(:status) { Fabricate(:status) } let!(:admin) { Fabricate(:user, admin: true) } diff --git a/spec/controllers/api/v1/search_controller_spec.rb b/spec/controllers/api/v1/search_controller_spec.rb index 024703867..c9e544cc7 100644 --- a/spec/controllers/api/v1/search_controller_spec.rb +++ b/spec/controllers/api/v1/search_controller_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Api::V1::SearchController, type: :controller do render_views let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:search') } before do allow(controller).to receive(:doorkeeper_token) { token } diff --git a/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb b/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb index c873e05dd..23b5d7de9 100644 --- a/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb @@ -5,7 +5,7 @@ RSpec.describe Api::V1::Statuses::FavouritedByAccountsController, type: :control let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'read:accounts') } context 'with an oauth token' do before do diff --git a/spec/controllers/api/v1/statuses/favourites_controller_spec.rb b/spec/controllers/api/v1/statuses/favourites_controller_spec.rb index 53f602616..24a760e20 100644 --- a/spec/controllers/api/v1/statuses/favourites_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/favourites_controller_spec.rb @@ -7,7 +7,7 @@ describe Api::V1::Statuses::FavouritesController do let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:favourites', application: app) } context 'with an oauth token' do before do diff --git a/spec/controllers/api/v1/statuses/mutes_controller_spec.rb b/spec/controllers/api/v1/statuses/mutes_controller_spec.rb index 13b4625d1..966398580 100644 --- a/spec/controllers/api/v1/statuses/mutes_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/mutes_controller_spec.rb @@ -7,7 +7,7 @@ describe Api::V1::Statuses::MutesController do let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:mutes', application: app) } context 'with an oauth token' do before do diff --git a/spec/controllers/api/v1/statuses/pins_controller_spec.rb b/spec/controllers/api/v1/statuses/pins_controller_spec.rb index 8f5b0800b..13405d285 100644 --- a/spec/controllers/api/v1/statuses/pins_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/pins_controller_spec.rb @@ -7,7 +7,7 @@ describe Api::V1::Statuses::PinsController do let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:accounts', application: app) } context 'with an oauth token' do before do diff --git a/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb b/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb index 9c0c2b60c..d758786dc 100644 --- a/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb @@ -5,7 +5,7 @@ RSpec.describe Api::V1::Statuses::RebloggedByAccountsController, type: :controll let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'read:accounts') } context 'with an oauth token' do before do diff --git a/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb b/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb index e60f8da2a..d14ca3e8b 100644 --- a/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb @@ -7,7 +7,7 @@ describe Api::V1::Statuses::ReblogsController do let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:statuses', application: app) } context 'with an oauth token' do before do diff --git a/spec/controllers/api/v1/statuses_controller_spec.rb b/spec/controllers/api/v1/statuses_controller_spec.rb index 27e4f4eb2..8bc3b0c67 100644 --- a/spec/controllers/api/v1/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/statuses_controller_spec.rb @@ -5,7 +5,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller do let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'write') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: scopes) } context 'with an oauth token' do before do @@ -13,6 +13,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller do end describe 'GET #show' do + let(:scopes) { 'read:statuses' } let(:status) { Fabricate(:status, account: user.account) } it 'returns http success' do @@ -22,6 +23,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller do end describe 'GET #context' do + let(:scopes) { 'read:statuses' } let(:status) { Fabricate(:status, account: user.account) } before do @@ -35,6 +37,8 @@ RSpec.describe Api::V1::StatusesController, type: :controller do end describe 'POST #create' do + let(:scopes) { 'write:statuses' } + before do post :create, params: { status: 'Hello world' } end @@ -45,6 +49,7 @@ RSpec.describe Api::V1::StatusesController, type: :controller do end describe 'DELETE #destroy' do + let(:scopes) { 'write:statuses' } let(:status) { Fabricate(:status, account: user.account) } before do diff --git a/spec/controllers/api/v1/timelines/home_controller_spec.rb b/spec/controllers/api/v1/timelines/home_controller_spec.rb index 85b031641..a667c33fa 100644 --- a/spec/controllers/api/v1/timelines/home_controller_spec.rb +++ b/spec/controllers/api/v1/timelines/home_controller_spec.rb @@ -12,7 +12,7 @@ describe Api::V1::Timelines::HomeController do end context 'with a user context' do - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses') } describe 'GET #show' do before do diff --git a/spec/controllers/api/v1/timelines/list_controller_spec.rb b/spec/controllers/api/v1/timelines/list_controller_spec.rb index 1729217c9..93a2be6e6 100644 --- a/spec/controllers/api/v1/timelines/list_controller_spec.rb +++ b/spec/controllers/api/v1/timelines/list_controller_spec.rb @@ -13,7 +13,7 @@ describe Api::V1::Timelines::ListController do end context 'with a user context' do - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:lists') } describe 'GET #show' do before do diff --git a/spec/controllers/api/v2/search_controller_spec.rb b/spec/controllers/api/v2/search_controller_spec.rb new file mode 100644 index 000000000..8ee8753de --- /dev/null +++ b/spec/controllers/api/v2/search_controller_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Api::V2::SearchController, type: :controller do + render_views + + let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:search') } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'GET #index' do + it 'returns http success' do + get :index, params: { q: 'test' } + + expect(response).to have_http_status(200) + end + end +end -- cgit From f89c595ea070d2017adb868fb5e311e198d8e990 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 6 Jul 2018 02:15:56 +0200 Subject: Add admin setting to enable OG previews for sensitive media (#7962) --- app/controllers/admin/settings_controller.rb | 2 ++ app/models/form/admin_settings.rb | 2 ++ app/views/admin/settings/edit.html.haml | 6 ++++++ app/views/stream_entries/_og_image.html.haml | 2 +- config/locales/en.yml | 3 +++ config/settings.yml | 1 + 6 files changed, 15 insertions(+), 1 deletion(-) (limited to 'config') diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index ce3208209..75d00326c 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -21,6 +21,7 @@ module Admin activity_api_enabled peers_api_enabled show_known_fediverse_at_about_page + preview_sensitive_media ).freeze BOOLEAN_SETTINGS = %w( @@ -31,6 +32,7 @@ module Admin activity_api_enabled peers_api_enabled show_known_fediverse_at_about_page + preview_sensitive_media ).freeze UPLOAD_SETTINGS = %w( diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 32922e7f1..723480bdd 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -36,6 +36,8 @@ class Form::AdminSettings :peers_api_enabled=, :show_known_fediverse_at_about_page, :show_known_fediverse_at_about_page=, + :preview_sensitive_media, + :preview_sensitive_media=, to: Setting ) end diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml index 08d05d738..f5c5deca8 100644 --- a/app/views/admin/settings/edit.html.haml +++ b/app/views/admin/settings/edit.html.haml @@ -2,6 +2,9 @@ = t('admin.settings.title') = simple_form_for @admin_settings, url: admin_settings_path, html: { method: :patch } do |f| + .actions.actions--top + = f.button :button, t('generic.save_changes'), type: :submit + .fields-group = f.input :site_title, placeholder: t('admin.settings.site_title') = f.input :site_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_description.title'), hint: t('admin.settings.site_description.desc_html'), input_html: { rows: 8 } @@ -58,5 +61,8 @@ .fields-group = f.input :peers_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.peers_api_enabled.title'), hint: t('admin.settings.peers_api_enabled.desc_html') + .fields-group + = f.input :preview_sensitive_media, as: :boolean, wrapper: :with_label, label: t('admin.settings.preview_sensitive_media.title'), hint: t('admin.settings.preview_sensitive_media.desc_html') + .actions = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/stream_entries/_og_image.html.haml b/app/views/stream_entries/_og_image.html.haml index 40530f567..e1b977da3 100644 --- a/app/views/stream_entries/_og_image.html.haml +++ b/app/views/stream_entries/_og_image.html.haml @@ -1,4 +1,4 @@ -- if activity.is_a?(Status) && activity.non_sensitive_with_media? +- if activity.is_a?(Status) && (activity.non_sensitive_with_media? || (activity.with_media? && Setting.preview_sensitive_media)) - player_card = false - activity.media_attachments.each do |media| - if media.image? diff --git a/config/locales/en.yml b/config/locales/en.yml index 8ab652045..a03b12a39 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -316,6 +316,9 @@ en: peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse title: Publish list of discovered instances + preview_sensitive_media: + desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive + title: Show sensitive media in OpenGraph previews registrations: closed_message: desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags diff --git a/config/settings.yml b/config/settings.yml index 3581d10a2..190f6afcd 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -26,6 +26,7 @@ defaults: &defaults delete_modal: true auto_play_gif: false display_sensitive_media: false + preview_sensitive_media: false reduce_motion: false system_font_ui: false noindex: false -- cgit From c24d62220d6d7db30e5c003987d7f7a74060b0a7 Mon Sep 17 00:00:00 2001 From: Marcin Mikołajczak Date: Sat, 7 Jul 2018 03:53:00 +0200 Subject: i18n: Update Polish translation (#7968) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcin Mikołajczak --- config/locales/doorkeeper.pl.yml | 28 +++++++++++++++++++++++++--- config/locales/pl.yml | 4 ++++ config/locales/simple_form.pl.yml | 1 + 3 files changed, 30 insertions(+), 3 deletions(-) (limited to 'config') diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml index 5cad356fc..2e0254864 100644 --- a/config/locales/doorkeeper.pl.yml +++ b/config/locales/doorkeeper.pl.yml @@ -114,7 +114,29 @@ pl: application: title: Uwierzytelnienie OAuth jest wymagane scopes: - follow: możliwość śledzenia, blokowania, usuwania blokad, anulowania śledzenia kont + follow: możliwość śledzenia kont push: otrzymywanie powiadomień push dla Twojego konta - read: dostęp do odczytu danych konta - write: możliwość publikowania wpisów w Twoim imieniu + read: możliwość odczytu wszystkich danych konta + read:accounts: dostęp do informacji o koncie + read:blocks: dostęp do listy blokowanych + read:favourites: dostęp do listy ulubionych + read:filters: dostęp do filtrów + read:follows: dostęp do listy śledzonych + read:lists: dostęp do Twoich list + read:mutes: dostęp do listy wyciszonych + read:notifications: możliwość odczytu powiadomień + read:reports: dostęp do Twoich zgłoszeń + read:search: wyświetlanie z Twojego konta + read:statuses: wyświetlanie wszystkich wpisów + write: możliwość modyfikowania wszystkich danych o koncie + write:accounts: możliwość modyfikowania informacji o koncie + write:blocks: możliwość blokowania domen i użytkowników + write:favourites: możliwość dodawnia wpisów do ulubionych + write:filters: możliwość tworzenia filtrów + write:follows: możliwość śledzenia ludzi + write:lists: możliwość tworzenia list + write:media: możliwość wysyłania zawartości multimedialnej + write:mutes: możliwość wyciszania ludzi i konwersacji + write:notifications: możliwość usuwania Twoich powiadomień + write:reports: możliwość zgłaszania wpisów + write:statuses: możliwość publikowania wpisów diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 290979bc4..061c07b64 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -317,6 +317,9 @@ pl: peers_api_enabled: desc_html: Nazwy domen, z którymi ta instancja wchodziła w interakcje title: Publikuj listę znanych instancji + preview_sensitive_media: + desc_html: Podgląd odnośników na innych instancjach będzie wyświetlał miniaturę nawet jeśli zawartość multimedialna zostanie oznaczona jako wrażliwa + title: Wyświetlaj zawartość wrażliwą w podglądzie OpenGraph registrations: closed_message: desc_html: Wyświetlana na stronie głównej, gdy możliwość otwarej rejestracji nie jest dostępna. Możesz korzystać z tagów HTML @@ -624,6 +627,7 @@ pl: remote_follow: acct: Podaj swój adres (nazwa@domena), z którego chcesz śledzić missing_resource: Nie udało się znaleźć adresu przekierowania z Twojej domeny + no_account_html: Nie masz konta? Możesz zarejestrować się tutaj proceed: Śledź prompt: 'Zamierzasz śledzić:' remote_unfollow: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 14558bbc2..55c5e1c6d 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -63,6 +63,7 @@ pl: otp_attempt: Kod uwierzytelnienia dwustopniowego password: Hasło phrase: Słowo kluczowe lub fraza + scopes: Do których API aplikacja będzie miała dostęp. Jeżeli wybierzesz zakres wyższego poziomu, nie musisz zaznaczać bardziej szczegółowych. setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy setting_boost_modal: Pytaj o potwierdzenie przed podbiciem setting_default_language: Język wpisów -- cgit From ef2bcf51d70b035407dffed8c40efee999f18115 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sat, 7 Jul 2018 20:45:04 +0200 Subject: Fix french translation of “Keyword or phrase” (#7980) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/locales/simple_form.fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'config') diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index c1de721b4..852e49d05 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -58,7 +58,7 @@ fr: note: Présentation otp_attempt: Code d’identification à deux facteurs password: Mot de passe - phrase: Mot de passe ou phrase + phrase: Mot-clé ou phrase setting_auto_play_gif: Lire automatiquement les GIFs animés setting_boost_modal: Afficher une fenêtre de confirmation avant de partager setting_default_language: Langue de publication -- cgit From 6b9e03e002ed349fd8b7e2879d599bb75a698eb2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 7 Jul 2018 21:09:54 +0200 Subject: Add API method to remove a suggestion (#7978) DELETE /api/v1/suggestions/:account_id When blocking, remove suggestion from both sides. Muting not affected, since muting is supposed to be invisible to the target. --- app/controllers/api/v1/suggestions_controller.rb | 5 +++++ app/models/concerns/account_interactions.rb | 3 ++- config/routes.rb | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) (limited to 'config') diff --git a/app/controllers/api/v1/suggestions_controller.rb b/app/controllers/api/v1/suggestions_controller.rb index 3abccedd5..9da2b60ae 100644 --- a/app/controllers/api/v1/suggestions_controller.rb +++ b/app/controllers/api/v1/suggestions_controller.rb @@ -13,6 +13,11 @@ class Api::V1::SuggestionsController < Api::BaseController render json: @accounts, each_serializer: REST::AccountSerializer end + def destroy + PotentialFriendshipTracker.remove(current_account.id, params[:id]) + render_empty + end + private def set_accounts diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index ee435f956..e14e041f6 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -203,7 +203,8 @@ module AccountInteractions private - def remove_potential_friendship(other_account) + def remove_potential_friendship(other_account, mutual = false) PotentialFriendshipTracker.remove(id, other_account.id) + PotentialFriendshipTracker.remove(other_account.id, id) if mutual end end diff --git a/config/routes.rb b/config/routes.rb index e59325964..fd26b4aa7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -246,7 +246,7 @@ Rails.application.routes.draw do resources :streaming, only: [:index] resources :custom_emojis, only: [:index] - resources :suggestions, only: [:index] + resources :suggestions, only: [:index, :destroy] get '/search', to: 'search#index', as: :search -- cgit