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