diff --git a/.ruby-version b/.ruby-version index 4d9d11cf50..6cb9d3dd0d 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.4.2 +3.4.3 diff --git a/Gemfile.lock b/Gemfile.lock index 1ed4b71318..f13df0c43f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -94,7 +94,7 @@ GEM ast (2.4.3) attr_required (1.0.2) aws-eventstream (1.3.2) - aws-partitions (1.1080.0) + aws-partitions (1.1087.0) aws-sdk-core (3.215.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -120,7 +120,7 @@ GEM rack (>= 0.9.0) rouge (>= 1.0.0) bigdecimal (3.1.9) - bindata (2.5.0) + bindata (2.5.1) binding_of_caller (1.0.1) debug_inspector (>= 1.2.0) blurhash (0.1.8) @@ -170,7 +170,7 @@ GEM crass (1.0.6) css_parser (1.21.1) addressable - csv (3.3.3) + csv (3.3.4) database_cleaner-active_record (2.2.0) activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) @@ -227,7 +227,7 @@ GEM fabrication (2.31.0) faker (3.5.1) i18n (>= 1.8.11, < 2) - faraday (2.12.2) + faraday (2.13.0) faraday-net_http (>= 2.0, < 3.5) json logger @@ -239,7 +239,7 @@ GEM net-http (>= 0.5.0) fast_blank (1.0.1) fastimage (2.4.0) - ffi (1.17.1) + ffi (1.17.2) ffi-compiler (1.3.2) ffi (>= 1.15.5) rake @@ -426,7 +426,7 @@ GEM mime-types (3.6.2) logger mime-types-data (~> 3.2015) - mime-types-data (3.2025.0402) + mime-types-data (3.2025.0408) mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.5) @@ -585,8 +585,8 @@ GEM ostruct (0.6.1) ox (2.14.22) bigdecimal (>= 3.0) - parallel (1.26.3) - parser (3.3.7.4) + parallel (1.27.0) + parser (3.3.8.0) ast (~> 2.4.1) racc parslet (2.0.0) @@ -751,7 +751,7 @@ GEM rubocop-ast (>= 1.44.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.44.0) + rubocop-ast (1.44.1) parser (>= 3.3.7.2) prism (~> 1.4) rubocop-capybara (2.22.1) @@ -1085,4 +1085,4 @@ RUBY VERSION ruby 3.4.1p0 BUNDLED WITH - 2.6.7 + 2.6.8 diff --git a/app/controllers/api/v1/accounts/endorsements_controller.rb b/app/controllers/api/v1/accounts/endorsements_controller.rb new file mode 100644 index 0000000000..1e21994a90 --- /dev/null +++ b/app/controllers/api/v1/accounts/endorsements_controller.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +class Api::V1::Accounts::EndorsementsController < Api::BaseController + include Authorization + + before_action -> { authorize_if_got_token! :read, :'read:accounts' }, only: :index + before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, except: :index + before_action :require_user!, except: :index + before_action :set_account + before_action :set_endorsed_accounts, only: :index + after_action :insert_pagination_headers, only: :index + + def index + cache_if_unauthenticated! + render json: @endorsed_accounts, each_serializer: REST::AccountSerializer + end + + def create + AccountPin.find_or_create_by!(account: current_account, target_account: @account) + render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter + end + + def destroy + pin = AccountPin.find_by(account: current_account, target_account: @account) + pin&.destroy! + render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter + end + + private + + def set_account + @account = Account.find(params[:account_id]) + end + + def set_endorsed_accounts + @endorsed_accounts = @account.unavailable? ? [] : paginated_endorsed_accounts + end + + def paginated_endorsed_accounts + @account.endorsed_accounts.without_suspended.includes(:account_stat, :user).paginate_by_max_id( + limit_param(DEFAULT_ACCOUNTS_LIMIT), + params[:max_id], + params[:since_id] + ) + end + + def relationships_presenter + AccountRelationshipsPresenter.new([@account], current_user.account_id) + end + + def next_path + api_v1_account_endorsements_url pagination_params(max_id: pagination_max_id) if records_continue? + end + + def prev_path + api_v1_account_endorsements_url pagination_params(since_id: pagination_since_id) unless @endorsed_accounts.empty? + end + + def pagination_collection + @endorsed_accounts + end + + def records_continue? + @endorsed_accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) + end +end diff --git a/app/controllers/api/v1/accounts/featured_tags_controller.rb b/app/controllers/api/v1/accounts/featured_tags_controller.rb index 0101fb469b..f95846366c 100644 --- a/app/controllers/api/v1/accounts/featured_tags_controller.rb +++ b/app/controllers/api/v1/accounts/featured_tags_controller.rb @@ -17,6 +17,6 @@ class Api::V1::Accounts::FeaturedTagsController < Api::BaseController end def set_featured_tags - @featured_tags = @account.suspended? ? [] : @account.featured_tags + @featured_tags = @account.unavailable? ? [] : @account.featured_tags end end diff --git a/app/controllers/api/v1/accounts/pins_controller.rb b/app/controllers/api/v1/accounts/pins_controller.rb deleted file mode 100644 index 0eb13c048c..0000000000 --- a/app/controllers/api/v1/accounts/pins_controller.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Accounts::PinsController < Api::BaseController - include Authorization - - before_action -> { doorkeeper_authorize! :write, :'write:accounts' } - before_action :require_user! - before_action :set_account - - def create - AccountPin.find_or_create_by!(account: current_account, target_account: @account) - render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter - end - - def destroy - pin = AccountPin.find_by(account: current_account, target_account: @account) - pin&.destroy! - render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships_presenter - end - - private - - def set_account - @account = Account.find(params[:account_id]) - end - - def relationships_presenter - AccountRelationshipsPresenter.new([@account], current_user.account_id) - end -end diff --git a/app/controllers/api/v1/lists_controller.rb b/app/controllers/api/v1/lists_controller.rb index 4bbbed2673..6bb884faa0 100644 --- a/app/controllers/api/v1/lists_controller.rb +++ b/app/controllers/api/v1/lists_controller.rb @@ -7,10 +7,6 @@ class Api::V1::ListsController < Api::BaseController before_action :require_user! before_action :set_list, except: [:index, :create] - rescue_from ArgumentError do |e| - render json: { error: e.to_s }, status: 422 - end - def index @lists = List.where(account: current_account).all render json: @lists, each_serializer: REST::ListSerializer diff --git a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx index c8fb3d2ae7..457cbcdcc4 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx @@ -495,9 +495,7 @@ export const AccountHeader: React.FC<{ arr.push({ text: intl.formatMessage( - account.getIn(['relationship', 'endorsed']) - ? messages.unendorse - : messages.endorse, + relationship.endorsed ? messages.unendorse : messages.endorse, ), action: handleEndorseToggle, }); @@ -746,7 +744,7 @@ export const AccountHeader: React.FC<{ badges.push(); } - account.get('roles', []).forEach((role) => { + account.roles.forEach((role) => { badges.push( {count, plural, other {# orang lain}} telah galakkan hantaran anda", + "notification.relationships_severance_event.domain_block": "Pentadbir dari {from} telah menyekat {target} termasuk {followersCount} pengikut anda dan {followingCount, plural, other {# akaun}} ikutan anda.", + "notification.relationships_severance_event.user_domain_block": "Anda telah menyekat {target} termasuk {followersCount} pengikut anda dan {followingCount, plural, other {# akaun}} ikutan anda.", "notification.status": "{name} baru sahaja mengirim hantaran", "notification.update": "{name} menyunting hantaran", "notifications.clear": "Buang pemberitahuan", @@ -524,7 +558,7 @@ "reply_indicator.cancel": "Batal", "reply_indicator.poll": "Undian", "report.block": "Sekat", - "report.block_explanation": "Anda tidak akan melihat hantaran mereka. Mereka tidak dapat melihat hantaran anda atau mengikuti anda. Mereka akan sedar bahawa mereka disekat.", + "report.block_explanation": "Anda tidak akan melihat hantarannya. Dia tidak akan dapat melihat hantaran anda atau mengikuti anda. Dia akan sedar bahawa dia disekat.", "report.categories.legal": "Sah", "report.categories.other": "Lain-lain", "report.categories.spam": "Spam", @@ -537,7 +571,7 @@ "report.comment.title": "Adakah ada hal-hal lain yang perlu kita ketahui?", "report.forward": "Panjangkan ke {target}", "report.forward_hint": "Akaun ini daripada pelayan lain. Hantar salinan laporan yang ditanpanamakan ke sana juga?", - "report.mute": "Bisukan", + "report.mute": "Redam", "report.mute_explanation": "Anda tidak akan melihat siaran mereka. Mereka masih boleh mengikuti dan melihat siaran anda dan tidak akan mengetahui bahawa mereka telah dibisukan.", "report.next": "Seterusnya", "report.placeholder": "Ulasan tambahan", @@ -621,8 +655,8 @@ "status.media_hidden": "Media disembunyikan", "status.mention": "Sebut @{name}", "status.more": "Lagi", - "status.mute": "Bisukan @{name}", - "status.mute_conversation": "Bisukan perbualan", + "status.mute": "Redamkan @{name}", + "status.mute_conversation": "Redamkan perbualan", "status.open": "Kembangkan hantaran ini", "status.pin": "Semat di profil", "status.pinned": "Hantaran disemat", @@ -648,7 +682,7 @@ "status.translate": "Menterjemah", "status.translated_from_with": "Diterjemah daripada {lang} dengan {provider}", "status.uncached_media_warning": "Pratonton tidak tersedia", - "status.unmute_conversation": "Nyahbisukan perbualan", + "status.unmute_conversation": "Nyahredamkan perbualan", "status.unpin": "Nyahsemat daripada profil", "subscribed_languages.lead": "Hanya hantaran dalam bahasa-bahasa terpilih akan dipaparkan pada garis masa rumah dan senarai selepas perubahan. Pilih tiada untuk menerima hantaran dalam semua bahasa.", "subscribed_languages.save": "Simpan perubahan", @@ -682,6 +716,8 @@ "video.expand": "Besarkan video", "video.fullscreen": "Skrin penuh", "video.hide": "Sembunyikan video", + "video.mute": "Redam", "video.pause": "Jeda", - "video.play": "Main" + "video.play": "Main", + "video.unmute": "Nyahredam" } diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json index 1ae348871f..2c5af1d406 100644 --- a/app/javascript/mastodon/locales/nan.json +++ b/app/javascript/mastodon/locales/nan.json @@ -27,6 +27,9 @@ "account.edit_profile": "編輯個人資料", "account.enable_notifications": "佇 {name} PO文ê時通知我", "account.endorse": "用個人資料推薦對方", + "account.featured": "精選ê", + "account.featured.hashtags": "Hashtag", + "account.featured.posts": "PO文", "account.featured_tags.last_status_at": "頂kái tī {date} Po文", "account.featured_tags.last_status_never": "無PO文", "account.follow": "跟tuè", @@ -293,6 +296,7 @@ "emoji_button.search_results": "Tshiau-tshuē ê結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅行kap地點", + "empty_column.account_featured": "Tsit ê列單是空ê", "empty_column.account_hides_collections": "Tsit位用者選擇無愛公開tsit ê資訊", "empty_column.account_suspended": "口座已經受停止", "empty_column.account_timeline": "Tsia無PO文!", @@ -377,6 +381,8 @@ "generic.saved": "儲存ah", "getting_started.heading": "開始用", "hashtag.admin_moderation": "Phah開 #{name} ê管理界面", + "hashtag.browse": "瀏覽佇 #{hashtag} ê PO文", + "hashtag.browse_from_account": "瀏覽 @{name} 佇 #{hashtag} 所寫ê PO文", "hashtag.column_header.tag_mode.all": "kap {additional}", "hashtag.column_header.tag_mode.any": "á是 {additional}", "hashtag.column_header.tag_mode.none": "無需要 {additional}", @@ -390,6 +396,7 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} 篇} other {{counter} 篇}} PO文", "hashtag.counter_by_uses_today": "Kin-á日有 {count, plural, one {{counter} 篇} other {{counter} 篇}} PO文", "hashtag.follow": "跟tuè hashtag", + "hashtag.mute": "消音 #{hashtag}", "hashtag.unfollow": "取消跟tuè hashtag", "hashtags.and_other": "……kap 其他 {count, plural, other {# ê}}", "hints.profiles.followers_may_be_missing": "Tsit ê個人資料ê跟tuè者資訊可能有落勾ê。", @@ -517,8 +524,70 @@ "mute_modal.hide_options": "Khàm掉選項", "mute_modal.indefinite": "直到我取消消音", "mute_modal.show_options": "顯示選項", + "mute_modal.they_can_mention_and_follow": "In iáu ē當提起á是跟tuè lí,毋過lí看buē著in。", + "mute_modal.they_wont_know": "In buē知影in受消音。", + "mute_modal.title": "Kā用者消音?", + "mute_modal.you_wont_see_mentions": "Lí buē看見提起in ê PO文。", + "mute_modal.you_wont_see_posts": "In iáu ē當看著lí ê PO文,毋過lí看bē tio̍h in ê。", + "navigation_bar.about": "概要", + "navigation_bar.administration": "管理", + "navigation_bar.advanced_interface": "用進階ê網頁界面開", + "navigation_bar.blocks": "封鎖ê用者", + "navigation_bar.bookmarks": "冊籤", + "navigation_bar.community_timeline": "本地ê時間線", + "navigation_bar.compose": "寫新ê PO文", + "navigation_bar.direct": "私人ê提起", + "navigation_bar.discover": "發現", + "navigation_bar.domain_blocks": "封鎖ê域名", + "navigation_bar.explore": "探查", + "navigation_bar.favourites": "Siōng kah意", + "navigation_bar.filters": "消音ê詞", + "navigation_bar.follow_requests": "跟tuè請求", + "navigation_bar.followed_tags": "跟tuè ê hashtag", + "navigation_bar.follows_and_followers": "Leh跟tuè ê kap跟tuè lí ê", + "navigation_bar.lists": "列單", + "navigation_bar.logout": "登出", + "navigation_bar.moderation": "審核", + "navigation_bar.mutes": "消音ê用者", + "navigation_bar.opened_in_classic_interface": "PO文、口座kap其他指定ê頁面,預設ē佇經典ê網頁界面內phah開。", + "navigation_bar.personal": "個人", + "navigation_bar.pins": "釘起來ê PO文", + "navigation_bar.preferences": "偏愛ê設定", + "navigation_bar.public_timeline": "聯邦ê時間線", + "navigation_bar.search": "Tshiau-tshuē", + "navigation_bar.security": "安全", + "not_signed_in_indicator.not_signed_in": "Lí著登入來接近使用tsit ê資源。", + "notification.admin.report": "{name} kā {target} 檢舉ah", + "notification.admin.report_account": "{name} kā {target} 所寫ê {count, plural, other {# 篇PO文}}檢舉ah,原因是:{category}", + "notification.admin.report_account_other": "{name} kā {target} 所寫ê {count, plural, other {# 篇PO文}}檢舉ah", + "notification.admin.report_statuses": "{name} kā {target} 檢舉ah,原因是:{category}", + "notification.admin.report_statuses_other": "{name} kā {target} 檢舉ah", + "notification.admin.sign_up": "口座 {name} 有開ah。", + "notification.admin.sign_up.name_and_others": "{name} kap {count, plural, other {其他 # ê lâng}} ê口座有開ah", + "notification.annual_report.message": "Lí ê {year} #Wrapstodon teh等lí!緊來看tsit年lí佇Mastodon頂ê上精彩ê內容,kap難忘ê時刻!", + "notification.annual_report.view": "Kā #Wrapstodon 看māi。", + "notification.favourite": "{name} kah意lí ê PO文", + "notification.favourite.name_and_others_with_link": "{name} kap{count, plural, other {另外 # ê lâng}}kah意lí ê PO文", "notification.favourite_pm": "{name} kah意lí ê私人提起", "notification.favourite_pm.name_and_others_with_link": "{name} kap{count, plural, other {另外 # ê lâng}}kah意lí ê私人提起", + "notification.follow": "{name}跟tuè lí", + "notification.follow.name_and_others": "{name} kap{count, plural, other {另外 # ê lâng}}跟tuè lí", + "notification.follow_request": "{name} 請求跟tuè lí", + "notification.follow_request.name_and_others": "{name} kap{count, plural, other {另外 # ê lâng}}請求跟tuè lí", + "notification.label.mention": "提起", + "notification.label.private_mention": "私人ê提起", + "notification.label.private_reply": "私人ê回應", + "notification.label.reply": "回應", + "notification.mention": "提起", + "notification.mentioned_you": "{name}kā lí提起", + "notification.moderation-warning.learn_more": "看詳細", + "notification.moderation_warning": "Lí有收著審核ê警告", + "notification.moderation_warning.action_delete_statuses": "Lí ê一寡PO文hōo lâng thâi掉ah。", + "notification.moderation_warning.action_disable": "Lí ê口座hōo lâng停止使用ah。", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Lí ê一寡PO文,hōo lâng標做敏感ê內容。", + "notification.moderation_warning.action_none": "Lí ê口座有收著審核ê警告。", + "notification_requests.edit_selection": "編輯", + "notification_requests.exit_selection": "做好ah", "search_popout.language_code": "ISO語言代碼", "status.translated_from_with": "用 {provider} 翻譯 {lang}" } diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index e22b7b3774..30f4777f61 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -381,6 +381,8 @@ "generic.saved": "Opgeslagen", "getting_started.heading": "Aan de slag", "hashtag.admin_moderation": "Moderatie-omgeving van #{name} openen", + "hashtag.browse": "Berichten met #{hashtag} bekijken", + "hashtag.browse_from_account": "Berichten van @{name} met #{hashtag} bekijken", "hashtag.column_header.tag_mode.all": "en {additional}", "hashtag.column_header.tag_mode.any": "of {additional}", "hashtag.column_header.tag_mode.none": "zonder {additional}", @@ -394,6 +396,7 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} bericht} other {{counter} berichten}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} bericht} other {{counter} berichten}} vandaag", "hashtag.follow": "Hashtag volgen", + "hashtag.mute": "#{hashtag} negeren", "hashtag.unfollow": "Hashtag ontvolgen", "hashtags.and_other": "…en {count, plural, one {}other {# meer}}", "hints.profiles.followers_may_be_missing": "Volgers voor dit profiel kunnen ontbreken.", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 6763a354f3..aaa73f51be 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -28,6 +28,8 @@ "account.enable_notifications": "Уведомлять о постах от @{name}", "account.endorse": "Рекомендовать в профиле", "account.featured": "Избранное", + "account.featured.hashtags": "Хэштеги", + "account.featured.posts": "Посты", "account.featured_tags.last_status_at": "Последний пост {date}", "account.featured_tags.last_status_never": "Нет постов", "account.follow": "Подписаться", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 57fc3be484..6cbf799328 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -27,6 +27,7 @@ "account.edit_profile": "Upraviť profil", "account.enable_notifications": "Zapnúť upozornenia na príspevky od @{name}", "account.endorse": "Zobraziť na vlastnom profile", + "account.featured.posts": "Príspevky", "account.featured_tags.last_status_at": "Posledný príspevok dňa {date}", "account.featured_tags.last_status_never": "Žiadne príspevky", "account.follow": "Sledovať", @@ -263,6 +264,7 @@ "emoji_button.search_results": "Výsledky hľadania", "emoji_button.symbols": "Symboly", "emoji_button.travel": "Cestovanie a miesta", + "empty_column.account_featured": "Tento zoznam je prázdny", "empty_column.account_hides_collections": "Tento účet sa rozhodol túto informáciu nesprístupniť", "empty_column.account_suspended": "Účet bol pozastavený", "empty_column.account_timeline": "Nie sú tu žiadne príspevky.", @@ -345,6 +347,7 @@ "generic.saved": "Uložené", "getting_started.heading": "Začíname", "hashtag.admin_moderation": "Otvor moderovacie rozhranie pre #{name}", + "hashtag.browse": "Prehľadávať príspevky pod #{hashtag}", "hashtag.column_header.tag_mode.all": "a {additional}", "hashtag.column_header.tag_mode.any": "alebo {additional}", "hashtag.column_header.tag_mode.none": "bez {additional}", @@ -358,6 +361,7 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}} dnes", "hashtag.follow": "Sledovať hashtag", + "hashtag.mute": "Utlmiť #{hashtag}", "hashtag.unfollow": "Prestať sledovať hashtag", "hashtags.and_other": "…a {count, plural, other {# ďalších}}", "hints.profiles.followers_may_be_missing": "Nasledovatelia tohto profilu môžu chýbať.", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index bb1668b2ef..a42a25b374 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -376,6 +376,8 @@ "generic.saved": "U ruajt", "getting_started.heading": "Si t’ia fillohet", "hashtag.admin_moderation": "Hap ndërfaqe moderimi për #{name}", + "hashtag.browse": "Shfletoni postime me #{hashtag}", + "hashtag.browse_from_account": "Shfletoni postime nga @{name} me #{hashtag}", "hashtag.column_header.tag_mode.all": "dhe {additional}", "hashtag.column_header.tag_mode.any": "ose {additional}", "hashtag.column_header.tag_mode.none": "pa {additional}", @@ -389,6 +391,7 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} postim} other {{counter} postime}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} postim} other {{counter} postime}} sot", "hashtag.follow": "Ndiqe hashtag-un", + "hashtag.mute": "Heshtoje #{hashtag}", "hashtag.unfollow": "Hiqe ndjekjen e hashtag-ut", "hashtags.and_other": "…dhe {count, plural, one {}other {# më tepër}}", "hints.profiles.followers_may_be_missing": "Mund të mungojnë ndjekës për këtë profil.", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index fa5a84dd68..1f703e0748 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -381,6 +381,8 @@ "generic.saved": "Kaydet", "getting_started.heading": "Başlarken", "hashtag.admin_moderation": "#{name} için denetim arayüzünü açın", + "hashtag.browse": "#{hashtag} gönderilerine gözat", + "hashtag.browse_from_account": "@{name} kişisinin #{hashtag} gönderilerine gözat", "hashtag.column_header.tag_mode.all": "ve {additional}", "hashtag.column_header.tag_mode.any": "ya da {additional}", "hashtag.column_header.tag_mode.none": "{additional} olmadan", @@ -394,6 +396,7 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}", "hashtag.counter_by_uses_today": "bugün {count, plural, one {{counter} gönderi} other {{counter} gönderi}}", "hashtag.follow": "Etiketi takip et", + "hashtag.mute": "#{hashtag} gönderilerini sessize al", "hashtag.unfollow": "Etiketi takibi bırak", "hashtags.and_other": "…ve {count, plural, one {}other {# fazlası}}", "hints.profiles.followers_may_be_missing": "Bu profilin takipçileri eksik olabilir.", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index b995713c52..6d37e0e1db 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -394,6 +394,7 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}} сьогодні", "hashtag.follow": "Стежити за хештегом", + "hashtag.mute": "Ігнорувати #{hashtag}", "hashtag.unfollow": "Не стежити за хештегом", "hashtags.and_other": "…і {count, plural, other {ще #}}", "hints.profiles.followers_may_be_missing": "Підписники цього профілю можуть бути не показані.", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index a608b3ed85..cabf3a5a82 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -381,6 +381,8 @@ "generic.saved": "Đã lưu", "getting_started.heading": "Quản lý", "hashtag.admin_moderation": "Mở giao diện quản trị #{name}", + "hashtag.browse": "Tìm tút #{hashtag}", + "hashtag.browse_from_account": "Tìm tút của @{name} có chứa #{hashtag}", "hashtag.column_header.tag_mode.all": "và {additional}", "hashtag.column_header.tag_mode.any": "hoặc {additional}", "hashtag.column_header.tag_mode.none": "mà không {additional}", @@ -394,6 +396,7 @@ "hashtag.counter_by_uses": "{count, plural, other {{counter} tút}}", "hashtag.counter_by_uses_today": "{count, plural, other {{counter} tút}} hôm nay", "hashtag.follow": "Theo dõi hashtag", + "hashtag.mute": "Ẩn #{hashtag}", "hashtag.unfollow": "Bỏ theo dõi hashtag", "hashtags.and_other": "…và {count, plural, other {# nữa}}", "hints.profiles.followers_may_be_missing": "Số người theo dõi có thể không đầy đủ.", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 48f12d241a..fc3f914e6a 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -27,6 +27,9 @@ "account.edit_profile": "修改个人资料", "account.enable_notifications": "当 @{name} 发布嘟文时通知我", "account.endorse": "在个人资料中推荐此用户", + "account.featured": "精选", + "account.featured.hashtags": "话题", + "account.featured.posts": "嘟文", "account.featured_tags.last_status_at": "上次发言于 {date}", "account.featured_tags.last_status_never": "暂无嘟文", "account.follow": "关注", @@ -64,6 +67,7 @@ "account.statuses_counter": "{count, plural, other {{counter} 条嘟文}}", "account.unblock": "取消屏蔽 @{name}", "account.unblock_domain": "取消屏蔽 {domain} 域名", + "account.unblock_domain_short": "取消屏蔽", "account.unblock_short": "取消屏蔽", "account.unendorse": "不在个人资料中推荐此用户", "account.unfollow": "取消关注", @@ -292,6 +296,7 @@ "emoji_button.search_results": "搜索结果", "emoji_button.symbols": "符号", "emoji_button.travel": "旅行与地点", + "empty_column.account_featured": "这个列表为空", "empty_column.account_hides_collections": "该用户选择不公开此信息", "empty_column.account_suspended": "账号已被停用", "empty_column.account_timeline": "这里没有嘟文!", @@ -389,6 +394,7 @@ "hashtag.counter_by_uses": "{count, plural, other {{counter} 条嘟文}}", "hashtag.counter_by_uses_today": "今日 {count, plural, other {{counter} 条嘟文}}", "hashtag.follow": "关注话题", + "hashtag.mute": "停止提醒 #{hashtag}", "hashtag.unfollow": "取消关注话题", "hashtags.and_other": "… 和另外 {count, plural, other {# 个话题}}", "hints.profiles.followers_may_be_missing": "该账号的关注者列表可能没有完全显示。", @@ -904,6 +910,12 @@ "video.expand": "展开视频", "video.fullscreen": "全屏", "video.hide": "隐藏视频", + "video.mute": "停止提醒", "video.pause": "暂停", - "video.play": "播放" + "video.play": "播放", + "video.skip_backward": "后退", + "video.skip_forward": "前进", + "video.unmute": "恢复提醒", + "video.volume_down": "音量减小", + "video.volume_up": "提高音量" } diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 3bb8ed4cbc..0d37e7f6c5 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -381,6 +381,8 @@ "generic.saved": "已儲存", "getting_started.heading": "開始使用", "hashtag.admin_moderation": "開啟 #{name} 的管理介面", + "hashtag.browse": "瀏覽於 #{hashtag} 之嘟文", + "hashtag.browse_from_account": "瀏覽來自 @{name} 於 #{hashtag} 之嘟文", "hashtag.column_header.tag_mode.all": "以及 {additional}", "hashtag.column_header.tag_mode.any": "或是 {additional}", "hashtag.column_header.tag_mode.none": "而無需 {additional}", @@ -394,6 +396,7 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} 則} other {{counter} 則}}嘟文", "hashtag.counter_by_uses_today": "本日有 {count, plural, one {{counter} 則} other {{counter} 則}}嘟文", "hashtag.follow": "跟隨主題標籤", + "hashtag.mute": "靜音 #{hashtag}", "hashtag.unfollow": "取消跟隨主題標籤", "hashtags.and_other": "…及其他 {count, plural, other {# 個}}", "hints.profiles.followers_may_be_missing": "此個人檔案之跟隨者或有缺失。", diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index 8d3e641eda..dc3466b7f3 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -17,7 +17,12 @@ body { font-weight: 400; color: $primary-text-color; text-rendering: optimizelegibility; - font-feature-settings: 'kern'; + + // Disable kerning for Japanese text to preserve monospaced alignment for readability + &:not(:lang(ja)) { + font-feature-settings: 'kern'; + } + text-size-adjust: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0%); -webkit-tap-highlight-color: transparent; diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb index d653c55310..07bbfd4373 100644 --- a/app/models/custom_filter.rb +++ b/app/models/custom_filter.rb @@ -33,7 +33,7 @@ class CustomFilter < ApplicationRecord include Expireable include Redisable - enum :action, { warn: 0, hide: 1, blur: 2 }, suffix: :action + enum :action, { warn: 0, hide: 1, blur: 2 }, suffix: :action, validate: true belongs_to :account has_many :keywords, class_name: 'CustomFilterKeyword', inverse_of: :custom_filter, dependent: :destroy diff --git a/app/models/list.rb b/app/models/list.rb index cd01774539..76c116ce24 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -18,7 +18,7 @@ class List < ApplicationRecord PER_ACCOUNT_LIMIT = 50 - enum :replies_policy, { list: 0, followed: 1, none: 2 }, prefix: :show + enum :replies_policy, { list: 0, followed: 1, none: 2 }, prefix: :show, validate: true belongs_to :account diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 1bdf202fca..37cd0b3bf6 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -325,6 +325,7 @@ cs: create: Vytvořit oznámení title: Nové oznámení preview: + disclaimer: Vzhledem k tomu, že se od nich uživatelé nemohou odhlásit, měla by být e-mailová upozornění omezena na důležitá oznámení, jako je narušení osobních údajů nebo oznámení o uzavření serveru. explanation_html: 'E-mail bude odeslán %{display_count} uživatelům. Následující text bude zahrnut do onoho e-mailu:' title: Náhled oznámení publish: Zveřejnit diff --git a/config/locales/da.yml b/config/locales/da.yml index b0314e0f74..63a414811e 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -319,6 +319,7 @@ da: create: Opret bekendtgørelse title: Ny bekendtgørelse preview: + disclaimer: Da brugere ikke kan fravælge e-mailnotifikationer, bør disse begrænses til vigtige emner som f.eks. personlige databrud eller serverlukninger. explanation_html: 'E-mailen sendes til %{display_count} brugere. Flg. tekst medtages i e-mailen:' title: Forhåndsvis annonceringsnotifikation publish: Publicér diff --git a/config/locales/de.yml b/config/locales/de.yml index ab0bc53fcc..0842ab73d7 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -319,6 +319,7 @@ de: create: Ankündigung erstellen title: Neue Ankündigung preview: + disclaimer: Da sich Profile nicht davon abmelden können, sollten Benachrichtigungen per E-Mail auf wichtige Ankündigungen wie z. B. zu Datenpannen oder Serverabschaltung beschränkt sein. explanation_html: 'Die E-Mail wird an %{display_count} Nutzer*innen gesendet. Folgendes wird in der E-Mail enthalten sein:' title: Vorschau der Ankündigung publish: Veröffentlichen @@ -497,6 +498,7 @@ de: registration_requested: Registrierung angefordert registrations: confirm: Bestätigen + description: Sie haben eine Registrierung von einer FASP erhalten. Lehnen Sie ab, wenn Sie dies nicht initiiert haben. Wenn Sie dies initiiert haben, vergleichen Sie Namen und Fingerabdruck vor der Bestätigung der Registrierung. reject: Ablehnen title: FASP-Registrierung bestätigen save: Speichern diff --git a/config/locales/doorkeeper.ms.yml b/config/locales/doorkeeper.ms.yml index f89def7b85..aadce76efd 100644 --- a/config/locales/doorkeeper.ms.yml +++ b/config/locales/doorkeeper.ms.yml @@ -128,11 +128,11 @@ ms: crypto: Penyulitan hujung ke hujung favourites: Sukaan filters: Penapis - follow: Ikut, Senyap dan Blok + follow: Ikutan, Redaman dan Sekatan follows: Ikutan lists: Senarai media: Lampiran media - mutes: Senyapkan + mutes: Redaman notifications: Pemberitahuan push: Pemberitahuan segera reports: Laporan @@ -173,7 +173,7 @@ ms: read:filters: lihat penapis anda read:follows: lihat senarai yang anda ikuti read:lists: lihat senarai anda - read:mutes: lihat senarai yang anda senyapkan + read:mutes: lihat redamanku read:notifications: lihat notifikasi anda read:reports: lihat laporan anda read:search: cari bagi pihak anda @@ -182,13 +182,13 @@ ms: write:accounts: ubaisuai profail anda write:blocks: domain dan akaun blok write:bookmarks: menandabuku hantaran - write:conversations: senyapkan dan padamkan perbualan + write:conversations: redamkan dan padamkan perbualan write:favourites: hantaran disukai write:filters: cipta penapis write:follows: ikut orang write:lists: cipta senarai write:media: memuat naik fail media - write:mutes: membisukan orang dan perbualan + write:mutes: redamkan orang dan perbualan write:notifications: kosongkan pemberitahuan anda write:reports: melaporkan orang lain write:statuses: terbitkan hantaran diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index dd92aed5f6..ab3d307fd8 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -319,6 +319,7 @@ es-AR: create: Crear anuncio title: Nuevo anuncio preview: + disclaimer: Como los usuarios no pueden excluirse de ellas, las notificaciones por correo electrónico deberían limitarse a anuncios importantes como la violación de datos personales o las notificaciones de cierre del servidor. explanation_html: 'El correo electrónico se enviará a %{display_count} usuarios. En el correo electrónico se incluirá el siguiente texto:' title: Previsualizar la notificación del anuncio publish: Publicar diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index a9192740fe..3032b663a1 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -319,6 +319,7 @@ es-MX: create: Crear anuncio title: Nuevo anuncio preview: + disclaimer: Como los usuarios no pueden optar por no recibirlas, las notificaciones por correo electrónico deben limitarse a anuncios importantes, como la violación de datos personales o las notificaciones de cierre de servidores. explanation_html: 'El correo electrónico se enviará a %{display_count} usuarios. En el correo electrónico se incluirá el siguiente texto:' title: Vista previa de la notificación del anuncio publish: Publicar diff --git a/config/locales/es.yml b/config/locales/es.yml index ed09dfb76b..9e0feb9d18 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -3,7 +3,7 @@ es: about: about_mastodon_html: 'La red social del futuro: ¡Sin anuncios, sin vigilancia corporativa, diseño ético, y descentralización! ¡Sé dueño de tu información con Mastodon!' contact_missing: No establecido - contact_unavailable: No disponible + contact_unavailable: N/D hosted_on: Mastodon alojado en %{domain} title: Acerca de accounts: @@ -319,6 +319,7 @@ es: create: Crear anuncio title: Nuevo anuncio preview: + disclaimer: Como los usuarios no pueden optar por no recibirlas, las notificaciones por correo electrónico deben limitarse a anuncios importantes, como la violación de datos personales o las notificaciones de cierre de servidores. explanation_html: 'El correo electrónico se enviará a %{display_count} usuarios. En el correo electrónico se incluirá el siguiente texto:' title: Vista previa de la notificación del anuncio publish: Publicar diff --git a/config/locales/fi.yml b/config/locales/fi.yml index fcb180518f..9a5bf97afe 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -319,6 +319,7 @@ fi: create: Luo tiedote title: Uusi tiedote preview: + disclaimer: Koska käyttäjät eivät voi kieltäytyä niistä, sähköposti-ilmoitukset tulee rajata tärkeisiin tiedotteisiin, kuten ilmoituksiin henkilötietojen tietoturvaloukkauksista tai palvelimen sulkeutumisesta. explanation_html: "%{display_count} käyttäjälle lähetetään sähköpostia. Sähköpostiviestiin sisällytetään seuraava teksti:" title: Esikatsele tiedoteilmoitus publish: Julkaise diff --git a/config/locales/fo.yml b/config/locales/fo.yml index ec38374070..8e611c346d 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -319,6 +319,7 @@ fo: create: Stovna kunngerð title: Nýggj kunngerð preview: + disclaimer: Av tí at brúkarar ikki kunnu velja tær frá, eiga teldupostfráboðanir at vera avmarkaðar til týdningarmiklar kunngerðir, sosum trygdarbrot og boð um at ambætarin verður tikin niður. explanation_html: 'Teldubrævið verður sent til %{display_count} brúkarar. Fylgjandi tekstur kemur við í teldubrævið:' title: Undanvís fráboðan um kunngerð publish: Legg út diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index dd751c0678..e85952f91c 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -482,6 +482,15 @@ fr-CA: new: title: Importer des blocages de domaine no_file: Aucun fichier sélectionné + fasp: + providers: + registrations: + confirm: Confirmer + reject: Rejeter + save: Enregistrer + select_capabilities: Sélectionnez les Capacités + sign_in: Se connecter + status: État follow_recommendations: description_html: "Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée." language: Pour la langue diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 6ad2733f3e..25218bd019 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -482,6 +482,15 @@ fr: new: title: Importer des blocages de domaine no_file: Aucun fichier sélectionné + fasp: + providers: + registrations: + confirm: Confirmer + reject: Rejeter + save: Enregistrer + select_capabilities: Sélectionnez les Capacités + sign_in: Se connecter + status: État follow_recommendations: description_html: "Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée." language: Pour la langue diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 1da5c146c7..ed51799e8a 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -319,6 +319,7 @@ gl: create: Crear anuncio title: Novo anuncio preview: + disclaimer: As usuarias non poden omitilas, as notificiacións por correo deberían limitarse a anuncios importantes como fugas de datos personais ou notificación do cese do servizo. explanation_html: 'Vaise enviar o correo a %{display_count} usuarias. Incluirase o seguinte texto no correo:' title: Previsualización da notificación do anuncio publish: Publicar diff --git a/config/locales/he.yml b/config/locales/he.yml index 6d575bc564..457569d05a 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -325,6 +325,7 @@ he: create: יצירת הכרזה title: הכרזה חדשה preview: + disclaimer: כיוון שהמשתמשים לא יכולים לבטל אותם, הודעות דוא"ל צריכות להיות מוגבלות בשימוש להודעות חשובות כגון הודעות על גניבת מידע אישי או הודעות על סגירת השרת. explanation_html: 'הדואל ישלח אל %{display_count} משתמשיםות. להלן המלל שישלח בדואל:' title: צפיה מקדימה בהודעה publish: פרסום diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 272dc0eb21..ef5d8d97e6 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -319,6 +319,7 @@ hu: create: Közlemény létrehozása title: Új közlemény preview: + disclaimer: Mivel a felhasználók nem iratkozhatnak le róluk, az e-mailes értesítéseket érdemes a fontos bejelentésekre korlátozni, mint a személyes adatokat érintő adatvédelmi incidensek vagy a kiszolgáló bezárására vonatkozó értesítések. explanation_html: 'Az e-mail %{display_count} felhasználónak lesz elküldve. A következő szöveg fog szerepelni a levélben:' title: Közleményértesítés előnézete publish: Közzététel diff --git a/config/locales/is.yml b/config/locales/is.yml index ef407a6a0e..0516fa4eb8 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -319,6 +319,7 @@ is: create: Búa til auglýsingu title: Ný auglýsing preview: + disclaimer: Þar sem notendur geta ekki afþakkað þær ætti aðeins að nota tilkynningar í tölvupósti fyrir mikilvægar upplýsingar á borð við persónuleg gagnabrot eða lokanir á netþjónum. explanation_html: 'Tölvupósturinn verður sendur til %{display_count} notenda. Eftirfarandi texti verður í meginmáli póstsins:' title: Forskoða tilkynninguna publish: Birta diff --git a/config/locales/ko.yml b/config/locales/ko.yml index c4ba1fa9e7..1ce5ef2da9 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -316,6 +316,7 @@ ko: create: 공지사항 생성 title: 새 공지사항 preview: + disclaimer: 사용자들은 수신설정을 끌 수 없기 때문에 이메일 알림은 개인정보 유출이나 서버 종료와 같은 중요한 공지사항에만 사용해야 합니다. explanation_html: "%{display_count} 명의 사용자에게 이메일이 발송됩니다. 다음 내용이 이메일에 포함됩니다:" title: 공지사항 알림 미리보기 publish: 게시 diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 7fc8adcf41..68f4e872b6 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -28,6 +28,7 @@ ms: created_msg: Catatan penyederhanaan telah berjaya dicipta! destroyed_msg: Catatan penyederhanaan telah berjaya dipadam! accounts: + add_email_domain_block: Sekat domain e-mel approve: Luluskan approved_msg: Berjaya meluluskan permohonan pendaftaran %{username} are_you_sure: Adakah anda pasti? @@ -146,7 +147,7 @@ ms: suspension_irreversible: Data akaun ini telah dipadam secara kekal. Anda boleh nyahgantungkannya untuk membuatkan akaun ini boleh digunakan semula tetapi data lama tidak akan diperolehi. suspension_reversible_hint_html: Akaun ini telah digantung, dan datanya akan dibuang pada %{date}. Sebelum tarikh itu, akaun ini boleh diperoleh semula tanpa kesan buruk. Jika anda mahu memadamkan kesemua data akaun ini serta-merta, anda boleh melakukannya di bawah. title: Akaun - unblock_email: Menyahsekat alamat e-mel + unblock_email: Nyahsekat alamat e-mel unblocked_email_msg: Alamat e-mel %{username} berjaya dinyahsekat unconfirmed_email: E-mel belum disahkan undo_sensitized: Nyahtanda sensitif @@ -169,17 +170,21 @@ ms: confirm_user: Sahkan Pengguna create_account_warning: Cipta Amaran create_announcement: Cipta Pengumuman + create_canonical_email_block: Cipta Penyekatan E-mel create_custom_emoji: Cipta Emoji Tersendiri create_domain_allow: Cipta Pelepasan Domain create_domain_block: Cipta Penyekatan Domain + create_email_domain_block: Cipta Penyekatan Domain E-mel create_ip_block: Cipta peraturan alamat IP create_unavailable_domain: Cipta Domain Tidak Tersedia create_user_role: Cipta Peranan demote_user: Turunkan Taraf Pengguna destroy_announcement: Padam Pengumuman + destroy_canonical_email_block: Padam Penyekatan E-mel destroy_custom_emoji: Padam Emoji Tersendiri destroy_domain_allow: Padam Pelepasan Domain destroy_domain_block: Padam Penyekatan Domain + destroy_email_domain_block: Padam Penyekatan Domain E-mel destroy_instance: Padamkan Domain destroy_ip_block: Padam peraturan alamat IP destroy_status: Padam Hantaran @@ -203,7 +208,7 @@ ms: silence_account: Diamkan Akaun suspend_account: Gantungkan Akaun unassigned_report: Menyahtugaskan Laporan - unblock_email_account: Menyahsekat alamat e-mel + unblock_email_account: Nyahsekat alamat e-mel unsensitive_account: Nyahtanda media di akaun anda sebagai sensitif unsilence_account: Nyahdiamkan Akaun unsuspend_account: Nyahgantungkan Akaun @@ -1144,7 +1149,7 @@ ms: csv: CSV domain_blocks: Domain disekat lists: Senarai - mutes: Awak bisu + mutes: Redaman anda storage: Storan Media featured_tags: add_new: Tambah baharu @@ -1235,10 +1240,11 @@ ms: domain_blocking: Mengimport domain yang disekat following: Mengimport akaun diikuti lists: Mengimport senarai - muting: Mengimport akaun diredam + muting: Mengimport akaun teredam type: Jenis import type_groups: constructive: Ikutan & Penanda Halaman + destructive: Sekatan dan redaman types: blocking: Senarai menyekat bookmarks: Penanda buku diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 84608307d4..5acd93ca13 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -319,6 +319,7 @@ nl: create: Mededeling aanmaken title: Nieuwe mededeling preview: + disclaimer: Omdat gebruikers zich niet voor deze e-mails kunnen afmelden, moeten e-mailmeldingen worden beperkt tot belangrijke aankondigingen, zoals het lekken van gebruikersgegevens of meldingen over het sluiten van deze server. explanation_html: 'De e-mail wordt verzonden naar %{display_count} gebruikers. De volgende tekst wordt in het bericht opgenomen:' title: Voorbeeld van mededeling publish: Inschakelen diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index a823604584..661028fff0 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -146,6 +146,7 @@ ko: min_age: 관할지역의 법률에서 요구하는 최저 연령보다 작으면 안 됩니다. user: chosen_languages: 체크하면, 선택 된 언어로 작성된 게시물들만 공개 타임라인에 보여집니다 + date_of_birth: 마스토돈을 사용하려면 %{age}세 이상임을 확인해야 합니다. 이 정보는 저장되지 않습니다. role: 역할은 사용자가 어떤 권한을 가지게 될 지 결정합니다. user_role: color: 색상은 사용자 인터페이스에서 역할을 나타내기 위해 사용되며, RGB 16진수 형식입니다 diff --git a/config/locales/sq.yml b/config/locales/sq.yml index dd96ddb88d..01884c10e9 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -319,6 +319,7 @@ sq: create: Krijoni lajmërim title: Lajmërim i ri preview: + disclaimer: Ngaqë përdoruesit s’mund të zgjedhin lënien jashtë tyre, njoftimet me email do të kufizohen te njoftime të rëndësishme, të tilla si cenim të dhënash personale, ose njoftime mbylljesh shërbyesish. explanation_html: 'Email-i do të dërgohet te %{display_count} përdorues. Te email-i do të përfshihet teksti vijues:' title: Bëni paraparje të shënimit për njoftimin publish: Publikoje diff --git a/config/locales/tr.yml b/config/locales/tr.yml index d943462d0c..751e6ae22f 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -319,6 +319,7 @@ tr: create: Duyuru oluştur title: Yeni duyuru preview: + disclaimer: Kullanıcılar bu bildirimleri almayı iptal edemediği için, e-posta bildirimleri kişisel veri ihlali veya sunucu kapatma bildirimleri gibi önemli duyurularla sınırlandırılmalıdır. explanation_html: 'E-posta, %{display_count} kullanıcıya gönderilecektir. E-posta içerisinde aşağıdaki metin yer alacaktır:' title: Duyuru bildiriminin önizlemesine bak publish: Yayınla diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 788c84fb27..0256773d32 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -325,6 +325,7 @@ uk: create: Створити оголошення title: Нове оголошення preview: + disclaimer: Оскільки користувачі не можуть відмовитися від них, сповіщення по електронній пошті повинні обмежуватися важливими оголошеннями, такими як порушення особистих даних або повідомлення про закриття серверу. explanation_html: 'Електронний лист буде надіслано %{display_count} користувачам. До електронного листа буде включено такий текст:' title: Попередній перегляд сповіщення publish: Опублікувати diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 25f423d37a..a255973a10 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -316,6 +316,7 @@ vi: create: Tạo thông báo title: Tạo thông báo mới preview: + disclaimer: Vì người dùng không thể chọn không nhận thông báo qua email nên thông báo qua email chỉ nên giới hạn ở những thông báo quan trọng như thông báo vi phạm dữ liệu cá nhân hoặc thông báo đóng máy chủ. explanation_html: 'Gửi email tới %{display_count} thành viên. Nội dung sau đây sẽ được đưa vào email:' title: Xem trước thông báo sẽ gửi publish: Đăng diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 5542975143..3b87654041 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -316,6 +316,7 @@ zh-CN: create: 创建公告 title: 新公告 preview: + disclaimer: 由于用户无法选择退出,电子邮件通知应仅限于重要公告,例如个人数据泄露或服务器关闭通知。 explanation_html: 此电子邮件将发送给 %{display_count} 用户。电子邮件将包含以下文本: title: 预览公告通知 publish: 发布 @@ -471,6 +472,30 @@ zh-CN: new: title: 导入域名列表 no_file: 没有选择文件 + fasp: + debug: + callbacks: + created_at: 创建于 + delete: 刪除 + ip: IP 地址 + request_body: 请求正文 + title: 调试回调 + providers: + active: 有效 + base_url: 基础 URL + callback: 回调 + delete: 刪除 + edit: 编辑提供商 + finish_registration: 完成注册 + name: 名称 + providers: 提供商 + public_key_fingerprint: 公钥指纹 + registrations: + confirm: 确认 + reject: 拒绝 + save: 保存 + sign_in: 登录 + status: 状态 follow_recommendations: description_html: "“关注推荐”可帮助新用户快速找到有趣的内容。 当用户与他人的互动不足以形成个性化的建议时,就会推荐关注这些账号。推荐会每日更新,基于选定语言的近期最高互动数和最多本站关注者数综合评估得出。" language: 选择语言 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 029aa33214..fae08b3216 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -316,6 +316,7 @@ zh-TW: create: 新增公告 title: 新增公告 preview: + disclaimer: 由於使用者無法選擇退出,電子郵件通知應僅限於重要公告,例如個人資料洩露或伺服器關閉通知。 explanation_html: 此 email 將寄至 %{display_count} 名使用者。以下文字將被包含於 e-mail 中: title: 預覽公告通知 publish: 發布 diff --git a/config/routes/api.rb b/config/routes/api.rb index c7be8c8e45..8fb8f5d0af 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -190,6 +190,7 @@ namespace :api, format: false do resources :lists, only: :index resources :identity_proofs, only: :index resources :featured_tags, only: :index + resources :endorsements, only: :index end member do @@ -203,8 +204,10 @@ namespace :api, format: false do end scope module: :accounts do - resource :pin, only: :create - post :unpin, to: 'pins#destroy' + post :pin, to: 'endorsements#create' + post :endorse, to: 'endorsements#create' + post :unpin, to: 'endorsements#destroy' + post :unendorse, to: 'endorsements#destroy' resource :note, only: :create end end diff --git a/package.json b/package.json index cd4eb712d7..b0a5382aee 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.8.1", + "packageManager": "yarn@4.9.1", "engines": { "node": ">=18" }, diff --git a/spec/requests/api/v1/accounts/pins_spec.rb b/spec/requests/api/v1/accounts/endorsements_spec.rb similarity index 57% rename from spec/requests/api/v1/accounts/pins_spec.rb rename to spec/requests/api/v1/accounts/endorsements_spec.rb index 8ebcb27d28..6e0996a1f1 100644 --- a/spec/requests/api/v1/accounts/pins_spec.rb +++ b/spec/requests/api/v1/accounts/endorsements_spec.rb @@ -13,8 +13,30 @@ RSpec.describe 'Accounts Pins API' do kevin.account.followers << user.account end - describe 'POST /api/v1/accounts/:account_id/pin' do - subject { post "/api/v1/accounts/#{kevin.account.id}/pin", headers: headers } + describe 'GET /api/v1/accounts/:account_id/endorsements' do + subject { get "/api/v1/accounts/#{user.account.id}/endorsements", headers: headers } + + let(:scopes) { 'read:accounts' } + + before do + user.account.endorsed_accounts << kevin.account + end + + it 'returns the expected accounts', :aggregate_failures do + subject + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body) + .to contain_exactly( + hash_including(id: kevin.account_id.to_s) + ) + end + end + + describe 'POST /api/v1/accounts/:account_id/endorse' do + subject { post "/api/v1/accounts/#{kevin.account.id}/endorse", headers: headers } it 'creates account_pin', :aggregate_failures do expect do @@ -26,8 +48,8 @@ RSpec.describe 'Accounts Pins API' do end end - describe 'POST /api/v1/accounts/:account_id/unpin' do - subject { post "/api/v1/accounts/#{kevin.account.id}/unpin", headers: headers } + describe 'POST /api/v1/accounts/:account_id/unendorse' do + subject { post "/api/v1/accounts/#{kevin.account.id}/unendorse", headers: headers } before do Fabricate(:account_pin, account: user.account, target_account: kevin.account) diff --git a/spec/requests/api/v1/lists_spec.rb b/spec/requests/api/v1/lists_spec.rb index 20f27a7431..226632c5ac 100644 --- a/spec/requests/api/v1/lists_spec.rb +++ b/spec/requests/api/v1/lists_spec.rb @@ -132,9 +132,12 @@ RSpec.describe 'Lists' do it 'returns http unprocessable entity' do subject - expect(response).to have_http_status(422) + expect(response) + .to have_http_status(422) expect(response.content_type) .to start_with('application/json') + expect(response.parsed_body) + .to include(error: /Replies policy is not included/) end end end diff --git a/spec/requests/api/v2/filters_spec.rb b/spec/requests/api/v2/filters_spec.rb index 3b5c44cefa..304afc7bd8 100644 --- a/spec/requests/api/v2/filters_spec.rb +++ b/spec/requests/api/v2/filters_spec.rb @@ -115,6 +115,21 @@ RSpec.describe 'Filters' do .to start_with('application/json') end end + + context 'when the given filter_action value is invalid' do + let(:params) { { title: 'magic', filter_action: 'imaginary_value', keywords_attributes: [keyword: 'magic'] } } + + it 'returns http unprocessable entity' do + subject + + expect(response) + .to have_http_status(422) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body) + .to include(error: /Action is not included/) + end + end end describe 'GET /api/v2/filters/:id' do diff --git a/streaming/package.json b/streaming/package.json index f376b89c3a..fa33b575db 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/streaming", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.8.1", + "packageManager": "yarn@4.9.1", "engines": { "node": ">=18" }, diff --git a/yarn.lock b/yarn.lock index 5ad52872a3..79ffcc5b9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7274,10 +7274,10 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3": - version: 10.4.3 - resolution: "decimal.js@npm:10.4.3" - checksum: 10c0/6d60206689ff0911f0ce968d40f163304a6c1bc739927758e6efc7921cfa630130388966f16bf6ef6b838cb33679fbe8e7a78a2f3c478afce841fd55ac8fb8ee +"decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3, decimal.js@npm:^10.5.0": + version: 10.5.0 + resolution: "decimal.js@npm:10.5.0" + checksum: 10c0/785c35279df32762143914668df35948920b6c1c259b933e0519a69b7003fc0a5ed2a766b1e1dda02574450c566b21738a45f15e274b47c2ac02072c0d1f3ac3 languageName: node linkType: hard @@ -8996,7 +8996,7 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0, form-data@npm:^4.0.1": +"form-data@npm:^4.0.0": version: 4.0.1 resolution: "form-data@npm:4.0.1" dependencies: @@ -10092,8 +10092,8 @@ __metadata: linkType: hard "ioredis@npm:^5.3.2": - version: 5.6.0 - resolution: "ioredis@npm:5.6.0" + version: 5.6.1 + resolution: "ioredis@npm:5.6.1" dependencies: "@ioredis/commands": "npm:^1.1.1" cluster-key-slot: "npm:^1.1.0" @@ -10104,7 +10104,7 @@ __metadata: redis-errors: "npm:^1.2.0" redis-parser: "npm:^3.0.0" standard-as-callback: "npm:^2.1.0" - checksum: 10c0/a885e5146640fc448706871290ef424ffa39af561f7ee3cf1590085209a509f85e99082bdaaf3cd32fa66758aea3fc2055d1109648ddca96fac4944bf2092c30 + checksum: 10c0/26ae49cf448e807e454a9bdea5a9dfdcf669e2fdbf2df341900a0fb693c5662fea7e39db3227ce8972d1bda0ba7da9b7410e5163b12d8878a579548d847220ac languageName: node linkType: hard @@ -11373,13 +11373,12 @@ __metadata: linkType: hard "jsdom@npm:^26.0.0": - version: 26.0.0 - resolution: "jsdom@npm:26.0.0" + version: 26.1.0 + resolution: "jsdom@npm:26.1.0" dependencies: cssstyle: "npm:^4.2.1" data-urls: "npm:^5.0.0" - decimal.js: "npm:^10.4.3" - form-data: "npm:^4.0.1" + decimal.js: "npm:^10.5.0" html-encoding-sniffer: "npm:^4.0.0" http-proxy-agent: "npm:^7.0.2" https-proxy-agent: "npm:^7.0.6" @@ -11389,12 +11388,12 @@ __metadata: rrweb-cssom: "npm:^0.8.0" saxes: "npm:^6.0.0" symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^5.0.0" + tough-cookie: "npm:^5.1.1" w3c-xmlserializer: "npm:^5.0.0" webidl-conversions: "npm:^7.0.0" whatwg-encoding: "npm:^3.1.1" whatwg-mimetype: "npm:^4.0.0" - whatwg-url: "npm:^14.1.0" + whatwg-url: "npm:^14.1.1" ws: "npm:^8.18.0" xml-name-validator: "npm:^5.0.0" peerDependencies: @@ -11402,7 +11401,7 @@ __metadata: peerDependenciesMeta: canvas: optional: true - checksum: 10c0/e48725ba4027edcfc9bca5799eaec72c6561ecffe3675a8ff87fe9c3541ca4ff9f82b4eff5b3d9c527302da0d859b2f60e9364347a5d42b77f5c76c436c569dc + checksum: 10c0/5b14a5bc32ce077a06fb42d1ab95b1191afa5cbbce8859e3b96831c5143becbbcbf0511d4d4934e922d2901443ced2cdc3b734c1cf30b5f73b3e067ce457d0f4 languageName: node linkType: hard @@ -12001,9 +12000,9 @@ __metadata: linkType: hard "marky@npm:^1.2.5": - version: 1.2.5 - resolution: "marky@npm:1.2.5" - checksum: 10c0/ca8a011f287dab1ac3291df720fc32b366c4cd767347b63722966650405ce71ec6566f71d1e22e1768bf6461a7fd689b9038e7df0fcfb62eacf3a5a6dcac249e + version: 1.3.0 + resolution: "marky@npm:1.3.0" + checksum: 10c0/6619cdb132fdc4f7cd3e2bed6eebf81a38e50ff4b426bbfb354db68731e4adfebf35ebfd7c8e5a6e846cbf9b872588c4f76db25782caee8c1529ec9d483bf98b languageName: node linkType: hard @@ -17446,12 +17445,12 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^5.0.0": - version: 5.0.0 - resolution: "tough-cookie@npm:5.0.0" +"tough-cookie@npm:^5.1.1": + version: 5.1.2 + resolution: "tough-cookie@npm:5.1.2" dependencies: tldts: "npm:^6.1.32" - checksum: 10c0/4a69c885bf6f45c5a64e60262af99e8c0d58a33bd3d0ce5da62121eeb9c00996d0128a72df8fc4614cbde59cc8b70aa3e21e4c3c98c2bbde137d7aba7fa00124 + checksum: 10c0/5f95023a47de0f30a902bba951664b359725597d8adeabc66a0b93a931c3af801e1e697dae4b8c21a012056c0ea88bd2bf4dfe66b2adcf8e2f42cd9796fe0626 languageName: node linkType: hard @@ -17480,12 +17479,12 @@ __metadata: languageName: node linkType: hard -"tr46@npm:^5.0.0": - version: 5.0.0 - resolution: "tr46@npm:5.0.0" +"tr46@npm:^5.1.0": + version: 5.1.0 + resolution: "tr46@npm:5.1.0" dependencies: punycode: "npm:^2.3.1" - checksum: 10c0/1521b6e7bbc8adc825c4561480f9fe48eb2276c81335eed9fa610aa4c44a48a3221f78b10e5f18b875769eb3413e30efbf209ed556a17a42aa8d690df44b7bee + checksum: 10c0/d761f7144e0cb296187674ef245c74f761e334d7cf25ca73ef60e4c72c097c75051031c093fa1a2fee04b904977b316716a7915854bcae8fb1a371746513cbe8 languageName: node linkType: hard @@ -18520,13 +18519,13 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.0": - version: 14.1.0 - resolution: "whatwg-url@npm:14.1.0" +"whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.1": + version: 14.2.0 + resolution: "whatwg-url@npm:14.2.0" dependencies: - tr46: "npm:^5.0.0" + tr46: "npm:^5.1.0" webidl-conversions: "npm:^7.0.0" - checksum: 10c0/f00104f1c67ce086ba8ffedab529cbbd9aefd8c0a6555320026de7aeff31f91c38680f95818b140a7c9cc657cde3781e567835dda552ddb1e2b8faaba0ac3cb6 + checksum: 10c0/f746fc2f4c906607d09537de1227b13f9494c171141e5427ed7d2c0dd0b6a48b43d8e71abaae57d368d0c06b673fd8ec63550b32ad5ed64990c7b0266c2b4272 languageName: node linkType: hard