mirror of
https://github.com/mastodon/mastodon.git
synced 2025-07-14 08:18:15 +00:00
Compare commits
33 Commits
0c39277b55
...
5b8adcb51a
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5b8adcb51a | ||
![]() |
88190b4558 | ||
![]() |
fdaab4fc13 | ||
![]() |
c442589593 | ||
![]() |
28633a504a | ||
![]() |
ad78701b6f | ||
![]() |
1496488771 | ||
![]() |
dd3d958e75 | ||
![]() |
b363a3651d | ||
![]() |
86645fc14c | ||
![]() |
f9beecb343 | ||
![]() |
4ecfbd3920 | ||
![]() |
a315934314 | ||
![]() |
e9170e2de1 | ||
![]() |
5cfc1fabcf | ||
![]() |
786b12e379 | ||
![]() |
e7c5c25de8 | ||
![]() |
a1e8813522 | ||
![]() |
76c1446416 | ||
![]() |
8bd2c87399 | ||
![]() |
1e2d77f2c7 | ||
![]() |
fb6c22f5c2 | ||
![]() |
f7259f625f | ||
![]() |
b628a98d32 | ||
![]() |
d8fa807998 | ||
![]() |
ef66d8379c | ||
![]() |
8ee6cee36e | ||
![]() |
71b2120e5c | ||
![]() |
b10078633c | ||
![]() |
b5eebd4d2b | ||
![]() |
fdefc4d2b4 | ||
![]() |
f6b2609353 | ||
![]() |
bdffdcb12f |
1
.github/workflows/crowdin-upload.yml
vendored
1
.github/workflows/crowdin-upload.yml
vendored
|
@ -14,6 +14,7 @@ on:
|
|||
- config/locales/devise.en.yml
|
||||
- config/locales/doorkeeper.en.yml
|
||||
- .github/workflows/crowdin-upload.yml
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
upload-translations:
|
||||
|
|
21
CHANGELOG.md
21
CHANGELOG.md
|
@ -2,7 +2,17 @@
|
|||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [4.4.0] - UNRELEASED
|
||||
## [4.4.1] - 2025-07-09
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix nearly every sub-directory being crawled as part of Vite build (#35323 by @ClearlyClaire)
|
||||
- Fix assets not building when Redis is unavailable (#35321 by @oneiros)
|
||||
- Fix replying from media modal or pop-in-player tagging user `@undefined` (#35317 by @ClearlyClaire)
|
||||
- Fix support for special characters in various environment variables (#35314 by @mjankowski and @ClearlyClaire)
|
||||
- Fix some database migrations failing for indexes manually removed by admins (#35309 by @mjankowski)
|
||||
|
||||
## [4.4.0] - 2025-07-08
|
||||
|
||||
### Added
|
||||
|
||||
|
@ -38,7 +48,7 @@ All notable changes to this project will be documented in this file.
|
|||
Server administrators can now chose to opt in to transmit referrer information when following an external link. Only the domain name is transmitted, not the referrer path.
|
||||
- Add double tap to zoom and swipe to dismiss to media modal in web UI (#34210 by @Gargron)
|
||||
- Add link from Web UI for Hashtags to the Moderation UI (#31448 by @ThisIsMissEm)
|
||||
- **Add terms of service** (#33055, #33233, #33230, #33703, #33699, #33994, #33993, #34105, #34122, #34200, #34527, #35053, #35115, #35126 and #35127 by @ClearlyClaire, @Gargron, @mjankowski, and @oneiros)\
|
||||
- **Add terms of service** (#33055, #33233, #33230, #33703, #33699, #33994, #33993, #34105, #34122, #34200, #34527, #35053, #35115, #35126, #35127 and #35233 by @ClearlyClaire, @Gargron, @mjankowski, and @oneiros)\
|
||||
Server administrators can now fill in Terms of Service and notify their users of upcoming changes.
|
||||
- Add optional bulk mailer settings (#35191 and #35203 by @oneiros)\
|
||||
This adds the optional environment variables `BULK_SMTP_PORT`, `BULK_SMTP_SERVER`, `BULK_SMTP_LOGIN` and so on analogous to `SMTP_PORT`, `SMTP_SERVER`, `SMTP_LOGIN` and related SMTP configuration environment variables.\
|
||||
|
@ -51,7 +61,7 @@ All notable changes to this project will be documented in this file.
|
|||
- Add ability to dismiss alt text badge by tapping it in web UI (#33737 by @Gargron)
|
||||
- Add loading indicator to timeline gap indicators in web UI (#33762 by @Gargron)
|
||||
- Add interaction modal when trying to interact with a poll while logged out (#32609 by @ThisIsMissEm)
|
||||
- **Add experimental FASP support** (#34031, #34415, #34765, #34965, #34964, #34033 and #35218 by @oneiros)\
|
||||
- **Add experimental FASP support** (#34031, #34415, #34765, #34965, #34964, #34033, #35218, #35262 and #35263 by @oneiros)\
|
||||
This is a first step towards supporting “Fediverse Auxiliary Service Providers” (https://github.com/mastodon/fediverse_auxiliary_service_provider_specifications). This is mostly interesting to developers who would like to implement their own FASP, but also includes the capability to share data with a discovery provider (see https://www.fediscovery.org).
|
||||
- Add ability for admins to send announcements to all users via email (#33928 and #34411 by @ClearlyClaire)\
|
||||
This is meant for critical announcements only, as this will potentially send a lot of emails and cannot be opted out of by users.
|
||||
|
@ -64,7 +74,7 @@ All notable changes to this project will be documented in this file.
|
|||
- Add dropdown menu with quick actions to lists of accounts in web UI (#34391, #34709, and #34767 by @Gargron, @diondiondion, and @mkljczk)
|
||||
- Add support for displaying “year in review” notification in web UI (#32710, #32765, #32709, #32807, #32914, #33148, and #33882 by @Gargron and @mjankowski)\
|
||||
Note that the notification is currently not generated automatically, and at the moment requires a manual undocumented administrator action.
|
||||
- Add experimental support for receiving HTTP Message Signatures (RFC9421) (#34814, #35033 and #35109 by @oneiros)\
|
||||
- Add experimental support for receiving HTTP Message Signatures (RFC9421) (#34814, #35033, #35109 and #35278 by @oneiros)\
|
||||
For now, this needs to be explicitly enabled through the `http_message_signatures` feature flag (`EXPERIMENTAL_FEATURES=http_message_signatures`). This currently only covers verifying such signatures (inbound HTTP requests), not issuing them (outbound HTTP requests).
|
||||
- Add experimental Async Refreshes API (#34918 by @oneiros)
|
||||
- Add experimental server-side feature to fetch remote replies (#32615, #34147, #34149, #34151, #34615, #34682, and #34702 by @ClearlyClaire and @sneakers-the-rat)\
|
||||
|
@ -218,6 +228,7 @@ All notable changes to this project will be documented in this file.
|
|||
- Fix admin dashboard crash on specific Elasticsearch connection errors (#34683 by @ClearlyClaire)
|
||||
- Fix OIDC account creation failing for long display names (#34639 by @defnull)
|
||||
- Fix use of the deprecated `/api/v1/instance` endpoint in the moderation interface (#34613 by @renchap)
|
||||
- Fix inaccessible “Clear search” button (#35152 and #35281 by @diondiondion)
|
||||
- Fix search operators sometimes getting lost (#35190 by @ClearlyClaire)
|
||||
- Fix directory scroll position reset (#34560 by @przucidlo)
|
||||
- Fix needlessly complex SVG paths for oEmbed and logo (#34538 by @edent)
|
||||
|
@ -232,7 +243,7 @@ All notable changes to this project will be documented in this file.
|
|||
- Fix extra space under left-indented vertical videos (#34313 by @ClearlyClaire)
|
||||
- Fix glitchy iOS media attachment drag interactions (#35057 by @diondiondion)
|
||||
- Fix zoomed images being blurry in Safari (#35052 by @diondiondion)
|
||||
- Fix redundant focus stop within status component in Web UI and make focus style more noticeable (#35037, #35051, #35096 and #35150 by @diondiondion)
|
||||
- Fix redundant focus stop within status component in Web UI and make focus style more noticeable (#35037, #35051, #35096, #35150 and #35251 by @diondiondion)
|
||||
- Fix digits in media player time readout not having a consistent width (#35038 by @diondiondion)
|
||||
- Fix wrong text color for “Open in advanced web interface” banner in high-contrast theme (#35032 by @diondiondion)
|
||||
- Fix hover card for limited accounts not hiding information as expected (#35024 by @diondiondion)
|
||||
|
|
|
@ -186,7 +186,7 @@ FROM build AS libvips
|
|||
|
||||
# libvips version to compile, change with [--build-arg VIPS_VERSION="8.15.2"]
|
||||
# renovate: datasource=github-releases depName=libvips packageName=libvips/libvips
|
||||
ARG VIPS_VERSION=8.17.0
|
||||
ARG VIPS_VERSION=8.17.1
|
||||
# libvips download URL, change with [--build-arg VIPS_URL="https://github.com/libvips/libvips/releases/download"]
|
||||
ARG VIPS_URL=https://github.com/libvips/libvips/releases/download
|
||||
|
||||
|
|
2
Gemfile
2
Gemfile
|
@ -62,7 +62,7 @@ gem 'inline_svg'
|
|||
gem 'irb', '~> 1.8'
|
||||
gem 'kaminari', '~> 1.2'
|
||||
gem 'link_header', '~> 0.0'
|
||||
gem 'linzer', '~> 0.7.2'
|
||||
gem 'linzer', '~> 0.7.7'
|
||||
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
||||
gem 'mime-types', '~> 3.7.0', require: 'mime/types/columnar'
|
||||
gem 'mutex_m'
|
||||
|
|
|
@ -365,7 +365,7 @@ GEM
|
|||
json-ld-preloaded (3.3.1)
|
||||
json-ld (~> 3.3)
|
||||
rdf (~> 3.3)
|
||||
json-schema (5.1.1)
|
||||
json-schema (5.2.1)
|
||||
addressable (~> 2.8)
|
||||
bigdecimal (~> 3.1)
|
||||
jsonapi-renderer (0.2.2)
|
||||
|
@ -403,7 +403,7 @@ GEM
|
|||
rexml
|
||||
link_header (0.0.8)
|
||||
lint_roller (1.1.0)
|
||||
linzer (0.7.3)
|
||||
linzer (0.7.7)
|
||||
cgi (~> 0.4.2)
|
||||
forwardable (~> 1.3, >= 1.3.3)
|
||||
logger (~> 1.7, >= 1.7.0)
|
||||
|
@ -761,7 +761,7 @@ GEM
|
|||
rspec-mocks (~> 3.0)
|
||||
sidekiq (>= 5, < 9)
|
||||
rspec-support (3.13.4)
|
||||
rubocop (1.77.0)
|
||||
rubocop (1.78.0)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (~> 3.17.0.2)
|
||||
lint_roller (~> 1.1.0)
|
||||
|
@ -1007,7 +1007,7 @@ DEPENDENCIES
|
|||
letter_opener (~> 1.8)
|
||||
letter_opener_web (~> 3.0)
|
||||
link_header (~> 0.0)
|
||||
linzer (~> 0.7.2)
|
||||
linzer (~> 0.7.7)
|
||||
lograge (~> 0.12)
|
||||
mail (~> 2.8)
|
||||
mario-redis-lock (~> 1.2)
|
||||
|
|
|
@ -14,7 +14,8 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
|
|||
## Supported Versions
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | --------- |
|
||||
| ------- | ---------------- |
|
||||
| 4.4.x | Yes |
|
||||
| 4.3.x | Yes |
|
||||
| 4.2.x | Yes |
|
||||
| 4.2.x | Until 2026-01-08 |
|
||||
| < 4.2 | No |
|
||||
|
|
|
@ -64,6 +64,9 @@ module SignatureVerification
|
|||
return (@signed_request_actor = actor) if signed_request.verified?(actor)
|
||||
|
||||
fail_with! "Verification failed for #{actor.to_log_human_identifier} #{actor.uri}"
|
||||
rescue Mastodon::MalformedHeaderError => e
|
||||
@signature_verification_failure_code = 400
|
||||
fail_with! e.message
|
||||
rescue Mastodon::SignatureVerificationError => e
|
||||
fail_with! e.message
|
||||
rescue *Mastodon::HTTP_CONNECTION_ERRORS => e
|
||||
|
|
|
@ -66,7 +66,7 @@ module ApplicationHelper
|
|||
|
||||
def provider_sign_in_link(provider)
|
||||
label = Devise.omniauth_configs[provider]&.strategy&.display_name.presence || I18n.t("auth.providers.#{provider}", default: provider.to_s.chomp('_oauth2').capitalize)
|
||||
link_to label, omniauth_authorize_path(:user, provider), class: "button button-#{provider}", method: :post
|
||||
link_to label, omniauth_authorize_path(:user, provider), class: "btn button-#{provider}", method: :post
|
||||
end
|
||||
|
||||
def locale_direction
|
||||
|
|
|
@ -47,10 +47,6 @@ const labelForRecentSearch = (search: RecentSearch) => {
|
|||
}
|
||||
};
|
||||
|
||||
const unfocus = () => {
|
||||
document.querySelector('.ui')?.parentElement?.focus();
|
||||
};
|
||||
|
||||
const ClearButton: React.FC<{
|
||||
onClick: () => void;
|
||||
hasValue: boolean;
|
||||
|
@ -107,6 +103,11 @@ export const Search: React.FC<{
|
|||
}, [initialValue]);
|
||||
const searchOptions: SearchOption[] = [];
|
||||
|
||||
const unfocus = useCallback(() => {
|
||||
document.querySelector('.ui')?.parentElement?.focus();
|
||||
setExpanded(false);
|
||||
}, []);
|
||||
|
||||
if (searchEnabled) {
|
||||
searchOptions.push(
|
||||
{
|
||||
|
@ -282,7 +283,7 @@ export const Search: React.FC<{
|
|||
history.push({ pathname: '/search', search: queryParams.toString() });
|
||||
unfocus();
|
||||
},
|
||||
[dispatch, history],
|
||||
[dispatch, history, unfocus],
|
||||
);
|
||||
|
||||
const handleChange = useCallback(
|
||||
|
@ -402,7 +403,7 @@ export const Search: React.FC<{
|
|||
|
||||
setQuickActions(newQuickActions);
|
||||
},
|
||||
[dispatch, history, signedIn, setValue, setQuickActions, submit],
|
||||
[signedIn, dispatch, unfocus, history, submit],
|
||||
);
|
||||
|
||||
const handleClear = useCallback(() => {
|
||||
|
@ -410,7 +411,7 @@ export const Search: React.FC<{
|
|||
setQuickActions([]);
|
||||
setSelectedOption(-1);
|
||||
unfocus();
|
||||
}, [setValue, setQuickActions, setSelectedOption]);
|
||||
}, [unfocus]);
|
||||
|
||||
const handleKeyDown = useCallback(
|
||||
(e: React.KeyboardEvent) => {
|
||||
|
@ -461,7 +462,7 @@ export const Search: React.FC<{
|
|||
break;
|
||||
}
|
||||
},
|
||||
[navigableOptions, value, selectedOption, setSelectedOption, submit],
|
||||
[unfocus, navigableOptions, selectedOption, submit, value],
|
||||
);
|
||||
|
||||
const handleFocus = useCallback(() => {
|
||||
|
@ -481,12 +482,38 @@ export const Search: React.FC<{
|
|||
}, [setExpanded, setSelectedOption, singleColumn]);
|
||||
|
||||
const handleBlur = useCallback(() => {
|
||||
setExpanded(false);
|
||||
setSelectedOption(-1);
|
||||
}, [setExpanded, setSelectedOption]);
|
||||
}, [setSelectedOption]);
|
||||
|
||||
const formRef = useRef<HTMLFormElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
// If the search popover is expanded, close it when tabbing or
|
||||
// clicking outside of it or the search form, while allowing
|
||||
// tabbing or clicking inside of the popover
|
||||
if (expanded) {
|
||||
function closeOnLeave(event: FocusEvent | MouseEvent) {
|
||||
const form = formRef.current;
|
||||
const isClickInsideForm =
|
||||
form &&
|
||||
(form === event.target || form.contains(event.target as Node));
|
||||
if (!isClickInsideForm) {
|
||||
setExpanded(false);
|
||||
}
|
||||
}
|
||||
document.addEventListener('focusin', closeOnLeave);
|
||||
document.addEventListener('click', closeOnLeave);
|
||||
|
||||
return () => {
|
||||
document.removeEventListener('focusin', closeOnLeave);
|
||||
document.removeEventListener('click', closeOnLeave);
|
||||
};
|
||||
}
|
||||
return () => null;
|
||||
}, [expanded]);
|
||||
|
||||
return (
|
||||
<form className={classNames('search', { active: expanded })}>
|
||||
<form ref={formRef} className={classNames('search', { active: expanded })}>
|
||||
<input
|
||||
ref={searchInputRef}
|
||||
className='search__input'
|
||||
|
@ -506,7 +533,7 @@ export const Search: React.FC<{
|
|||
|
||||
<ClearButton hasValue={hasValue} onClick={handleClear} />
|
||||
|
||||
<div className='search__popout'>
|
||||
<div className='search__popout' tabIndex={-1}>
|
||||
{!hasValue && (
|
||||
<>
|
||||
<h4>
|
||||
|
|
110
app/javascript/mastodon/features/emoji/constants.ts
Normal file
110
app/javascript/mastodon/features/emoji/constants.ts
Normal file
|
@ -0,0 +1,110 @@
|
|||
// Utility codes
|
||||
export const VARIATION_SELECTOR_CODE = 0xfe0f;
|
||||
export const KEYCAP_CODE = 0x20e3;
|
||||
|
||||
// Gender codes
|
||||
export const GENDER_FEMALE_CODE = 0x2640;
|
||||
export const GENDER_MALE_CODE = 0x2642;
|
||||
|
||||
// Skin tone codes
|
||||
export const SKIN_TONE_CODES = [
|
||||
0x1f3fb, // Light skin tone
|
||||
0x1f3fc, // Medium-light skin tone
|
||||
0x1f3fd, // Medium skin tone
|
||||
0x1f3fe, // Medium-dark skin tone
|
||||
0x1f3ff, // Dark skin tone
|
||||
] as const;
|
||||
|
||||
export const EMOJIS_WITH_DARK_BORDER = [
|
||||
'🎱', // 1F3B1
|
||||
'🐜', // 1F41C
|
||||
'⚫', // 26AB
|
||||
'🖤', // 1F5A4
|
||||
'⬛', // 2B1B
|
||||
'◼️', // 25FC-FE0F
|
||||
'◾', // 25FE
|
||||
'◼️', // 25FC-FE0F
|
||||
'✒️', // 2712-FE0F
|
||||
'▪️', // 25AA-FE0F
|
||||
'💣', // 1F4A3
|
||||
'🎳', // 1F3B3
|
||||
'📷', // 1F4F7
|
||||
'📸', // 1F4F8
|
||||
'♣️', // 2663-FE0F
|
||||
'🕶️', // 1F576-FE0F
|
||||
'✴️', // 2734-FE0F
|
||||
'🔌', // 1F50C
|
||||
'💂♀️', // 1F482-200D-2640-FE0F
|
||||
'📽️', // 1F4FD-FE0F
|
||||
'🍳', // 1F373
|
||||
'🦍', // 1F98D
|
||||
'💂', // 1F482
|
||||
'🔪', // 1F52A
|
||||
'🕳️', // 1F573-FE0F
|
||||
'🕹️', // 1F579-FE0F
|
||||
'🕋', // 1F54B
|
||||
'🖊️', // 1F58A-FE0F
|
||||
'🖋️', // 1F58B-FE0F
|
||||
'💂♂️', // 1F482-200D-2642-FE0F
|
||||
'🎤', // 1F3A4
|
||||
'🎓', // 1F393
|
||||
'🎥', // 1F3A5
|
||||
'🎼', // 1F3BC
|
||||
'♠️', // 2660-FE0F
|
||||
'🎩', // 1F3A9
|
||||
'🦃', // 1F983
|
||||
'📼', // 1F4FC
|
||||
'📹', // 1F4F9
|
||||
'🎮', // 1F3AE
|
||||
'🐃', // 1F403
|
||||
'🏴', // 1F3F4
|
||||
'🐞', // 1F41E
|
||||
'🕺', // 1F57A
|
||||
'📱', // 1F4F1
|
||||
'📲', // 1F4F2
|
||||
'🚲', // 1F6B2
|
||||
'🪮', // 1FAA6
|
||||
'🐦⬛', // 1F426-200D-2B1B
|
||||
];
|
||||
|
||||
export const EMOJIS_WITH_LIGHT_BORDER = [
|
||||
'👽', // 1F47D
|
||||
'⚾', // 26BE
|
||||
'🐔', // 1F414
|
||||
'☁️', // 2601-FE0F
|
||||
'💨', // 1F4A8
|
||||
'🕊️', // 1F54A-FE0F
|
||||
'👀', // 1F440
|
||||
'🍥', // 1F365
|
||||
'👻', // 1F47B
|
||||
'🐐', // 1F410
|
||||
'❕', // 2755
|
||||
'❔', // 2754
|
||||
'⛸️', // 26F8-FE0F
|
||||
'🌩️', // 1F329-FE0F
|
||||
'🔊', // 1F50A
|
||||
'🔇', // 1F507
|
||||
'📃', // 1F4C3
|
||||
'🌧️', // 1F327-FE0F
|
||||
'🐏', // 1F40F
|
||||
'🍚', // 1F35A
|
||||
'🍙', // 1F359
|
||||
'🐓', // 1F413
|
||||
'🐑', // 1F411
|
||||
'💀', // 1F480
|
||||
'☠️', // 2620-FE0F
|
||||
'🌨️', // 1F328-FE0F
|
||||
'🔉', // 1F509
|
||||
'🔈', // 1F508
|
||||
'💬', // 1F4AC
|
||||
'💭', // 1F4AD
|
||||
'🏐', // 1F3D0
|
||||
'🏳️', // 1F3F3-FE0F
|
||||
'⚪', // 26AA
|
||||
'⬜', // 2B1C
|
||||
'◽', // 25FD
|
||||
'◻️', // 25FB-FE0F
|
||||
'▫️', // 25AB-FE0F
|
||||
'🪽', // 1FAE8
|
||||
'🪿', // 1FABF
|
||||
];
|
102
app/javascript/mastodon/features/emoji/database.ts
Normal file
102
app/javascript/mastodon/features/emoji/database.ts
Normal file
|
@ -0,0 +1,102 @@
|
|||
import { SUPPORTED_LOCALES } from 'emojibase';
|
||||
import type { FlatCompactEmoji, Locale } from 'emojibase';
|
||||
import type { DBSchema } from 'idb';
|
||||
import { openDB } from 'idb';
|
||||
|
||||
import type { ApiCustomEmojiJSON } from '@/mastodon/api_types/custom_emoji';
|
||||
|
||||
import type { LocaleOrCustom } from './locale';
|
||||
import { toSupportedLocale, toSupportedLocaleOrCustom } from './locale';
|
||||
|
||||
interface EmojiDB extends LocaleTables, DBSchema {
|
||||
custom: {
|
||||
key: string;
|
||||
value: ApiCustomEmojiJSON;
|
||||
indexes: {
|
||||
category: string;
|
||||
};
|
||||
};
|
||||
etags: {
|
||||
key: LocaleOrCustom;
|
||||
value: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface LocaleTable {
|
||||
key: string;
|
||||
value: FlatCompactEmoji;
|
||||
indexes: {
|
||||
group: number;
|
||||
label: string;
|
||||
order: number;
|
||||
tags: string[];
|
||||
};
|
||||
}
|
||||
type LocaleTables = Record<Locale, LocaleTable>;
|
||||
|
||||
const SCHEMA_VERSION = 1;
|
||||
|
||||
const db = await openDB<EmojiDB>('mastodon-emoji', SCHEMA_VERSION, {
|
||||
upgrade(database) {
|
||||
const customTable = database.createObjectStore('custom', {
|
||||
keyPath: 'shortcode',
|
||||
autoIncrement: false,
|
||||
});
|
||||
customTable.createIndex('category', 'category');
|
||||
|
||||
database.createObjectStore('etags');
|
||||
|
||||
for (const locale of SUPPORTED_LOCALES) {
|
||||
const localeTable = database.createObjectStore(locale, {
|
||||
keyPath: 'hexcode',
|
||||
autoIncrement: false,
|
||||
});
|
||||
localeTable.createIndex('group', 'group');
|
||||
localeTable.createIndex('label', 'label');
|
||||
localeTable.createIndex('order', 'order');
|
||||
localeTable.createIndex('tags', 'tags', { multiEntry: true });
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export async function putEmojiData(emojis: FlatCompactEmoji[], locale: Locale) {
|
||||
const trx = db.transaction(locale, 'readwrite');
|
||||
await Promise.all(emojis.map((emoji) => trx.store.put(emoji)));
|
||||
await trx.done;
|
||||
}
|
||||
|
||||
export async function putCustomEmojiData(emojis: ApiCustomEmojiJSON[]) {
|
||||
const trx = db.transaction('custom', 'readwrite');
|
||||
await Promise.all(emojis.map((emoji) => trx.store.put(emoji)));
|
||||
await trx.done;
|
||||
}
|
||||
|
||||
export function putLatestEtag(etag: string, localeString: string) {
|
||||
const locale = toSupportedLocaleOrCustom(localeString);
|
||||
return db.put('etags', etag, locale);
|
||||
}
|
||||
|
||||
export function searchEmojiByHexcode(hexcode: string, localeString: string) {
|
||||
const locale = toSupportedLocale(localeString);
|
||||
return db.get(locale, hexcode);
|
||||
}
|
||||
|
||||
export function searchEmojiByTag(tag: string, localeString: string) {
|
||||
const locale = toSupportedLocale(localeString);
|
||||
const range = IDBKeyRange.only(tag.toLowerCase());
|
||||
return db.getAllFromIndex(locale, 'tags', range);
|
||||
}
|
||||
|
||||
export function searchCustomEmojiByShortcode(shortcode: string) {
|
||||
return db.get('custom', shortcode);
|
||||
}
|
||||
|
||||
export async function loadLatestEtag(localeString: string) {
|
||||
const locale = toSupportedLocaleOrCustom(localeString);
|
||||
const rowCount = await db.count(locale);
|
||||
if (!rowCount) {
|
||||
return null; // No data for this locale, return null even if there is an etag.
|
||||
}
|
||||
const etag = await db.get('etags', locale);
|
||||
return etag ?? null;
|
||||
}
|
38
app/javascript/mastodon/features/emoji/index.ts
Normal file
38
app/javascript/mastodon/features/emoji/index.ts
Normal file
|
@ -0,0 +1,38 @@
|
|||
import initialState from '@/mastodon/initial_state';
|
||||
|
||||
import { toSupportedLocale } from './locale';
|
||||
|
||||
const serverLocale = toSupportedLocale(initialState?.meta.locale ?? 'en');
|
||||
|
||||
const worker =
|
||||
'Worker' in window
|
||||
? new Worker(new URL('./worker', import.meta.url), {
|
||||
type: 'module',
|
||||
})
|
||||
: null;
|
||||
|
||||
export async function initializeEmoji() {
|
||||
if (worker) {
|
||||
worker.addEventListener('message', (event: MessageEvent<string>) => {
|
||||
const { data: message } = event;
|
||||
if (message === 'ready') {
|
||||
worker.postMessage(serverLocale);
|
||||
worker.postMessage('custom');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
const { importCustomEmojiData, importEmojiData } = await import('./loader');
|
||||
await Promise.all([importCustomEmojiData(), importEmojiData(serverLocale)]);
|
||||
}
|
||||
}
|
||||
|
||||
export async function loadEmojiLocale(localeString: string) {
|
||||
const locale = toSupportedLocale(localeString);
|
||||
|
||||
if (worker) {
|
||||
worker.postMessage(locale);
|
||||
} else {
|
||||
const { importEmojiData } = await import('./loader');
|
||||
await importEmojiData(locale);
|
||||
}
|
||||
}
|
77
app/javascript/mastodon/features/emoji/loader.ts
Normal file
77
app/javascript/mastodon/features/emoji/loader.ts
Normal file
|
@ -0,0 +1,77 @@
|
|||
import { flattenEmojiData } from 'emojibase';
|
||||
import type { CompactEmoji, FlatCompactEmoji } from 'emojibase';
|
||||
|
||||
import type { ApiCustomEmojiJSON } from '@/mastodon/api_types/custom_emoji';
|
||||
import { isDevelopment } from '@/mastodon/utils/environment';
|
||||
|
||||
import {
|
||||
putEmojiData,
|
||||
putCustomEmojiData,
|
||||
loadLatestEtag,
|
||||
putLatestEtag,
|
||||
} from './database';
|
||||
import { toSupportedLocale, toSupportedLocaleOrCustom } from './locale';
|
||||
import type { LocaleOrCustom } from './locale';
|
||||
|
||||
export async function importEmojiData(localeString: string) {
|
||||
const locale = toSupportedLocale(localeString);
|
||||
const emojis = await fetchAndCheckEtag<CompactEmoji[]>(locale);
|
||||
if (!emojis) {
|
||||
return;
|
||||
}
|
||||
const flattenedEmojis: FlatCompactEmoji[] = flattenEmojiData(emojis);
|
||||
await putEmojiData(flattenedEmojis, locale);
|
||||
}
|
||||
|
||||
export async function importCustomEmojiData() {
|
||||
const emojis = await fetchAndCheckEtag<ApiCustomEmojiJSON[]>('custom');
|
||||
if (!emojis) {
|
||||
return;
|
||||
}
|
||||
await putCustomEmojiData(emojis);
|
||||
}
|
||||
|
||||
async function fetchAndCheckEtag<ResultType extends object[]>(
|
||||
localeOrCustom: LocaleOrCustom,
|
||||
): Promise<ResultType | null> {
|
||||
const locale = toSupportedLocaleOrCustom(localeOrCustom);
|
||||
|
||||
let uri: string;
|
||||
if (locale === 'custom') {
|
||||
uri = '/api/v1/custom_emojis';
|
||||
} else {
|
||||
uri = `/packs${isDevelopment() ? '-dev' : ''}/emoji/${locale}.json`;
|
||||
}
|
||||
|
||||
const oldEtag = await loadLatestEtag(locale);
|
||||
const response = await fetch(uri, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'If-None-Match': oldEtag ?? '', // Send the old ETag to check for modifications
|
||||
},
|
||||
});
|
||||
// If not modified, return null
|
||||
if (response.status === 304) {
|
||||
return null;
|
||||
}
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
`Failed to fetch emoji data for ${localeOrCustom}: ${response.statusText}`,
|
||||
);
|
||||
}
|
||||
|
||||
const data = (await response.json()) as ResultType;
|
||||
if (!Array.isArray(data)) {
|
||||
throw new Error(
|
||||
`Unexpected data format for ${localeOrCustom}: expected an array`,
|
||||
);
|
||||
}
|
||||
|
||||
// Store the ETag for future requests
|
||||
const etag = response.headers.get('ETag');
|
||||
if (etag) {
|
||||
await putLatestEtag(etag, localeOrCustom);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
|
@ -1,52 +1,6 @@
|
|||
import { flattenEmojiData, SUPPORTED_LOCALES } from 'emojibase';
|
||||
import emojiEnData from 'emojibase-data/en/compact.json';
|
||||
import emojiFrData from 'emojibase-data/fr/compact.json';
|
||||
import { SUPPORTED_LOCALES } from 'emojibase';
|
||||
|
||||
import { toSupportedLocale, unicodeToLocaleLabel } from './locale';
|
||||
|
||||
describe('unicodeToLocaleLabel', () => {
|
||||
const emojiTestCases = [
|
||||
'1F3CB-1F3FF-200D-2640-FE0F', // 🏋🏿♀️ Woman weightlifter, dark skin
|
||||
'1F468-1F3FB', // 👨🏻 Man, light skin
|
||||
'1F469-1F3FB-200D-2695-FE0F', // 👩🏻⚕️ Woman health worker, light skin
|
||||
'1F468-1F3FD-200D-1F692', // 👨🏽🚒 Man firefighter, medium skin
|
||||
'1F469-1F3FE', // 👩🏾 Woman, medium-dark skin
|
||||
'1F469-1F3FF-200D-1F4BB', // 👩🏿💻 Woman technologist, dark skin
|
||||
'1F478-1F3FF', // 👸🏿 Princess with dark skin tone
|
||||
'1F935-1F3FC-200D-2640-FE0F', // 🤵🏼♀️ Woman in tuxedo, medium-light skin
|
||||
'1F9D1-1F3FC', // 🧑🏼 Person, medium-light skin
|
||||
'1F9D4-1F3FE', // 🧔🏾 Person with beard, medium-dark skin
|
||||
];
|
||||
|
||||
const flattenedEnData = flattenEmojiData(emojiEnData);
|
||||
const flattenedFrData = flattenEmojiData(emojiFrData);
|
||||
|
||||
const emojiTestEnLabels = new Map(
|
||||
emojiTestCases.map((code) => [
|
||||
code,
|
||||
flattenedEnData.find((emoji) => emoji.hexcode === code)?.label,
|
||||
]),
|
||||
);
|
||||
const emojiTestFrLabels = new Map(
|
||||
emojiTestCases.map((code) => [
|
||||
code,
|
||||
flattenedFrData.find((emoji) => emoji.hexcode === code)?.label,
|
||||
]),
|
||||
);
|
||||
|
||||
test.for(
|
||||
emojiTestCases.flatMap((code) => [
|
||||
[code, 'en', emojiTestEnLabels.get(code)],
|
||||
[code, 'fr', emojiTestFrLabels.get(code)],
|
||||
]) satisfies [string, string, string | undefined][],
|
||||
)(
|
||||
'returns correct label for %s for %s locale',
|
||||
async ([unicodeHex, locale, expectedLabel]) => {
|
||||
const label = await unicodeToLocaleLabel(unicodeHex, locale);
|
||||
expect(label).toBe(expectedLabel);
|
||||
},
|
||||
);
|
||||
});
|
||||
import { toSupportedLocale, toSupportedLocaleOrCustom } from './locale';
|
||||
|
||||
describe('toSupportedLocale', () => {
|
||||
test('returns the same locale if it is supported', () => {
|
||||
|
@ -62,3 +16,14 @@ describe('toSupportedLocale', () => {
|
|||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('toSupportedLocaleOrCustom', () => {
|
||||
test('returns custom for "custom" locale', () => {
|
||||
expect(toSupportedLocaleOrCustom('custom')).toBe('custom');
|
||||
});
|
||||
test('returns supported locale for valid locales', () => {
|
||||
for (const locale of SUPPORTED_LOCALES) {
|
||||
expect(toSupportedLocaleOrCustom(locale)).toBe(locale);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,51 +1,23 @@
|
|||
import type { CompactEmoji, Locale } from 'emojibase';
|
||||
import { flattenEmojiData, SUPPORTED_LOCALES } from 'emojibase';
|
||||
import type { Locale } from 'emojibase';
|
||||
import { SUPPORTED_LOCALES } from 'emojibase';
|
||||
|
||||
// Simple cache. This will be replaced with an IndexedDB cache in the future.
|
||||
const localeCache = new Map<Locale, Map<string, CompactEmoji>>();
|
||||
export type LocaleOrCustom = Locale | 'custom';
|
||||
|
||||
export async function unicodeToLocaleLabel(
|
||||
unicodeHex: string,
|
||||
localeString: string,
|
||||
) {
|
||||
const locale = toSupportedLocale(localeString);
|
||||
let hexMap = localeCache.get(locale);
|
||||
if (!hexMap) {
|
||||
hexMap = await loadLocaleLabels(locale);
|
||||
localeCache.set(locale, hexMap);
|
||||
}
|
||||
|
||||
const label = hexMap.get(unicodeHex)?.label;
|
||||
if (!label) {
|
||||
throw new Error(
|
||||
`Label for unicode hex ${unicodeHex} not found in locale ${locale}`,
|
||||
);
|
||||
}
|
||||
return label;
|
||||
}
|
||||
|
||||
async function loadLocaleLabels(
|
||||
locale: Locale,
|
||||
): Promise<Map<string, CompactEmoji>> {
|
||||
const { default: localeEmoji } = ((await import(
|
||||
`emojibase-data/${locale}/compact.json`
|
||||
)) ?? { default: [] }) as { default: CompactEmoji[] };
|
||||
if (!Array.isArray(localeEmoji)) {
|
||||
throw new Error(`Locale data for ${locale} not found`);
|
||||
}
|
||||
const hexMapEntries = flattenEmojiData(localeEmoji).map(
|
||||
(emoji) => [emoji.hexcode, emoji] satisfies [string, CompactEmoji],
|
||||
);
|
||||
return new Map(hexMapEntries);
|
||||
}
|
||||
|
||||
export function toSupportedLocale(locale: string): Locale {
|
||||
export function toSupportedLocale(localeBase: string): Locale {
|
||||
const locale = localeBase.toLowerCase();
|
||||
if (isSupportedLocale(locale)) {
|
||||
return locale;
|
||||
}
|
||||
return 'en'; // Default to English if unsupported
|
||||
}
|
||||
|
||||
function isSupportedLocale(locale: string): locale is Locale {
|
||||
return SUPPORTED_LOCALES.includes(locale as Locale);
|
||||
export function toSupportedLocaleOrCustom(locale: string): LocaleOrCustom {
|
||||
if (locale.toLowerCase() === 'custom') {
|
||||
return 'custom';
|
||||
}
|
||||
return toSupportedLocale(locale);
|
||||
}
|
||||
|
||||
function isSupportedLocale(locale: string): locale is Locale {
|
||||
return SUPPORTED_LOCALES.includes(locale.toLowerCase() as Locale);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,17 @@
|
|||
import { readdir } from 'fs/promises';
|
||||
import { basename, resolve } from 'path';
|
||||
|
||||
import unicodeEmojis from 'emojibase-data/en/data.json';
|
||||
import { flattenEmojiData } from 'emojibase';
|
||||
import unicodeRawEmojis from 'emojibase-data/en/data.json';
|
||||
|
||||
import { twemojiToUnicodeInfo, unicodeToTwemojiHex } from './normalize';
|
||||
import {
|
||||
twemojiHasBorder,
|
||||
twemojiToUnicodeInfo,
|
||||
unicodeToTwemojiHex,
|
||||
CODES_WITH_DARK_BORDER,
|
||||
CODES_WITH_LIGHT_BORDER,
|
||||
emojiToUnicodeHex,
|
||||
} from './normalize';
|
||||
|
||||
const emojiSVGFiles = await readdir(
|
||||
// This assumes tests are run from project root
|
||||
|
@ -13,16 +21,31 @@ const emojiSVGFiles = await readdir(
|
|||
},
|
||||
);
|
||||
const svgFileNames = emojiSVGFiles
|
||||
.filter(
|
||||
(file) =>
|
||||
file.isFile() &&
|
||||
file.name.endsWith('.svg') &&
|
||||
!file.name.endsWith('_border.svg'),
|
||||
)
|
||||
.filter((file) => file.isFile() && file.name.endsWith('.svg'))
|
||||
.map((file) => basename(file.name, '.svg').toUpperCase());
|
||||
const svgFileNamesWithoutBorder = svgFileNames.filter(
|
||||
(fileName) => !fileName.endsWith('_BORDER'),
|
||||
);
|
||||
|
||||
describe('normalizeEmoji', () => {
|
||||
describe('unicodeToSVGName', () => {
|
||||
const unicodeEmojis = flattenEmojiData(unicodeRawEmojis);
|
||||
|
||||
describe('emojiToUnicodeHex', () => {
|
||||
test.concurrent.for([
|
||||
['🎱', '1F3B1'],
|
||||
['🐜', '1F41C'],
|
||||
['⚫', '26AB'],
|
||||
['🖤', '1F5A4'],
|
||||
['💀', '1F480'],
|
||||
['💂♂️', '1F482-200D-2642-FE0F'],
|
||||
] as const)(
|
||||
'emojiToUnicodeHex converts %s to %s',
|
||||
([emoji, hexcode], { expect }) => {
|
||||
expect(emojiToUnicodeHex(emoji)).toBe(hexcode);
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
describe('unicodeToTwemojiHex', () => {
|
||||
test.concurrent.for(
|
||||
unicodeEmojis
|
||||
// Our version of Twemoji only supports up to version 15.1
|
||||
|
@ -30,32 +53,39 @@ describe('normalizeEmoji', () => {
|
|||
.map((emoji) => [emoji.hexcode, emoji.label] as [string, string]),
|
||||
)('verifying an emoji exists for %s (%s)', ([hexcode], { expect }) => {
|
||||
const result = unicodeToTwemojiHex(hexcode);
|
||||
expect(svgFileNames).toContain(result);
|
||||
expect(svgFileNamesWithoutBorder).toContain(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe('twemojiHasBorder', () => {
|
||||
test.concurrent.for(
|
||||
svgFileNames
|
||||
.filter((file) => file.endsWith('_BORDER'))
|
||||
.map((file) => {
|
||||
const hexCode = file.replace('_BORDER', '');
|
||||
return [
|
||||
hexCode,
|
||||
CODES_WITH_LIGHT_BORDER.includes(hexCode),
|
||||
CODES_WITH_DARK_BORDER.includes(hexCode),
|
||||
] as const;
|
||||
}),
|
||||
)('twemojiHasBorder for %s', ([hexCode, isLight, isDark], { expect }) => {
|
||||
const result = twemojiHasBorder(hexCode);
|
||||
expect(result).toHaveProperty('hexCode', hexCode);
|
||||
expect(result).toHaveProperty('hasLightBorder', isLight);
|
||||
expect(result).toHaveProperty('hasDarkBorder', isDark);
|
||||
});
|
||||
});
|
||||
|
||||
describe('twemojiToUnicodeInfo', () => {
|
||||
const unicodeMap = new Map(
|
||||
unicodeEmojis.flatMap((emoji) => {
|
||||
const base: [string, string][] = [[emoji.hexcode, emoji.label]];
|
||||
if (emoji.skins) {
|
||||
base.push(
|
||||
...emoji.skins.map(
|
||||
(skin) => [skin.hexcode, skin.label] as [string, string],
|
||||
),
|
||||
);
|
||||
}
|
||||
return base;
|
||||
}),
|
||||
);
|
||||
const unicodeCodeSet = new Set(unicodeEmojis.map((emoji) => emoji.hexcode));
|
||||
|
||||
test.concurrent.for(svgFileNames)(
|
||||
test.concurrent.for(svgFileNamesWithoutBorder)(
|
||||
'verifying SVG file %s maps to Unicode emoji',
|
||||
(svgFileName, { expect }) => {
|
||||
assert(!!svgFileName);
|
||||
const result = twemojiToUnicodeInfo(svgFileName);
|
||||
const hexcode =
|
||||
typeof result === 'string' ? result : result.unqualified;
|
||||
const hexcode = typeof result === 'string' ? result : result.unqualified;
|
||||
if (!hexcode) {
|
||||
// No hexcode means this is a special case like the Shibuya 109 emoji
|
||||
expect(result).toHaveProperty('label');
|
||||
|
@ -63,10 +93,9 @@ describe('normalizeEmoji', () => {
|
|||
}
|
||||
assert(!!hexcode);
|
||||
expect(
|
||||
unicodeMap.has(hexcode),
|
||||
unicodeCodeSet.has(hexcode),
|
||||
`${hexcode} (${svgFileName}) not found`,
|
||||
).toBeTruthy();
|
||||
},
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,19 +1,12 @@
|
|||
// Utility codes
|
||||
const VARIATION_SELECTOR_CODE = 0xfe0f;
|
||||
const KEYCAP_CODE = 0x20e3;
|
||||
|
||||
// Gender codes
|
||||
const GENDER_FEMALE_CODE = 0x2640;
|
||||
const GENDER_MALE_CODE = 0x2642;
|
||||
|
||||
// Skin tone codes
|
||||
const SKIN_TONE_CODES = [
|
||||
0x1f3fb, // Light skin tone
|
||||
0x1f3fc, // Medium-light skin tone
|
||||
0x1f3fd, // Medium skin tone
|
||||
0x1f3fe, // Medium-dark skin tone
|
||||
0x1f3ff, // Dark skin tone
|
||||
] as const;
|
||||
import {
|
||||
VARIATION_SELECTOR_CODE,
|
||||
KEYCAP_CODE,
|
||||
GENDER_FEMALE_CODE,
|
||||
GENDER_MALE_CODE,
|
||||
SKIN_TONE_CODES,
|
||||
EMOJIS_WITH_DARK_BORDER,
|
||||
EMOJIS_WITH_LIGHT_BORDER,
|
||||
} from './constants';
|
||||
|
||||
// Misc codes that have special handling
|
||||
const SKIER_CODE = 0x26f7;
|
||||
|
@ -24,6 +17,17 @@ const LEVITATING_PERSON_CODE = 0x1f574;
|
|||
const SPEECH_BUBBLE_CODE = 0x1f5e8;
|
||||
const MS_CLAUS_CODE = 0x1f936;
|
||||
|
||||
export function emojiToUnicodeHex(emoji: string): string {
|
||||
const codes: number[] = [];
|
||||
for (const char of emoji) {
|
||||
const code = char.codePointAt(0);
|
||||
if (code !== undefined) {
|
||||
codes.push(code);
|
||||
}
|
||||
}
|
||||
return hexNumbersToString(codes);
|
||||
}
|
||||
|
||||
export function unicodeToTwemojiHex(unicodeHex: string): string {
|
||||
const codes = hexStringToNumbers(unicodeHex);
|
||||
const normalizedCodes: number[] = [];
|
||||
|
@ -50,6 +54,35 @@ export function unicodeToTwemojiHex(unicodeHex: string): string {
|
|||
return hexNumbersToString(normalizedCodes, 0);
|
||||
}
|
||||
|
||||
interface TwemojiBorderInfo {
|
||||
hexCode: string;
|
||||
hasLightBorder: boolean;
|
||||
hasDarkBorder: boolean;
|
||||
}
|
||||
|
||||
export const CODES_WITH_DARK_BORDER =
|
||||
EMOJIS_WITH_DARK_BORDER.map(emojiToUnicodeHex);
|
||||
|
||||
export const CODES_WITH_LIGHT_BORDER =
|
||||
EMOJIS_WITH_LIGHT_BORDER.map(emojiToUnicodeHex);
|
||||
|
||||
export function twemojiHasBorder(twemojiHex: string): TwemojiBorderInfo {
|
||||
const normalizedHex = twemojiHex.toUpperCase();
|
||||
let hasLightBorder = false;
|
||||
let hasDarkBorder = false;
|
||||
if (CODES_WITH_LIGHT_BORDER.includes(normalizedHex)) {
|
||||
hasLightBorder = true;
|
||||
}
|
||||
if (CODES_WITH_DARK_BORDER.includes(normalizedHex)) {
|
||||
hasDarkBorder = true;
|
||||
}
|
||||
return {
|
||||
hexCode: normalizedHex,
|
||||
hasLightBorder,
|
||||
hasDarkBorder,
|
||||
};
|
||||
}
|
||||
|
||||
interface TwemojiSpecificEmoji {
|
||||
unqualified?: string;
|
||||
gender?: number;
|
||||
|
@ -84,11 +117,16 @@ export function twemojiToUnicodeInfo(
|
|||
let gender: undefined | number;
|
||||
let skin: undefined | number;
|
||||
for (const code of codes) {
|
||||
if (code in GENDER_CODES_MAP) {
|
||||
if (!gender && code in GENDER_CODES_MAP) {
|
||||
gender = GENDER_CODES_MAP[code];
|
||||
} else if (code in SKIN_TONE_CODES) {
|
||||
} else if (!skin && code in SKIN_TONE_CODES) {
|
||||
skin = code;
|
||||
}
|
||||
|
||||
// Exit if we have both skin and gender
|
||||
if (skin && gender) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let mappedCodes: unknown[] = codes;
|
||||
|
@ -103,8 +141,8 @@ export function twemojiToUnicodeInfo(
|
|||
// For key emoji, insert the variation selector
|
||||
mappedCodes = [codes[0], VARIATION_SELECTOR_CODE, KEYCAP_CODE];
|
||||
} else if (
|
||||
codes.at(0) === SKIER_CODE ||
|
||||
codes.at(0) === LEVITATING_PERSON_CODE
|
||||
(codes.at(0) === SKIER_CODE || codes.at(0) === LEVITATING_PERSON_CODE) &&
|
||||
codes.length > 1
|
||||
) {
|
||||
// Twemoji offers more gender and skin options for the skier and levitating person emoji.
|
||||
return {
|
||||
|
|
13
app/javascript/mastodon/features/emoji/worker.ts
Normal file
13
app/javascript/mastodon/features/emoji/worker.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
import { importEmojiData, importCustomEmojiData } from './loader';
|
||||
|
||||
addEventListener('message', handleMessage);
|
||||
self.postMessage('ready'); // After the worker is ready, notify the main thread
|
||||
|
||||
function handleMessage(event: MessageEvent<string>) {
|
||||
const { data: locale } = event;
|
||||
if (locale !== 'custom') {
|
||||
void importEmojiData(locale);
|
||||
} else {
|
||||
void importCustomEmojiData();
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
import { useCallback } from 'react';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
|
||||
|
@ -21,6 +21,9 @@ import { openModal } from 'mastodon/actions/modal';
|
|||
import { IconButton } from 'mastodon/components/icon_button';
|
||||
import { useIdentity } from 'mastodon/identity_context';
|
||||
import { me } from 'mastodon/initial_state';
|
||||
import type { Status } from 'mastodon/models/status';
|
||||
import { makeGetStatus } from 'mastodon/selectors';
|
||||
import type { RootState } from 'mastodon/store';
|
||||
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||
|
||||
const messages = defineMessages({
|
||||
|
@ -47,6 +50,11 @@ const messages = defineMessages({
|
|||
open: { id: 'status.open', defaultMessage: 'Expand this status' },
|
||||
});
|
||||
|
||||
type GetStatusSelector = (
|
||||
state: RootState,
|
||||
props: { id?: string | null; contextType?: string },
|
||||
) => Status | null;
|
||||
|
||||
export const Footer: React.FC<{
|
||||
statusId: string;
|
||||
withOpenButton?: boolean;
|
||||
|
@ -56,7 +64,8 @@ export const Footer: React.FC<{
|
|||
const intl = useIntl();
|
||||
const history = useHistory();
|
||||
const dispatch = useAppDispatch();
|
||||
const status = useAppSelector((state) => state.statuses.get(statusId));
|
||||
const getStatus = useMemo(() => makeGetStatus(), []) as GetStatusSelector;
|
||||
const status = useAppSelector((state) => getStatus(state, { id: statusId }));
|
||||
const accountId = status?.get('account') as string | undefined;
|
||||
const account = useAppSelector((state) =>
|
||||
accountId ? state.accounts.get(accountId) : undefined,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"about.blocks": "خوادم تحت الإشراف",
|
||||
"about.contact": "للاتصال:",
|
||||
"about.default_locale": "الافتراضية",
|
||||
"about.default_locale": "افتراضيالافتراضية",
|
||||
"about.disclaimer": "ماستدون برنامج حر ومفتوح المصدر وعلامة تجارية لـ Mastodon GmbH.",
|
||||
"about.domain_blocks.no_reason_available": "السبب غير متوفر",
|
||||
"about.domain_blocks.preamble": "يتيح مَستُدون عمومًا لمستخدميه مطالعة المحتوى من المستخدمين من الخواديم الأخرى في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادوم.",
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
"about.domain_blocks.silenced.title": "Ограничено",
|
||||
"about.domain_blocks.suspended.explanation": "Никакви данни от този сървър няма да се обработват, съхраняват или обменят, правещи невъзможно всяко взаимодействие или комуникация с потребители от тези сървъри.",
|
||||
"about.domain_blocks.suspended.title": "Спряно",
|
||||
"about.language_label": "Език",
|
||||
"about.not_available": "Тази информация не е публична на този сървър.",
|
||||
"about.powered_by": "Децентрализирана социална мрежа, захранвана от {mastodon}",
|
||||
"about.rules": "Правила на сървъра",
|
||||
|
@ -28,6 +29,7 @@
|
|||
"account.edit_profile": "Редактиране на профила",
|
||||
"account.enable_notifications": "Известяване при публикуване от @{name}",
|
||||
"account.endorse": "Представи в профила",
|
||||
"account.familiar_followers_many": "Последвано от {name1}, {name2}, и {othersCount, plural, one {един друг, когото познавате} other {# други, които познавате}}",
|
||||
"account.familiar_followers_one": "Последвано от {name1}",
|
||||
"account.familiar_followers_two": "Последвано от {name1} и {name2}",
|
||||
"account.featured": "Препоръчано",
|
||||
|
@ -40,6 +42,7 @@
|
|||
"account.followers": "Последователи",
|
||||
"account.followers.empty": "Още никой не следва потребителя.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} последовател} other {{counter} последователи}}",
|
||||
"account.followers_you_know_counter": "{counter} познавате",
|
||||
"account.following": "Последвано",
|
||||
"account.following_counter": "{count, plural, one {{counter} последван} other {{counter} последвани}}",
|
||||
"account.follows.empty": "Потребителят още никого не следва.",
|
||||
|
@ -185,7 +188,7 @@
|
|||
"community.column_settings.remote_only": "Само отдалечено",
|
||||
"compose.language.change": "Смяна на езика",
|
||||
"compose.language.search": "Търсене на езици...",
|
||||
"compose.published.body": "Публикувана публикация.",
|
||||
"compose.published.body": "Публикувано.",
|
||||
"compose.published.open": "Отваряне",
|
||||
"compose.saved.body": "Запазена публикация.",
|
||||
"compose_form.direct_message_warning_learn_more": "Още информация",
|
||||
|
@ -215,6 +218,13 @@
|
|||
"confirmations.delete_list.confirm": "Изтриване",
|
||||
"confirmations.delete_list.message": "Наистина ли искате да изтриете завинаги списъка?",
|
||||
"confirmations.delete_list.title": "Изтривате ли списъка?",
|
||||
"confirmations.discard_draft.confirm": "Изхвърляне и продължаване",
|
||||
"confirmations.discard_draft.edit.cancel": "Възобновяване на редактиране",
|
||||
"confirmations.discard_draft.edit.message": "Продължаването ще изхвърли всякакви промени, които сте правили в публикацията, която сега редактирате.",
|
||||
"confirmations.discard_draft.edit.title": "Изхвърляте ли промените в публикацията си?",
|
||||
"confirmations.discard_draft.post.cancel": "Възстановка на чернова",
|
||||
"confirmations.discard_draft.post.message": "Продължаването ще изхвърли публикацията, която сега съставяте.",
|
||||
"confirmations.discard_draft.post.title": "Изхвърляте ли черновата си публикация?",
|
||||
"confirmations.discard_edit_media.confirm": "Отхвърляне",
|
||||
"confirmations.discard_edit_media.message": "Не сте запазили промени на описанието или огледа на мултимедията, отхвърляте ли ги?",
|
||||
"confirmations.follow_to_list.confirm": "Последване и добавяне в списък",
|
||||
|
@ -324,9 +334,15 @@
|
|||
"errors.unexpected_crash.copy_stacktrace": "Копиране на трасето на стека в буферната памет",
|
||||
"errors.unexpected_crash.report_issue": "Сигнал за проблем",
|
||||
"explore.suggested_follows": "Хора",
|
||||
"explore.title": "Вървежно",
|
||||
"explore.trending_links": "Новини",
|
||||
"explore.trending_statuses": "Публикации",
|
||||
"explore.trending_tags": "Хаштагове",
|
||||
"featured_carousel.header": "{count, plural, one {закачена публикация} other {закачени публикации}}",
|
||||
"featured_carousel.next": "Напред",
|
||||
"featured_carousel.post": "Публикация",
|
||||
"featured_carousel.previous": "Назад",
|
||||
"featured_carousel.slide": "{index} от {total}",
|
||||
"filter_modal.added.context_mismatch_explanation": "Тази категория филтър не е приложима към контекста, в който достъпвате тази публикация. Ако желаете да филтрирате публикациите в този контекст, трябва да изберете друг филтър.",
|
||||
"filter_modal.added.context_mismatch_title": "Несъвпадащ контекст!",
|
||||
"filter_modal.added.expired_explanation": "Валидността на тази категория филтър е изтекла. Сменете срока на валидност, за да я приложите.",
|
||||
|
@ -405,6 +421,7 @@
|
|||
"hints.profiles.see_more_posts": "Преглед на още публикации на {domain}",
|
||||
"hints.threads.replies_may_be_missing": "Отговори от други сървъри може да липсват.",
|
||||
"hints.threads.see_more": "Преглед на още отговори на {domain}",
|
||||
"home.column_settings.show_quotes": "Показване на цитираното",
|
||||
"home.column_settings.show_reblogs": "Показване на подсилванията",
|
||||
"home.column_settings.show_replies": "Показване на отговорите",
|
||||
"home.hide_announcements": "Скриване на оповестяванията",
|
||||
|
@ -527,8 +544,10 @@
|
|||
"mute_modal.you_wont_see_mentions": "Няма да виждате споменаващите ги публикации.",
|
||||
"mute_modal.you_wont_see_posts": "Още могат да виждат публикациите ви, но вие техните не.",
|
||||
"navigation_bar.about": "Относно",
|
||||
"navigation_bar.account_settings": "Парола и сигурност",
|
||||
"navigation_bar.administration": "Администрация",
|
||||
"navigation_bar.advanced_interface": "Отваряне в разширен уебинтерфейс",
|
||||
"navigation_bar.automated_deletion": "Автоматично изтриване на публикации",
|
||||
"navigation_bar.blocks": "Блокирани потребители",
|
||||
"navigation_bar.bookmarks": "Отметки",
|
||||
"navigation_bar.direct": "Частни споменавания",
|
||||
|
@ -538,13 +557,17 @@
|
|||
"navigation_bar.follow_requests": "Заявки за последване",
|
||||
"navigation_bar.followed_tags": "Последвани хаштагове",
|
||||
"navigation_bar.follows_and_followers": "Последвания и последователи",
|
||||
"navigation_bar.import_export": "Внасяне и изнасяне",
|
||||
"navigation_bar.lists": "Списъци",
|
||||
"navigation_bar.logout": "Излизане",
|
||||
"navigation_bar.moderation": "Модериране",
|
||||
"navigation_bar.more": "Още",
|
||||
"navigation_bar.mutes": "Заглушени потребители",
|
||||
"navigation_bar.opened_in_classic_interface": "Публикации, акаунти и други особени страници се отварят по подразбиране в класическия мрежови интерфейс.",
|
||||
"navigation_bar.preferences": "Предпочитания",
|
||||
"navigation_bar.privacy_and_reach": "Поверителност и обхват",
|
||||
"navigation_bar.search": "Търсене",
|
||||
"navigation_bar.search_trends": "Търсене / Вървежно",
|
||||
"not_signed_in_indicator.not_signed_in": "Трябва ви вход за достъп до ресурса.",
|
||||
"notification.admin.report": "{name} докладва {target}",
|
||||
"notification.admin.report_account": "{name} докладва {count, plural, one {публикация} other {# публикации}} от {target} за {category}",
|
||||
|
@ -771,6 +794,7 @@
|
|||
"report_notification.categories.violation": "Нарушение на правилото",
|
||||
"report_notification.categories.violation_sentence": "нарушение на правило",
|
||||
"report_notification.open": "Отваряне на доклада",
|
||||
"search.clear": "Изчистване на търсенето",
|
||||
"search.no_recent_searches": "Няма скорошни търсения",
|
||||
"search.placeholder": "Търсене",
|
||||
"search.quick_action.account_search": "Съвпадение на профили {x}",
|
||||
|
@ -837,6 +861,13 @@
|
|||
"status.mute_conversation": "Заглушаване на разговора",
|
||||
"status.open": "Разширяване на публикацията",
|
||||
"status.pin": "Закачане в профила",
|
||||
"status.quote_error.filtered": "Скрито поради един от филтрите ви",
|
||||
"status.quote_error.not_found": "Публикацията не може да се показва.",
|
||||
"status.quote_error.pending_approval": "Публикацията чака одобрение от първоначалния автор.",
|
||||
"status.quote_error.rejected": "Публикацията не може да се показва като първоначалния автор не позволява цитирането ѝ.",
|
||||
"status.quote_error.removed": "Публикацията е премахната от автора ѝ.",
|
||||
"status.quote_error.unauthorized": "Публикацията не може да се показва, тъй като не сте упълномощени да я гледате.",
|
||||
"status.quote_post_author": "Публикация от {name}",
|
||||
"status.read_more": "Още за четене",
|
||||
"status.reblog": "Подсилване",
|
||||
"status.reblog_private": "Подсилване с оригиналната видимост",
|
||||
|
@ -866,7 +897,10 @@
|
|||
"subscribed_languages.save": "Запазване на промените",
|
||||
"subscribed_languages.target": "Промяна на абонираните езици за {target}",
|
||||
"tabs_bar.home": "Начало",
|
||||
"tabs_bar.menu": "Меню",
|
||||
"tabs_bar.notifications": "Известия",
|
||||
"tabs_bar.publish": "Нова публикация",
|
||||
"tabs_bar.search": "Търсене",
|
||||
"terms_of_service.effective_as_of": "В сила от {date}",
|
||||
"terms_of_service.title": "Условия на услугата",
|
||||
"terms_of_service.upcoming_changes_on": "Предстоящи промени на {date}",
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
"account.unendorse": "Vis ikke på profil",
|
||||
"account.unfollow": "Følg ikke længere",
|
||||
"account.unmute": "Vis @{name} igen",
|
||||
"account.unmute_notifications_short": "Tænd for notifikationer",
|
||||
"account.unmute_notifications_short": "Vis notifikationer igen",
|
||||
"account.unmute_short": "Vis igen",
|
||||
"account_note.placeholder": "Klik for at tilføje notat",
|
||||
"admin.dashboard.daily_retention": "Brugerfastholdelsesrate pr. dag efter tilmelding",
|
||||
|
@ -130,7 +130,7 @@
|
|||
"attachments_list.unprocessed": "(ubehandlet)",
|
||||
"audio.hide": "Skjul lyd",
|
||||
"block_modal.remote_users_caveat": "Serveren {domain} vil blive bedt om at respektere din beslutning. Overholdelse er dog ikke garanteret, da nogle servere kan håndtere blokke forskelligt. Offentlige indlæg kan stadig være synlige for ikke-indloggede brugere.",
|
||||
"block_modal.show_less": "Vis færre",
|
||||
"block_modal.show_less": "Vis mindre",
|
||||
"block_modal.show_more": "Vis flere",
|
||||
"block_modal.they_cant_mention": "Vedkommende kan ikke omtale eller følge dig.",
|
||||
"block_modal.they_cant_see_posts": "Vedkommende kan ikke se dine indlæg, og du vil ikke se vedkommendes.",
|
||||
|
@ -239,9 +239,9 @@
|
|||
"confirmations.missing_alt_text.secondary": "Læg op alligevel",
|
||||
"confirmations.missing_alt_text.title": "Tilføj alt-tekst?",
|
||||
"confirmations.mute.confirm": "Skjul",
|
||||
"confirmations.redraft.confirm": "Slet og omformulér",
|
||||
"confirmations.redraft.confirm": "Slet og omskriv",
|
||||
"confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og fremhævelser går tabt, og svar til det oprindelige indlæg mister tilknytningen.",
|
||||
"confirmations.redraft.title": "Slet og omformulér indlæg?",
|
||||
"confirmations.redraft.title": "Slet og omskriv indlæg?",
|
||||
"confirmations.remove_from_followers.confirm": "Fjern følger",
|
||||
"confirmations.remove_from_followers.message": "{name} vil ikke længere følge dig. Er du sikker på, at du vil fortsætte?",
|
||||
"confirmations.remove_from_followers.title": "Fjern følger?",
|
||||
|
@ -279,14 +279,14 @@
|
|||
"domain_pill.activitypub_lets_connect": "Det muliggører at forbinde og interagere med folk, ikke kun på Mastodon, men også på tværs af forskellige sociale apps.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", som Mastodon taler med andre sociale netværk.",
|
||||
"domain_pill.server": "Server",
|
||||
"domain_pill.their_handle": "Deres greb:",
|
||||
"domain_pill.their_handle": "Deres handle:",
|
||||
"domain_pill.their_server": "Det digitale hjem, hvor alle indlæggene findes.",
|
||||
"domain_pill.their_username": "Entydig identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.",
|
||||
"domain_pill.username": "Brugernavn",
|
||||
"domain_pill.whats_in_a_handle": "Hvad er der i et greb?",
|
||||
"domain_pill.whats_in_a_handle": "Hvad indeholder et handle?",
|
||||
"domain_pill.who_they_are": "Da et handle fortæller, hvem nogen er, og hvor de er, kan du interagere med folk på tværs af det sociale net af <button>ActivityPub-drevne platforme</button>.",
|
||||
"domain_pill.who_you_are": "Fordi dit handle fortæller, hvem du er, og hvor du er, kan du interagere med folk på tværs af det sociale net af <button>ActivityPub-drevne platforme</button>.",
|
||||
"domain_pill.your_handle": "Dit greb:",
|
||||
"domain_pill.your_handle": "Dit handle:",
|
||||
"domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.",
|
||||
"domain_pill.your_username": "Din entydige identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.",
|
||||
"embed.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.",
|
||||
|
@ -386,7 +386,7 @@
|
|||
"follow_suggestions.similar_to_recently_followed_longer": "Minder om profiler, du har fulgt for nylig",
|
||||
"follow_suggestions.view_all": "Vis alle",
|
||||
"follow_suggestions.who_to_follow": "Hvem, som skal følges",
|
||||
"followed_tags": "Hashtag, som følges",
|
||||
"followed_tags": "Hashtags, som følges",
|
||||
"footer.about": "Om",
|
||||
"footer.directory": "Profiloversigt",
|
||||
"footer.get_app": "Hent appen",
|
||||
|
@ -414,7 +414,7 @@
|
|||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag",
|
||||
"hashtag.feature": "Fremhæv på profil",
|
||||
"hashtag.follow": "Følg hashtag",
|
||||
"hashtag.mute": "Tavsgør #{hashtag}",
|
||||
"hashtag.mute": "Skjul #{hashtag}",
|
||||
"hashtag.unfeature": "Fremhæv ikke på profil",
|
||||
"hashtag.unfollow": "Følg ikke længere hashtag",
|
||||
"hashtags.and_other": "…og {count, plural, one {}other {# flere}}",
|
||||
|
@ -543,10 +543,10 @@
|
|||
"mute_modal.hide_options": "Skjul valgmuligheder",
|
||||
"mute_modal.indefinite": "Indtil jeg vælger at se dem igen",
|
||||
"mute_modal.show_options": "Vis valgmuligheder",
|
||||
"mute_modal.they_can_mention_and_follow": "De kan omtale og følge dig, men du vil ikke se dem.",
|
||||
"mute_modal.they_can_mention_and_follow": "Vedkommende kan nævne og følge dig, men vil ikke blive vist.",
|
||||
"mute_modal.they_wont_know": "De vil ikke vide, at de er blevet skjult.",
|
||||
"mute_modal.title": "Skjul bruger?",
|
||||
"mute_modal.you_wont_see_mentions": "Du vil ikke se indlæg som omtaler dem.",
|
||||
"mute_modal.you_wont_see_mentions": "Indlæg, som nævner vedkommende, vises ikke.",
|
||||
"mute_modal.you_wont_see_posts": "De kan stadig se dine indlæg, men du vil ikke se deres.",
|
||||
"navigation_bar.about": "Om",
|
||||
"navigation_bar.account_settings": "Adgangskode og sikkerhed",
|
||||
|
@ -560,7 +560,7 @@
|
|||
"navigation_bar.favourites": "Favoritter",
|
||||
"navigation_bar.filters": "Skjulte ord",
|
||||
"navigation_bar.follow_requests": "Følgeanmodninger",
|
||||
"navigation_bar.followed_tags": "Hashtag, som følges",
|
||||
"navigation_bar.followed_tags": "Hashtags, som følges",
|
||||
"navigation_bar.follows_and_followers": "Følges og følgere",
|
||||
"navigation_bar.import_export": "Import og eksport",
|
||||
"navigation_bar.lists": "Lister",
|
||||
|
@ -686,11 +686,11 @@
|
|||
"notifications.policy.filter_limited_accounts_hint": "Begrænset af servermoderatorer",
|
||||
"notifications.policy.filter_limited_accounts_title": "Modererede konti",
|
||||
"notifications.policy.filter_new_accounts.hint": "Oprettet indenfor {days, plural, one {den seneste dag} other {de seneste # dage}}",
|
||||
"notifications.policy.filter_new_accounts_title": "Ny konti",
|
||||
"notifications.policy.filter_not_followers_hint": "Inklusiv personer, som har fulgt dig {days, plural, one {mindre end én dag} other {færre end # dage}}",
|
||||
"notifications.policy.filter_not_followers_title": "Folk, som ikke følger dig",
|
||||
"notifications.policy.filter_new_accounts_title": "Nye konti",
|
||||
"notifications.policy.filter_not_followers_hint": "Inklusiv personer, som har fulgt dig {days, plural, one {mindre end én dag} other {mindre end # dage}}",
|
||||
"notifications.policy.filter_not_followers_title": "Personer, som ikke følger dig",
|
||||
"notifications.policy.filter_not_following_hint": "Indtil du manuelt godkender dem",
|
||||
"notifications.policy.filter_not_following_title": "Folk, du ikke følger",
|
||||
"notifications.policy.filter_not_following_title": "Personer, du ikke følger",
|
||||
"notifications.policy.filter_private_mentions_hint": "Filtreret, medmindre det er i svar på egen omtale, eller hvis afsenderen følges",
|
||||
"notifications.policy.filter_private_mentions_title": "Uopfordrede private omtaler",
|
||||
"notifications.policy.title": "Håndtér notifikationer fra…",
|
||||
|
@ -830,7 +830,7 @@
|
|||
"search_results.see_all": "Vis alle",
|
||||
"search_results.statuses": "Indlæg",
|
||||
"search_results.title": "Søg efter \"{q}\"",
|
||||
"server_banner.about_active_users": "Folk, som brugte denne server de seneste 30 dage (månedlige aktive brugere)",
|
||||
"server_banner.about_active_users": "Personer, som brugte denne server de seneste 30 dage (månedlige aktive brugere)",
|
||||
"server_banner.active_users": "aktive brugere",
|
||||
"server_banner.administered_by": "Håndteres af:",
|
||||
"server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, du kan bruge for at deltage i fediverset.",
|
||||
|
@ -885,10 +885,10 @@
|
|||
"status.reblogged_by": "{name} fremhævede",
|
||||
"status.reblogs": "{count, plural, one {# fremhævelse} other {# fremhævelser}}",
|
||||
"status.reblogs.empty": "Ingen har endnu fremhævet dette indlæg. Når nogen gør, vil det fremgå hér.",
|
||||
"status.redraft": "Slet og omformulér",
|
||||
"status.redraft": "Slet og omskriv",
|
||||
"status.remove_bookmark": "Fjern bogmærke",
|
||||
"status.remove_favourite": "Fjern fra favoritter",
|
||||
"status.replied_in_thread": "Svaret i tråd",
|
||||
"status.replied_in_thread": "Svarede i tråd",
|
||||
"status.replied_to": "Svarede {name}",
|
||||
"status.reply": "Besvar",
|
||||
"status.replyAll": "Svar alle",
|
||||
|
@ -902,7 +902,7 @@
|
|||
"status.translate": "Oversæt",
|
||||
"status.translated_from_with": "Oversat fra {lang} ved brug af {provider}",
|
||||
"status.uncached_media_warning": "Ingen forhåndsvisning",
|
||||
"status.unmute_conversation": "Genaktivér samtale",
|
||||
"status.unmute_conversation": "Vis samtale",
|
||||
"status.unpin": "Frigør fra profil",
|
||||
"subscribed_languages.lead": "Efter ændringen vises kun indlæg på de valgte sprog på din hjem- og listetidslinje. Vælger du ingen, vil du modtage indlæg på alle sprog.",
|
||||
"subscribed_languages.save": "Gem ændringer",
|
||||
|
|
|
@ -219,6 +219,13 @@
|
|||
"confirmations.delete_list.confirm": "Delete",
|
||||
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
|
||||
"confirmations.delete_list.title": "Delete list?",
|
||||
"confirmations.discard_draft.confirm": "Discard and continue",
|
||||
"confirmations.discard_draft.edit.cancel": "Resume editing",
|
||||
"confirmations.discard_draft.edit.message": "Continuing will discard any changes you have made to the post you are currently editing.",
|
||||
"confirmations.discard_draft.edit.title": "Discard changes to your post?",
|
||||
"confirmations.discard_draft.post.cancel": "Resume draft",
|
||||
"confirmations.discard_draft.post.message": "Continuing will discard the post you are currently composing.",
|
||||
"confirmations.discard_draft.post.title": "Discard your draft post?",
|
||||
"confirmations.discard_edit_media.confirm": "Discard",
|
||||
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
|
||||
"confirmations.follow_to_list.confirm": "Follow and add to list",
|
||||
|
@ -330,6 +337,7 @@
|
|||
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
|
||||
"errors.unexpected_crash.report_issue": "Report issue",
|
||||
"explore.suggested_follows": "People",
|
||||
"explore.title": "Trending",
|
||||
"explore.trending_links": "News",
|
||||
"explore.trending_statuses": "Posts",
|
||||
"explore.trending_tags": "Hashtags",
|
||||
|
@ -541,8 +549,10 @@
|
|||
"mute_modal.you_wont_see_mentions": "You won't see posts that mention them.",
|
||||
"mute_modal.you_wont_see_posts": "They can still see your posts, but you won't see theirs.",
|
||||
"navigation_bar.about": "About",
|
||||
"navigation_bar.account_settings": "Password and security",
|
||||
"navigation_bar.administration": "Administration",
|
||||
"navigation_bar.advanced_interface": "Open in advanced web interface",
|
||||
"navigation_bar.automated_deletion": "Automated post deletion",
|
||||
"navigation_bar.blocks": "Blocked users",
|
||||
"navigation_bar.bookmarks": "Bookmarks",
|
||||
"navigation_bar.direct": "Private mentions",
|
||||
|
@ -552,13 +562,23 @@
|
|||
"navigation_bar.follow_requests": "Follow requests",
|
||||
"navigation_bar.followed_tags": "Followed hashtags",
|
||||
"navigation_bar.follows_and_followers": "Follows and followers",
|
||||
"navigation_bar.import_export": "Import and export",
|
||||
"navigation_bar.lists": "Lists",
|
||||
"navigation_bar.live_feed_local": "Live feed (local)",
|
||||
"navigation_bar.live_feed_public": "Live feed (public)",
|
||||
"navigation_bar.logout": "Logout",
|
||||
"navigation_bar.moderation": "Moderation",
|
||||
"navigation_bar.more": "More",
|
||||
"navigation_bar.mutes": "Muted users",
|
||||
"navigation_bar.opened_in_classic_interface": "Posts, accounts, and other specific pages are opened by default in the classic web interface.",
|
||||
"navigation_bar.preferences": "Preferences",
|
||||
"navigation_bar.privacy_and_reach": "Privacy and reach",
|
||||
"navigation_bar.search": "Search",
|
||||
"navigation_bar.search_trends": "Search / Trending",
|
||||
"navigation_panel.collapse_followed_tags": "Collapse followed hashtags menu",
|
||||
"navigation_panel.collapse_lists": "Collapse list menu",
|
||||
"navigation_panel.expand_followed_tags": "Expand followed hashtags menu",
|
||||
"navigation_panel.expand_lists": "Expand list menu",
|
||||
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
|
||||
"notification.admin.report": "{name} reported {target}",
|
||||
"notification.admin.report_account": "{name} reported {count, plural, one {one post} other {# posts}} from {target} for {category}",
|
||||
|
@ -785,6 +805,7 @@
|
|||
"report_notification.categories.violation": "Rule violation",
|
||||
"report_notification.categories.violation_sentence": "rule violation",
|
||||
"report_notification.open": "Open report",
|
||||
"search.clear": "Clear search",
|
||||
"search.no_recent_searches": "No recent searches",
|
||||
"search.placeholder": "Search",
|
||||
"search.quick_action.account_search": "Profiles matching {x}",
|
||||
|
@ -887,7 +908,10 @@
|
|||
"subscribed_languages.save": "Save changes",
|
||||
"subscribed_languages.target": "Change subscribed languages for {target}",
|
||||
"tabs_bar.home": "Home",
|
||||
"tabs_bar.menu": "Menu",
|
||||
"tabs_bar.notifications": "Notifications",
|
||||
"tabs_bar.publish": "New Post",
|
||||
"tabs_bar.search": "Search",
|
||||
"terms_of_service.effective_as_of": "Effective as of {date}",
|
||||
"terms_of_service.title": "Terms of Service",
|
||||
"terms_of_service.upcoming_changes_on": "Upcoming changes on {date}",
|
||||
|
|
|
@ -327,10 +327,14 @@
|
|||
"errors.unexpected_crash.copy_stacktrace": "Kopiatu irteera arbelera",
|
||||
"errors.unexpected_crash.report_issue": "Eman arazoaren berri",
|
||||
"explore.suggested_follows": "Jendea",
|
||||
"explore.title": "Joerak",
|
||||
"explore.trending_links": "Berriak",
|
||||
"explore.trending_statuses": "Tutak",
|
||||
"explore.trending_tags": "Traolak",
|
||||
"featured_carousel.next": "Hurrengoa",
|
||||
"featured_carousel.post": "Argitaratu",
|
||||
"featured_carousel.previous": "Aurrekoa",
|
||||
"featured_carousel.slide": "{total}-tik {index}",
|
||||
"filter_modal.added.context_mismatch_explanation": "Iragazki-kategoria hau ez zaio aplikatzen bidalketa honetara sartzeko erabili duzun testuinguruari. Bidalketa testuinguru horretan ere iragaztea nahi baduzu, iragazkia editatu beharko duzu.",
|
||||
"filter_modal.added.context_mismatch_title": "Testuingurua ez dator bat!",
|
||||
"filter_modal.added.expired_explanation": "Iragazki kategoria hau iraungi da, eragina izan dezan bere iraungitze-data aldatu beharko duzu.",
|
||||
|
@ -383,6 +387,8 @@
|
|||
"generic.saved": "Gordea",
|
||||
"getting_started.heading": "Menua",
|
||||
"hashtag.admin_moderation": "#{name}-(r)en moderazio-interfazea ireki",
|
||||
"hashtag.browse": "Arakatu bidalketak #{hashtag}(e)n",
|
||||
"hashtag.browse_from_account": "Arakatu @{name}(r)en bidalketak #{hashtag}(e)n",
|
||||
"hashtag.column_header.tag_mode.all": "eta {osagarria}",
|
||||
"hashtag.column_header.tag_mode.any": "edo {osagarria}",
|
||||
"hashtag.column_header.tag_mode.none": "gabe {osagarria}",
|
||||
|
@ -395,7 +401,10 @@
|
|||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} parte-hartzaile} other {{counter} parte-hartzaile}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}} gaur",
|
||||
"hashtag.feature": "Nabarmendu profilean",
|
||||
"hashtag.follow": "Jarraitu traolari",
|
||||
"hashtag.mute": "Mututu #{hashtag}",
|
||||
"hashtag.unfeature": "Ez nabarmendu profilean",
|
||||
"hashtag.unfollow": "Utzi traola jarraitzeari",
|
||||
"hashtags.and_other": "…eta {count, plural, one {}other {# gehiago}}",
|
||||
"hints.profiles.followers_may_be_missing": "Baliteke profil honen jarraitzaile guztiak ez agertzea.",
|
||||
|
@ -406,6 +415,7 @@
|
|||
"hints.profiles.see_more_posts": "Ikusi bidalketa gehiago {domain}-(e)n",
|
||||
"hints.threads.replies_may_be_missing": "Baliteke beste zerbitzari batzuen erantzun batzuk ez erakustea.",
|
||||
"hints.threads.see_more": "Ikusi erantzun gehiago {domain}-(e)n",
|
||||
"home.column_settings.show_quotes": "Erakutsi aipamenak",
|
||||
"home.column_settings.show_reblogs": "Erakutsi bultzadak",
|
||||
"home.column_settings.show_replies": "Erakutsi erantzunak",
|
||||
"home.hide_announcements": "Ezkutatu iragarpenak",
|
||||
|
@ -424,6 +434,11 @@
|
|||
"ignore_notifications_modal.not_followers_title": "Jarraitzen ez zaituzten pertsonen jakinarazpenei ez ikusiarena egin?",
|
||||
"ignore_notifications_modal.not_following_title": "Jarraitzen ez dituzun pertsonen jakinarazpenei ez ikusiarena egin?",
|
||||
"ignore_notifications_modal.private_mentions_title": "Eskatu gabeko aipamen pribatuen jakinarazpenei ez ikusiarena egin?",
|
||||
"info_button.label": "Laguntza",
|
||||
"interaction_modal.action.favourite": "Jarraitzeko, zure kontutik atsegindu behar duzu.",
|
||||
"interaction_modal.action.follow": "Jarraitzeko zure kontutik jarraitu behar duzu.",
|
||||
"interaction_modal.action.reply": "Jarraitzeko zure kontutik erantzun behar duzu.",
|
||||
"interaction_modal.action.vote": "Jarraitzeko, zure kontutik bozkatu behar duzu.",
|
||||
"interaction_modal.go": "Joan",
|
||||
"interaction_modal.no_account_yet": "Ez al duzu konturik oraindik?",
|
||||
"interaction_modal.on_another_server": "Beste zerbitzari batean",
|
||||
|
@ -468,11 +483,14 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "testua erakustea/ezkutatzea abisu baten atzean",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "multimedia erakutsi/ezkutatzeko",
|
||||
"keyboard_shortcuts.toot": "Hasi bidalketa berri bat",
|
||||
"keyboard_shortcuts.translate": "bidalketa itzultzeko",
|
||||
"keyboard_shortcuts.unfocus": "testua konposatzeko area / bilaketatik fokua kentzea",
|
||||
"keyboard_shortcuts.up": "zerrendan gora mugitzea",
|
||||
"lightbox.close": "Itxi",
|
||||
"lightbox.next": "Hurrengoa",
|
||||
"lightbox.previous": "Aurrekoa",
|
||||
"lightbox.zoom_in": "Zooma egungo tamainara",
|
||||
"lightbox.zoom_out": "Zooma egokitzeko",
|
||||
"limited_account_hint.action": "Erakutsi profila hala ere",
|
||||
"limited_account_hint.title": "Profil hau ezkutatu egin dute {domain} zerbitzariko moderatzaileek.",
|
||||
"link_preview.author": "Egilea: {name}",
|
||||
|
@ -482,13 +500,24 @@
|
|||
"lists.add_to_list": "Gehitu zerrendara",
|
||||
"lists.add_to_lists": "Gehitu {name} zerrendetara",
|
||||
"lists.create": "Sortu",
|
||||
"lists.create_a_list_to_organize": "Sortu zerrenda berria zure Hasierako jarioa antolatzeko",
|
||||
"lists.create_list": "Sortu zerrenda",
|
||||
"lists.delete": "Ezabatu zerrenda",
|
||||
"lists.done": "Egina",
|
||||
"lists.edit": "Editatu zerrenda",
|
||||
"lists.exclusive": "Ezkutatu kideak Hasieran",
|
||||
"lists.exclusive_hint": "Norbait zerrenda honetan badago, ezkutatu zure Hasierako jariotik mezuak bi aldiz ez ikusteko.",
|
||||
"lists.find_users_to_add": "Bilatu erabiltzaileak gehitzeko",
|
||||
"lists.list_name": "Zerrenda izena",
|
||||
"lists.new_list_name": "Zerrenda izen berria",
|
||||
"lists.no_lists_yet": "Ez duzu zerrendarik oraindik.",
|
||||
"lists.no_members_yet": "Ez duzu kiderik oraindik.",
|
||||
"lists.no_results_found": "Ez da emaitzarik aurkitu.",
|
||||
"lists.remove_member": "Ezabatu",
|
||||
"lists.replies_policy.followed": "Jarraitutako edozein erabiltzaile",
|
||||
"lists.replies_policy.list": "Zerrendako kideak",
|
||||
"lists.replies_policy.none": "Bat ere ez",
|
||||
"lists.save": "Gorde",
|
||||
"lists.search": "Bilatu",
|
||||
"load_pending": "{count, plural, one {elementu berri #} other {# elementu berri}}",
|
||||
"loading_indicator.label": "Kargatzen…",
|
||||
|
@ -504,8 +533,10 @@
|
|||
"mute_modal.you_wont_see_mentions": "Ez duzu ikusiko bera aipatzen duen argitalpenik.",
|
||||
"mute_modal.you_wont_see_posts": "Zure argitalpenak ikus ditzake, baina ez dituzu bereak ikusiko.",
|
||||
"navigation_bar.about": "Honi buruz",
|
||||
"navigation_bar.account_settings": "Pasahitza eta segurtasuna",
|
||||
"navigation_bar.administration": "Administrazioa",
|
||||
"navigation_bar.advanced_interface": "Ireki web interfaze aurreratuan",
|
||||
"navigation_bar.automated_deletion": "Bidalketa automatikoaren ezabaketa",
|
||||
"navigation_bar.blocks": "Blokeatutako erabiltzaileak",
|
||||
"navigation_bar.bookmarks": "Laster-markak",
|
||||
"navigation_bar.direct": "Aipamen pribatuak",
|
||||
|
@ -515,13 +546,19 @@
|
|||
"navigation_bar.follow_requests": "Jarraitzeko eskaerak",
|
||||
"navigation_bar.followed_tags": "Jarraitutako traolak",
|
||||
"navigation_bar.follows_and_followers": "Jarraitutakoak eta jarraitzaileak",
|
||||
"navigation_bar.import_export": "Inportazioa eta esportazioa",
|
||||
"navigation_bar.lists": "Zerrendak",
|
||||
"navigation_bar.live_feed_local": "Zuzeneko jarioa (lokala)",
|
||||
"navigation_bar.live_feed_public": "Zuzeneko jarioa (publikoa)",
|
||||
"navigation_bar.logout": "Amaitu saioa",
|
||||
"navigation_bar.moderation": "Moderazioa",
|
||||
"navigation_bar.more": "Gehiago",
|
||||
"navigation_bar.mutes": "Mutututako erabiltzaileak",
|
||||
"navigation_bar.opened_in_classic_interface": "Argitalpenak, kontuak eta beste orri jakin batzuk lehenespenez irekitzen dira web-interfaze klasikoan.",
|
||||
"navigation_bar.preferences": "Hobespenak",
|
||||
"navigation_bar.privacy_and_reach": "Pribatutasuna eta irismena",
|
||||
"navigation_bar.search": "Bilatu",
|
||||
"navigation_bar.search_trends": "Bilatu / Joera",
|
||||
"not_signed_in_indicator.not_signed_in": "Baliabide honetara sarbidea izateko saioa hasi behar duzu.",
|
||||
"notification.admin.report": "{name} erabiltzaileak {target} salatu du",
|
||||
"notification.admin.report_account": "{name}-(e)k {target}-ren {count, plural, one {bidalketa bat} other {# bidalketa}} salatu zituen {category} delakoagatik",
|
||||
|
@ -532,6 +569,7 @@
|
|||
"notification.admin.sign_up.name_and_others": "{name} eta {count, plural, one {erabiltzaile # gehiago} other {# erabiltzaile gehiago}} erregistratu dira",
|
||||
"notification.favourite": "{name}(e)k zure bidalketa gogoko du",
|
||||
"notification.favourite.name_and_others_with_link": "{name} eta <a>{count, plural, one {erabiltzaile # gehiagok} other {# erabiltzaile gehiagok}}</a> zure bidalketa gogoko dute",
|
||||
"notification.favourite_pm": "{name}-ek zure aipamen pribatua gogokoetan jarri du",
|
||||
"notification.follow": "{name}(e)k jarraitzen dizu",
|
||||
"notification.follow_request": "{name}(e)k zu jarraitzeko eskaera egin du",
|
||||
"notification.follow_request.name_and_others": "{name} eta {count, plural, one {erabiltzaile # gehiagok} other {# erabiltzaile gehiagok}} zu jarraitzeko eskaera egin dute",
|
||||
|
@ -540,6 +578,7 @@
|
|||
"notification.label.private_reply": "Erantzun pribatua",
|
||||
"notification.label.reply": "Erantzuna",
|
||||
"notification.mention": "Aipamena",
|
||||
"notification.mentioned_you": "{name}(e)k aipatu zaitu",
|
||||
"notification.moderation-warning.learn_more": "Informazio gehiago",
|
||||
"notification.moderation_warning": "Moderazio-abisu bat jaso duzu",
|
||||
"notification.moderation_warning.action_delete_statuses": "Argitalpen batzuk kendu dira.",
|
||||
|
@ -586,6 +625,7 @@
|
|||
"notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra",
|
||||
"notifications.column_settings.follow": "Jarraitzaile berriak:",
|
||||
"notifications.column_settings.follow_request": "Jarraitzeko eskaera berriak:",
|
||||
"notifications.column_settings.group": "Taldea",
|
||||
"notifications.column_settings.mention": "Aipamenak:",
|
||||
"notifications.column_settings.poll": "Inkestaren emaitzak:",
|
||||
"notifications.column_settings.push": "Push jakinarazpenak",
|
||||
|
@ -736,6 +776,7 @@
|
|||
"report_notification.categories.violation": "Arau haustea",
|
||||
"report_notification.categories.violation_sentence": "arau haustea",
|
||||
"report_notification.open": "Ireki salaketa",
|
||||
"search.clear": "Garbitu bilaketa",
|
||||
"search.no_recent_searches": "Duela gutxiko bilaketarik ez",
|
||||
"search.placeholder": "Bilatu",
|
||||
"search.quick_action.account_search": "{x}-(r)ekin bat datozen profilak",
|
||||
|
@ -800,6 +841,8 @@
|
|||
"status.mute_conversation": "Mututu elkarrizketa",
|
||||
"status.open": "Hedatu bidalketa hau",
|
||||
"status.pin": "Finkatu profilean",
|
||||
"status.quote_error.not_found": "Bidalketa hau ezin da erakutsi.",
|
||||
"status.quote_error.pending_approval": "Bidalketa hau egile originalak onartzeko zain dago.",
|
||||
"status.read_more": "Irakurri gehiago",
|
||||
"status.reblog": "Bultzada",
|
||||
"status.reblog_private": "Bultzada jatorrizko hartzaileei",
|
||||
|
@ -828,7 +871,11 @@
|
|||
"subscribed_languages.save": "Gorde aldaketak",
|
||||
"subscribed_languages.target": "Aldatu {target}(e)n harpidetutako hizkuntzak",
|
||||
"tabs_bar.home": "Hasiera",
|
||||
"tabs_bar.menu": "Menua",
|
||||
"tabs_bar.notifications": "Jakinarazpenak",
|
||||
"tabs_bar.publish": "Bidalketa berria",
|
||||
"tabs_bar.search": "Bilatu",
|
||||
"terms_of_service.title": "Zerbitzuaren baldintzak",
|
||||
"time_remaining.days": "{number, plural, one {egun #} other {# egun}} amaitzeko",
|
||||
"time_remaining.hours": "{number, plural, one {ordu #} other {# ordu}} amaitzeko",
|
||||
"time_remaining.minutes": "{number, plural, one {minutu #} other {# minutu}} amaitzeko",
|
||||
|
@ -855,5 +902,8 @@
|
|||
"video.fullscreen": "Pantaila osoa",
|
||||
"video.hide": "Ezkutatu bideoa",
|
||||
"video.pause": "Pausatu",
|
||||
"video.play": "Jo"
|
||||
"video.play": "Jo",
|
||||
"video.unmute": "Soinua ezarri",
|
||||
"video.volume_down": "Bolumena jaitsi",
|
||||
"video.volume_up": "Bolumena Igo"
|
||||
}
|
||||
|
|
|
@ -564,6 +564,8 @@
|
|||
"navigation_bar.follows_and_followers": "Folgers en folgjenden",
|
||||
"navigation_bar.import_export": "Ymportearje en eksportearje",
|
||||
"navigation_bar.lists": "Listen",
|
||||
"navigation_bar.live_feed_local": "Livefeed (lokaal)",
|
||||
"navigation_bar.live_feed_public": "Livefeed (iepenbier)",
|
||||
"navigation_bar.logout": "Ofmelde",
|
||||
"navigation_bar.moderation": "Moderaasje",
|
||||
"navigation_bar.more": "Mear",
|
||||
|
@ -803,6 +805,7 @@
|
|||
"report_notification.categories.violation": "Skeinde regels",
|
||||
"report_notification.categories.violation_sentence": "skeinde regels",
|
||||
"report_notification.open": "Rapport iepenje",
|
||||
"search.clear": "Sykopdracht wiskje",
|
||||
"search.no_recent_searches": "Gjin resinte sykopdrachten",
|
||||
"search.placeholder": "Sykje",
|
||||
"search.quick_action.account_search": "Accounts dy’t oerienkomme mei {x}",
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
"about.domain_blocks.preamble": "Maṣṭudun s umata yeḍmen-ak ad teẓreḍ agbur, ad tesdemreḍ akked yimseqdacen-nniḍen seg yal aqeddac deg fedivers. Ha-tent-an ɣur-k tsuraf i yellan deg uqeddac-agi.",
|
||||
"about.domain_blocks.silenced.title": "Ɣur-s talast",
|
||||
"about.domain_blocks.suspended.title": "Yettwaḥbes",
|
||||
"about.language_label": "Tutlayt",
|
||||
"about.not_available": "Talɣut-a ur tettwabder ara deg uqeddac-a.",
|
||||
"about.powered_by": "Azeṭṭa inmetti yettwasɣelsen sɣur {mastodon}",
|
||||
"about.rules": "Ilugan n uqeddac",
|
||||
|
@ -237,6 +238,10 @@
|
|||
"explore.trending_links": "Isallen",
|
||||
"explore.trending_statuses": "Tisuffaɣ",
|
||||
"explore.trending_tags": "Ihacṭagen",
|
||||
"featured_carousel.next": "Uḍfiṛ",
|
||||
"featured_carousel.post": "Tasuffeɣt",
|
||||
"featured_carousel.previous": "Uzwir",
|
||||
"featured_carousel.slide": "{index} ɣef {total}",
|
||||
"filter_modal.added.review_and_configure_title": "Iɣewwaṛen n imzizdig",
|
||||
"filter_modal.added.settings_link": "asebter n yiɣewwaṛen",
|
||||
"filter_modal.added.short_explanation": "Tasuffeɣt-a tettwarna ɣer taggayt-a n yimsizdegen: {title}.",
|
||||
|
@ -357,6 +362,7 @@
|
|||
"lists.add_to_list": "Rnu ɣer tebdart",
|
||||
"lists.add_to_lists": "Rnu {name} ɣer tebdarin",
|
||||
"lists.create": "Snulfu-d",
|
||||
"lists.create_list": "Snulfu-d tabdart",
|
||||
"lists.delete": "Kkes tabdart",
|
||||
"lists.done": "Immed",
|
||||
"lists.edit": "Ẓreg tabdart",
|
||||
|
@ -397,6 +403,7 @@
|
|||
"navigation_bar.lists": "Tibdarin",
|
||||
"navigation_bar.logout": "Ffeɣ",
|
||||
"navigation_bar.moderation": "Aseɣyed",
|
||||
"navigation_bar.more": "Ugar",
|
||||
"navigation_bar.mutes": "Iseqdacen yettwasusmen",
|
||||
"navigation_bar.opened_in_classic_interface": "Tisuffaɣ, imiḍanen akked isebtar-nniḍen igejdanen ldin-d s wudem amezwer deg ugrudem web aklasiki.",
|
||||
"navigation_bar.preferences": "Imenyafen",
|
||||
|
@ -610,6 +617,7 @@
|
|||
"status.mute_conversation": "Sgugem adiwenni",
|
||||
"status.open": "Semɣeṛ tasuffeɣt-ayi",
|
||||
"status.pin": "Senteḍ-itt deg umaɣnu",
|
||||
"status.quote_post_author": "Izen sɣur {name}",
|
||||
"status.read_more": "Issin ugar",
|
||||
"status.reblog": "Bḍu",
|
||||
"status.reblogged_by": "Yebḍa-tt {name}",
|
||||
|
@ -635,7 +643,10 @@
|
|||
"status.unpin": "Kkes asenteḍ seg umaɣnu",
|
||||
"subscribed_languages.save": "Sekles ibeddilen",
|
||||
"tabs_bar.home": "Agejdan",
|
||||
"tabs_bar.menu": "Umuɣ",
|
||||
"tabs_bar.notifications": "Ilɣa",
|
||||
"tabs_bar.publish": "Tasuffeɣt tamaynut",
|
||||
"tabs_bar.search": "Nadi",
|
||||
"terms_of_service.title": "Tiwtilin n useqdec",
|
||||
"time_remaining.days": "Mazal {number, plural, one {# wass} other {# wussan}}",
|
||||
"time_remaining.hours": "Mazal {number, plural, one {# usarag} other {# yisragen}}",
|
||||
|
|
|
@ -356,6 +356,7 @@
|
|||
"hashtag.counter_by_accounts": "{count, plural, one {{counter} partisipante} other {{counter} partisipantes}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}} oy",
|
||||
"hashtag.feature": "Avalia en profil",
|
||||
"hashtag.follow": "Sige etiketa",
|
||||
"hashtag.mute": "Silensia #{hashtag}",
|
||||
"hashtag.unfeature": "No avalia en profil",
|
||||
|
@ -390,6 +391,7 @@
|
|||
"interaction_modal.title.reblog": "Repartaja publikasyon de {name}",
|
||||
"interaction_modal.title.reply": "Arisponde a publikasyon de {name}",
|
||||
"interaction_modal.title.vote": "Vota en la anketa de {name}",
|
||||
"interaction_modal.username_prompt": "Por enshemplo {example}",
|
||||
"intervals.full.days": "{number, plural, one {# diya} other {# diyas}}",
|
||||
"intervals.full.hours": "{number, plural, one {# ora} other {# oras}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
|
||||
|
@ -442,6 +444,7 @@
|
|||
"lists.delete": "Efasa lista",
|
||||
"lists.done": "Fecho",
|
||||
"lists.edit": "Edita lista",
|
||||
"lists.list_name": "Nombre de lista",
|
||||
"lists.new_list_name": "Nombre de mueva lista",
|
||||
"lists.replies_policy.followed": "Kualseker utilizador segido",
|
||||
"lists.replies_policy.list": "Miembros de la lista",
|
||||
|
@ -738,6 +741,7 @@
|
|||
"status.reblogs.empty": "Ainda nadie tiene repartajado esta publikasyon. Kuando algien lo aga, se amostrara aki.",
|
||||
"status.redraft": "Efasa i eskrive de muevo",
|
||||
"status.remove_bookmark": "Kita markador",
|
||||
"status.remove_favourite": "Kita de los favoritos",
|
||||
"status.replied_in_thread": "Arispondo en filo",
|
||||
"status.replied_to": "Arispondio a {name}",
|
||||
"status.reply": "Arisponde",
|
||||
|
@ -758,6 +762,7 @@
|
|||
"subscribed_languages.save": "Guadra trokamientos",
|
||||
"subscribed_languages.target": "Troka linguas abonadas para {target}",
|
||||
"tabs_bar.home": "Linya prinsipala",
|
||||
"tabs_bar.menu": "Menu",
|
||||
"tabs_bar.notifications": "Avizos",
|
||||
"tabs_bar.publish": "Mueva publikasyon",
|
||||
"tabs_bar.search": "Bushkeda",
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"about.blocks": "Servidores moderados",
|
||||
"about.contact": "Contato:",
|
||||
"about.default_locale": "Padrão",
|
||||
"about.disclaimer": "Mastodon é um software de código aberto e livre, e uma marca registrada de Mastodon gGmbH.",
|
||||
"about.domain_blocks.no_reason_available": "Razão não disponível",
|
||||
"about.domain_blocks.preamble": "O Mastodon geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no fediverso. Estas são as exceções deste servidor em específico.",
|
||||
|
@ -8,6 +9,7 @@
|
|||
"about.domain_blocks.silenced.title": "Limitado",
|
||||
"about.domain_blocks.suspended.explanation": "Nenhum dado desse servidor será processado, armazenado ou trocado, impossibilitando qualquer interação ou comunicação com os usuários deste servidor.",
|
||||
"about.domain_blocks.suspended.title": "Suspenso",
|
||||
"about.language_label": "Idioma",
|
||||
"about.not_available": "Esta informação não foi disponibilizada neste servidor.",
|
||||
"about.powered_by": "Redes sociais descentralizadas alimentadas por {mastodon}",
|
||||
"about.rules": "Regras do servidor",
|
||||
|
@ -217,6 +219,11 @@
|
|||
"confirmations.delete_list.confirm": "Excluir",
|
||||
"confirmations.delete_list.message": "Você tem certeza de que deseja excluir esta lista?",
|
||||
"confirmations.delete_list.title": "Excluir lista?",
|
||||
"confirmations.discard_draft.confirm": "Descartar e continuar",
|
||||
"confirmations.discard_draft.edit.cancel": "Continuar editando",
|
||||
"confirmations.discard_draft.edit.message": "Continuar vai descartar quaisquer mudanças feitas ao post sendo editado.",
|
||||
"confirmations.discard_draft.edit.title": "Descartar mudanças no seu post?",
|
||||
"confirmations.discard_draft.post.cancel": "Continuar rascunho",
|
||||
"confirmations.discard_edit_media.confirm": "Descartar",
|
||||
"confirmations.discard_edit_media.message": "Há mudanças não salvas na descrição ou pré-visualização da mídia. Descartar assim mesmo?",
|
||||
"confirmations.follow_to_list.confirm": "Seguir e adicionar à lista",
|
||||
|
|
|
@ -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": "Zviditeľnené",
|
||||
"account.featured.accounts": "Profily",
|
||||
"account.featured.hashtags": "Hashtagy",
|
||||
"account.featured_tags.last_status_at": "Posledný príspevok dňa {date}",
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"about.blocks": "เซิร์ฟเวอร์ที่ได้รับการกลั่นกรอง",
|
||||
"about.contact": "ติดต่อ:",
|
||||
"about.default_locale": "ค่าเริ่มต้น",
|
||||
"about.disclaimer": "Mastodon เป็นซอฟต์แวร์เสรี โอเพนซอร์ส และเครื่องหมายการค้าของ Mastodon gGmbH",
|
||||
"about.domain_blocks.no_reason_available": "เหตุผลไม่พร้อมใช้งาน",
|
||||
"about.domain_blocks.preamble": "โดยทั่วไป Mastodon อนุญาตให้คุณดูเนื้อหาจากและโต้ตอบกับผู้ใช้จากเซิร์ฟเวอร์อื่นใดในจักรวาลสหพันธ์ นี่คือข้อยกเว้นที่ทำขึ้นในเซิร์ฟเวอร์นี้โดยเฉพาะ",
|
||||
|
@ -8,6 +9,7 @@
|
|||
"about.domain_blocks.silenced.title": "จำกัดอยู่",
|
||||
"about.domain_blocks.suspended.explanation": "จะไม่ประมวลผล จัดเก็บ หรือแลกเปลี่ยนข้อมูลจากเซิร์ฟเวอร์นี้ ทำให้การโต้ตอบหรือการสื่อสารใด ๆ กับผู้ใช้จากเซิร์ฟเวอร์นี้เป็นไปไม่ได้",
|
||||
"about.domain_blocks.suspended.title": "ระงับอยู่",
|
||||
"about.language_label": "ภาษา",
|
||||
"about.not_available": "ไม่ได้ทำให้ข้อมูลนี้พร้อมใช้งานในเซิร์ฟเวอร์นี้",
|
||||
"about.powered_by": "สื่อสังคมแบบกระจายศูนย์ที่ขับเคลื่อนโดย {mastodon}",
|
||||
"about.rules": "กฎของเซิร์ฟเวอร์",
|
||||
|
@ -19,14 +21,18 @@
|
|||
"account.block_domain": "ปิดกั้นโดเมน {domain}",
|
||||
"account.block_short": "ปิดกั้น",
|
||||
"account.blocked": "ปิดกั้นอยู่",
|
||||
"account.blocking": "กำลังปิดกั้น",
|
||||
"account.cancel_follow_request": "ยกเลิกการติดตาม",
|
||||
"account.copy": "คัดลอกลิงก์ไปยังโปรไฟล์",
|
||||
"account.direct": "กล่าวถึง @{name} แบบส่วนตัว",
|
||||
"account.disable_notifications": "หยุดแจ้งเตือนฉันเมื่อ @{name} โพสต์",
|
||||
"account.domain_blocking": "โดเมน",
|
||||
"account.domain_blocking": "กำลังปิดกั้นโดเมน",
|
||||
"account.edit_profile": "แก้ไขโปรไฟล์",
|
||||
"account.enable_notifications": "แจ้งเตือนฉันเมื่อ @{name} โพสต์",
|
||||
"account.endorse": "แสดงในโปรไฟล์",
|
||||
"account.featured": "น่าสนใจ",
|
||||
"account.featured.accounts": "โปรไฟล์",
|
||||
"account.featured.hashtags": "แฮชแท็ก",
|
||||
"account.featured_tags.last_status_at": "โพสต์ล่าสุดเมื่อ {date}",
|
||||
"account.featured_tags.last_status_never": "ไม่มีโพสต์",
|
||||
"account.follow": "ติดตาม",
|
||||
|
@ -37,6 +43,7 @@
|
|||
"account.following": "กำลังติดตาม",
|
||||
"account.following_counter": "{count, plural, other {{counter} กำลังติดตาม}}",
|
||||
"account.follows.empty": "ผู้ใช้นี้ยังไม่ได้ติดตามใคร",
|
||||
"account.follows_you": "ติดตามคุณ",
|
||||
"account.go_to_profile": "ไปยังโปรไฟล์",
|
||||
"account.hide_reblogs": "ซ่อนการดันจาก @{name}",
|
||||
"account.in_memoriam": "เพื่อระลึกถึง",
|
||||
|
@ -51,6 +58,7 @@
|
|||
"account.mute_notifications_short": "ซ่อนการแจ้งเตือน",
|
||||
"account.mute_short": "ซ่อน",
|
||||
"account.muted": "ซ่อนอยู่",
|
||||
"account.muting": "กำลังซ่อน",
|
||||
"account.no_bio": "ไม่ได้ให้คำอธิบาย",
|
||||
"account.open_original_page": "เปิดหน้าดั้งเดิม",
|
||||
"account.posts": "โพสต์",
|
||||
|
@ -305,9 +313,14 @@
|
|||
"errors.unexpected_crash.copy_stacktrace": "คัดลอกการติดตามสแตกไปยังคลิปบอร์ด",
|
||||
"errors.unexpected_crash.report_issue": "รายงานปัญหา",
|
||||
"explore.suggested_follows": "ผู้คน",
|
||||
"explore.title": "กำลังนิยม",
|
||||
"explore.trending_links": "ข่าว",
|
||||
"explore.trending_statuses": "โพสต์",
|
||||
"explore.trending_tags": "แฮชแท็ก",
|
||||
"featured_carousel.next": "ถัดไป",
|
||||
"featured_carousel.post": "โพสต์",
|
||||
"featured_carousel.previous": "ก่อนหน้า",
|
||||
"featured_carousel.slide": "{index} จาก {total}",
|
||||
"filter_modal.added.context_mismatch_explanation": "หมวดหมู่ตัวกรองนี้ไม่นำไปใช้กับบริบทที่คุณได้เข้าถึงโพสต์นี้ หากคุณต้องการกรองโพสต์ในบริบทนี้ด้วย คุณจะต้องแก้ไขตัวกรอง",
|
||||
"filter_modal.added.context_mismatch_title": "บริบทไม่ตรงกัน!",
|
||||
"filter_modal.added.expired_explanation": "หมวดหมู่ตัวกรองนี้หมดอายุแล้ว คุณจะต้องเปลี่ยนวันหมดอายุสำหรับหมวดหมู่เพื่อนำไปใช้",
|
||||
|
@ -372,7 +385,10 @@
|
|||
"hashtag.counter_by_accounts": "{count, plural, other {{counter} ผู้มีส่วนร่วม}}",
|
||||
"hashtag.counter_by_uses": "{count, plural, other {{counter} โพสต์}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, other {{counter} โพสต์}}วันนี้",
|
||||
"hashtag.feature": "แสดงในโปรไฟล์",
|
||||
"hashtag.follow": "ติดตามแฮชแท็ก",
|
||||
"hashtag.mute": "ซ่อน #{hashtag}",
|
||||
"hashtag.unfeature": "ไม่แสดงในโปรไฟล์",
|
||||
"hashtag.unfollow": "เลิกติดตามแฮชแท็ก",
|
||||
"hashtags.and_other": "…และอีก {count, plural, other {# เพิ่มเติม}}",
|
||||
"hints.profiles.followers_may_be_missing": "ผู้ติดตามสำหรับโปรไฟล์นี้อาจขาดหายไป",
|
||||
|
@ -504,8 +520,10 @@
|
|||
"mute_modal.you_wont_see_mentions": "คุณจะไม่เห็นโพสต์ที่กล่าวถึงเขา",
|
||||
"mute_modal.you_wont_see_posts": "เขายังคงสามารถเห็นโพสต์ของคุณ แต่คุณจะไม่เห็นโพสต์ของเขา",
|
||||
"navigation_bar.about": "เกี่ยวกับ",
|
||||
"navigation_bar.account_settings": "รหัสผ่านและความปลอดภัย",
|
||||
"navigation_bar.administration": "การดูแล",
|
||||
"navigation_bar.advanced_interface": "เปิดในส่วนติดต่อเว็บขั้นสูง",
|
||||
"navigation_bar.automated_deletion": "การลบโพสต์แบบอัตโนมัติ",
|
||||
"navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
|
||||
"navigation_bar.bookmarks": "ที่คั่นหน้า",
|
||||
"navigation_bar.direct": "การกล่าวถึงแบบส่วนตัว",
|
||||
|
@ -515,12 +533,15 @@
|
|||
"navigation_bar.follow_requests": "คำขอติดตาม",
|
||||
"navigation_bar.followed_tags": "แฮชแท็กที่ติดตาม",
|
||||
"navigation_bar.follows_and_followers": "การติดตามและผู้ติดตาม",
|
||||
"navigation_bar.import_export": "การนำเข้าและการส่งออก",
|
||||
"navigation_bar.lists": "รายการ",
|
||||
"navigation_bar.logout": "ออกจากระบบ",
|
||||
"navigation_bar.moderation": "การกลั่นกรอง",
|
||||
"navigation_bar.more": "เพิ่มเติม",
|
||||
"navigation_bar.mutes": "ผู้ใช้ที่ซ่อนอยู่",
|
||||
"navigation_bar.opened_in_classic_interface": "จะเปิดโพสต์, บัญชี และหน้าที่เฉพาะเจาะจงอื่น ๆ เป็นค่าเริ่มต้นในส่วนติดต่อเว็บแบบคลาสสิก",
|
||||
"navigation_bar.preferences": "การกำหนดลักษณะ",
|
||||
"navigation_bar.privacy_and_reach": "ความเป็นส่วนตัวและการเข้าถึง",
|
||||
"navigation_bar.search": "ค้นหา",
|
||||
"not_signed_in_indicator.not_signed_in": "คุณจำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงทรัพยากรนี้",
|
||||
"notification.admin.report": "{name} ได้รายงาน {target}",
|
||||
|
@ -747,6 +768,7 @@
|
|||
"report_notification.categories.violation": "การละเมิดกฎ",
|
||||
"report_notification.categories.violation_sentence": "การละเมิดกฎ",
|
||||
"report_notification.open": "รายงานที่เปิด",
|
||||
"search.clear": "ล้างการค้นหา",
|
||||
"search.no_recent_searches": "ไม่มีการค้นหาล่าสุด",
|
||||
"search.placeholder": "ค้นหา",
|
||||
"search.quick_action.account_search": "โปรไฟล์ที่ตรงกับ {x}",
|
||||
|
@ -812,6 +834,7 @@
|
|||
"status.mute_conversation": "ซ่อนการสนทนา",
|
||||
"status.open": "ขยายโพสต์นี้",
|
||||
"status.pin": "ปักหมุดในโปรไฟล์",
|
||||
"status.quote_post_author": "โพสต์โดย {name}",
|
||||
"status.read_more": "อ่านเพิ่มเติม",
|
||||
"status.reblog": "ดัน",
|
||||
"status.reblog_private": "ดันด้วยการมองเห็นดั้งเดิม",
|
||||
|
@ -841,7 +864,10 @@
|
|||
"subscribed_languages.save": "บันทึกการเปลี่ยนแปลง",
|
||||
"subscribed_languages.target": "เปลี่ยนภาษาที่บอกรับสำหรับ {target}",
|
||||
"tabs_bar.home": "หน้าแรก",
|
||||
"tabs_bar.menu": "เมนู",
|
||||
"tabs_bar.notifications": "การแจ้งเตือน",
|
||||
"tabs_bar.publish": "โพสต์ใหม่",
|
||||
"tabs_bar.search": "ค้นหา",
|
||||
"terms_of_service.title": "เงื่อนไขการให้บริการ",
|
||||
"time_remaining.days": "เหลืออีก {number, plural, other {# วัน}}",
|
||||
"time_remaining.hours": "เหลืออีก {number, plural, other {# ชั่วโมง}}",
|
||||
|
|
|
@ -218,6 +218,9 @@
|
|||
"confirmations.delete_list.confirm": "删除",
|
||||
"confirmations.delete_list.message": "确定要永久删除此列表吗?",
|
||||
"confirmations.delete_list.title": "确定要删除列表?",
|
||||
"confirmations.discard_draft.confirm": "放弃并继续",
|
||||
"confirmations.discard_draft.edit.cancel": "恢复编辑",
|
||||
"confirmations.discard_draft.post.cancel": "恢复草稿",
|
||||
"confirmations.discard_edit_media.confirm": "丢弃",
|
||||
"confirmations.discard_edit_media.message": "你还有未保存的媒体描述或预览修改,仍要丢弃吗?",
|
||||
"confirmations.follow_to_list.confirm": "关注并添加到列表",
|
||||
|
|
|
@ -28,7 +28,7 @@ class AnnualReport::Archetype < AnnualReport::Source
|
|||
end
|
||||
|
||||
def polls_count
|
||||
@polls_count ||= report_statuses.where.not(poll_id: nil).count
|
||||
@polls_count ||= report_statuses.only_polls.count
|
||||
end
|
||||
|
||||
def reblogs_count
|
||||
|
@ -36,7 +36,7 @@ class AnnualReport::Archetype < AnnualReport::Source
|
|||
end
|
||||
|
||||
def replies_count
|
||||
@replies_count ||= report_statuses.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count
|
||||
@replies_count ||= report_statuses.where.not(in_reply_to_id: nil).not_replying_to_account(@account).count
|
||||
end
|
||||
|
||||
def standalone_count
|
||||
|
|
|
@ -18,7 +18,7 @@ class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source
|
|||
private
|
||||
|
||||
def commonly_interacted_with_accounts
|
||||
report_statuses.where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having(minimum_interaction_count).order(count_all: :desc).limit(SET_SIZE).count
|
||||
report_statuses.not_replying_to_account(@account).group(:in_reply_to_account_id).having(minimum_interaction_count).order(count_all: :desc).limit(SET_SIZE).count
|
||||
end
|
||||
|
||||
def minimum_interaction_count
|
||||
|
|
|
@ -2,20 +2,44 @@
|
|||
|
||||
class AnnualReport::TopStatuses < AnnualReport::Source
|
||||
def generate
|
||||
top_reblogs = base_scope.order(reblogs_count: :desc).first&.id
|
||||
top_favourites = base_scope.where.not(id: top_reblogs).order(favourites_count: :desc).first&.id
|
||||
top_replies = base_scope.where.not(id: [top_reblogs, top_favourites]).order(replies_count: :desc).first&.id
|
||||
|
||||
{
|
||||
top_statuses: {
|
||||
by_reblogs: top_reblogs&.to_s,
|
||||
by_favourites: top_favourites&.to_s,
|
||||
by_replies: top_replies&.to_s,
|
||||
by_reblogs: status_identifier(most_reblogged_status),
|
||||
by_favourites: status_identifier(most_favourited_status),
|
||||
by_replies: status_identifier(most_replied_status),
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def status_identifier(status)
|
||||
status.id.to_s if status.present?
|
||||
end
|
||||
|
||||
def most_reblogged_status
|
||||
base_scope
|
||||
.order(reblogs_count: :desc)
|
||||
.first
|
||||
end
|
||||
|
||||
def most_favourited_status
|
||||
base_scope
|
||||
.excluding(most_reblogged_status)
|
||||
.order(favourites_count: :desc)
|
||||
.first
|
||||
end
|
||||
|
||||
def most_replied_status
|
||||
base_scope
|
||||
.excluding(most_reblogged_status, most_favourited_status)
|
||||
.order(replies_count: :desc)
|
||||
.first
|
||||
end
|
||||
|
||||
def base_scope
|
||||
report_statuses.public_visibility.joins(:status_stat)
|
||||
report_statuses
|
||||
.public_visibility
|
||||
.joins(:status_stat)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -6,7 +6,7 @@ class AnnualReport::TypeDistribution < AnnualReport::Source
|
|||
type_distribution: {
|
||||
total: report_statuses.count,
|
||||
reblogs: report_statuses.only_reblogs.count,
|
||||
replies: report_statuses.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count,
|
||||
replies: report_statuses.where.not(in_reply_to_id: nil).not_replying_to_account(@account).count,
|
||||
standalone: report_statuses.without_replies.without_reblogs.count,
|
||||
},
|
||||
}
|
||||
|
|
|
@ -196,6 +196,8 @@ class SignedRequest
|
|||
return if body_digest == received_digest
|
||||
|
||||
raise Mastodon::SignatureVerificationError, "Invalid Digest value. Computed SHA-256 digest: #{body_digest}; given: #{received_digest}"
|
||||
rescue Starry::ParseError
|
||||
raise Mastodon::MalformedHeaderError, 'Content-Digest could not be parsed. It does not contain a valid RFC8941 dictionary.'
|
||||
end
|
||||
|
||||
def created_time
|
||||
|
|
|
@ -138,10 +138,7 @@ class Account < ApplicationRecord
|
|||
scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) }
|
||||
scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) }
|
||||
scope :recent, -> { reorder(id: :desc) }
|
||||
scope :bots, -> { where(actor_type: AUTOMATED_ACTOR_TYPES) }
|
||||
scope :non_automated, -> { where.not(actor_type: AUTOMATED_ACTOR_TYPES) }
|
||||
scope :groups, -> { where(actor_type: 'Group') }
|
||||
scope :alphabetic, -> { order(domain: :asc, username: :asc) }
|
||||
scope :matches_uri_prefix, ->(value) { where(arel_table[:uri].matches("#{sanitize_sql_like(value)}/%", false, true)).or(where(uri: value)) }
|
||||
scope :matches_username, ->(value) { where('lower((username)::text) LIKE lower(?)', "#{value}%") }
|
||||
scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
|
||||
|
|
|
@ -161,7 +161,7 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
|
|||
end
|
||||
|
||||
def without_poll_scope
|
||||
Status.where(poll_id: nil)
|
||||
Status.without_polls
|
||||
end
|
||||
|
||||
def without_popular_scope
|
||||
|
|
|
@ -4,14 +4,8 @@ module FollowLimitable
|
|||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
validates_with FollowLimitValidator, on: :create, unless: :bypass_follow_limit?
|
||||
end
|
||||
validates_with FollowLimitValidator, on: :create, unless: :bypass_follow_limit
|
||||
|
||||
def bypass_follow_limit=(value)
|
||||
@bypass_follow_limit = value
|
||||
end
|
||||
|
||||
def bypass_follow_limit?
|
||||
@bypass_follow_limit
|
||||
attribute :bypass_follow_limit, :boolean, default: false
|
||||
end
|
||||
end
|
||||
|
|
|
@ -24,7 +24,7 @@ class GeneratedAnnualReport < ApplicationRecord
|
|||
end
|
||||
|
||||
def view!
|
||||
update!(viewed_at: Time.now.utc)
|
||||
touch(:viewed_at)
|
||||
end
|
||||
|
||||
def account_ids
|
||||
|
|
|
@ -121,7 +121,10 @@ class Status < ApplicationRecord
|
|||
scope :without_replies, -> { not_reply.or(reply_to_account) }
|
||||
scope :not_reply, -> { where(reply: false) }
|
||||
scope :only_reblogs, -> { where.not(reblog_of_id: nil) }
|
||||
scope :only_polls, -> { where.not(poll_id: nil) }
|
||||
scope :without_polls, -> { where(poll_id: nil) }
|
||||
scope :reply_to_account, -> { where(arel_table[:in_reply_to_account_id].eq arel_table[:account_id]) }
|
||||
scope :not_replying_to_account, ->(account) { where.not(in_reply_to_account: account) }
|
||||
scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) }
|
||||
scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) }
|
||||
scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) }
|
||||
|
|
|
@ -49,8 +49,8 @@ class Tag < ApplicationRecord
|
|||
|
||||
validates :name, presence: true, format: { with: HASHTAG_NAME_RE }
|
||||
validates :display_name, format: { with: HASHTAG_NAME_RE }
|
||||
validate :validate_name_change, if: -> { !new_record? && name_changed? }
|
||||
validate :validate_display_name_change, if: -> { !new_record? && display_name_changed? }
|
||||
validate :validate_name_change, on: :update, if: :name_changed?
|
||||
validate :validate_display_name_change, on: :update, if: :display_name_changed?
|
||||
|
||||
scope :pending_review, -> { unreviewed.where.not(requested_review_at: nil) }
|
||||
scope :usable, -> { where(usable: [true, nil]) }
|
||||
|
|
|
@ -35,6 +35,7 @@ class UserSettings
|
|||
setting :expand_content_warnings, default: false
|
||||
setting :display_media, default: 'default', in: %w(default show_all hide_all)
|
||||
setting :auto_play, default: false
|
||||
setting :emoji_style, default: 'auto', in: %w(auto native twemoji)
|
||||
end
|
||||
|
||||
namespace :notification_emails do
|
||||
|
|
|
@ -31,6 +31,17 @@
|
|||
label: I18n.t('simple_form.labels.defaults.setting_theme'),
|
||||
wrapper: :with_label
|
||||
|
||||
- if Mastodon::Feature.modern_emojis_enabled?
|
||||
.fields-group
|
||||
= f.simple_fields_for :settings, current_user.settings do |ff|
|
||||
= ff.input :'web.emoji_style',
|
||||
collection: %w(auto twemoji native),
|
||||
include_blank: false,
|
||||
hint: I18n.t('simple_form.hints.defaults.setting_emoji_style'),
|
||||
label: I18n.t('simple_form.labels.defaults.setting_emoji_style'),
|
||||
label_method: ->(emoji_style) { I18n.t("emoji_styles.#{emoji_style}", default: emoji_style) },
|
||||
wrapper: :with_label
|
||||
|
||||
- unless I18n.locale == :en
|
||||
.flash-message.translation-prompt
|
||||
#{t 'appearance.localization.body'} #{content_tag(:a, t('appearance.localization.guide_link_text'), href: t('appearance.localization.guide_link'), target: '_blank', rel: 'noopener')}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
shared:
|
||||
enabled: <%= ENV.fetch('CACHE_BUSTER_ENABLED', 'false') == 'true' %>
|
||||
secret_header: <%= ENV.fetch('CACHE_BUSTER_SECRET_HEADER', nil) %>
|
||||
secret: <%= ENV.fetch('CACHE_BUSTER_SECRET', nil) %>
|
||||
secret_header: <%= ENV.fetch('CACHE_BUSTER_SECRET_HEADER', nil)&.to_json %>
|
||||
secret: <%= ENV.fetch('CACHE_BUSTER_SECRET', nil)&.to_json %>
|
||||
http_method: <%= ENV.fetch('CACHE_BUSTER_HTTP_METHOD', 'GET') %>
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
# keys are added here.
|
||||
production:
|
||||
delivery_method: <%= ENV.fetch('SMTP_DELIVERY_METHOD', 'smtp') %>
|
||||
from_address: <%= ENV.fetch('SMTP_FROM_ADDRESS', 'notifications@localhost') %>
|
||||
reply_to: <%= ENV.fetch('SMTP_REPLY_TO', nil) %>
|
||||
return_path: <%= ENV.fetch('SMTP_RETURN_PATH', nil) %>
|
||||
from_address: <%= ENV.fetch('SMTP_FROM_ADDRESS', 'notifications@localhost')&.to_json %>
|
||||
reply_to: <%= ENV.fetch('SMTP_REPLY_TO', nil)&.to_json %>
|
||||
return_path: <%= ENV.fetch('SMTP_RETURN_PATH', nil)&.to_json %>
|
||||
smtp_settings:
|
||||
port: <%= ENV.fetch('SMTP_PORT', nil) %>
|
||||
address: <%= ENV.fetch('SMTP_SERVER', nil) %>
|
||||
user_name: <%= ENV.fetch('SMTP_LOGIN', nil) %>
|
||||
password: <%= ENV.fetch('SMTP_PASSWORD', nil) %>
|
||||
address: <%= ENV.fetch('SMTP_SERVER', nil)&.to_json %>
|
||||
user_name: <%= ENV.fetch('SMTP_LOGIN', nil)&.to_json %>
|
||||
password: <%= ENV.fetch('SMTP_PASSWORD', nil)&.to_json %>
|
||||
domain: <%= ENV.fetch('SMTP_DOMAIN', ENV.fetch('LOCAL_DOMAIN', nil)) %>
|
||||
authentication: <%= ENV.fetch('SMTP_AUTH_METHOD', 'plain') %>
|
||||
ca_file: <%= ENV.fetch('SMTP_CA_FILE', '/etc/ssl/certs/ca-certificates.crt') %>
|
||||
|
@ -22,9 +22,9 @@ production:
|
|||
bulk_mail:
|
||||
smtp_settings:
|
||||
port: <%= ENV.fetch('BULK_SMTP_PORT', nil) %>
|
||||
address: <%= ENV.fetch('BULK_SMTP_SERVER', nil) %>
|
||||
user_name: <%= ENV.fetch('BULK_SMTP_LOGIN', nil) %>
|
||||
password: <%= ENV.fetch('BULK_SMTP_PASSWORD', nil) %>
|
||||
address: <%= ENV.fetch('BULK_SMTP_SERVER', nil)&.to_json %>
|
||||
user_name: <%= ENV.fetch('BULK_SMTP_LOGIN', nil)&.to_json %>
|
||||
password: <%= ENV.fetch('BULK_SMTP_PASSWORD', nil)&.to_json %>
|
||||
domain: <%= ENV.fetch('BULK_SMTP_DOMAIN', ENV.fetch('LOCAL_DOMAIN', nil)) %>
|
||||
authentication: <%= ENV.fetch('BULK_SMTP_AUTH_METHOD', 'plain') %>
|
||||
ca_file: <%= ENV.fetch('BULK_SMTP_CA_FILE', '/etc/ssl/certs/ca-certificates.crt') %>
|
||||
|
|
|
@ -5,24 +5,14 @@ require 'linzer/message/adapter/http_gem/response'
|
|||
|
||||
module Linzer::Message::Adapter
|
||||
module ActionDispatch
|
||||
class Response < Linzer::Message::Adapter::Abstract
|
||||
def initialize(operation, **_options) # rubocop:disable Lint/MissingSuper
|
||||
@operation = operation
|
||||
end
|
||||
|
||||
def header(name)
|
||||
@operation.headers[name]
|
||||
end
|
||||
|
||||
def attach!(signature)
|
||||
signature.to_h.each { |h, v| @operation.headers[h] = v }
|
||||
end
|
||||
class Response < Linzer::Message::Adapter::Generic::Response
|
||||
private
|
||||
|
||||
# Incomplete, but sufficient for FASP
|
||||
def [](field_name)
|
||||
return @operation.status if field_name == '@status'
|
||||
|
||||
@operation.headers[field_name]
|
||||
def derived(name)
|
||||
case name.value
|
||||
when '@status' then @operation.status
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
Rails.application.config.to_prepare do
|
||||
custom_css = begin
|
||||
Setting.custom_css
|
||||
rescue ActiveRecord::AdapterError # Running without a database, not migrated, no connection, etc
|
||||
rescue # Running without a cache, database, not migrated, no connection, etc
|
||||
nil
|
||||
end
|
||||
|
||||
|
|
|
@ -49,8 +49,14 @@ en-GB:
|
|||
attributes:
|
||||
reblog:
|
||||
taken: of post already exists
|
||||
terms_of_service:
|
||||
attributes:
|
||||
effective_date:
|
||||
too_soon: is too soon, must be later than %{date}
|
||||
user:
|
||||
attributes:
|
||||
date_of_birth:
|
||||
below_limit: is below the age limit
|
||||
email:
|
||||
blocked: uses a disallowed e-mail provider
|
||||
unreachable: does not seem to exist
|
||||
|
|
|
@ -49,8 +49,14 @@ eu:
|
|||
attributes:
|
||||
reblog:
|
||||
taken: mezu honentzat bazegoen aurretik
|
||||
terms_of_service:
|
||||
attributes:
|
||||
effective_date:
|
||||
too_soon: goizegi da, %{date} baino geroagokoa izan behar da
|
||||
user:
|
||||
attributes:
|
||||
date_of_birth:
|
||||
below_limit: adinaren mugaren azpitik dago
|
||||
email:
|
||||
blocked: onartu gabeko e-posta hornitzaile bat erabiltzen du
|
||||
unreachable: dirudienez ez da existitzen
|
||||
|
|
|
@ -566,6 +566,13 @@ bg:
|
|||
all: Всичко
|
||||
limited: Ограничено
|
||||
title: Mодериране
|
||||
moderation_notes:
|
||||
create: Добавяне на бележка за модериране
|
||||
created_msg: Успешно създадена бележка за модериране на екземпляр!
|
||||
description_html: Прегледайте и оставете бележки за други модератори и за вас в бъдеще
|
||||
destroyed_msg: Успешно изтрита бележка за модериране на екземпляр!
|
||||
placeholder: Сведенията за този екземпляр, предприети действия, или всичко друго, което ще ви помогне да модерирате този екземпляр в бъдеще.
|
||||
title: Бележки за модериране
|
||||
private_comment: Личен коментар
|
||||
public_comment: Публичен коментар
|
||||
purge: Чистка
|
||||
|
@ -774,11 +781,16 @@ bg:
|
|||
title: Роли
|
||||
rules:
|
||||
add_new: Добавяне на правило
|
||||
add_translation: Добавяне на превод
|
||||
delete: Изтриване
|
||||
description_html: Дори повечето хора да отбелязват, че са прочели и са съгласни с условията на услугата, обикновено хората не ги четат, докато не се сблъскат с проблем. <strong>Улеснете четенето на правилата за сървъра си, представяйки ги като списък с точки.</strong> Опитайте да се придържате към кратки и прости правила, но не ги разпилявайте в премного точки.
|
||||
edit: Промяна на правило
|
||||
empty: Още няма определени правила на сървъра.
|
||||
move_down: Преместване надолу
|
||||
move_up: Преместване нагоре
|
||||
title: Сървърни правила
|
||||
translation: Превод
|
||||
translations: Преводи
|
||||
settings:
|
||||
about:
|
||||
manage_rules: Управление на правилата на сървъра
|
||||
|
@ -804,6 +816,7 @@ bg:
|
|||
discovery:
|
||||
follow_recommendations: Препоръки за следване
|
||||
preamble: За потребители, които са нови и не познават никого в Mastodon, показването на интересно съдържание е ключово. Настройте начина, по който различни функции по откриване на съдържание работят на вашия сървър.
|
||||
privacy: Поверителност
|
||||
profile_directory: Указател на профила
|
||||
public_timelines: Публични хронологии
|
||||
publish_statistics: Публикуване на статистиката
|
||||
|
@ -890,6 +903,8 @@ bg:
|
|||
system_checks:
|
||||
database_schema_check:
|
||||
message_html: Има миграции на базата данни, които чакат да бъдат изпълнени. Моля, изпълнете ги, за да осигурите изправността на приложението
|
||||
elasticsearch_analysis_index_mismatch:
|
||||
message_html: Настройките за анализиращия индекс Elasticsearch са остарели. Пуснете <code>tootctl search deploy --only-mapping --only=%{value}</code>
|
||||
elasticsearch_health_red:
|
||||
message_html: Клъстерът Elasticsearch е нездрав (червено състояние), функциите за търсене не са налични
|
||||
elasticsearch_health_yellow:
|
||||
|
@ -1841,6 +1856,10 @@ bg:
|
|||
limit: Вече сте закачили максималния брой публикации
|
||||
ownership: Публикация на някого другиго не може да бъде закачена
|
||||
reblog: Раздуване не може да бъде закачано
|
||||
quote_policies:
|
||||
followers: Последователи и споменати потребители
|
||||
nobody: Само споменатите потребители
|
||||
public: Всеки
|
||||
title: "%{name}: „%{quote}“"
|
||||
visibilities:
|
||||
direct: Директно
|
||||
|
@ -1894,6 +1913,11 @@ bg:
|
|||
does_not_match_previous_name: не съвпада с предишното име
|
||||
terms_of_service:
|
||||
title: Условия на услугата
|
||||
terms_of_service_interstitial:
|
||||
future_preamble_html: Правим някои промени в условията на услугата ни, което ще влезе в сила на <strong>%{date}</strong>. Насърчаваме ви да разгледате обновените условия.
|
||||
past_preamble_html: Променихме условията на услугата ни от последното ви посещение. Насърчаваме ви да разгледате обновените условия.
|
||||
review_link: Разглеждане на условията на услугата
|
||||
title: Условията на услугата на %{domain} се променят
|
||||
themes:
|
||||
contrast: Mastodon (висок контраст)
|
||||
default: Mastodon (тъмно)
|
||||
|
|
|
@ -396,6 +396,9 @@ br:
|
|||
created_at: Deiziad
|
||||
title_actions:
|
||||
none: Diwall
|
||||
emoji_styles:
|
||||
auto: Emgefreek
|
||||
twemoji: Twemoji
|
||||
exports:
|
||||
archive_takeout:
|
||||
date: Deiziad
|
||||
|
|
|
@ -1387,6 +1387,10 @@ cs:
|
|||
basic_information: Základní informace
|
||||
hint_html: "<strong>Nastavte si, co lidé uvidí na vašem veřejném profilu a vedle vašich příspěvků.</strong> Ostatní lidé vás budou spíše sledovat a komunikovat s vámi, když budete mít vyplněný profil a profilový obrázek."
|
||||
other: Další
|
||||
emoji_styles:
|
||||
auto: Auto
|
||||
native: Výchozí
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': Žádost, kterou jste odeslali, byla neplatná nebo poškozená.
|
||||
'403': Nejste oprávněni tuto stránku zobrazit.
|
||||
|
|
|
@ -1006,7 +1006,7 @@ da:
|
|||
one: Send %{display_count} e-mail
|
||||
other: Send %{display_count} e-mails
|
||||
title: Forhåndsvis Tjenestevilkår-underretning
|
||||
publish: Udgiv
|
||||
publish: Publicér
|
||||
published_on_html: Udgivet pr. %{date}
|
||||
save_draft: Gem udkast
|
||||
title: Tjenestevilkår
|
||||
|
@ -1347,8 +1347,12 @@ da:
|
|||
your_appeal_rejected: Din appel er afvist
|
||||
edit_profile:
|
||||
basic_information: Oplysninger
|
||||
hint_html: "<strong>Tilpas hvad folk ser på din offentlige profil og ved siden af dine indlæg.</strong> Andre personer vil mere sandsynligt følge dig tilbage og interagere med dig, når du har en udfyldt profil og et profilbillede."
|
||||
hint_html: "<strong>Tilpas, hvad folk ser på din offentlige profil og ved siden af dine indlæg.</strong> Andre personer er mere tilbøjelige til at følge dig tilbage og interagere med dig, når du har en udfyldt profil og et profilbillede."
|
||||
other: Andre
|
||||
emoji_styles:
|
||||
auto: Auto
|
||||
native: Indbygget
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': Din indsendte anmodning er ugyldig eller fejlbehæftet.
|
||||
'403': Du har ikke tilladelse til at se denne side.
|
||||
|
@ -1485,8 +1489,8 @@ da:
|
|||
one: Man er ved at <strong>erstatte sine lister</strong> med indhold fra <strong>%{filename}</strong>. <strong>%{count} konto</strong> føjes til nye lister.
|
||||
other: Man er ved at <strong>erstatte sine lister</strong> med indhold fra <strong>%{filename}</strong>. Op til <strong>%{count} konti</strong> føjes til nye lister.
|
||||
muting_html:
|
||||
one: Man er ved at <strong>sin liste over en tavsgjort konto</strong> med <strong>%{count} konto</strong> fra <strong>%{filename}</strong>.
|
||||
other: Du er ved at <strong>erstatte din liste over skjulte kontoer</strong> med op til <strong>%{count} kontoer</strong> fra <strong>%{filename}</strong>.
|
||||
one: Du er ved at <strong>erstatte din liste over en skjult konto</strong> med op til <strong>%{count} konto</strong> fra <strong>%{filename}</strong>.
|
||||
other: Du er ved at <strong>erstatte din liste over skjulte konti</strong> med op til <strong>%{count} konti</strong> fra <strong>%{filename}</strong>.
|
||||
preambles:
|
||||
blocking_html:
|
||||
one: Man er ved at <strong>blokere</strong> <strong>%{count} konto</strong> fra <strong>%{filename}</strong>.
|
||||
|
@ -1504,8 +1508,8 @@ da:
|
|||
one: Man er ved at tilføje <strong>%{count} konto</strong> fra <strong>%{filename}</strong> til sine <strong>lister</strong>. Nye lister oprettes, hvis der ikke findes nogen liste at tilføje til.
|
||||
other: Man er ved at tilføje <strong>%{count} konti</strong> fra <strong>%{filename}</strong> til sine <strong>lister</strong>. Nye lister oprettes, hvis der ikke findes nogen liste at tilføje til.
|
||||
muting_html:
|
||||
one: Man er ved at <strong>tavsgøre</strong> <strong>%{count} konto</strong> fra <strong>%{filename}</strong>.
|
||||
other: Du er ved at <strong>skjule</strong> op til <strong>%{count} kontoer</strong> fra <strong>%{filename}</strong>.
|
||||
one: Du er ved at <strong>skjule</strong> op til <strong>%{count} konto</strong> fra <strong>%{filename}</strong>.
|
||||
other: Du er ved at <strong>skjule</strong> op til <strong>%{count} konti</strong> fra <strong>%{filename}</strong>.
|
||||
preface: Du kan importere data, du har eksporteret fra en anden server, såsom en liste over folk du følger eller blokerer.
|
||||
recent_imports: Seneste importer
|
||||
states:
|
||||
|
@ -1522,11 +1526,11 @@ da:
|
|||
domain_blocking: Importerer blokerede konti
|
||||
following: Importerer fulgte konti
|
||||
lists: Import af lister
|
||||
muting: Importerer skjulte kontoer
|
||||
muting: Importerer skjulte konti
|
||||
type: Importtype
|
||||
type_groups:
|
||||
constructive: Følger og Bogmærker
|
||||
destructive: Blokerede og skjulte kontoer
|
||||
destructive: Blokerede og skjulte konti
|
||||
types:
|
||||
blocking: Blokeringsliste
|
||||
bookmarks: Bogmærker
|
||||
|
@ -1628,7 +1632,7 @@ da:
|
|||
title: Moderation
|
||||
move_handler:
|
||||
carry_blocks_over_text: Denne bruger er flyttet fra %{acct}, som du har haft blokeret.
|
||||
carry_mutes_over_text: Denne bruger er flyttet fra %{acct}, som du har haft skjult.
|
||||
carry_mutes_over_text: Denne bruger flyttede fra %{acct}, som du havde skjult.
|
||||
copy_account_note_text: 'Denne bruger er flyttet fra %{acct}, hvor dine tidligere noter om dem var:'
|
||||
navigation:
|
||||
toggle_menu: Åbn/luk menu
|
||||
|
@ -1832,7 +1836,7 @@ da:
|
|||
profile: Offentlig profil
|
||||
relationships: Følger og følgere
|
||||
severed_relationships: Afbrudte forhold
|
||||
statuses_cleanup: Auto-indlægssletning
|
||||
statuses_cleanup: Automatiseret sletning af indlæg
|
||||
strikes: Moderationsadvarsler
|
||||
two_factor_authentication: Tofaktorgodkendelse
|
||||
webauthn_authentication: Sikkerhedsnøgler
|
||||
|
@ -1905,9 +1909,9 @@ da:
|
|||
keep_polls: Behold afstemninger
|
||||
keep_polls_hint: Sletter ingen af dine afstemninger
|
||||
keep_self_bookmark: Behold bogmærkede indlæg
|
||||
keep_self_bookmark_hint: Sletter ikke dine egne indlæg, såfremt de er bogmærket
|
||||
keep_self_bookmark_hint: Sletter ikke dine egne indlæg, hvis du har bogmærket dem
|
||||
keep_self_fav: Behold favoritmarkerede indlæg
|
||||
keep_self_fav_hint: Sletter ikke dine egne indlæg, såfremt de er favoritmarkeret
|
||||
keep_self_fav_hint: Sletter ikke dine egne indlæg, hvis du har favoritmarkeret dem
|
||||
min_age:
|
||||
'1209600': 2 uger
|
||||
'15778476': 6 måneder
|
||||
|
|
|
@ -1349,6 +1349,10 @@ de:
|
|||
basic_information: Allgemeine Informationen
|
||||
hint_html: "<strong>Bestimme, was andere auf deinem öffentlichen Profil und neben deinen Beiträgen sehen können.</strong> Wenn du ein Profilbild festlegst und dein Profil vervollständigst, werden andere eher mit dir interagieren und dir folgen."
|
||||
other: Andere
|
||||
emoji_styles:
|
||||
auto: Automatisch
|
||||
native: Nativ
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': Die Anfrage, die du gestellt hast, war ungültig oder fehlerhaft.
|
||||
'403': Dir fehlt die Berechtigung, diese Seite aufzurufen.
|
||||
|
@ -1940,7 +1944,7 @@ de:
|
|||
contrast: Mastodon (Hoher Kontrast)
|
||||
default: Mastodon (Dunkel)
|
||||
mastodon-light: Mastodon (Hell)
|
||||
system: Automatisch (mit System synchronisieren)
|
||||
system: Automatisch (wie Betriebssystem)
|
||||
time:
|
||||
formats:
|
||||
default: "%d. %b %Y, %H:%M Uhr"
|
||||
|
|
|
@ -49,14 +49,14 @@ vi:
|
|||
title: Đổi lại mật khẩu
|
||||
two_factor_disabled:
|
||||
explanation: Đăng nhập bây giờ chỉ có thể sử dụng địa chỉ email và mật khẩu.
|
||||
subject: 'Mastodon: Xác minh 2 bước đã bị vô hiệu hóa'
|
||||
subtitle: Xác minh hai bước cho tài khoản của bạn đã bị vô hiệu hóa.
|
||||
title: Vô hiệu hóa xác minh 2 bước
|
||||
subject: 'Mastodon: Xác thực 2 bước đã bị vô hiệu hóa'
|
||||
subtitle: Xác thực 2 bước cho tài khoản của bạn đã bị vô hiệu hóa.
|
||||
title: Vô hiệu hóa xác thực 2 bước
|
||||
two_factor_enabled:
|
||||
explanation: Cần có mã token được tạo bởi ứng dụng TOTP được ghép nối để đăng nhập.
|
||||
subject: 'Mastodon: Kích hoạt xác minh 2 bước'
|
||||
subtitle: Xác minh hai bước đã được bật cho tài khoản của bạn.
|
||||
title: Kích hoạt xác minh 2 bước
|
||||
subject: 'Mastodon: Kích hoạt xác thực 2 bước'
|
||||
subtitle: Xác thực 2 bước đã được bật cho tài khoản của bạn.
|
||||
title: Kích hoạt xác thực 2 bước
|
||||
two_factor_recovery_codes_changed:
|
||||
explanation: Các mã khôi phục trước đó đã bị vô hiệu hóa và thay bằng mã mới.
|
||||
subject: 'Mastodon: Mã khôi phục xác thực hai yếu tố đã được tạo lại'
|
||||
|
|
|
@ -29,7 +29,7 @@ cs:
|
|||
edit:
|
||||
title: Upravit aplikaci
|
||||
form:
|
||||
error: A jéje! Zkontrolujte ve formuláři případné chyby
|
||||
error: A jéje! Zkontrolujte formulář pro případné chyby
|
||||
help:
|
||||
native_redirect_uri: Pro místní testy použijte %{native_redirect_uri}
|
||||
redirect_uri: Jedno URI na každý řádek
|
||||
|
|
|
@ -130,11 +130,11 @@ da:
|
|||
crypto: Ende-til-ende kryptering
|
||||
favourites: Favoritter
|
||||
filters: Filtre
|
||||
follow: Fulgte, skjjulte og blokerede kontoer
|
||||
follow: Fulgte, skjulte og blokerede konti
|
||||
follows: Følger
|
||||
lists: Lister
|
||||
media: Medievedhæftninger
|
||||
mutes: Skjulte kontoer
|
||||
mutes: Skjulte
|
||||
notifications: Notifikationer
|
||||
profile: Din Mastodon-profil
|
||||
push: Push-notifikationer
|
||||
|
@ -177,7 +177,7 @@ da:
|
|||
read:filters: se dine filtre
|
||||
read:follows: se dine følger
|
||||
read:lists: se dine lister
|
||||
read:mutes: se dine skjulte kontoer
|
||||
read:mutes: se dine skjulte konti
|
||||
read:notifications: se dine notifikationer
|
||||
read:reports: se dine anmeldelser
|
||||
read:search: søg på dine vegne
|
||||
|
|
|
@ -309,6 +309,7 @@ en-GB:
|
|||
title: Audit log
|
||||
unavailable_instance: "(domain name unavailable)"
|
||||
announcements:
|
||||
back: Back to announcements
|
||||
destroyed_msg: Announcement successfully deleted!
|
||||
edit:
|
||||
title: Edit announcement
|
||||
|
@ -317,6 +318,10 @@ en-GB:
|
|||
new:
|
||||
create: Create announcement
|
||||
title: New announcement
|
||||
preview:
|
||||
disclaimer: As users cannot opt out of them, email notifications should be limited to important announcements such as personal data breach or server closure notifications.
|
||||
explanation_html: 'The email will be sent to <strong>%{display_count} users</strong>. The following text will be included in the e-mail:'
|
||||
title: Preview announcement notification
|
||||
publish: Publish
|
||||
published_msg: Announcement successfully published!
|
||||
scheduled_for: Scheduled for %{time}
|
||||
|
@ -475,6 +480,36 @@ en-GB:
|
|||
new:
|
||||
title: Import domain blocks
|
||||
no_file: No file selected
|
||||
fasp:
|
||||
debug:
|
||||
callbacks:
|
||||
created_at: Created at
|
||||
delete: Delete
|
||||
ip: IP address
|
||||
request_body: Request body
|
||||
title: Debug Callbacks
|
||||
providers:
|
||||
active: Active
|
||||
base_url: Base URL
|
||||
callback: Callback
|
||||
delete: Delete
|
||||
edit: Edit Provider
|
||||
finish_registration: Finish registration
|
||||
name: Name
|
||||
providers: Providers
|
||||
public_key_fingerprint: Public key fingerprint
|
||||
registration_requested: Registration requested
|
||||
registrations:
|
||||
confirm: Confirm
|
||||
description: You received a registration from a FASP. Reject it if you did not initiate this. If you initiated this, carefully compare name and key fingerprint before confirming the registration.
|
||||
reject: Reject
|
||||
title: Confirm FASP Registration
|
||||
save: Save
|
||||
select_capabilities: Select Capabilities
|
||||
sign_in: Sign In
|
||||
status: Status
|
||||
title: Fediverse Auxiliary Service Providers
|
||||
title: FASP
|
||||
follow_recommendations:
|
||||
description_html: "<strong>Follow recommendations help new users quickly find interesting content</strong>. When a user has not interacted with others enough to form personalised follow recommendations, these accounts are recommended instead. They are re-calculated on a daily basis from a mix of accounts with the highest recent engagements and highest local follower counts for a given language."
|
||||
language: For language
|
||||
|
@ -543,6 +578,13 @@ en-GB:
|
|||
all: All
|
||||
limited: Limited
|
||||
title: Moderation
|
||||
moderation_notes:
|
||||
create: Add Moderation Note
|
||||
created_msg: Instance moderation note successfully created!
|
||||
description_html: View and leave notes for other moderators and your future self
|
||||
destroyed_msg: Instance moderation note successfully deleted!
|
||||
placeholder: Information about this instance, actions taken, or anything else that will help you moderate this instance in the future.
|
||||
title: Moderation Notes
|
||||
private_comment: Private comment
|
||||
public_comment: Public comment
|
||||
purge: Purge
|
||||
|
@ -751,17 +793,26 @@ en-GB:
|
|||
title: Roles
|
||||
rules:
|
||||
add_new: Add rule
|
||||
add_translation: Add translation
|
||||
delete: Delete
|
||||
description_html: While most claim to have read and agree to the terms of service, usually people do not read through until after a problem arises. <strong>Make it easier to see your server's rules at a glance by providing them in a flat bullet point list.</strong> Try to keep individual rules short and simple, but try not to split them up into many separate items either.
|
||||
edit: Edit rule
|
||||
empty: No server rules have been defined yet.
|
||||
move_down: Move down
|
||||
move_up: Move up
|
||||
title: Server rules
|
||||
translation: Translation
|
||||
translations: Translations
|
||||
translations_explanation: You can optionally add translations for the rules. The default value will be shown if no translated version is available. Please always ensure any provided translation is in sync with the default value.
|
||||
settings:
|
||||
about:
|
||||
manage_rules: Manage server rules
|
||||
preamble: Provide in-depth information about how the server is operated, moderated, funded.
|
||||
rules_hint: There is a dedicated area for rules that your users are expected to adhere to.
|
||||
title: About
|
||||
allow_referrer_origin:
|
||||
desc: When your users click links to external sites, their browser may send the address of your Mastodon server as the referrer. Disable this if this would uniquely identify your users, e.g. if this is a personal Mastodon server.
|
||||
title: Allow external sites to see your Mastodon server as a traffic source
|
||||
appearance:
|
||||
preamble: Customise Mastodon's web interface.
|
||||
title: Appearance
|
||||
|
@ -781,6 +832,7 @@ en-GB:
|
|||
discovery:
|
||||
follow_recommendations: Follow recommendations
|
||||
preamble: Surfacing interesting content is instrumental in onboarding new users who may not know anyone Mastodon. Control how various discovery features work on your server.
|
||||
privacy: Privacy
|
||||
profile_directory: Profile directory
|
||||
public_timelines: Public timelines
|
||||
publish_statistics: Publish statistics
|
||||
|
@ -867,6 +919,8 @@ en-GB:
|
|||
system_checks:
|
||||
database_schema_check:
|
||||
message_html: There are pending database migrations. Please run them to ensure the application behaves as expected
|
||||
elasticsearch_analysis_index_mismatch:
|
||||
message_html: Elasticsearch index analyser settings are outdated. Please run <code>tootctl search deploy --only-mapping --only=%{value}</code>
|
||||
elasticsearch_health_red:
|
||||
message_html: Elasticsearch cluster is unhealthy (red status), search features are unavailable
|
||||
elasticsearch_health_yellow:
|
||||
|
@ -938,6 +992,7 @@ en-GB:
|
|||
chance_to_review_html: "<strong>The generated terms of service will not be published automatically.</strong> You will have a chance to review the results. Please fill in the necessary details to proceed."
|
||||
explanation_html: The terms of service template provided is for informational purposes only, and should not be construed as legal advice on any subject matter. Please consult with your own legal counsel on your situation and specific legal questions you have.
|
||||
title: Terms of Service Setup
|
||||
going_live_on_html: Live, effective %{date}
|
||||
history: History
|
||||
live: Live
|
||||
no_history: There are no recorded changes of the terms of service yet.
|
||||
|
@ -1294,6 +1349,10 @@ en-GB:
|
|||
basic_information: Basic information
|
||||
hint_html: "<strong>Customise what people see on your public profile and next to your posts.</strong> Other people are more likely to follow you back and interact with you when you have a filled out profile and a profile picture."
|
||||
other: Other
|
||||
emoji_styles:
|
||||
auto: Auto
|
||||
native: Native
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': The request you submitted was invalid or malformed.
|
||||
'403': You don't have permission to view this page.
|
||||
|
@ -1819,6 +1878,10 @@ en-GB:
|
|||
limit: You have already pinned the maximum number of posts
|
||||
ownership: Someone else's post cannot be pinned
|
||||
reblog: A boost cannot be pinned
|
||||
quote_policies:
|
||||
followers: Followers and mentioned users
|
||||
nobody: Only mentioned users
|
||||
public: Everyone
|
||||
title: '%{name}: "%{quote}"'
|
||||
visibilities:
|
||||
direct: Direct
|
||||
|
@ -1872,6 +1935,11 @@ en-GB:
|
|||
does_not_match_previous_name: does not match the previous name
|
||||
terms_of_service:
|
||||
title: Terms of Service
|
||||
terms_of_service_interstitial:
|
||||
future_preamble_html: We're making some changes to our terms of service, which will be effective on <strong>%{date}</strong>. We encourage you to review the updated terms.
|
||||
past_preamble_html: We have changed our terms of service since your last visit. We encourage you to review the updated terms.
|
||||
review_link: Review terms of service
|
||||
title: The terms of service of %{domain} are changing
|
||||
themes:
|
||||
contrast: Mastodon (High contrast)
|
||||
default: Mastodon (Dark)
|
||||
|
@ -1903,6 +1971,10 @@ en-GB:
|
|||
recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. <strong>Keep the recovery codes safe</strong>. For example, you may print them and store them with other important documents.
|
||||
webauthn: Security keys
|
||||
user_mailer:
|
||||
announcement_published:
|
||||
description: 'The administrators of %{domain} are making an announcement:'
|
||||
subject: Service announcement
|
||||
title: "%{domain} service announcement"
|
||||
appeal_approved:
|
||||
action: Account Settings
|
||||
explanation: The appeal of the strike against your account on %{strike_date} that you submitted on %{appeal_date} has been approved. Your account is once again in good standing.
|
||||
|
@ -1935,6 +2007,8 @@ en-GB:
|
|||
terms_of_service_changed:
|
||||
agreement: By continuing to use %{domain}, you are agreeing to these terms. If you disagree with the updated terms, you may terminate your agreement with %{domain} at any time by deleting your account.
|
||||
changelog: 'At a glance, here is what this update means for you:'
|
||||
description: 'You are receiving this e-mail because we''re making some changes to our terms of service at %{domain}. These updates will take effect on %{date}. We encourage you to review the updated terms in full here:'
|
||||
description_html: You are receiving this e-mail because we're making some changes to our terms of service at %{domain}. These updates will take effect on <strong>%{date}</strong>. We encourage you to review the <a href="%{path}" target="_blank">updated terms in full here</a>.
|
||||
sign_off: The %{domain} team
|
||||
subject: Updates to our terms of service
|
||||
subtitle: The terms of service of %{domain} are changing
|
||||
|
|
|
@ -1349,6 +1349,10 @@ en:
|
|||
basic_information: Basic information
|
||||
hint_html: "<strong>Customize what people see on your public profile and next to your posts.</strong> Other people are more likely to follow you back and interact with you when you have a filled out profile and a profile picture."
|
||||
other: Other
|
||||
emoji_styles:
|
||||
auto: Auto
|
||||
native: Native
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': The request you submitted was invalid or malformed.
|
||||
'403': You don't have permission to view this page.
|
||||
|
|
|
@ -1349,6 +1349,10 @@ es-AR:
|
|||
basic_information: Información básica
|
||||
hint_html: "<strong>Personalizá lo que la gente ve en tu perfil público y junto a tus publicaciones.</strong> Es más probable que otras personas te sigan e interactúen con vos cuando tengas un perfil completo y una foto de perfil."
|
||||
other: Otros
|
||||
emoji_styles:
|
||||
auto: Automático
|
||||
native: Nativo
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': La solicitud que enviaste no era válida o estaba corrompida.
|
||||
'403': No tenés permiso para ver esta página.
|
||||
|
|
|
@ -1349,6 +1349,10 @@ es-MX:
|
|||
basic_information: Información básica
|
||||
hint_html: "<strong>Personaliza lo que la gente ve en tu perfil público junto a tus publicaciones.</strong> Es más probable que otras personas te sigan e interactúen contigo cuando completes tu perfil y agregues una foto."
|
||||
other: Otro
|
||||
emoji_styles:
|
||||
auto: Automático
|
||||
native: Nativo
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': La solicitud que has enviado no es valida o estaba malformada.
|
||||
'403': No tienes permiso para acceder a esta página.
|
||||
|
|
|
@ -1349,6 +1349,10 @@ es:
|
|||
basic_information: Información básica
|
||||
hint_html: "<strong>Personaliza lo que la gente ve en tu perfil público junto a tus publicaciones.</strong> Es más probable que otras personas te sigan e interactúen contigo cuando completas tu perfil y foto."
|
||||
other: Otros
|
||||
emoji_styles:
|
||||
auto: Automático
|
||||
native: Nativo
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': La solicitud que has enviado no es valida o estaba malformada.
|
||||
'403': No tienes permiso para acceder a esta página.
|
||||
|
|
|
@ -187,6 +187,7 @@ eu:
|
|||
create_domain_block: Sortu domeinu blokeoa
|
||||
create_email_domain_block: Sortu email domeinu blokeoa
|
||||
create_ip_block: Sortu IP araua
|
||||
create_relay: Erreleboa sortu
|
||||
create_unavailable_domain: Sortu eskuragarri ez dagoen domeinua
|
||||
create_user_role: Sortu rola
|
||||
demote_user: Jaitsi erabiltzailearen maila
|
||||
|
@ -198,11 +199,13 @@ eu:
|
|||
destroy_email_domain_block: Ezabatu email domeinu blokeoa
|
||||
destroy_instance: Ezabatu betiko domeinua
|
||||
destroy_ip_block: Ezabatu IP araua
|
||||
destroy_relay: Erreleboa ezabatu
|
||||
destroy_status: Ezabatu bidalketa
|
||||
destroy_unavailable_domain: Ezabatu eskuragarri ez dagoen domeinua
|
||||
destroy_user_role: Ezabatu rola
|
||||
disable_2fa_user: Desgaitu 2FA
|
||||
disable_custom_emoji: Desgaitu emoji pertsonalizatua
|
||||
disable_relay: Erreleboa desaktibatu
|
||||
disable_sign_in_token_auth_user: Desgaitu email token autentifikazioa erabiltzailearentzat
|
||||
disable_user: Desgaitu erabiltzailea
|
||||
enable_custom_emoji: Gaitu emoji pertsonalizatua
|
||||
|
@ -210,6 +213,7 @@ eu:
|
|||
enable_user: Gaitu erabiltzailea
|
||||
memorialize_account: Bihurtu kontua oroigarri
|
||||
promote_user: Igo erabiltzailea mailaz
|
||||
publish_terms_of_service: Zerbitzu-baldintzak argitaratu
|
||||
reject_appeal: Baztertu apelazioa
|
||||
reject_user: Baztertu erabiltzailea
|
||||
remove_avatar_user: Kendu abatarra
|
||||
|
@ -229,23 +233,29 @@ eu:
|
|||
update_custom_emoji: Eguneratu emoji pertsonalizatua
|
||||
update_domain_block: Eguneratu domeinu-blokeoa
|
||||
update_ip_block: Eguneratu IP araua
|
||||
update_report: Txostena eguneratu
|
||||
update_status: Eguneratu bidalketa
|
||||
update_user_role: Eguneratu rola
|
||||
actions:
|
||||
approve_appeal_html: "%{name} erabiltzaileak %{target} erabiltzailearen moderazio erabakiaren apelazioa onartu du"
|
||||
approve_user_html: "%{name} erabiltzaileak %{target} erabiltzailearen izen-ematea onartu du"
|
||||
assigned_to_self_report_html: "%{name} erabiltzaileak %{target} salaketa bere buruari esleitu dio"
|
||||
change_email_user_html: "%{name}(e)k %{target} erabiltzailearen e-posta helbidea aldatu du"
|
||||
change_role_user_html: "%{name} erabiltzaileak %{target} kontuaren rola aldatu du"
|
||||
confirm_user_html: "%{name}(e)k %{target} erabiltzailearen e-posta helbidea berretsi du"
|
||||
create_account_warning_html: "%{name} erabiltzaileak abisua bidali dio %{target} erabiltzaileari"
|
||||
create_announcement_html: "%{name} erabiltzaileak %{target} iragarpen berria sortu du"
|
||||
create_canonical_email_block_html: "%{name}(e)k %{target} hash-a duen helbide elektronikoa blokeatu du"
|
||||
create_custom_emoji_html: "%{name} erabiltzaileak %{target} emoji berria kargatu du"
|
||||
create_domain_allow_html: "%{name} erabiltzaileak %{target} domeinuarekin federazioa onartu du"
|
||||
create_domain_block_html: "%{name} erabiltzaileak %{target} domeinua blokeatu du"
|
||||
create_email_domain_block_html: "%{name}(e)k %{target} e-posta helbideen domeinua blokeatu du"
|
||||
create_ip_block_html: "%{name} kontuak %{target} IParen araua sortu du"
|
||||
create_unavailable_domain_html: "%{name}(e)k %{target} domeinurako banaketa gelditu du"
|
||||
create_user_role_html: "%{name} erabiltzaileak %{target} rola sortu du"
|
||||
demote_user_html: "%{name} erabiltzaileak %{target} erabiltzailea mailaz jaitsi du"
|
||||
destroy_announcement_html: "%{name} erabiltzaileak %{target} iragarpena ezabatu du"
|
||||
destroy_canonical_email_block_html: "%{name}(e)k %{target} hash-a duen helbide elektronikoa desblokeatu du"
|
||||
destroy_custom_emoji_html: "%{name} erabiltzaileak %{target} emoji-a ezabatu du"
|
||||
destroy_domain_allow_html: "%{name} erabiltzaileak %{target} domeinuarekin federatzea debekatu du"
|
||||
destroy_domain_block_html: "%{name} erabiltzaileak %{target} domeinua desblokeatu du"
|
||||
|
@ -286,7 +296,9 @@ eu:
|
|||
filter_by_action: Iragazi ekintzen arabera
|
||||
filter_by_user: Iragazi erabiltzaileen arabera
|
||||
title: Auditoria-egunkaria
|
||||
unavailable_instance: "(domeinu izena ez dago erabilgarri)"
|
||||
announcements:
|
||||
back: Oharretara bueltatu
|
||||
destroyed_msg: Iragarpena ongi ezabatu da!
|
||||
edit:
|
||||
title: Editatu iragarpena
|
||||
|
@ -433,8 +445,10 @@ eu:
|
|||
new:
|
||||
create: Gehitu domeinua
|
||||
resolve: Ebatzi domeinua
|
||||
title: Posta domeinu berria blokeatu
|
||||
not_permitted: Baimendu gabea
|
||||
resolved_through_html: "%{domain} domeinuaren bidez ebatzia"
|
||||
title: Email domeinua blokeatuta
|
||||
export_domain_allows:
|
||||
new:
|
||||
title: Baimendutako domeinuak inportatu
|
||||
|
@ -450,6 +464,32 @@ eu:
|
|||
new:
|
||||
title: Domeinu-blokeoak inportatu
|
||||
no_file: Ez da fitxategirik hautatu
|
||||
fasp:
|
||||
debug:
|
||||
callbacks:
|
||||
created_at: Sortua hemen
|
||||
delete: Ezabatu
|
||||
ip: IP helbidea
|
||||
request_body: Eskaeraren edukia
|
||||
title: Atzera-deiak araztu
|
||||
providers:
|
||||
active: Aktibo
|
||||
base_url: Oinarrizko URL-a
|
||||
delete: Ezabatu
|
||||
edit: Editatu hornitzailea
|
||||
finish_registration: Izen-ematea bukatu
|
||||
name: Izena
|
||||
providers: Hornitzaileak
|
||||
public_key_fingerprint: Gako publikoaren hatz-marka
|
||||
registration_requested: Izen-ematea eskatuta
|
||||
registrations:
|
||||
confirm: Berretsi
|
||||
reject: Ukatu
|
||||
save: Gorde
|
||||
sign_in: Hasi saioa
|
||||
status: Egoera
|
||||
title: Fedibertsoko zerbitzu osagarrien hornitzaileak
|
||||
title: FZOH
|
||||
follow_recommendations:
|
||||
description_html: "<strong>Jarraitzeko gomendioek erabiltzaile berriei eduki interesgarria azkar aurkitzen laguntzen diete</strong>. Erabiltzaile batek jarraitzeko gomendio pertsonalizatuak jasotzeko adina interakzio izan ez duenean, kontu hauek gomendatzen zaizkio. Egunero birkalkulatzen dira hizkuntza bakoitzerako, azken aldian parte-hartze handiena izan duten eta jarraitzaile lokal gehien dituzten kontuak nahasiz."
|
||||
language: Hizkuntza
|
||||
|
@ -515,6 +555,10 @@ eu:
|
|||
all: Denak
|
||||
limited: Mugatua
|
||||
title: Moderazioa
|
||||
moderation_notes:
|
||||
create: Gehitu Moderazio Oharra
|
||||
created_msg: Instantziako moderazio oharra ongi sortu da!
|
||||
description_html: Ikusi eta idatzi oharrak beste moderatzaileentzat eta zuretzat etorkizunerako
|
||||
private_comment: Iruzkin pribatua
|
||||
public_comment: Iruzkin publikoa
|
||||
purge: Ezabatu betiko
|
||||
|
@ -717,11 +761,14 @@ eu:
|
|||
title: Rolak
|
||||
rules:
|
||||
add_new: Gehitu araua
|
||||
add_translation: Gehitu itzulpena
|
||||
delete: Ezabatu
|
||||
description_html: Gehienek erabilera baldintzak irakurri eta onartu dituztela baieztatzen badute ere, orokorrean arazoren bat dagoen arte ez dituzte irakurtzen. <strong>Zerbitzariaren arauak begirada batean ikustea errazteko buletadun zerrenda batean bildu.</strong> Saiatu arauak labur eta sinple idazten, baina elementu askotan banatu gabe.
|
||||
edit: Editatu araua
|
||||
empty: Ez da zerbitzariko araurik definitu oraindik.
|
||||
title: Zerbitzariaren arauak
|
||||
translation: Itzulpena
|
||||
translations: Itzulpenak
|
||||
settings:
|
||||
about:
|
||||
manage_rules: Kudeatu zerbitzariaren arauak
|
||||
|
@ -747,6 +794,7 @@ eu:
|
|||
discovery:
|
||||
follow_recommendations: Jarraitzeko gomendioak
|
||||
preamble: Eduki interesgarria aurkitzea garrantzitsua da Mastodoneko erabiltzaile berrientzat, behar bada inor ez dutelako ezagutuko. Kontrolatu zure zerbitzariko aurkikuntza-ezaugarriek nola funtzionatzen duten.
|
||||
privacy: Pribatutasuna
|
||||
profile_directory: Profil-direktorioa
|
||||
public_timelines: Denbora-lerro publikoak
|
||||
publish_statistics: Argitaratu estatistikak
|
||||
|
@ -777,6 +825,7 @@ eu:
|
|||
destroyed_msg: Guneko igoera ongi ezabatu da!
|
||||
software_updates:
|
||||
critical_update: Kritikoa — mesedez, eguneratu azkar
|
||||
description: Gomendagarria da Mastodon instalazioa eguneratuta mantentzea azken konponketa eta funtzioez baliatzeko. Gainera, batzuetan ezinbestekoa da Mastodon garaiz eguneratzea segurtasun arazoak saihesteko. Arrazoi hauengatik, Mastodonek 30 minuturo eguneratzeak egiaztatzen ditu, eta zure posta elektroniko bidezko jakinarazpenen lehentasunen arabera jakinaraziko dizu.
|
||||
documentation_link: Informazio gehiago
|
||||
release_notes: Bertsio oharrak
|
||||
title: Eguneraketak eskuragarri
|
||||
|
@ -794,6 +843,7 @@ eu:
|
|||
batch:
|
||||
remove_from_report: Kendu txostenetik
|
||||
report: Salatu
|
||||
contents: Edukiak
|
||||
deleted: Ezabatuta
|
||||
favourites: Gogokoak
|
||||
history: Bertsio-historia
|
||||
|
@ -802,6 +852,7 @@ eu:
|
|||
media:
|
||||
title: Multimedia
|
||||
metadata: Metadatuak
|
||||
no_history: Bidalketa hau ez da editatu
|
||||
no_status_selected: Ez da bidalketarik aldatu ez delako bat ere hautatu
|
||||
open: Ireki bidalketa
|
||||
original_status: Jatorrizko bidalketa
|
||||
|
@ -849,6 +900,8 @@ eu:
|
|||
message_html: Ez duzu zerbitzariaren araurik definitu.
|
||||
sidekiq_process_check:
|
||||
message_html: Ez da ari Sidekiq prozesurik exekutatzen %{value} ilad(et)an. Egiaztatu Sidekiq konfigurazioa
|
||||
software_version_check:
|
||||
message_html: Mastodon eguneratze bat eskuragarri dago.
|
||||
software_version_critical_check:
|
||||
action: Ikusi eguneraketa eskuragarriak
|
||||
message_html: Mastodon eguneraketa kritikoa eskuragarri, mesedez eguneratu ahal bezain azkar.
|
||||
|
@ -862,8 +915,35 @@ eu:
|
|||
action: Ikus hemen informazio gehiagorako
|
||||
message_html: "<strong>Zure objektuen biltegiratzea ez dago ongi konfiguratua. Zure erabiltzaileen pribatutasuna arriskuan dago.</strong>"
|
||||
tags:
|
||||
moderation:
|
||||
not_usable: Ez erabilgarri
|
||||
pending_review: Berrikusketaren zain
|
||||
reviewed: Berrikusita
|
||||
title: Egoera
|
||||
unreviewed: Berrikusi gabe
|
||||
usable: Erabilgarri
|
||||
name: Izena
|
||||
newest: Berriena
|
||||
oldest: Zaharrena
|
||||
open: Publikoki ikusi
|
||||
reset: Berrezarri
|
||||
review: Berrikusketaren egoera
|
||||
search: Bilatu
|
||||
title: Traolak
|
||||
updated_msg: Traola-ezarpenak ongi eguneratu dira
|
||||
terms_of_service:
|
||||
changelog: Zer aldatu da
|
||||
current: Oraingoa
|
||||
draft: Zirriborroa
|
||||
generate: Txantiloila erabili
|
||||
generates:
|
||||
action: Sortu
|
||||
history: Historia
|
||||
live: Zuzenean
|
||||
publish: Argitaratu
|
||||
published_on_html: "%{date}(e)an argitaratua"
|
||||
save_draft: Gorde zirriborroa
|
||||
title: Zerbitzuaren baldintzak
|
||||
title: Administrazioa
|
||||
trends:
|
||||
allow: Onartu
|
||||
|
@ -1056,6 +1136,7 @@ eu:
|
|||
migrate_account_html: Kontu hau beste batera birbideratu nahi baduzu, <a href="%{path}">hemen konfiguratu</a> dezakezu.
|
||||
or_log_in_with: Edo hasi saioa honekin
|
||||
progress:
|
||||
confirm: Berretsi e-mail helbidea
|
||||
details: Zure xehetasunak
|
||||
review: Gure berrikuspena
|
||||
rules: Onartu arauak
|
||||
|
@ -1077,6 +1158,7 @@ eu:
|
|||
security: Segurtasuna
|
||||
set_new_password: Ezarri pasahitza berria
|
||||
setup:
|
||||
email_below_hint_html: Begiratu zure spameko karpetan, edo eskatu beste bat. Zure helbide elektronikoa zuzen dezakezu oker badago.
|
||||
link_not_received: Ez duzu estekarik jaso?
|
||||
title: Begiratu zure sarrera-ontzia
|
||||
sign_in:
|
||||
|
@ -1587,10 +1669,12 @@ eu:
|
|||
delete: Kontuaren ezabaketa
|
||||
development: Garapena
|
||||
edit_profile: Editatu profila
|
||||
export: Esportatu
|
||||
featured_tags: Nabarmendutako traolak
|
||||
import: Inportazioa
|
||||
import_and_export: Inportatu eta esportatu
|
||||
migrate: Kontuaren migrazioa
|
||||
notifications: Posta bidezko jakinarazpenak
|
||||
preferences: Hobespenak
|
||||
profile: Profila
|
||||
relationships: Jarraitutakoak eta jarraitzaileak
|
||||
|
@ -1637,6 +1721,10 @@ eu:
|
|||
limit: Gehienez finkatu daitekeen bidalketa kopurua finkatu duzu jada
|
||||
ownership: Ezin duzu beste norbaiten bidalketa bat finkatu
|
||||
reblog: Bultzada bat ezin da finkatu
|
||||
quote_policies:
|
||||
followers: Jarraitzaileak eta aipatutako erabiltzaileak
|
||||
nobody: Aipatutako erabiltzaileak soilik
|
||||
public: Guztiak
|
||||
title: '%{name}: "%{quote}"'
|
||||
visibilities:
|
||||
direct: Zuzena
|
||||
|
@ -1688,6 +1776,8 @@ eu:
|
|||
too_late: Beranduegi da neurri hau apelatzeko
|
||||
tags:
|
||||
does_not_match_previous_name: ez dator aurreko izenarekin bat
|
||||
terms_of_service:
|
||||
title: Erabilera baldintzak
|
||||
themes:
|
||||
contrast: Mastodon (Kontraste altua)
|
||||
default: Mastodon (Iluna)
|
||||
|
@ -1833,6 +1923,7 @@ eu:
|
|||
instructions_html: Kopiatu eta itsatsi ondoko kodea zure webguneko HTMLan. Ondoren, gehitu zure webgunearen helbidea zure profileko eremu gehigarrietako batean, "Editatu profila" fitxatik eta gorde aldaketak.
|
||||
verification: Egiaztaketa
|
||||
verified_links: Zure lotura egiaztatuak
|
||||
website_verification: Web orriaren egiaztapena
|
||||
webauthn_credentials:
|
||||
add: Gehitu segurtasun gako berria
|
||||
create:
|
||||
|
|
|
@ -1347,6 +1347,10 @@ fi:
|
|||
basic_information: Perustiedot
|
||||
hint_html: "<strong>Mukauta, mitä ihmiset näkevät julkisessa profiilissasi ja julkaisujesi vieressä.</strong> Sinua seurataan takaisin ja kanssasi ollaan vuorovaikutuksessa todennäköisemmin, kun sinulla on täytetty profiili ja profiilikuva."
|
||||
other: Muut
|
||||
emoji_styles:
|
||||
auto: Automaattinen
|
||||
native: Natiivi
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': Lähettämäsi pyyntö oli virheellinen tai muotoiltu virheellisesti.
|
||||
'403': Sinulla ei ole oikeutta nähdä tätä sivua.
|
||||
|
|
|
@ -1349,6 +1349,10 @@ fo:
|
|||
basic_information: Grundleggjandi upplýsingar
|
||||
hint_html: "<strong>Tillaga tað, sum fólk síggja á tínum almenna vanga og við síðna av tínum postum.</strong> Sannlíkindini fyri, at onnur fylgja tær og virka saman við tær eru størri, tá tú hevur fylt út vangan og eina vangamynd."
|
||||
other: Onnur
|
||||
emoji_styles:
|
||||
auto: Sjálvvirkandi
|
||||
native: Upprunalig
|
||||
twemoji: Twitter kenslutekn
|
||||
errors:
|
||||
'400': Umbønin, sum tú sendi inn, var ógildug ella hevði skeivt skap.
|
||||
'403': Tú hevur ikki loyvi at síggja hesa síðuna.
|
||||
|
|
|
@ -1851,6 +1851,8 @@ fr-CA:
|
|||
limit: Vous avez déjà épinglé le nombre maximum de messages
|
||||
ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas
|
||||
reblog: Un partage ne peut pas être épinglé
|
||||
quote_policies:
|
||||
followers: Abonné·e·s et utilisateur·trice·s mentionné·e·s
|
||||
title: "%{name} : « %{quote} »"
|
||||
visibilities:
|
||||
direct: Direct
|
||||
|
@ -1904,6 +1906,8 @@ fr-CA:
|
|||
does_not_match_previous_name: ne correspond pas au nom précédent
|
||||
terms_of_service:
|
||||
title: Conditions d'utilisation
|
||||
terms_of_service_interstitial:
|
||||
title: Les conditions d'utilisation de %{domain} ont changées
|
||||
themes:
|
||||
contrast: Mastodon (Contraste élevé)
|
||||
default: Mastodon (Sombre)
|
||||
|
|
|
@ -1851,6 +1851,8 @@ fr:
|
|||
limit: Vous avez déjà épinglé le nombre maximum de messages
|
||||
ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas
|
||||
reblog: Un partage ne peut pas être épinglé
|
||||
quote_policies:
|
||||
followers: Abonné·e·s et utilisateur·trice·s mentionné·e·s
|
||||
title: "%{name} : « %{quote} »"
|
||||
visibilities:
|
||||
direct: Direct
|
||||
|
@ -1904,6 +1906,8 @@ fr:
|
|||
does_not_match_previous_name: ne correspond pas au nom précédent
|
||||
terms_of_service:
|
||||
title: Conditions d'utilisation
|
||||
terms_of_service_interstitial:
|
||||
title: Les conditions d'utilisation de %{domain} ont changées
|
||||
themes:
|
||||
contrast: Mastodon (Contraste élevé)
|
||||
default: Mastodon (Sombre)
|
||||
|
|
|
@ -578,6 +578,13 @@ fy:
|
|||
all: Alle
|
||||
limited: Beheind
|
||||
title: Moderaasje
|
||||
moderation_notes:
|
||||
create: Moderaasje-opmerking oanmeitsje
|
||||
created_msg: Oanmeitsjen fan servermoderaasje-opmerking slagge!
|
||||
description_html: Opmerkingen besjen en foar josele en oare moderatoaren efterlitte
|
||||
destroyed_msg: Fuortsmiten fan servermoderaasje-opmerking slagge!
|
||||
placeholder: Ynformaasje oer dizze server, nommen aksjes of wat oars dy’t jo helpe kinne om dizze server yn de takomst te moderearjen.
|
||||
title: Moderaasje-opmerkingen
|
||||
private_comment: Priveeopmerking
|
||||
public_comment: Iepenbiere opmerking
|
||||
purge: Folslein fuortsmite
|
||||
|
@ -1342,6 +1349,10 @@ fy:
|
|||
basic_information: Algemiene ynformaasje
|
||||
hint_html: "<strong>Pas oan wat minsken op jo iepenbiere profyl en njonken jo berjochten sjogge.</strong> Oare minsken sille jo earder folgje en mei jo kommunisearje wannear’t jo profyl ynfolle is en jo in profylfoto hawwe."
|
||||
other: Oars
|
||||
emoji_styles:
|
||||
auto: Automatysk
|
||||
native: Systeemeigen
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': De oanfraach dy’t jo yntsjinne hawwe wie ûnjildich of fout.
|
||||
'403': Jo hawwe gjin tastimming om dizze side te besjen.
|
||||
|
|
|
@ -1406,6 +1406,10 @@ ga:
|
|||
basic_information: Eolas bunúsach
|
||||
hint_html: "<strong>Saincheap a bhfeiceann daoine ar do phróifíl phoiblí agus in aice le do phostálacha.</strong> Is dóichí go leanfaidh daoine eile ar ais tú agus go n-idirghníomhóidh siad leat nuair a bhíonn próifíl líonta agus pictiúr próifíle agat."
|
||||
other: Eile
|
||||
emoji_styles:
|
||||
auto: Uath
|
||||
native: Dúchasach
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': Bhí an t-iarratas a chuir tú isteach neamhbhailí nó míchumtha.
|
||||
'403': Níl cead agat an leathanach seo a fheiceáil.
|
||||
|
|
|
@ -1349,6 +1349,10 @@ gl:
|
|||
basic_information: Información básica
|
||||
hint_html: "<strong>Personaliza o que van ver no teu perfil público e ao lado das túas publicacións.</strong> As outras persoas estarán máis animadas a seguirte e interactuar contigo se engades algún dato sobre ti así como unha imaxe de perfil."
|
||||
other: Outros
|
||||
emoji_styles:
|
||||
auto: Auto
|
||||
native: Nativo
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': A solicitude que enviou non é válida ou ten formato incorrecto.
|
||||
'403': Non ten permiso para ver esta páxina.
|
||||
|
|
|
@ -1387,6 +1387,10 @@ he:
|
|||
basic_information: מידע בסיסי
|
||||
hint_html: "<strong>התאמה אישית של מה שיראו אחרים בפרופיל הציבורי שלך וליד הודעותיך.</strong> אחרים עשויים יותר להחזיר עוקב וליצור אתך שיחה אם הפרופיל והתמונה יהיו מלאים."
|
||||
other: אחר
|
||||
emoji_styles:
|
||||
auto: אוטומטי
|
||||
native: מקומי
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': הבקשה שהגשת לא תקינה.
|
||||
'403': חסרות לך הרשאות לצפיה בעמוד זה.
|
||||
|
|
|
@ -1353,6 +1353,10 @@ is:
|
|||
basic_information: Grunnupplýsingar
|
||||
hint_html: "<strong>Sérsníddu hvað fólk sér á opinbera notandasniðinu þínu og næst færslunum þínum.</strong> Annað fólk er líklegra til að fylgjast með þér og eiga í samskiptum við þig ef þú fyllir út notandasniðið og setur auðkennismynd."
|
||||
other: Annað
|
||||
emoji_styles:
|
||||
auto: Sjálfvirkt
|
||||
native: Innbyggt
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': Beiðnin sem þú sendir er ógild eða rangt uppsett.
|
||||
'403': Þú hefur ekki heimildir til að skoða þessari síðu.
|
||||
|
|
|
@ -1351,6 +1351,10 @@ it:
|
|||
basic_information: Informazioni di base
|
||||
hint_html: "<strong>Personalizza ciò che le persone vedono sul tuo profilo pubblico e accanto ai tuoi post.</strong> È più probabile che altre persone ti seguano e interagiscano con te quando hai un profilo compilato e un'immagine del profilo."
|
||||
other: Altro
|
||||
emoji_styles:
|
||||
auto: Automatico
|
||||
native: Nativo
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': La richiesta che hai inviato non è valida o non è corretta.
|
||||
'403': Non sei autorizzato a visualizzare questa pagina.
|
||||
|
|
|
@ -280,6 +280,7 @@ kab:
|
|||
registrations:
|
||||
confirm: Sentem
|
||||
save: Sekles
|
||||
sign_in: Qqen
|
||||
title: FASP
|
||||
follow_recommendations:
|
||||
language: I tutlayt
|
||||
|
@ -383,6 +384,9 @@ kab:
|
|||
updated_at: Yettwaleqqem
|
||||
view_profile: Wali amaɣnu
|
||||
roles:
|
||||
assigned_users:
|
||||
one: "%{count} n useqdac"
|
||||
other: "%{count} n iseqdacen"
|
||||
categories:
|
||||
administration: Tadbelt
|
||||
invites: Iɛeṛṛuḍen
|
||||
|
@ -395,16 +399,20 @@ kab:
|
|||
view_dashboard: Timẓriwt n tfelwit
|
||||
rules:
|
||||
add_new: Rnu alugen
|
||||
add_translation: Ad yernu tasuqilt
|
||||
delete: Kkes
|
||||
edit: Ẓreg alugen
|
||||
empty: Mazal ur ttwasbadun ara yilugan n uqeddac.
|
||||
title: Ilugan n uqeddac
|
||||
translation: Tasuqilt
|
||||
translations: Tisuqilin
|
||||
settings:
|
||||
about:
|
||||
title: Ɣef
|
||||
appearance:
|
||||
title: Udem
|
||||
discovery:
|
||||
privacy: Tabaḍnit
|
||||
profile_directory: Akaram n imaɣnuten
|
||||
title: Asnirem
|
||||
trends: Ayen mucaɛen
|
||||
|
@ -440,6 +448,10 @@ kab:
|
|||
visibility: Abani
|
||||
with_media: S umidya
|
||||
system_checks:
|
||||
elasticsearch_preset:
|
||||
action: Wali tasemlit
|
||||
elasticsearch_preset_single_node:
|
||||
action: Wali tasemlit
|
||||
rules_check:
|
||||
action: Sefrek ilugan n uqeddac
|
||||
software_version_critical_check:
|
||||
|
@ -601,6 +613,8 @@ kab:
|
|||
basic_information: Talɣut tamatut
|
||||
hint_html: "<strong>Mudd udem i wayen ttwalin medden deg umaɣnu-inek azayez ɣer yidis n yiznan-ik.</strong> Imdanen niḍen zemren ad k-ḍefren yernu ad gen assaɣ yid-k mi ara tesɛuḍ amaɣnu yeccuṛen ed tugna n umaɣnu."
|
||||
other: Ayen nniḍen
|
||||
emoji_styles:
|
||||
auto: Awurman
|
||||
errors:
|
||||
'404': Asebter i tettnadiḍ ulac-it da.
|
||||
'500':
|
||||
|
@ -835,6 +849,8 @@ kab:
|
|||
one: "%{count} n tbidyutt"
|
||||
other: "%{count} n tbidyutin"
|
||||
edited_at_html: Tettwaẓreg ass n %{date}
|
||||
quote_policies:
|
||||
public: Yal yiwen
|
||||
title: '%{name} : "%{quote}"'
|
||||
visibilities:
|
||||
direct: Usrid
|
||||
|
|
|
@ -1332,6 +1332,10 @@ ko:
|
|||
basic_information: 기본 정보
|
||||
hint_html: "<strong>사람들이 공개 프로필을 보고서 게시물을 볼 때를 위한 프로필을 꾸밉니다.</strong> 프로필과 프로필 사진을 채우면 다른 사람들이 나를 팔로우하고 나와 교류할 기회가 더 많아집니다."
|
||||
other: 기타
|
||||
emoji_styles:
|
||||
auto: 자동
|
||||
native: 시스템 기본
|
||||
twemoji: 트웨모지
|
||||
errors:
|
||||
'400': 제출한 요청이 올바르지 않습니다.
|
||||
'403': 이 페이지를 표시할 권한이 없습니다.
|
||||
|
|
|
@ -186,6 +186,7 @@ lad:
|
|||
create_domain_block: Kriya bloko de domeno
|
||||
create_email_domain_block: Kriya bloko de domeno de posta
|
||||
create_ip_block: Kriya regla de IP
|
||||
create_relay: Kriya relevo
|
||||
create_unavailable_domain: Kriya domeno no desponivle
|
||||
create_user_role: Kriya rolo
|
||||
demote_user: Degrada utilizador
|
||||
|
@ -197,6 +198,7 @@ lad:
|
|||
destroy_email_domain_block: Efasa bloko de domeno de posta
|
||||
destroy_instance: Efasa domeno
|
||||
destroy_ip_block: Efasa regla de IP
|
||||
destroy_relay: Efasa relevo
|
||||
destroy_status: Efasa publikasyon
|
||||
destroy_unavailable_domain: Efasa domeno no desponivle
|
||||
destroy_user_role: Efasa rolo
|
||||
|
@ -205,6 +207,7 @@ lad:
|
|||
disable_sign_in_token_auth_user: Inkapasita la autentifikasyon por token de posta elektronika para el utilizador
|
||||
disable_user: Inkapasita utilizador
|
||||
enable_custom_emoji: Kapasita emoji personalizados
|
||||
enable_relay: Aktiva relevo
|
||||
enable_sign_in_token_auth_user: Kapasita la autentifikasyon por token de posta para el utilizador
|
||||
enable_user: Kapasita utilizador
|
||||
memorialize_account: Transforma en kuento komemorativo
|
||||
|
@ -229,6 +232,7 @@ lad:
|
|||
update_custom_emoji: Aktualiza emoji personalizado
|
||||
update_domain_block: Aktualiza bloko de domeno
|
||||
update_ip_block: Aktualiza regla de IP
|
||||
update_report: Aktualiza raporto
|
||||
update_status: Aktualiza publikasyon
|
||||
update_user_role: Aktualiza rolo
|
||||
actions:
|
||||
|
@ -466,10 +470,13 @@ lad:
|
|||
fasp:
|
||||
debug:
|
||||
callbacks:
|
||||
created_at: Kriyado en
|
||||
delete: Efasa
|
||||
ip: Adreso IP
|
||||
providers:
|
||||
active: Aktivo
|
||||
delete: Efasa
|
||||
finish_registration: Finaliza enrejistrasyon
|
||||
name: Nombre
|
||||
registrations:
|
||||
confirm: Konfirma
|
||||
|
@ -542,6 +549,12 @@ lad:
|
|||
all: Todos
|
||||
limited: Limitado
|
||||
title: Moderasyon
|
||||
moderation_notes:
|
||||
create: Adjusta nota de moderasyon
|
||||
created_msg: Nota de moderasyon de sirvidor kriyada kon sukseso!
|
||||
description_html: Ve i desha notas a otros moderadores i a tu yo futuro
|
||||
destroyed_msg: Nota de moderasyon de sirvidor efasada kon sukseso!
|
||||
title: Notas de moderasyon
|
||||
private_comment: Komento privado
|
||||
public_comment: Komento publiko
|
||||
purge: Purga
|
||||
|
@ -748,6 +761,7 @@ lad:
|
|||
title: Rolos
|
||||
rules:
|
||||
add_new: Adjusta regla
|
||||
add_translation: Adjusta traduksyon
|
||||
delete: Efasa
|
||||
description_html: Aunke la majorita afirma aver meldado i estar de akodro kon los terminos de servisyo, la djente normalmente no los melda asta dempues de ke surja algun problema. <strong>Az ke sea mas kolay ver las normas de tu sirvidor de un vistazo estipulándolas en una lista de puntos.</strong> Aprova ke kada norma sea corta i kolay, ama sin estar divididas en munchos puntos.
|
||||
edit: Edita regla
|
||||
|
@ -920,6 +934,9 @@ lad:
|
|||
updated_msg: Konfigurasyon de etiketas aktualizada kon sukseso
|
||||
terms_of_service:
|
||||
changelog: Ke troko
|
||||
current: Aktual
|
||||
generates:
|
||||
action: Djenera
|
||||
history: Istorya
|
||||
live: En bivo
|
||||
publish: Publika
|
||||
|
@ -1245,6 +1262,10 @@ lad:
|
|||
basic_information: Enformasyon bazika
|
||||
hint_html: "<strong>Personaliza lo ke la djente ve en tu profil publiko i kon tus publikasyones.</strong> Es mas probavle ke otras personas te sigan i enteraktuen kontigo kuando kompletas tu profil i foto."
|
||||
other: Otros
|
||||
emoji_styles:
|
||||
auto: Otomatiko
|
||||
native: Nativo
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': La solisitasyon ke enviates no fue valida o fue malformada.
|
||||
'403': No tienes permiso para ver esta pajina.
|
||||
|
|
|
@ -346,6 +346,68 @@ nan:
|
|||
enabled: 啟用ê
|
||||
enabled_msg: Hit ê emoji成功啟用ah
|
||||
image_hint: Sài-suh無超過 %{size} ê PNG á是 GIF
|
||||
list: 列單
|
||||
listed: 加入列單ah
|
||||
new:
|
||||
title: 加添新ê自訂emoji
|
||||
no_emoji_selected: 因為無揀任何emoji,所以lóng無改變
|
||||
not_permitted: Lí無允准行tsit ê動作
|
||||
overwrite: Khàm掉
|
||||
shortcode: 短碼
|
||||
shortcode_hint: 字元上少2 ê,kan-ta接受字母、數字kap底線(_)
|
||||
title: 自訂emoji
|
||||
uncategorized: Iáu無分類
|
||||
unlist: Tuì列單the̍h掉
|
||||
unlisted: The̍h掉ah
|
||||
update_failed_msg: Bē當更新hit ê emoji
|
||||
updated_msg: Emoji成功更新ah!
|
||||
upload: 傳上去
|
||||
dashboard:
|
||||
active_users: 活動ê用者
|
||||
interactions: 互動
|
||||
media_storage: 媒體儲存
|
||||
new_users: 新用者
|
||||
opened_reports: 拍開ê報告
|
||||
pending_appeals_html:
|
||||
other: "<strong>%{count}</strong> ê投訴愛處理"
|
||||
pending_reports_html:
|
||||
other: "<strong>%{count}</strong> ê檢舉愛處理"
|
||||
pending_tags_html:
|
||||
other: "<strong>%{count}</strong> ê hashtag愛處理"
|
||||
pending_users_html:
|
||||
other: "<strong>%{count}</strong> ê用者愛處理"
|
||||
resolved_reports: 解決ê報告
|
||||
software: 軟體
|
||||
sources: 註冊ê源頭
|
||||
space: 空間ê使用
|
||||
title: Le-jí-páng (dashboard)
|
||||
top_languages: 上tsia̍p出現ê語言
|
||||
top_servers: 上tsia̍p活動ê服侍器
|
||||
website: 網站
|
||||
disputes:
|
||||
appeals:
|
||||
empty: Tshuē無投訴。
|
||||
title: 投訴
|
||||
domain_allows:
|
||||
add_new: 允准kap tsit ê域名相連
|
||||
created_msg: 域名已經成功允准相連
|
||||
destroyed_msg: 域名已經成功取消相連
|
||||
export: 輸出
|
||||
import: 輸入
|
||||
undo: 禁止kap tsit ê域名相連
|
||||
domain_blocks:
|
||||
add_new: 加添新ê封鎖域名
|
||||
confirm_suspension:
|
||||
cancel: 取消
|
||||
confirm: 中止權限
|
||||
permanent_action: 取消中止權限,bē當復原任何資料á是關係。
|
||||
preamble_html: Lí teh beh停止 <strong>%{domain}</strong> kap伊ê kiánn域名ê權限。
|
||||
remove_all_data: Tse ē tī lí ê服侍器內底,kā tuì tsit ê域名ê口座來ê所有內容、媒體kap個人資料lóng thâi掉。
|
||||
stop_communication: Lí ê服侍器ē停止kap hia ê服侍器聯絡。
|
||||
title: 確認封鎖域名 %{domain}
|
||||
edit: 編輯域名封鎖
|
||||
export: 輸出
|
||||
import: 輸入
|
||||
instances:
|
||||
dashboard:
|
||||
instance_languages_dimension: Tsia̍p用ê語言
|
||||
|
|
|
@ -583,7 +583,7 @@ nl:
|
|||
created_msg: Aanmaken van servermoderatie-opmerking geslaagd!
|
||||
description_html: Opmerkingen bekijken, en voor jezelf en andere moderatoren achterlaten
|
||||
destroyed_msg: Verwijderen van servermoderatie-opmerking geslaagd!
|
||||
placeholder: Informatie over deze server, genomen acties of iets anders die jou kunnen helpen om deze server in de toekomst te moderen.
|
||||
placeholder: Informatie over deze server, genomen acties of iets anders die jou kunnen helpen om deze server in de toekomst te modereren.
|
||||
title: Moderatie-opmerkingen
|
||||
private_comment: Privé-opmerking
|
||||
public_comment: Openbare opmerking
|
||||
|
@ -1349,6 +1349,10 @@ nl:
|
|||
basic_information: Algemene informatie
|
||||
hint_html: "<strong>Wat mensen op jouw openbare profiel en naast je berichten zien aanpassen.</strong> Andere mensen gaan je waarschijnlijk eerder volgen en hebben vaker interactie met je, wanneer je profiel is ingevuld en je een profielfoto hebt."
|
||||
other: Overige
|
||||
emoji_styles:
|
||||
auto: Auto
|
||||
native: Systeemeigen
|
||||
twemoji: Twemoji
|
||||
errors:
|
||||
'400': De aanvraag die je hebt ingediend was ongeldig of foutief.
|
||||
'403': Jij hebt geen toestemming om deze pagina te bekijken.
|
||||
|
|
|
@ -578,6 +578,8 @@ pt-BR:
|
|||
all: Todos
|
||||
limited: Limitados
|
||||
title: Moderação
|
||||
moderation_notes:
|
||||
title: Notas de Moderação
|
||||
private_comment: Comentário privado
|
||||
public_comment: Comentário público
|
||||
purge: Limpar
|
||||
|
|
|
@ -49,6 +49,7 @@ br:
|
|||
setting_display_media_default: Dre ziouer
|
||||
setting_display_media_hide_all: Kuzhat pep tra
|
||||
setting_display_media_show_all: Diskouez pep tra
|
||||
setting_emoji_style: Stil an emojioù
|
||||
setting_theme: Neuz al lec'hienn
|
||||
setting_use_pending_items: Mod gorrek
|
||||
title: Titl
|
||||
|
|
|
@ -61,6 +61,7 @@ cs:
|
|||
setting_display_media_default: Skrývat média označená jako citlivá
|
||||
setting_display_media_hide_all: Vždy skrývat média
|
||||
setting_display_media_show_all: Vždy zobrazovat média
|
||||
setting_emoji_style: Jak se budou zobrazovat emoji. "Auto" zkusí použít výchozí emoji, ale pro starší prohlížeče použije Twemoji.
|
||||
setting_system_scrollbars_ui: Platí pouze pro desktopové prohlížeče založené na Safari nebo Chrome
|
||||
setting_use_blurhash: Gradienty jsou vytvořeny na základě barvev skrytých médií, ale zakrývají veškeré detaily
|
||||
setting_use_pending_items: Aktualizovat časovou osu až po kliknutí namísto automatického rolování kanálu
|
||||
|
@ -243,6 +244,7 @@ cs:
|
|||
setting_display_media_default: Výchozí
|
||||
setting_display_media_hide_all: Skrýt vše
|
||||
setting_display_media_show_all: Zobrazit vše
|
||||
setting_emoji_style: Styl emoji
|
||||
setting_expand_spoilers: Vždy rozbalit příspěvky označené varováními o obsahu
|
||||
setting_hide_network: Skrýt mou síť
|
||||
setting_missing_alt_text_modal: Zobrazit potvrzovací dialog před odesláním médií bez alt textu
|
||||
|
|
|
@ -61,6 +61,7 @@ da:
|
|||
setting_display_media_default: Skjul medier med sensitiv-markering
|
||||
setting_display_media_hide_all: Skjul altid medier
|
||||
setting_display_media_show_all: Vis altid medier
|
||||
setting_emoji_style: Hvordan emojis skal vises. "Auto" vil forsøge at bruge indbyggede emojis, men skifter tilbage til Twemoji i ældre webbrowsere.
|
||||
setting_system_scrollbars_ui: Gælder kun for computerwebbrowsere baseret på Safari og Chrome
|
||||
setting_use_blurhash: Gradienter er baseret på de skjulte grafikelementers farver, men slører alle detaljer
|
||||
setting_use_pending_items: Skjul tidslinjeopdateringer bag et klik i stedet for brug af auto-feedrulning
|
||||
|
@ -241,6 +242,7 @@ da:
|
|||
setting_display_media_default: Standard
|
||||
setting_display_media_hide_all: Skjul alle
|
||||
setting_display_media_show_all: Vis alle
|
||||
setting_emoji_style: Emoji-stil
|
||||
setting_expand_spoilers: Udvid altid indlæg markeret med indholdsadvarsler
|
||||
setting_hide_network: Skjul din sociale graf
|
||||
setting_missing_alt_text_modal: Vis bekræftelsesdialog inden medier uden alt-tekst lægges op
|
||||
|
|
|
@ -61,6 +61,7 @@ de:
|
|||
setting_display_media_default: Medien mit Inhaltswarnung ausblenden
|
||||
setting_display_media_hide_all: Medien immer ausblenden
|
||||
setting_display_media_show_all: Medien mit Inhaltswarnung immer anzeigen
|
||||
setting_emoji_style: 'Wie Emojis dargestellt werden: „Automatisch“ verwendet native Emojis, für veraltete Browser wird jedoch Twemoji verwendet.'
|
||||
setting_system_scrollbars_ui: Betrifft nur Desktop-Browser, die auf Chrome oder Safari basieren
|
||||
setting_use_blurhash: Der Farbverlauf basiert auf den Farben der ausgeblendeten Medien, verschleiert aber jegliche Details
|
||||
setting_use_pending_items: Neue Beiträge hinter einem Klick verstecken, anstatt automatisch zu scrollen
|
||||
|
@ -241,12 +242,13 @@ de:
|
|||
setting_display_media_default: Standard
|
||||
setting_display_media_hide_all: Alle Medien ausblenden
|
||||
setting_display_media_show_all: Alle Medien anzeigen
|
||||
setting_emoji_style: Emoji-Stil
|
||||
setting_expand_spoilers: Beiträge mit Inhaltswarnung immer ausklappen
|
||||
setting_hide_network: Follower und „Folge ich“ nicht anzeigen
|
||||
setting_missing_alt_text_modal: Bestätigungsdialog anzeigen, bevor Medien ohne Bildbeschreibung veröffentlicht werden
|
||||
setting_reduce_motion: Bewegung in Animationen verringern
|
||||
setting_system_font_ui: Standardschriftart des Browsers verwenden
|
||||
setting_system_scrollbars_ui: Bildlaufleiste des Systems verwenden
|
||||
setting_system_scrollbars_ui: Bildlaufleiste des Betriebssystems verwenden
|
||||
setting_theme: Design
|
||||
setting_trends: Heutige Trends anzeigen
|
||||
setting_unfollow_modal: Bestätigungsdialog beim Entfolgen eines Profils anzeigen
|
||||
|
|
|
@ -56,10 +56,12 @@ en-GB:
|
|||
scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones.
|
||||
setting_aggregate_reblogs: Do not show new boosts for posts that have been recently boosted (only affects newly-received boosts)
|
||||
setting_always_send_emails: Normally e-mail notifications won't be sent when you are actively using Mastodon
|
||||
setting_default_quote_policy: Mentioned users are always allowed to quote. This setting will only take effect for posts created with the next Mastodon version, but you can select your preference in preparation
|
||||
setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click
|
||||
setting_display_media_default: Hide media marked as sensitive
|
||||
setting_display_media_hide_all: Always hide media
|
||||
setting_display_media_show_all: Always show media
|
||||
setting_emoji_style: How to display emojis. "Auto" will try using native emoji, but falls back to Twemoji for legacy browsers.
|
||||
setting_system_scrollbars_ui: Applies only to desktop browsers based on Safari and Chrome
|
||||
setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details
|
||||
setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed
|
||||
|
@ -75,6 +77,7 @@ en-GB:
|
|||
filters:
|
||||
action: Chose which action to perform when a post matches the filter
|
||||
actions:
|
||||
blur: Hide media behind a warning, without hiding the text itself
|
||||
hide: Completely hide the filtered content, behaving as if it did not exist
|
||||
warn: Hide the filtered content behind a warning mentioning the filter's title
|
||||
form_admin_settings:
|
||||
|
@ -88,6 +91,7 @@ en-GB:
|
|||
favicon: WEBP, PNG, GIF or JPG. Overrides the default Mastodon favicon with a custom icon.
|
||||
mascot: Overrides the illustration in the advanced web interface.
|
||||
media_cache_retention_period: Media files from posts made by remote users are cached on your server. When set to a positive value, media will be deleted after the specified number of days. If the media data is requested after it is deleted, it will be re-downloaded, if the source content is still available. Due to restrictions on how often link preview cards poll third-party sites, it is recommended to set this value to at least 14 days, or link preview cards will not be updated on demand before that time.
|
||||
min_age: Users will be asked to confirm their date of birth during sign-up
|
||||
peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
|
||||
profile_directory: The profile directory lists all users who have opted-in to be discoverable.
|
||||
require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional
|
||||
|
@ -132,14 +136,23 @@ en-GB:
|
|||
name: You can only change the casing of the letters, for example, to make it more readable
|
||||
terms_of_service:
|
||||
changelog: Can be structured with Markdown syntax.
|
||||
effective_date: A reasonable timeframe can range anywhere from 10 to 30 days from the date you notify your users.
|
||||
text: Can be structured with Markdown syntax.
|
||||
terms_of_service_generator:
|
||||
admin_email: Legal notices include counternotices, court orders, takedown requests, and law enforcement requests.
|
||||
arbitration_address: Can be the same as Physical address above, or “N/A” if using email.
|
||||
arbitration_website: Can be a web form, or “N/A” if using email.
|
||||
choice_of_law: City, region, territory or state the internal substantive laws of which shall govern any and all claims.
|
||||
dmca_address: For US operators, use the address registered in the DMCA Designated Agent Directory. A P.O. Box listing is available upon direct request, use the DMCA Designated Agent Post Office Box Waiver Request to email the Copyright Office and describe that you are a home-based content moderator who fears revenge or retribution for your actions and need to use a P.O. Box to remove your home address from public view.
|
||||
dmca_email: Can be the same email used for “Email address for legal notices” above.
|
||||
domain: Unique identification of the online service you are providing.
|
||||
jurisdiction: List the country where whoever pays the bills lives. If it’s a company or other entity, list the country where it’s incorporated, and the city, region, territory or state as appropriate.
|
||||
min_age: Should not be below the minimum age required by the laws of your jurisdiction.
|
||||
user:
|
||||
chosen_languages: When checked, only posts in selected languages will be displayed in public timelines
|
||||
date_of_birth:
|
||||
one: We have to make sure you're at least %{count} to use Mastodon. We won't store this.
|
||||
other: We have to make sure you're at least %{count} to use Mastodon. We won't store this.
|
||||
role: The role controls which permissions the user has.
|
||||
user_role:
|
||||
color: Color to be used for the role throughout the UI, as RGB in hex format
|
||||
|
@ -220,6 +233,7 @@ en-GB:
|
|||
setting_boost_modal: Show confirmation dialogue before boosting
|
||||
setting_default_language: Posting language
|
||||
setting_default_privacy: Posting privacy
|
||||
setting_default_quote_policy: Who can quote
|
||||
setting_default_sensitive: Always mark media as sensitive
|
||||
setting_delete_modal: Show confirmation dialogue before deleting a post
|
||||
setting_disable_hover_cards: Disable profile preview on hover
|
||||
|
@ -228,6 +242,7 @@ en-GB:
|
|||
setting_display_media_default: Default
|
||||
setting_display_media_hide_all: Hide all
|
||||
setting_display_media_show_all: Show all
|
||||
setting_emoji_style: Emoji style
|
||||
setting_expand_spoilers: Always expand posts marked with content warnings
|
||||
setting_hide_network: Hide your social graph
|
||||
setting_missing_alt_text_modal: Show confirmation dialogue before posting media without alt text
|
||||
|
@ -252,6 +267,7 @@ en-GB:
|
|||
name: Hashtag
|
||||
filters:
|
||||
actions:
|
||||
blur: Hide media with a warning
|
||||
hide: Hide completely
|
||||
warn: Hide with a warning
|
||||
form_admin_settings:
|
||||
|
@ -265,6 +281,7 @@ en-GB:
|
|||
favicon: Favicon
|
||||
mascot: Custom mascot (legacy)
|
||||
media_cache_retention_period: Media cache retention period
|
||||
min_age: Minimum age requirement
|
||||
peers_api_enabled: Publish list of discovered servers in the API
|
||||
profile_directory: Enable profile directory
|
||||
registrations_mode: Who can sign-up
|
||||
|
@ -330,16 +347,22 @@ en-GB:
|
|||
usable: Allow posts to use this hashtag locally
|
||||
terms_of_service:
|
||||
changelog: What's changed?
|
||||
effective_date: Effective date
|
||||
text: Terms of Service
|
||||
terms_of_service_generator:
|
||||
admin_email: Email address for legal notices
|
||||
arbitration_address: Physical address for arbitration notices
|
||||
arbitration_website: Website for submitting arbitration notices
|
||||
choice_of_law: Choice of Law
|
||||
dmca_address: Physical address for DMCA/copyright notices
|
||||
dmca_email: Email address for DMCA/copyright notices
|
||||
domain: Domain
|
||||
jurisdiction: Legal jurisdiction
|
||||
min_age: Minimum age
|
||||
user:
|
||||
date_of_birth_1i: Day
|
||||
date_of_birth_2i: Month
|
||||
date_of_birth_3i: Year
|
||||
role: Role
|
||||
time_zone: Time Zone
|
||||
user_role:
|
||||
|
|
|
@ -61,6 +61,7 @@ en:
|
|||
setting_display_media_default: Hide media marked as sensitive
|
||||
setting_display_media_hide_all: Always hide media
|
||||
setting_display_media_show_all: Always show media
|
||||
setting_emoji_style: How to display emojis. "Auto" will try using native emoji, but falls back to Twemoji for legacy browsers.
|
||||
setting_system_scrollbars_ui: Applies only to desktop browsers based on Safari and Chrome
|
||||
setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details
|
||||
setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed
|
||||
|
@ -241,6 +242,7 @@ en:
|
|||
setting_display_media_default: Default
|
||||
setting_display_media_hide_all: Hide all
|
||||
setting_display_media_show_all: Show all
|
||||
setting_emoji_style: Emoji style
|
||||
setting_expand_spoilers: Always expand posts marked with content warnings
|
||||
setting_hide_network: Hide your social graph
|
||||
setting_missing_alt_text_modal: Show confirmation dialog before posting media without alt text
|
||||
|
|
|
@ -61,6 +61,7 @@ es-AR:
|
|||
setting_display_media_default: Ocultar medios marcados como sensibles
|
||||
setting_display_media_hide_all: Siempre ocultar todos los medios
|
||||
setting_display_media_show_all: Siempre mostrar todos los medios
|
||||
setting_emoji_style: Cómo se mostrarán los emojis. "Automático" intentará usar emojis nativos, cambiando a Twemoji en navegadores antiguos.
|
||||
setting_system_scrollbars_ui: Solo aplica para navegadores web de escritorio basados en Safari y Chrome
|
||||
setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles
|
||||
setting_use_pending_items: Ocultar actualizaciones de la línea temporal detrás de un clic en lugar de desplazar automáticamente el flujo
|
||||
|
@ -241,6 +242,7 @@ es-AR:
|
|||
setting_display_media_default: Predeterminada
|
||||
setting_display_media_hide_all: Ocultar todo
|
||||
setting_display_media_show_all: Mostrar todo
|
||||
setting_emoji_style: Estilo de emoji
|
||||
setting_expand_spoilers: Siempre expandir los mensajes marcados con advertencias de contenido
|
||||
setting_hide_network: Ocultá tu gráfica social
|
||||
setting_missing_alt_text_modal: Mostrar diálogo de confirmación antes de enviar medios sin texto alternativo
|
||||
|
|
|
@ -61,6 +61,7 @@ es-MX:
|
|||
setting_display_media_default: Ocultar contenido multimedia marcado como sensible
|
||||
setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia
|
||||
setting_display_media_show_all: Mostrar siempre contenido multimedia marcado como sensible
|
||||
setting_emoji_style: Cómo se mostrarán los emojis. "Auto" intentará usar emojis nativos, cambiando a Twemoji en navegadores antiguos.
|
||||
setting_system_scrollbars_ui: Solo se aplica a los navegadores de escritorio basados en Safari y Chrome
|
||||
setting_use_blurhash: Los degradados se basan en los colores de los elementos visuales ocultos, pero ocultan cualquier detalle
|
||||
setting_use_pending_items: Ocultar las publicaciones de la línea de tiempo tras un clic en lugar de desplazar automáticamente el feed
|
||||
|
@ -241,6 +242,7 @@ es-MX:
|
|||
setting_display_media_default: Por defecto
|
||||
setting_display_media_hide_all: Ocultar todo
|
||||
setting_display_media_show_all: Mostrar todo
|
||||
setting_emoji_style: Estilo de emoji
|
||||
setting_expand_spoilers: Siempre expandir las publicaciones marcadas con advertencias de contenido
|
||||
setting_hide_network: Ocultar tu red
|
||||
setting_missing_alt_text_modal: Mostrar cuadro de diálogo de confirmación antes de publicar contenido multimedia sin texto alternativo
|
||||
|
|
|
@ -61,6 +61,7 @@ es:
|
|||
setting_display_media_default: Ocultar contenido multimedia marcado como sensible
|
||||
setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia
|
||||
setting_display_media_show_all: Mostrar siempre contenido multimedia marcado como sensible
|
||||
setting_emoji_style: Cómo se mostrarán los emojis. "Auto" intentará usar emojis nativos, cambiando a Twemoji en navegadores antiguos.
|
||||
setting_system_scrollbars_ui: Solo aplica para navegadores de escritorio basados en Safari y Chrome
|
||||
setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles
|
||||
setting_use_pending_items: Ocultar nuevas publicaciones detrás de un clic en lugar de desplazar automáticamente el feed
|
||||
|
@ -241,6 +242,7 @@ es:
|
|||
setting_display_media_default: Por defecto
|
||||
setting_display_media_hide_all: Ocultar todo
|
||||
setting_display_media_show_all: Mostrar todo
|
||||
setting_emoji_style: Estilo de emoji
|
||||
setting_expand_spoilers: Siempre expandir las publicaciones marcadas con advertencias de contenido
|
||||
setting_hide_network: Ocultar tu red
|
||||
setting_missing_alt_text_modal: Mostrar diálogo de confirmación antes de publicar medios sin texto alternativo
|
||||
|
|
|
@ -56,6 +56,7 @@ eu:
|
|||
scopes: Zeintzuk API atzitu ditzakeen aplikazioak. Goi mailako arloa aukeratzen baduzu, ez dituzu azpikoak aukeratu behar.
|
||||
setting_aggregate_reblogs: Ez erakutsi bultzada berriak berriki bultzada jaso duten tootentzat (berriki jasotako bultzadei eragiten die bakarrik)
|
||||
setting_always_send_emails: Normalean eposta jakinarazpenak ez dira bidaliko Mastodon aktiboki erabiltzen ari zaren bitartean
|
||||
setting_default_quote_policy: Aipaturiko erabiltzaileek beti dute aipatzeko baimena. Ezarpen honek Mastodon-en hurrengo bertsioarekin sortutako argitalpenetan bakarrik izango du eragina, baina prestatzean lehentasuna hauta dezakezu
|
||||
setting_default_sensitive: Multimedia hunkigarria lehenetsita ezkutatzen da, eta sakatuz ikusi daiteke
|
||||
setting_display_media_default: Ezkutatu hunkigarri gisa markatutako multimedia
|
||||
setting_display_media_hide_all: Ezkutatu multimedia guztia beti
|
||||
|
@ -75,6 +76,7 @@ eu:
|
|||
filters:
|
||||
action: Aukeratu ze ekintza burutu behar den bidalketa bat iragazkiarekin bat datorrenean
|
||||
actions:
|
||||
blur: Ezkutatu edukia ohar baten atzean, testua bera ezkutatu gabe
|
||||
hide: Ezkutatu erabat iragazitako edukia, existituko ez balitz bezala
|
||||
warn: Ezkutatu iragazitako edukia iragazkiaren izenburua duen abisu batekin
|
||||
form_admin_settings:
|
||||
|
@ -88,6 +90,7 @@ eu:
|
|||
favicon: WEBP, PNG, GIF or JPG. Mastodon-en favicon-a gainidazten du ikono pertsonalizatu batekin.
|
||||
mascot: Web interfaze aurreratuko ilustrazioa gainidazten du.
|
||||
media_cache_retention_period: Multimedia-fitxategiak dituzten urruneko erabiltzaileen argitalpenak zure zerbitzarian gordetzen dira cachean. Balio positiboa ezartzean, multimedia zehazturiko egunen buruan ezabatuko da. Multimedia-datuak eskatzen badira ezabatu ostean, berriro deskargatuko dira, iturburuko edukia oraindik erabilgarri badago. Estekaren aurrebistako txartelek hirugarrenen guneei zenbatetan dei diezaieketen mugatzen dieten murrizketak direla eta, balio honi, gutxienez, 14 egunen balioa ezartzea gomendatzen da, bestela, esteken aurrebistako txartelak ez dira eguneratuko eskatu ahala denbora horren aurretik.
|
||||
min_age: Erabiltzaileei jaiotze-data berresteko eskatuko zaie izen-ematean
|
||||
peers_api_enabled: Zerbitzari honek fedibertsoan ikusi dituen zerbitzarien domeinu-izenen zerrenda. Ez da daturik ematen zerbitzari jakin batekin federatzearen ala ez federatzearen inguruan, zerbitzariak haien berri duela soilik. Federazioari buruzko estatistika orokorrak biltzen dituzten zerbitzuek erabiltzen dute hau.
|
||||
profile_directory: Profilen direktorioan ikusgai egotea aukeratu duten erabiltzaile guztiak zerrendatzen dira.
|
||||
require_invite_text: Izen emateak eskuz onartu behar direnean, "Zergatik elkartu nahi duzu?" testu sarrera derrigorrezko bezala ezarri, ez hautazko
|
||||
|
@ -132,9 +135,12 @@ eu:
|
|||
name: Letrak maiuskula/minuskulara aldatu ditzakezu besterik ez, adibidez irakurterrazago egiteko
|
||||
terms_of_service:
|
||||
changelog: Markdown-en sintaxiarekin egitura daiteke.
|
||||
effective_date: Zentzuzko epe bat 10 eta 30 egun bitartekoa izan daiteke, erabiltzaileei jakinarazten diezun egunetik kontatzen hasita.
|
||||
text: Markdown-en sintaxiarekin egitura daiteke.
|
||||
terms_of_service_generator:
|
||||
admin_email: Legezko abisuak, kontraindikazioak, agindu judizialak, erretiratzeko eskaerak eta legea betetzeko eskaerak barne.
|
||||
arbitration_address: Goiko helbide fisikoa edo "N/A" bera izan daiteke posta elektronikoa erabiliz gero.
|
||||
arbitration_website: Web formularioa izan daiteke, edo "N/A" posta elektronikoa erabiliz gero.
|
||||
user:
|
||||
chosen_languages: Markatzean, hautatutako hizkuntzetan dauden tutak besterik ez dira erakutsiko.
|
||||
user_role:
|
||||
|
@ -327,6 +333,9 @@ eu:
|
|||
terms_of_service_generator:
|
||||
domain: Domeinua
|
||||
user:
|
||||
date_of_birth_1i: Eguna
|
||||
date_of_birth_2i: Hilabetea
|
||||
date_of_birth_3i: Urtea
|
||||
role: Rola
|
||||
time_zone: Ordu zona
|
||||
user_role:
|
||||
|
|
|
@ -240,6 +240,7 @@ fi:
|
|||
setting_display_media_default: Oletus
|
||||
setting_display_media_hide_all: Piilota kaikki
|
||||
setting_display_media_show_all: Näytä kaikki
|
||||
setting_emoji_style: Emojityyli
|
||||
setting_expand_spoilers: Laajenna aina sisältövaroituksilla merkityt julkaisut
|
||||
setting_hide_network: Piilota verkostotietosi
|
||||
setting_missing_alt_text_modal: Näytä vahvistusikkuna ennen kuin julkaistaan mediaa ilman vaihtoehtoista tekstiä
|
||||
|
|
|
@ -61,6 +61,7 @@ fo:
|
|||
setting_display_media_default: Fjal miðlafílur, sum eru merktar sum viðkvæmar
|
||||
setting_display_media_hide_all: Fjal altíð miðlafílur
|
||||
setting_display_media_show_all: Vís altíð miðlafílur
|
||||
setting_emoji_style: Hvussu kenslutekn vera víst. "Sjálvvirkandi" roynir at brúka upprunalig kenslutekn, men fellir aftur á Twitter kenslutekn í eldri kagum.
|
||||
setting_system_scrollbars_ui: Er einans viðkomandi fyri skriviborðskagar grundaðir á Safari og Chrome
|
||||
setting_use_blurhash: Gradientar eru grundaðir á litirnar av fjaldu myndunum, men grugga allar smálutir
|
||||
setting_use_pending_items: Fjal tíðarlinjudagføringar aftan fyri eitt klikk heldur enn at skrulla tilføringina sjálvvirkandi
|
||||
|
@ -241,6 +242,7 @@ fo:
|
|||
setting_display_media_default: Sjálvvirði
|
||||
setting_display_media_hide_all: Fjal alt
|
||||
setting_display_media_show_all: Vís alt
|
||||
setting_emoji_style: Kensluteknsstílur
|
||||
setting_expand_spoilers: Víðka altíð postar, sum eru merktir við innihaldsávaringum
|
||||
setting_hide_network: Fjal sosiala grafin hjá tær
|
||||
setting_missing_alt_text_modal: Spyr um góðkenning áðrenn miðlar uttan alternativan tekst verða postaðir
|
||||
|
|
|
@ -61,6 +61,7 @@ fy:
|
|||
setting_display_media_default: As gefoelich markearre media ferstopje
|
||||
setting_display_media_hide_all: Media altyd ferstopje
|
||||
setting_display_media_show_all: Media altyd toane
|
||||
setting_emoji_style: Wêrmei moatte emojis werjûn wurde. ‘Automatysk’ probearret de systeemeigen emojis te brûken, mar falt werom op Twemoji foar âldere browsers.
|
||||
setting_system_scrollbars_ui: Allinnich fan tapassing op desktopbrowsers basearre op Safari en Chromium
|
||||
setting_use_blurhash: Dizige kleuroergongen binne basearre op de kleuren fan de ferstoppe media, wêrmei elk detail ferdwynt
|
||||
setting_use_pending_items: De tiidline wurdt bywurke troch op it oantal nije items te klikken, yn stee fan dat dizze automatysk bywurke wurdt
|
||||
|
@ -241,6 +242,7 @@ fy:
|
|||
setting_display_media_default: Standert
|
||||
setting_display_media_hide_all: Alles ferstopje
|
||||
setting_display_media_show_all: Alles toane
|
||||
setting_emoji_style: Emojistyl
|
||||
setting_expand_spoilers: Berjochten mei ynhâldswarskôgingen altyd útklappe
|
||||
setting_hide_network: Jo folgers en wa’t jo folget ferstopje
|
||||
setting_missing_alt_text_modal: Befêstigingsfinster toane foar it pleatsen fan media sûnder alt-tekst
|
||||
|
|
|
@ -61,6 +61,7 @@ ga:
|
|||
setting_display_media_default: Folaigh meáin atá marcáilte mar íogair
|
||||
setting_display_media_hide_all: Folaigh meáin i gcónaí
|
||||
setting_display_media_show_all: Taispeáin meáin i gcónaí
|
||||
setting_emoji_style: Conas emojis a thaispeáint. Déanfaidh "Auto" iarracht emoji dúchasacha a úsáid, ach titeann sé ar ais go Twemoji le haghaidh seanbhrabhsálaithe.
|
||||
setting_system_scrollbars_ui: Ní bhaineann sé ach le brabhsálaithe deisce bunaithe ar Safari agus Chrome
|
||||
setting_use_blurhash: Tá grádáin bunaithe ar dhathanna na n-amharcanna ceilte ach cuireann siad salach ar aon mhionsonraí
|
||||
setting_use_pending_items: Folaigh nuashonruithe amlíne taobh thiar de chlic seachas an fotha a scrollú go huathoibríoch
|
||||
|
@ -244,6 +245,7 @@ ga:
|
|||
setting_display_media_default: Réamhshocrú
|
||||
setting_display_media_hide_all: Cuir uile i bhfolach
|
||||
setting_display_media_show_all: Taispeáin uile
|
||||
setting_emoji_style: Stíl Emoji
|
||||
setting_expand_spoilers: Méadaigh postálacha atá marcáilte le rabhaidh inneachair i gcónaí
|
||||
setting_hide_network: Folaigh do ghraf sóisialta
|
||||
setting_missing_alt_text_modal: Taispeáin dialóg deimhnithe sula bpostálann tú meán gan alt téacs
|
||||
|
|
|
@ -61,6 +61,7 @@ gl:
|
|||
setting_display_media_default: Ocultar medios marcados como sensibles
|
||||
setting_display_media_hide_all: Ocultar sempre os medios
|
||||
setting_display_media_show_all: Mostrar sempre os medios marcados como sensibles
|
||||
setting_emoji_style: Forma de mostrar emojis. «Auto» intentará usar os emojis nativos, e se falla recurrirase a Twemoji en navegadores antigos.
|
||||
setting_system_scrollbars_ui: Aplícase só en navegadores de escritorio baseados en Safari e Chrome
|
||||
setting_use_blurhash: Os gradientes toman as cores da imaxe oculta pero esvaecendo tódolos detalles
|
||||
setting_use_pending_items: Agochar actualizacións da cronoloxía tras un click no lugar de desprazar automáticamente os comentarios
|
||||
|
@ -241,6 +242,7 @@ gl:
|
|||
setting_display_media_default: Por defecto
|
||||
setting_display_media_hide_all: Ocultar todo
|
||||
setting_display_media_show_all: Mostrar todo
|
||||
setting_emoji_style: Estilo dos emojis
|
||||
setting_expand_spoilers: Despregar sempre as publicacións marcadas con avisos de contido
|
||||
setting_hide_network: Non mostrar contactos
|
||||
setting_missing_alt_text_modal: Mostrar mensaxe de confirmación antes de publicar multimedia sen texto descritivo
|
||||
|
|
|
@ -61,6 +61,7 @@ he:
|
|||
setting_display_media_default: הסתרת מדיה המסומנת כרגישה
|
||||
setting_display_media_hide_all: הסתר מדיה תמיד
|
||||
setting_display_media_show_all: גלה מדיה תמיד
|
||||
setting_emoji_style: כיצד להציג רגישונים. "אוטומטי" ינסה להציג מסט האימוג'י המקומי, אבל נופל לערכת Twemoji כברירת מחדל עבור דפדפנים ישנים.
|
||||
setting_system_scrollbars_ui: נוגע רק לגבי דפדפני דסקטופ מבוססים ספארי וכרום
|
||||
setting_use_blurhash: הגראדיינטים מבוססים על תוכן התמונה המוסתרת, אבל מסתירים את כל הפרטים
|
||||
setting_use_pending_items: הסתר עדכוני פיד מאחורי קליק במקום לגלול את הפיד אוטומטית
|
||||
|
@ -243,6 +244,7 @@ he:
|
|||
setting_display_media_default: ברירת מחדל
|
||||
setting_display_media_hide_all: להסתיר הכל
|
||||
setting_display_media_show_all: להציג הכול
|
||||
setting_emoji_style: סגנון רגישונים (אמוג'י)
|
||||
setting_expand_spoilers: להרחיב תמיד הודעות מסומנות באזהרת תוכן
|
||||
setting_hide_network: להחביא את הגרף החברתי שלך
|
||||
setting_missing_alt_text_modal: הצג כרטיס אישור לפני פרסום קובץ גרפי ללא תיאור מילולי
|
||||
|
|
|
@ -61,6 +61,7 @@ is:
|
|||
setting_display_media_default: Fela myndefni sem merkt er viðkvæmt
|
||||
setting_display_media_hide_all: Alltaf fela allt myndefni
|
||||
setting_display_media_show_all: Alltaf birta myndefni sem merkt er viðkvæmt
|
||||
setting_emoji_style: Hvernig birta skal tjáningartákn (emoji). "Sjálfvirkt" mun reyna að nota innbyggð tjáningartákn, en til vara verða notuð Twemoji-tákn fyrir eldri vafra.
|
||||
setting_system_scrollbars_ui: Á einungis við um vafra fyrir vinnutölvur sem byggjast á Safari og Chrome
|
||||
setting_use_blurhash: Litstiglarnir byggja á litunum í földu myndunum, en gera öll smáatriði óskýr
|
||||
setting_use_pending_items: Fela uppfærslur tímalínu þar til smellt er, í stað þess að hún skruni streyminu sjálfvirkt
|
||||
|
@ -241,6 +242,7 @@ is:
|
|||
setting_display_media_default: Sjálfgefið
|
||||
setting_display_media_hide_all: Fela allt
|
||||
setting_display_media_show_all: Birta allt
|
||||
setting_emoji_style: Stíll tjáningartákna
|
||||
setting_expand_spoilers: Alltaf útfella færslur sem eru með aðvörun vegna efnisins
|
||||
setting_hide_network: Fela félagsnetið þitt
|
||||
setting_missing_alt_text_modal: Birta staðfestingarglugga áður en myndefni án ALT-hjálpartexta er birt
|
||||
|
|
|
@ -61,6 +61,7 @@ it:
|
|||
setting_display_media_default: Nascondi media segnati come sensibili
|
||||
setting_display_media_hide_all: Nascondi sempre tutti i media
|
||||
setting_display_media_show_all: Mostra sempre i media segnati come sensibili
|
||||
setting_emoji_style: Come visualizzare gli emoji. "Automatico" proverà a usare gli emoji nativi, ma per i browser più vecchi ricorrerà a Twemoji.
|
||||
setting_system_scrollbars_ui: Si applica solo ai browser desktop basati su Safari e Chrome
|
||||
setting_use_blurhash: I gradienti sono basati sui colori delle immagini nascoste ma offuscano tutti i dettagli
|
||||
setting_use_pending_items: Fare clic per mostrare i nuovi messaggi invece di aggiornare la timeline automaticamente
|
||||
|
@ -241,6 +242,7 @@ it:
|
|||
setting_display_media_default: Predefinita
|
||||
setting_display_media_hide_all: Nascondi tutti
|
||||
setting_display_media_show_all: Mostra tutti
|
||||
setting_emoji_style: Stile emoji
|
||||
setting_expand_spoilers: Espandi sempre post con content warning
|
||||
setting_hide_network: Nascondi la tua rete
|
||||
setting_missing_alt_text_modal: Chiedi di confermare prima di pubblicare media senza testo alternativo
|
||||
|
|
|
@ -61,6 +61,7 @@ ko:
|
|||
setting_display_media_default: 민감함으로 표시된 미디어 가리기
|
||||
setting_display_media_hide_all: 모든 미디어를 가리기
|
||||
setting_display_media_show_all: 모든 미디어를 보이기
|
||||
setting_emoji_style: 에모지 표현 방식. "자동"은 시스템 기본 에모지를 적용하고 그렇지 못하는 오래된 브라우저의 경우 트웨모지를 사용합니다.
|
||||
setting_system_scrollbars_ui: 사파리와 크롬 기반의 데스크탑 브라우저만 적용됩니다
|
||||
setting_use_blurhash: 그라디언트는 숨겨진 내용의 색상을 기반으로 하지만 상세 내용은 보이지 않게 합니다
|
||||
setting_use_pending_items: 타임라인의 새 게시물을 자동으로 보여 주는 대신, 클릭해서 나타내도록 합니다
|
||||
|
@ -240,6 +241,7 @@ ko:
|
|||
setting_display_media_default: 기본
|
||||
setting_display_media_hide_all: 모두 가리기
|
||||
setting_display_media_show_all: 모두 보이기
|
||||
setting_emoji_style: 에모지 스타일
|
||||
setting_expand_spoilers: 내용 경고로 표시된 게시물을 항상 펼치기
|
||||
setting_hide_network: 내 인맥 숨기기
|
||||
setting_missing_alt_text_modal: 대체 텍스트 없이 미디어를 게시하려고 할 때 확인창을 띄웁니다
|
||||
|
|
|
@ -61,6 +61,7 @@ nl:
|
|||
setting_display_media_default: Als gevoelig gemarkeerde media verbergen
|
||||
setting_display_media_hide_all: Media altijd verbergen
|
||||
setting_display_media_show_all: Media altijd tonen
|
||||
setting_emoji_style: Waarmee moeten emojis worden weergegeven. ‘Auto’ probeert de systeemeigen emojis te gebruiken, maar valt terug op Twemoji voor oudere webbrowsers.
|
||||
setting_system_scrollbars_ui: Alleen van toepassing op desktopbrowsers gebaseerd op Safari en Chrome
|
||||
setting_use_blurhash: Wazige kleurovergangen zijn gebaseerd op de kleuren van de verborgen media, waarmee elk detail verdwijnt
|
||||
setting_use_pending_items: De tijdlijn wordt bijgewerkt door op het aantal nieuwe items te klikken, in plaats van dat deze automatisch wordt bijgewerkt
|
||||
|
@ -241,6 +242,7 @@ nl:
|
|||
setting_display_media_default: Standaard
|
||||
setting_display_media_hide_all: Alles verbergen
|
||||
setting_display_media_show_all: Alles tonen
|
||||
setting_emoji_style: Emoji-stijl
|
||||
setting_expand_spoilers: Berichten met inhoudswaarschuwingen altijd uitklappen
|
||||
setting_hide_network: Jouw volgers en wie je volgt verbergen
|
||||
setting_missing_alt_text_modal: Bevestigingsvenster tonen voor het plaatsen van media zonder alt-tekst
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user