Merge tag 'v3.2.0' into instance_only_statuses
This commit is contained in:
37
app/javascript/mastodon/actions/account_notes.js
Normal file
37
app/javascript/mastodon/actions/account_notes.js
Normal file
@ -0,0 +1,37 @@
|
||||
import api from '../api';
|
||||
|
||||
export const ACCOUNT_NOTE_SUBMIT_REQUEST = 'ACCOUNT_NOTE_SUBMIT_REQUEST';
|
||||
export const ACCOUNT_NOTE_SUBMIT_SUCCESS = 'ACCOUNT_NOTE_SUBMIT_SUCCESS';
|
||||
export const ACCOUNT_NOTE_SUBMIT_FAIL = 'ACCOUNT_NOTE_SUBMIT_FAIL';
|
||||
|
||||
export function submitAccountNote(id, value) {
|
||||
return (dispatch, getState) => {
|
||||
dispatch(submitAccountNoteRequest());
|
||||
|
||||
api(getState).post(`/api/v1/accounts/${id}/note`, {
|
||||
comment: value,
|
||||
}).then(response => {
|
||||
dispatch(submitAccountNoteSuccess(response.data));
|
||||
}).catch(error => dispatch(submitAccountNoteFail(error)));
|
||||
};
|
||||
};
|
||||
|
||||
export function submitAccountNoteRequest() {
|
||||
return {
|
||||
type: ACCOUNT_NOTE_SUBMIT_REQUEST,
|
||||
};
|
||||
};
|
||||
|
||||
export function submitAccountNoteSuccess(relationship) {
|
||||
return {
|
||||
type: ACCOUNT_NOTE_SUBMIT_SUCCESS,
|
||||
relationship,
|
||||
};
|
||||
};
|
||||
|
||||
export function submitAccountNoteFail(error) {
|
||||
return {
|
||||
type: ACCOUNT_NOTE_SUBMIT_FAIL,
|
||||
error,
|
||||
};
|
||||
};
|
@ -28,6 +28,11 @@ export const COMPOSE_UPLOAD_FAIL = 'COMPOSE_UPLOAD_FAIL';
|
||||
export const COMPOSE_UPLOAD_PROGRESS = 'COMPOSE_UPLOAD_PROGRESS';
|
||||
export const COMPOSE_UPLOAD_UNDO = 'COMPOSE_UPLOAD_UNDO';
|
||||
|
||||
export const THUMBNAIL_UPLOAD_REQUEST = 'THUMBNAIL_UPLOAD_REQUEST';
|
||||
export const THUMBNAIL_UPLOAD_SUCCESS = 'THUMBNAIL_UPLOAD_SUCCESS';
|
||||
export const THUMBNAIL_UPLOAD_FAIL = 'THUMBNAIL_UPLOAD_FAIL';
|
||||
export const THUMBNAIL_UPLOAD_PROGRESS = 'THUMBNAIL_UPLOAD_PROGRESS';
|
||||
|
||||
export const COMPOSE_SUGGESTIONS_CLEAR = 'COMPOSE_SUGGESTIONS_CLEAR';
|
||||
export const COMPOSE_SUGGESTIONS_READY = 'COMPOSE_SUGGESTIONS_READY';
|
||||
export const COMPOSE_SUGGESTION_SELECT = 'COMPOSE_SUGGESTION_SELECT';
|
||||
@ -160,7 +165,6 @@ export function submitCompose(routerHistory) {
|
||||
|
||||
// To make the app more responsive, immediately push the status
|
||||
// into the columns
|
||||
|
||||
const insertIfOnline = timelineId => {
|
||||
const timeline = getState().getIn(['timelines', timelineId]);
|
||||
|
||||
@ -176,6 +180,7 @@ export function submitCompose(routerHistory) {
|
||||
if (response.data.in_reply_to_id === null && response.data.visibility === 'public') {
|
||||
insertIfOnline('community');
|
||||
insertIfOnline('public');
|
||||
insertIfOnline(`account:${response.data.account.id}`);
|
||||
}
|
||||
}).catch(function (error) {
|
||||
dispatch(submitComposeFail(error));
|
||||
@ -262,6 +267,49 @@ export function uploadCompose(files) {
|
||||
};
|
||||
};
|
||||
|
||||
export const uploadThumbnail = (id, file) => (dispatch, getState) => {
|
||||
dispatch(uploadThumbnailRequest());
|
||||
|
||||
const total = file.size;
|
||||
const data = new FormData();
|
||||
|
||||
data.append('thumbnail', file);
|
||||
|
||||
api(getState).put(`/api/v1/media/${id}`, data, {
|
||||
onUploadProgress: ({ loaded }) => {
|
||||
dispatch(uploadThumbnailProgress(loaded, total));
|
||||
},
|
||||
}).then(({ data }) => {
|
||||
dispatch(uploadThumbnailSuccess(data));
|
||||
}).catch(error => {
|
||||
dispatch(uploadThumbnailFail(id, error));
|
||||
});
|
||||
};
|
||||
|
||||
export const uploadThumbnailRequest = () => ({
|
||||
type: THUMBNAIL_UPLOAD_REQUEST,
|
||||
skipLoading: true,
|
||||
});
|
||||
|
||||
export const uploadThumbnailProgress = (loaded, total) => ({
|
||||
type: THUMBNAIL_UPLOAD_PROGRESS,
|
||||
loaded,
|
||||
total,
|
||||
skipLoading: true,
|
||||
});
|
||||
|
||||
export const uploadThumbnailSuccess = media => ({
|
||||
type: THUMBNAIL_UPLOAD_SUCCESS,
|
||||
media,
|
||||
skipLoading: true,
|
||||
});
|
||||
|
||||
export const uploadThumbnailFail = error => ({
|
||||
type: THUMBNAIL_UPLOAD_FAIL,
|
||||
error,
|
||||
skipLoading: true,
|
||||
});
|
||||
|
||||
export function changeUploadCompose(id, params) {
|
||||
return (dispatch, getState) => {
|
||||
dispatch(changeUploadComposeRequest());
|
||||
@ -280,6 +328,7 @@ export function changeUploadComposeRequest() {
|
||||
skipLoading: true,
|
||||
};
|
||||
};
|
||||
|
||||
export function changeUploadComposeSuccess(media) {
|
||||
return {
|
||||
type: COMPOSE_UPLOAD_CHANGE_SUCCESS,
|
||||
|
@ -1,8 +1,8 @@
|
||||
export const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN';
|
||||
export const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE';
|
||||
|
||||
export function openDropdownMenu(id, placement, keyboard) {
|
||||
return { type: DROPDOWN_MENU_OPEN, id, placement, keyboard };
|
||||
export function openDropdownMenu(id, placement, keyboard, scroll_key) {
|
||||
return { type: DROPDOWN_MENU_OPEN, id, placement, keyboard, scroll_key };
|
||||
}
|
||||
|
||||
export function closeDropdownMenu(id) {
|
||||
|
@ -12,7 +12,7 @@ const makeEmojiMap = record => record.emojis.reduce((obj, emoji) => {
|
||||
|
||||
export function searchTextFromRawStatus (status) {
|
||||
const spoilerText = status.spoiler_text || '';
|
||||
const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
|
||||
const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
|
||||
return domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
|
||||
}
|
||||
|
||||
|
@ -1,30 +1,102 @@
|
||||
export const submitMarkers = () => (dispatch, getState) => {
|
||||
import api from '../api';
|
||||
import { debounce } from 'lodash';
|
||||
import compareId from '../compare_id';
|
||||
import { showAlertForError } from './alerts';
|
||||
|
||||
export const MARKERS_SUBMIT_SUCCESS = 'MARKERS_SUBMIT_SUCCESS';
|
||||
|
||||
export const synchronouslySubmitMarkers = () => (dispatch, getState) => {
|
||||
const accessToken = getState().getIn(['meta', 'access_token'], '');
|
||||
const params = {};
|
||||
|
||||
const lastHomeId = getState().getIn(['timelines', 'home', 'items', 0]);
|
||||
const lastNotificationId = getState().getIn(['notifications', 'items', 0, 'id']);
|
||||
|
||||
if (lastHomeId) {
|
||||
params.home = {
|
||||
last_read_id: lastHomeId,
|
||||
};
|
||||
}
|
||||
|
||||
if (lastNotificationId) {
|
||||
params.notifications = {
|
||||
last_read_id: lastNotificationId,
|
||||
};
|
||||
}
|
||||
const params = _buildParams(getState());
|
||||
|
||||
if (Object.keys(params).length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const client = new XMLHttpRequest();
|
||||
// The Fetch API allows us to perform requests that will be carried out
|
||||
// after the page closes. But that only works if the `keepalive` attribute
|
||||
// is supported.
|
||||
if (window.fetch && 'keepalive' in new Request('')) {
|
||||
fetch('/api/v1/markers', {
|
||||
keepalive: true,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': `Bearer ${accessToken}`,
|
||||
},
|
||||
body: JSON.stringify(params),
|
||||
});
|
||||
return;
|
||||
} else if (navigator && navigator.sendBeacon) {
|
||||
// Failing that, we can use sendBeacon, but we have to encode the data as
|
||||
// FormData for DoorKeeper to recognize the token.
|
||||
const formData = new FormData();
|
||||
formData.append('bearer_token', accessToken);
|
||||
for (const [id, value] of Object.entries(params)) {
|
||||
formData.append(`${id}[last_read_id]`, value.last_read_id);
|
||||
}
|
||||
if (navigator.sendBeacon('/api/v1/markers', formData)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
client.open('POST', '/api/v1/markers', false);
|
||||
client.setRequestHeader('Content-Type', 'application/json');
|
||||
client.setRequestHeader('Authorization', `Bearer ${accessToken}`);
|
||||
client.send(JSON.stringify(params));
|
||||
// If neither Fetch nor sendBeacon worked, try to perform a synchronous
|
||||
// request.
|
||||
try {
|
||||
const client = new XMLHttpRequest();
|
||||
|
||||
client.open('POST', '/api/v1/markers', false);
|
||||
client.setRequestHeader('Content-Type', 'application/json');
|
||||
client.setRequestHeader('Authorization', `Bearer ${accessToken}`);
|
||||
client.SUBMIT(JSON.stringify(params));
|
||||
} catch (e) {
|
||||
// Do not make the BeforeUnload handler error out
|
||||
}
|
||||
};
|
||||
|
||||
const _buildParams = (state) => {
|
||||
const params = {};
|
||||
|
||||
const lastHomeId = state.getIn(['timelines', 'home', 'items', 0]);
|
||||
const lastNotificationId = state.getIn(['notifications', 'items', 0, 'id']);
|
||||
|
||||
if (lastHomeId && compareId(lastHomeId, state.getIn(['markers', 'home'])) > 0) {
|
||||
params.home = {
|
||||
last_read_id: lastHomeId,
|
||||
};
|
||||
}
|
||||
|
||||
if (lastNotificationId && compareId(lastNotificationId, state.getIn(['markers', 'notifications'])) > 0) {
|
||||
params.notifications = {
|
||||
last_read_id: lastNotificationId,
|
||||
};
|
||||
}
|
||||
|
||||
return params;
|
||||
};
|
||||
|
||||
const debouncedSubmitMarkers = debounce((dispatch, getState) => {
|
||||
const params = _buildParams(getState());
|
||||
|
||||
if (Object.keys(params).length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
api().post('/api/v1/markers', params).then(() => {
|
||||
dispatch(submitMarkersSuccess(params));
|
||||
}).catch(error => {
|
||||
dispatch(showAlertForError(error));
|
||||
});
|
||||
}, 300000, { leading: true, trailing: true });
|
||||
|
||||
export function submitMarkersSuccess({ home, notifications }) {
|
||||
return {
|
||||
type: MARKERS_SUBMIT_SUCCESS,
|
||||
home: (home || {}).last_read_id,
|
||||
notifications: (notifications || {}).last_read_id,
|
||||
};
|
||||
};
|
||||
|
||||
export function submitMarkers() {
|
||||
return (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState);
|
||||
};
|
||||
|
@ -7,6 +7,7 @@ import {
|
||||
importFetchedStatus,
|
||||
importFetchedStatuses,
|
||||
} from './importer';
|
||||
import { submitMarkers } from './markers';
|
||||
import { saveSettings } from './settings';
|
||||
import { defineMessages } from 'react-intl';
|
||||
import { List as ImmutableList } from 'immutable';
|
||||
@ -70,6 +71,8 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
||||
filtered = regex && regex.test(searchIndex);
|
||||
}
|
||||
|
||||
dispatch(submitMarkers());
|
||||
|
||||
if (showInColumn) {
|
||||
dispatch(importFetchedAccount(notification.account));
|
||||
|
||||
@ -157,6 +160,7 @@ export function expandNotifications({ maxId } = {}, done = noOp) {
|
||||
|
||||
dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
|
||||
fetchRelatedRelationships(dispatch, response.data);
|
||||
dispatch(submitMarkers());
|
||||
}).catch(error => {
|
||||
dispatch(expandNotificationsFail(error, isLoadingMore));
|
||||
}).finally(() => {
|
||||
|
@ -3,7 +3,7 @@ import openDB from '../storage/db';
|
||||
import { evictStatus } from '../storage/modifier';
|
||||
|
||||
import { deleteFromTimelines } from './timelines';
|
||||
import { importFetchedStatus, importFetchedStatuses, importAccount, importStatus } from './importer';
|
||||
import { importFetchedStatus, importFetchedStatuses, importAccount, importStatus, importFetchedAccount } from './importer';
|
||||
import { ensureComposeIsVisible } from './compose';
|
||||
|
||||
export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
|
||||
@ -155,6 +155,7 @@ export function deleteStatus(id, routerHistory, withRedraft = false) {
|
||||
evictStatus(id);
|
||||
dispatch(deleteStatusSuccess(id));
|
||||
dispatch(deleteFromTimelines(id));
|
||||
dispatch(importFetchedAccount(response.data.account));
|
||||
|
||||
if (withRedraft) {
|
||||
dispatch(redraft(status, response.data.text));
|
||||
|
@ -74,6 +74,6 @@ const refreshHomeTimelineAndNotification = (dispatch, done) => {
|
||||
export const connectUserStream = () => connectTimelineStream('home', 'user', refreshHomeTimelineAndNotification);
|
||||
export const connectCommunityStream = ({ onlyMedia } = {}) => connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`);
|
||||
export const connectPublicStream = ({ onlyMedia, onlyRemote } = {}) => connectTimelineStream(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, `public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`);
|
||||
export const connectHashtagStream = (id, tag, accept) => connectTimelineStream(`hashtag:${id}`, `hashtag&tag=${tag}`, null, accept);
|
||||
export const connectHashtagStream = (id, tag, local, accept) => connectTimelineStream(`hashtag:${id}${local ? ':local' : ''}`, `hashtag${local ? ':local' : ''}&tag=${tag}`, null, accept);
|
||||
export const connectDirectStream = () => connectTimelineStream('direct', 'direct');
|
||||
export const connectListStream = id => connectTimelineStream(`list:${id}`, `list&list=${id}`);
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { importFetchedStatus, importFetchedStatuses } from './importer';
|
||||
import { submitMarkers } from './markers';
|
||||
import api, { getLinks } from 'mastodon/api';
|
||||
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
|
||||
import compareId from 'mastodon/compare_id';
|
||||
@ -36,6 +37,10 @@ export function updateTimeline(timeline, status, accept) {
|
||||
status,
|
||||
usePendingItems: preferPendingItems,
|
||||
});
|
||||
|
||||
if (timeline === 'home') {
|
||||
dispatch(submitMarkers());
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
@ -98,6 +103,10 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
|
||||
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||
dispatch(importFetchedStatuses(response.data));
|
||||
dispatch(expandTimelineSuccess(timelineId, response.data, next ? next.uri : null, response.status === 206, isLoadingRecent, isLoadingMore, isLoadingRecent && preferPendingItems));
|
||||
|
||||
if (timelineId === 'home') {
|
||||
dispatch(submitMarkers());
|
||||
}
|
||||
}).catch(error => {
|
||||
dispatch(expandTimelineFail(timelineId, error, isLoadingMore));
|
||||
}).finally(() => {
|
||||
@ -114,7 +123,7 @@ export const expandAccountFeaturedTimeline = accountId => expandTimeline(`accoun
|
||||
export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 });
|
||||
export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done);
|
||||
export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}, done = noOp) => {
|
||||
return expandTimeline(`hashtag:${hashtag}`, `/api/v1/timelines/tag/${hashtag}`, {
|
||||
return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, {
|
||||
max_id: maxId,
|
||||
any: parseTags(tags, 'any'),
|
||||
all: parseTags(tags, 'all'),
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { shallow } from 'enzyme';
|
||||
import { render, fireEvent, screen } from '@testing-library/react';
|
||||
import React from 'react';
|
||||
import renderer from 'react-test-renderer';
|
||||
import Button from '../button';
|
||||
@ -21,16 +21,16 @@ describe('<Button />', () => {
|
||||
|
||||
it('handles click events using the given handler', () => {
|
||||
const handler = jest.fn();
|
||||
const button = shallow(<Button onClick={handler} />);
|
||||
button.find('button').simulate('click');
|
||||
render(<Button onClick={handler}>button</Button>);
|
||||
fireEvent.click(screen.getByText('button'));
|
||||
|
||||
expect(handler.mock.calls.length).toEqual(1);
|
||||
});
|
||||
|
||||
it('does not handle click events if props.disabled given', () => {
|
||||
const handler = jest.fn();
|
||||
const button = shallow(<Button onClick={handler} disabled />);
|
||||
button.find('button').simulate('click');
|
||||
render(<Button onClick={handler} disabled>button</Button>);
|
||||
fireEvent.click(screen.getByText('button'));
|
||||
|
||||
expect(handler.mock.calls.length).toEqual(0);
|
||||
});
|
||||
|
@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { shortNumberFormat } from 'mastodon/utils/numbers';
|
||||
import ShortNumber from 'mastodon/components/short_number';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
export default class AutosuggestHashtag extends React.PureComponent {
|
||||
@ -13,14 +13,28 @@ export default class AutosuggestHashtag extends React.PureComponent {
|
||||
}).isRequired,
|
||||
};
|
||||
|
||||
render () {
|
||||
render() {
|
||||
const { tag } = this.props;
|
||||
const weeklyUses = tag.history && shortNumberFormat(tag.history.reduce((total, day) => total + (day.uses * 1), 0));
|
||||
const weeklyUses = tag.history && (
|
||||
<ShortNumber
|
||||
value={tag.history.reduce((total, day) => total + day.uses * 1, 0)}
|
||||
/>
|
||||
);
|
||||
|
||||
return (
|
||||
<div className='autosuggest-hashtag'>
|
||||
<div className='autosuggest-hashtag__name'>#<strong>{tag.name}</strong></div>
|
||||
{tag.history !== undefined && <div className='autosuggest-hashtag__uses'><FormattedMessage id='autosuggest_hashtag.per_week' defaultMessage='{count} per week' values={{ count: weeklyUses }} /></div>}
|
||||
<div className='autosuggest-hashtag__name'>
|
||||
#<strong>{tag.name}</strong>
|
||||
</div>
|
||||
{tag.history !== undefined && (
|
||||
<div className='autosuggest-hashtag__uses'>
|
||||
<FormattedMessage
|
||||
id='autosuggest_hashtag.per_week'
|
||||
defaultMessage='{count} per week'
|
||||
values={{ count: weeklyUses }}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
|
||||
<span style={{ display: 'none' }}>{placeholder}</span>
|
||||
|
||||
<Textarea
|
||||
inputRef={this.setTextarea}
|
||||
ref={this.setTextarea}
|
||||
className='autosuggest-textarea__textarea'
|
||||
disabled={disabled}
|
||||
placeholder={placeholder}
|
||||
|
65
app/javascript/mastodon/components/blurhash.js
Normal file
65
app/javascript/mastodon/components/blurhash.js
Normal file
@ -0,0 +1,65 @@
|
||||
// @ts-check
|
||||
|
||||
import { decode } from 'blurhash';
|
||||
import React, { useRef, useEffect } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
/**
|
||||
* @typedef BlurhashPropsBase
|
||||
* @property {string?} hash Hash to render
|
||||
* @property {number} width
|
||||
* Width of the blurred region in pixels. Defaults to 32
|
||||
* @property {number} [height]
|
||||
* Height of the blurred region in pixels. Defaults to width
|
||||
* @property {boolean} [dummy]
|
||||
* Whether dummy mode is enabled. If enabled, nothing is rendered
|
||||
* and canvas left untouched
|
||||
*/
|
||||
|
||||
/** @typedef {JSX.IntrinsicElements['canvas'] & BlurhashPropsBase} BlurhashProps */
|
||||
|
||||
/**
|
||||
* Component that is used to render blurred of blurhash string
|
||||
*
|
||||
* @param {BlurhashProps} param1 Props of the component
|
||||
* @returns Canvas which will render blurred region element to embed
|
||||
*/
|
||||
function Blurhash({
|
||||
hash,
|
||||
width = 32,
|
||||
height = width,
|
||||
dummy = false,
|
||||
...canvasProps
|
||||
}) {
|
||||
const canvasRef = /** @type {import('react').MutableRefObject<HTMLCanvasElement>} */ (useRef());
|
||||
|
||||
useEffect(() => {
|
||||
const { current: canvas } = canvasRef;
|
||||
canvas.width = canvas.width; // resets canvas
|
||||
|
||||
if (dummy || !hash) return;
|
||||
|
||||
try {
|
||||
const pixels = decode(hash, width, height);
|
||||
const ctx = canvas.getContext('2d');
|
||||
const imageData = new ImageData(pixels, width, height);
|
||||
|
||||
ctx.putImageData(imageData, 0, 0);
|
||||
} catch (err) {
|
||||
console.error('Blurhash decoding failure', { err, hash });
|
||||
}
|
||||
}, [dummy, hash, width, height]);
|
||||
|
||||
return (
|
||||
<canvas {...canvasProps} ref={canvasRef} width={width} height={height} />
|
||||
);
|
||||
}
|
||||
|
||||
Blurhash.propTypes = {
|
||||
hash: PropTypes.string.isRequired,
|
||||
width: PropTypes.number,
|
||||
height: PropTypes.number,
|
||||
dummy: PropTypes.bool,
|
||||
};
|
||||
|
||||
export default React.memo(Blurhash);
|
62
app/javascript/mastodon/components/common_counter.js
Normal file
62
app/javascript/mastodon/components/common_counter.js
Normal file
@ -0,0 +1,62 @@
|
||||
// @ts-check
|
||||
import React from 'react';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
/**
|
||||
* Returns custom renderer for one of the common counter types
|
||||
*
|
||||
* @param {"statuses" | "following" | "followers"} counterType
|
||||
* Type of the counter
|
||||
* @param {boolean} isBold Whether display number must be displayed in bold
|
||||
* @returns {(displayNumber: JSX.Element, pluralReady: number) => JSX.Element}
|
||||
* Renderer function
|
||||
* @throws If counterType is not covered by this function
|
||||
*/
|
||||
export function counterRenderer(counterType, isBold = true) {
|
||||
/**
|
||||
* @type {(displayNumber: JSX.Element) => JSX.Element}
|
||||
*/
|
||||
const renderCounter = isBold
|
||||
? (displayNumber) => <strong>{displayNumber}</strong>
|
||||
: (displayNumber) => displayNumber;
|
||||
|
||||
switch (counterType) {
|
||||
case 'statuses': {
|
||||
return (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='account.statuses_counter'
|
||||
defaultMessage='{count, plural, one {{counter} Toot} other {{counter} Toots}}'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: renderCounter(displayNumber),
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
case 'following': {
|
||||
return (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='account.following_counter'
|
||||
defaultMessage='{count, plural, one {{counter} Following} other {{counter} Following}}'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: renderCounter(displayNumber),
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
case 'followers': {
|
||||
return (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='account.followers_counter'
|
||||
defaultMessage='{count, plural, one {{counter} Follower} other {{counter} Followers}}'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: renderCounter(displayNumber),
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
default: throw Error(`Incorrect counter name: ${counterType}. Ensure it accepted by commonCounter function`);
|
||||
}
|
||||
}
|
@ -1,26 +1,65 @@
|
||||
// @ts-check
|
||||
import React from 'react';
|
||||
import { Sparklines, SparklinesCurve } from 'react-sparklines';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import Permalink from './permalink';
|
||||
import { shortNumberFormat } from '../utils/numbers';
|
||||
import ShortNumber from 'mastodon/components/short_number';
|
||||
|
||||
/**
|
||||
* Used to render counter of how much people are talking about hashtag
|
||||
*
|
||||
* @type {(displayNumber: JSX.Element, pluralReady: number) => JSX.Element}
|
||||
*/
|
||||
const accountsCountRenderer = (displayNumber, pluralReady) => (
|
||||
<FormattedMessage
|
||||
id='trends.counter_by_accounts'
|
||||
defaultMessage='{count, plural, one {{counter} person} other {{counter} people}} talking'
|
||||
values={{
|
||||
count: pluralReady,
|
||||
counter: <strong>{displayNumber}</strong>,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
const Hashtag = ({ hashtag }) => (
|
||||
<div className='trends__item'>
|
||||
<div className='trends__item__name'>
|
||||
<Permalink href={hashtag.get('url')} to={`/timelines/tag/${hashtag.get('name')}`}>
|
||||
<Permalink
|
||||
href={hashtag.get('url')}
|
||||
to={`/timelines/tag/${hashtag.get('name')}`}
|
||||
>
|
||||
#<span>{hashtag.get('name')}</span>
|
||||
</Permalink>
|
||||
|
||||
<FormattedMessage id='trends.count_by_accounts' defaultMessage='{count} {rawCount, plural, one {person} other {people}} talking' values={{ rawCount: hashtag.getIn(['history', 0, 'accounts']) * 1 + hashtag.getIn(['history', 1, 'accounts']) * 1, count: <strong>{shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']) * 1 + hashtag.getIn(['history', 1, 'accounts']) * 1)}</strong> }} />
|
||||
<ShortNumber
|
||||
value={
|
||||
hashtag.getIn(['history', 0, 'accounts']) * 1 +
|
||||
hashtag.getIn(['history', 1, 'accounts']) * 1
|
||||
}
|
||||
renderer={accountsCountRenderer}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className='trends__item__current'>
|
||||
{shortNumberFormat(hashtag.getIn(['history', 0, 'uses']) * 1 + hashtag.getIn(['history', 1, 'uses']) * 1)}
|
||||
<ShortNumber
|
||||
value={
|
||||
hashtag.getIn(['history', 0, 'uses']) * 1 +
|
||||
hashtag.getIn(['history', 1, 'uses']) * 1
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className='trends__item__sparkline'>
|
||||
<Sparklines width={50} height={28} data={hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}>
|
||||
<Sparklines
|
||||
width={50}
|
||||
height={28}
|
||||
data={hashtag
|
||||
.get('history')
|
||||
.reverse()
|
||||
.map((day) => day.get('uses'))
|
||||
.toArray()}
|
||||
>
|
||||
<SparklinesCurve style={{ fill: 'none' }} />
|
||||
</Sparklines>
|
||||
</div>
|
||||
|
@ -7,10 +7,11 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
import { isIOS } from '../is_mobile';
|
||||
import classNames from 'classnames';
|
||||
import { autoPlayGif, cropImages, displayMedia, useBlurhash } from '../initial_state';
|
||||
import { decode } from 'blurhash';
|
||||
import { debounce } from 'lodash';
|
||||
import Blurhash from 'mastodon/components/blurhash';
|
||||
|
||||
const messages = defineMessages({
|
||||
toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Hide media' },
|
||||
toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Hide {number, plural, one {image} other {images}}' },
|
||||
});
|
||||
|
||||
class Item extends React.PureComponent {
|
||||
@ -73,36 +74,6 @@ class Item extends React.PureComponent {
|
||||
e.stopPropagation();
|
||||
}
|
||||
|
||||
componentDidMount () {
|
||||
if (this.props.attachment.get('blurhash')) {
|
||||
this._decode();
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate (prevProps) {
|
||||
if (prevProps.attachment.get('blurhash') !== this.props.attachment.get('blurhash') && this.props.attachment.get('blurhash')) {
|
||||
this._decode();
|
||||
}
|
||||
}
|
||||
|
||||
_decode () {
|
||||
if (!useBlurhash) return;
|
||||
|
||||
const hash = this.props.attachment.get('blurhash');
|
||||
const pixels = decode(hash, 32, 32);
|
||||
|
||||
if (pixels) {
|
||||
const ctx = this.canvas.getContext('2d');
|
||||
const imageData = new ImageData(pixels, 32, 32);
|
||||
|
||||
ctx.putImageData(imageData, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
setCanvasRef = c => {
|
||||
this.canvas = c;
|
||||
}
|
||||
|
||||
handleImageLoad = () => {
|
||||
this.setState({ loaded: true });
|
||||
}
|
||||
@ -165,7 +136,11 @@ class Item extends React.PureComponent {
|
||||
return (
|
||||
<div className={classNames('media-gallery__item', { standalone })} key={attachment.get('id')} style={{ left: left, top: top, right: right, bottom: bottom, width: `${width}%`, height: `${height}%` }}>
|
||||
<a className='media-gallery__item-thumbnail' href={attachment.get('remote_url') || attachment.get('url')} style={{ cursor: 'pointer' }} title={attachment.get('description')} target='_blank' rel='noopener noreferrer'>
|
||||
<canvas width={32} height={32} ref={this.setCanvasRef} className='media-gallery__preview' />
|
||||
<Blurhash
|
||||
hash={attachment.get('blurhash')}
|
||||
className='media-gallery__preview'
|
||||
dummy={!useBlurhash}
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
@ -231,7 +206,13 @@ class Item extends React.PureComponent {
|
||||
|
||||
return (
|
||||
<div className={classNames('media-gallery__item', { standalone })} key={attachment.get('id')} style={{ left: left, top: top, right: right, bottom: bottom, width: `${width}%`, height: `${height}%` }}>
|
||||
<canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && this.state.loaded })} />
|
||||
<Blurhash
|
||||
hash={attachment.get('blurhash')}
|
||||
dummy={!useBlurhash}
|
||||
className={classNames('media-gallery__preview', {
|
||||
'media-gallery__preview--hidden': visible && this.state.loaded,
|
||||
})}
|
||||
/>
|
||||
{visible && thumbnail}
|
||||
</div>
|
||||
);
|
||||
@ -266,6 +247,14 @@ class MediaGallery extends React.PureComponent {
|
||||
width: this.props.defaultWidth,
|
||||
};
|
||||
|
||||
componentDidMount () {
|
||||
window.addEventListener('resize', this.handleResize, { passive: true });
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
window.removeEventListener('resize', this.handleResize);
|
||||
}
|
||||
|
||||
componentWillReceiveProps (nextProps) {
|
||||
if (!is(nextProps.media, this.props.media) && nextProps.visible === undefined) {
|
||||
this.setState({ visible: displayMedia !== 'hide_all' && !nextProps.sensitive || displayMedia === 'show_all' });
|
||||
@ -274,6 +263,14 @@ class MediaGallery extends React.PureComponent {
|
||||
}
|
||||
}
|
||||
|
||||
handleResize = debounce(() => {
|
||||
if (this.node) {
|
||||
this._setDimensions();
|
||||
}
|
||||
}, 250, {
|
||||
trailing: true,
|
||||
});
|
||||
|
||||
handleOpen = () => {
|
||||
if (this.props.onToggleVisibility) {
|
||||
this.props.onToggleVisibility();
|
||||
@ -286,17 +283,27 @@ class MediaGallery extends React.PureComponent {
|
||||
this.props.onOpenMedia(this.props.media, index);
|
||||
}
|
||||
|
||||
handleRef = (node) => {
|
||||
if (node) {
|
||||
// offsetWidth triggers a layout, so only calculate when we need to
|
||||
if (this.props.cacheWidth) this.props.cacheWidth(node.offsetWidth);
|
||||
handleRef = c => {
|
||||
this.node = c;
|
||||
|
||||
this.setState({
|
||||
width: node.offsetWidth,
|
||||
});
|
||||
if (this.node) {
|
||||
this._setDimensions();
|
||||
}
|
||||
}
|
||||
|
||||
_setDimensions () {
|
||||
const width = this.node.offsetWidth;
|
||||
|
||||
// offsetWidth triggers a layout, so only calculate when we need to
|
||||
if (this.props.cacheWidth) {
|
||||
this.props.cacheWidth(width);
|
||||
}
|
||||
|
||||
this.setState({
|
||||
width: width,
|
||||
});
|
||||
}
|
||||
|
||||
isFullSizeEligible() {
|
||||
const { media } = this.props;
|
||||
return media.size === 1 && media.getIn([0, 'meta', 'small', 'aspect']);
|
||||
@ -338,7 +345,7 @@ class MediaGallery extends React.PureComponent {
|
||||
</button>
|
||||
);
|
||||
} else if (visible) {
|
||||
spoilerButton = <IconButton title={intl.formatMessage(messages.toggle_visible)} icon='eye-slash' overlay onClick={this.handleOpen} />;
|
||||
spoilerButton = <IconButton title={intl.formatMessage(messages.toggle_visible, { number: size })} icon='eye-slash' overlay onClick={this.handleOpen} />;
|
||||
} else {
|
||||
spoilerButton = (
|
||||
<button type='button' onClick={this.handleOpen} className='spoiler-button__overlay'>
|
||||
|
@ -66,7 +66,7 @@ export default class ModalRoot extends React.PureComponent {
|
||||
// immediately selectable, we have to wait for observers to run, as
|
||||
// described in https://github.com/WICG/inert#performance-and-gotchas
|
||||
Promise.resolve().then(() => {
|
||||
this.activeElement.focus();
|
||||
this.activeElement.focus({ preventScroll: true });
|
||||
this.activeElement = null;
|
||||
}).catch((error) => {
|
||||
console.error(error);
|
||||
|
@ -10,10 +10,18 @@ import { List as ImmutableList } from 'immutable';
|
||||
import classNames from 'classnames';
|
||||
import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../features/ui/util/fullscreen';
|
||||
import LoadingIndicator from './loading_indicator';
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
const MOUSE_IDLE_DELAY = 300;
|
||||
|
||||
export default class ScrollableList extends PureComponent {
|
||||
const mapStateToProps = (state, { scrollKey }) => {
|
||||
return {
|
||||
preventScroll: scrollKey === state.getIn(['dropdown_menu', 'scroll_key']),
|
||||
};
|
||||
};
|
||||
|
||||
export default @connect(mapStateToProps, null, null, { forwardRef: true })
|
||||
class ScrollableList extends PureComponent {
|
||||
|
||||
static contextTypes = {
|
||||
router: PropTypes.object,
|
||||
@ -32,10 +40,12 @@ export default class ScrollableList extends PureComponent {
|
||||
hasMore: PropTypes.bool,
|
||||
numPending: PropTypes.number,
|
||||
prepend: PropTypes.node,
|
||||
append: PropTypes.node,
|
||||
alwaysPrepend: PropTypes.bool,
|
||||
emptyMessage: PropTypes.node,
|
||||
children: PropTypes.node,
|
||||
bindToDocument: PropTypes.bool,
|
||||
preventScroll: PropTypes.bool,
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
@ -128,7 +138,7 @@ export default class ScrollableList extends PureComponent {
|
||||
});
|
||||
|
||||
handleMouseIdle = () => {
|
||||
if (this.scrollToTopOnMouseIdle) {
|
||||
if (this.scrollToTopOnMouseIdle && !this.props.preventScroll) {
|
||||
this.setScrollTop(0);
|
||||
}
|
||||
|
||||
@ -178,7 +188,7 @@ export default class ScrollableList extends PureComponent {
|
||||
this.getFirstChildKey(prevProps) !== this.getFirstChildKey(this.props);
|
||||
const pendingChanged = (prevProps.numPending > 0) !== (this.props.numPending > 0);
|
||||
|
||||
if (pendingChanged || someItemInserted && (this.getScrollTop() > 0 || this.mouseMovedRecently)) {
|
||||
if (pendingChanged || someItemInserted && (this.getScrollTop() > 0 || this.mouseMovedRecently || this.props.preventScroll)) {
|
||||
return this.getScrollHeight() - this.getScrollTop();
|
||||
} else {
|
||||
return null;
|
||||
@ -280,7 +290,7 @@ export default class ScrollableList extends PureComponent {
|
||||
}
|
||||
|
||||
render () {
|
||||
const { children, scrollKey, trackScroll, shouldUpdateScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, emptyMessage, onLoadMore } = this.props;
|
||||
const { children, scrollKey, trackScroll, shouldUpdateScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props;
|
||||
const { fullscreen } = this.state;
|
||||
const childrenCount = React.Children.count(children);
|
||||
|
||||
@ -327,6 +337,8 @@ export default class ScrollableList extends PureComponent {
|
||||
))}
|
||||
|
||||
{loadMore}
|
||||
|
||||
{!hasMore && append}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
117
app/javascript/mastodon/components/short_number.js
Normal file
117
app/javascript/mastodon/components/short_number.js
Normal file
@ -0,0 +1,117 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { toShortNumber, pluralReady, DECIMAL_UNITS } from '../utils/numbers';
|
||||
import { FormattedMessage, FormattedNumber } from 'react-intl';
|
||||
// @ts-check
|
||||
|
||||
/**
|
||||
* @callback ShortNumberRenderer
|
||||
* @param {JSX.Element} displayNumber Number to display
|
||||
* @param {number} pluralReady Number used for pluralization
|
||||
* @returns {JSX.Element} Final render of number
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {object} ShortNumberProps
|
||||
* @property {number} value Number to display in short variant
|
||||
* @property {ShortNumberRenderer} [renderer]
|
||||
* Custom renderer for numbers, provided as a prop. If another renderer
|
||||
* passed as a child of this component, this prop won't be used.
|
||||
* @property {ShortNumberRenderer} [children]
|
||||
* Custom renderer for numbers, provided as a child. If another renderer
|
||||
* passed as a prop of this component, this one will be used instead.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Component that renders short big number to a shorter version
|
||||
*
|
||||
* @param {ShortNumberProps} param0 Props for the component
|
||||
* @returns {JSX.Element} Rendered number
|
||||
*/
|
||||
function ShortNumber({ value, renderer, children }) {
|
||||
const shortNumber = toShortNumber(value);
|
||||
const [, division] = shortNumber;
|
||||
|
||||
// eslint-disable-next-line eqeqeq
|
||||
if (children != null && renderer != null) {
|
||||
console.warn('Both renderer prop and renderer as a child provided. This is a mistake and you really should fix that. Only renderer passed as a child will be used.');
|
||||
}
|
||||
|
||||
// eslint-disable-next-line eqeqeq
|
||||
const customRenderer = children != null ? children : renderer;
|
||||
|
||||
const displayNumber = <ShortNumberCounter value={shortNumber} />;
|
||||
|
||||
// eslint-disable-next-line eqeqeq
|
||||
return customRenderer != null
|
||||
? customRenderer(displayNumber, pluralReady(value, division))
|
||||
: displayNumber;
|
||||
}
|
||||
|
||||
ShortNumber.propTypes = {
|
||||
value: PropTypes.number.isRequired,
|
||||
renderer: PropTypes.func,
|
||||
children: PropTypes.func,
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef {object} ShortNumberCounterProps
|
||||
* @property {import('../utils/number').ShortNumber} value Short number
|
||||
*/
|
||||
|
||||
/**
|
||||
* Renders short number into corresponding localizable react fragment
|
||||
*
|
||||
* @param {ShortNumberCounterProps} param0 Props for the component
|
||||
* @returns {JSX.Element} FormattedMessage ready to be embedded in code
|
||||
*/
|
||||
function ShortNumberCounter({ value }) {
|
||||
const [rawNumber, unit, maxFractionDigits = 0] = value;
|
||||
|
||||
const count = (
|
||||
<FormattedNumber
|
||||
value={rawNumber}
|
||||
maximumFractionDigits={maxFractionDigits}
|
||||
/>
|
||||
);
|
||||
|
||||
let values = { count, rawNumber };
|
||||
|
||||
switch (unit) {
|
||||
case DECIMAL_UNITS.THOUSAND: {
|
||||
return (
|
||||
<FormattedMessage
|
||||
id='units.short.thousand'
|
||||
defaultMessage='{count}K'
|
||||
values={values}
|
||||
/>
|
||||
);
|
||||
}
|
||||
case DECIMAL_UNITS.MILLION: {
|
||||
return (
|
||||
<FormattedMessage
|
||||
id='units.short.million'
|
||||
defaultMessage='{count}M'
|
||||
values={values}
|
||||
/>
|
||||
);
|
||||
}
|
||||
case DECIMAL_UNITS.BILLION: {
|
||||
return (
|
||||
<FormattedMessage
|
||||
id='units.short.billion'
|
||||
defaultMessage='{count}B'
|
||||
values={values}
|
||||
/>
|
||||
);
|
||||
}
|
||||
// Not sure if we should go farther - @Sasha-Sorokin
|
||||
default: return count;
|
||||
}
|
||||
}
|
||||
|
||||
ShortNumberCounter.propTypes = {
|
||||
value: PropTypes.arrayOf(PropTypes.number),
|
||||
};
|
||||
|
||||
export default React.memo(ShortNumber);
|
@ -10,7 +10,7 @@ import StatusContent from './status_content';
|
||||
import StatusActionBar from './status_action_bar';
|
||||
import AttachmentList from './attachment_list';
|
||||
import Card from '../features/status/components/card';
|
||||
import { injectIntl, FormattedMessage } from 'react-intl';
|
||||
import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import { MediaGallery, Video, Audio } from '../features/ui/util/async-components';
|
||||
import { HotKeys } from 'react-hotkeys';
|
||||
@ -51,6 +51,13 @@ export const defaultMediaVisibility = (status) => {
|
||||
return (displayMedia !== 'hide_all' && !status.get('sensitive') || displayMedia === 'show_all');
|
||||
};
|
||||
|
||||
const messages = defineMessages({
|
||||
public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
|
||||
unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },
|
||||
private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },
|
||||
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },
|
||||
});
|
||||
|
||||
export default @injectIntl
|
||||
class Status extends ImmutablePureComponent {
|
||||
|
||||
@ -87,6 +94,7 @@ class Status extends ImmutablePureComponent {
|
||||
updateScrollBottom: PropTypes.func,
|
||||
cacheMediaWidth: PropTypes.func,
|
||||
cachedMediaWidth: PropTypes.number,
|
||||
scrollKey: PropTypes.string,
|
||||
};
|
||||
|
||||
// Avoid checking props that are functions (and whose equality will always
|
||||
@ -257,7 +265,7 @@ class Status extends ImmutablePureComponent {
|
||||
let media = null;
|
||||
let statusAvatar, prepend, rebloggedByText;
|
||||
|
||||
const { intl, hidden, featured, otherAccounts, unread, showThread } = this.props;
|
||||
const { intl, hidden, featured, otherAccounts, unread, showThread, scrollKey } = this.props;
|
||||
|
||||
let { status, account, ...other } = this.props;
|
||||
|
||||
@ -345,9 +353,14 @@ class Status extends ImmutablePureComponent {
|
||||
<Component
|
||||
src={attachment.get('url')}
|
||||
alt={attachment.get('description')}
|
||||
poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])}
|
||||
backgroundColor={attachment.getIn(['meta', 'colors', 'background'])}
|
||||
foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])}
|
||||
accentColor={attachment.getIn(['meta', 'colors', 'accent'])}
|
||||
duration={attachment.getIn(['meta', 'original', 'duration'], 0)}
|
||||
peaks={[0]}
|
||||
height={70}
|
||||
width={this.props.cachedMediaWidth}
|
||||
height={110}
|
||||
cacheWidth={this.props.cacheMediaWidth}
|
||||
/>
|
||||
)}
|
||||
</Bundle>
|
||||
@ -401,6 +414,7 @@ class Status extends ImmutablePureComponent {
|
||||
compact
|
||||
cacheWidth={this.props.cacheMediaWidth}
|
||||
defaultWidth={this.props.cachedMediaWidth}
|
||||
sensitive={status.get('sensitive')}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@ -413,6 +427,15 @@ class Status extends ImmutablePureComponent {
|
||||
statusAvatar = <AvatarOverlay account={status.get('account')} friend={account} />;
|
||||
}
|
||||
|
||||
const visibilityIconInfo = {
|
||||
'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },
|
||||
'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },
|
||||
'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },
|
||||
'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) },
|
||||
};
|
||||
|
||||
const visibilityIcon = visibilityIconInfo[status.get('visibility')];
|
||||
|
||||
return (
|
||||
<HotKeys handlers={handlers}>
|
||||
<div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), read: unread === false, focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText)} ref={this.handleRef}>
|
||||
@ -422,6 +445,7 @@ class Status extends ImmutablePureComponent {
|
||||
<div className='status__expand' onClick={this.handleExpandClick} role='presentation' />
|
||||
<div className='status__info'>
|
||||
<a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
|
||||
<span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
|
||||
|
||||
<a onClick={this.handleAccountClick} data-id={status.getIn(['account', 'id'])} href={status.getIn(['account', 'url'])} title={status.getIn(['account', 'acct'])} className='status__display-name' target='_blank' rel='noopener noreferrer'>
|
||||
<div className='status__avatar'>
|
||||
@ -436,7 +460,7 @@ class Status extends ImmutablePureComponent {
|
||||
|
||||
{media}
|
||||
|
||||
<StatusActionBar status={status} account={account} {...other} />
|
||||
<StatusActionBar scrollKey={scrollKey} status={status} account={account} {...other} />
|
||||
</div>
|
||||
</div>
|
||||
</HotKeys>
|
||||
|
@ -86,6 +86,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||
onPin: PropTypes.func,
|
||||
onBookmark: PropTypes.func,
|
||||
withDismiss: PropTypes.bool,
|
||||
scrollKey: PropTypes.string,
|
||||
intl: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
@ -230,7 +231,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||
}
|
||||
|
||||
render () {
|
||||
const { status, relationship, intl, withDismiss } = this.props;
|
||||
const { status, relationship, intl, withDismiss, scrollKey } = this.props;
|
||||
|
||||
const mutingConversation = status.get('muted');
|
||||
const anonymousAccess = !me;
|
||||
@ -239,9 +240,6 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||
const federated = !status.get('local_only');
|
||||
|
||||
let menu = [];
|
||||
let reblogIcon = 'retweet';
|
||||
let replyIcon;
|
||||
let replyTitle;
|
||||
|
||||
menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });
|
||||
|
||||
@ -261,10 +259,6 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||
if (status.getIn(['account', 'id']) === me) {
|
||||
if (publicStatus) {
|
||||
menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });
|
||||
} else {
|
||||
if (status.get('visibility') === 'private') {
|
||||
menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancel_reblog_private : messages.reblog_private), action: this.handleReblogClick });
|
||||
}
|
||||
}
|
||||
|
||||
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
|
||||
@ -307,12 +301,8 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||
}
|
||||
}
|
||||
|
||||
if (status.get('visibility') === 'direct') {
|
||||
reblogIcon = 'envelope';
|
||||
} else if (status.get('visibility') === 'private') {
|
||||
reblogIcon = 'lock';
|
||||
}
|
||||
|
||||
let replyIcon;
|
||||
let replyTitle;
|
||||
if (status.get('in_reply_to_id', null) === null) {
|
||||
replyIcon = 'reply';
|
||||
replyTitle = intl.formatMessage(messages.reply);
|
||||
@ -321,6 +311,19 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||
replyTitle = intl.formatMessage(messages.replyAll);
|
||||
}
|
||||
|
||||
const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
|
||||
|
||||
let reblogTitle = '';
|
||||
if (status.get('reblogged')) {
|
||||
reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
|
||||
} else if (publicStatus) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog);
|
||||
} else if (reblogPrivate) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog_private);
|
||||
} else {
|
||||
reblogTitle = intl.formatMessage(messages.cannot_reblog);
|
||||
}
|
||||
|
||||
const shareButton = ('share' in navigator) && publicStatus && (
|
||||
<IconButton className='status__action-bar-button' title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShareClick} />
|
||||
);
|
||||
@ -328,12 +331,21 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||
return (
|
||||
<div className='status__action-bar'>
|
||||
<div className='status__action-bar__counter'><IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /><span className='status__action-bar__counter__label' >{obfuscatedCount(status.get('replies_count'))}</span></div>
|
||||
<IconButton className='status__action-bar-button' disabled={!publicStatus} active={status.get('reblogged')} pressed={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} />
|
||||
<IconButton className='status__action-bar-button' disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} pressed={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} />
|
||||
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
|
||||
{shareButton}
|
||||
|
||||
<div className='status__action-bar-dropdown'>
|
||||
<DropdownMenuContainer disabled={anonymousAccess} status={status} items={menu} icon='ellipsis-h' size={18} direction='right' title={intl.formatMessage(messages.more)} />
|
||||
<DropdownMenuContainer
|
||||
scrollKey={scrollKey}
|
||||
disabled={anonymousAccess}
|
||||
status={status}
|
||||
items={menu}
|
||||
icon='ellipsis-h'
|
||||
size={18}
|
||||
direction='right'
|
||||
title={intl.formatMessage(messages.more)}
|
||||
/>
|
||||
</div>
|
||||
{ !federated &&
|
||||
<IconButton className='status__action-bar-button' disabled title={intl.formatMessage(messages.local_only)} icon='chain-broken' />
|
||||
|
@ -99,6 +99,7 @@ export default class StatusList extends ImmutablePureComponent {
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
contextType={timelineId}
|
||||
scrollKey={this.props.scrollKey}
|
||||
showThread
|
||||
/>
|
||||
))
|
||||
|
18
app/javascript/mastodon/components/timeline_hint.js
Normal file
18
app/javascript/mastodon/components/timeline_hint.js
Normal file
@ -0,0 +1,18 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
const TimelineHint = ({ resource, url }) => (
|
||||
<div className='timeline-hint'>
|
||||
<strong><FormattedMessage id='timeline_hint.remote_resource_not_displayed' defaultMessage='{resource} from other servers are not displayed.' values={{ resource }} /></strong>
|
||||
<br />
|
||||
<a href={url} target='_blank'><FormattedMessage id='account.browse_more_on_origin_server' defaultMessage='Browse more on the original profile' /></a>
|
||||
</div>
|
||||
);
|
||||
|
||||
TimelineHint.propTypes = {
|
||||
resource: PropTypes.node.isRequired,
|
||||
url: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default TimelineHint;
|
@ -12,7 +12,7 @@ const mapStateToProps = state => ({
|
||||
openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch, { status, items }) => ({
|
||||
const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
|
||||
onOpen(id, onItemClick, dropdownPlacement, keyboard) {
|
||||
if (status) {
|
||||
dispatch(fetchRelationships([status.getIn(['account', 'id'])]));
|
||||
@ -22,7 +22,7 @@ const mapDispatchToProps = (dispatch, { status, items }) => ({
|
||||
status,
|
||||
actions: items,
|
||||
onClick: onItemClick,
|
||||
}) : openDropdownMenu(id, dropdownPlacement, keyboard));
|
||||
}) : openDropdownMenu(id, dropdownPlacement, keyboard, scrollKey));
|
||||
},
|
||||
|
||||
onClose(id) {
|
||||
|
@ -0,0 +1,170 @@
|
||||
import React from 'react';
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import PropTypes from 'prop-types';
|
||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import Textarea from 'react-textarea-autosize';
|
||||
import { is } from 'immutable';
|
||||
|
||||
const messages = defineMessages({
|
||||
placeholder: { id: 'account_note.placeholder', defaultMessage: 'Click to add a note' },
|
||||
});
|
||||
|
||||
class InlineAlert extends React.PureComponent {
|
||||
|
||||
static propTypes = {
|
||||
show: PropTypes.bool,
|
||||
};
|
||||
|
||||
state = {
|
||||
mountMessage: false,
|
||||
};
|
||||
|
||||
static TRANSITION_DELAY = 200;
|
||||
|
||||
componentWillReceiveProps (nextProps) {
|
||||
if (!this.props.show && nextProps.show) {
|
||||
this.setState({ mountMessage: true });
|
||||
} else if (this.props.show && !nextProps.show) {
|
||||
setTimeout(() => this.setState({ mountMessage: false }), InlineAlert.TRANSITION_DELAY);
|
||||
}
|
||||
}
|
||||
|
||||
render () {
|
||||
const { show } = this.props;
|
||||
const { mountMessage } = this.state;
|
||||
|
||||
return (
|
||||
<span aria-live='polite' role='status' className='inline-alert' style={{ opacity: show ? 1 : 0 }}>
|
||||
{mountMessage && <FormattedMessage id='generic.saved' defaultMessage='Saved' />}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default @injectIntl
|
||||
class AccountNote extends ImmutablePureComponent {
|
||||
|
||||
static propTypes = {
|
||||
account: ImmutablePropTypes.map.isRequired,
|
||||
value: PropTypes.string,
|
||||
onSave: PropTypes.func.isRequired,
|
||||
intl: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
state = {
|
||||
value: null,
|
||||
saving: false,
|
||||
saved: false,
|
||||
};
|
||||
|
||||
componentWillMount () {
|
||||
this._reset();
|
||||
}
|
||||
|
||||
componentWillReceiveProps (nextProps) {
|
||||
const accountWillChange = !is(this.props.account, nextProps.account);
|
||||
const newState = {};
|
||||
|
||||
if (accountWillChange && this._isDirty()) {
|
||||
this._save(false);
|
||||
}
|
||||
|
||||
if (accountWillChange || nextProps.value === this.state.value) {
|
||||
newState.saving = false;
|
||||
}
|
||||
|
||||
if (this.props.value !== nextProps.value) {
|
||||
newState.value = nextProps.value;
|
||||
}
|
||||
|
||||
this.setState(newState);
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
if (this._isDirty()) {
|
||||
this._save(false);
|
||||
}
|
||||
}
|
||||
|
||||
setTextareaRef = c => {
|
||||
this.textarea = c;
|
||||
}
|
||||
|
||||
handleChange = e => {
|
||||
this.setState({ value: e.target.value, saving: false });
|
||||
};
|
||||
|
||||
handleKeyDown = e => {
|
||||
if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
|
||||
e.preventDefault();
|
||||
|
||||
this._save();
|
||||
|
||||
if (this.textarea) {
|
||||
this.textarea.blur();
|
||||
}
|
||||
} else if (e.keyCode === 27) {
|
||||
e.preventDefault();
|
||||
|
||||
this._reset(() => {
|
||||
if (this.textarea) {
|
||||
this.textarea.blur();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
handleBlur = () => {
|
||||
if (this._isDirty()) {
|
||||
this._save();
|
||||
}
|
||||
}
|
||||
|
||||
_save (showMessage = true) {
|
||||
this.setState({ saving: true }, () => this.props.onSave(this.state.value));
|
||||
|
||||
if (showMessage) {
|
||||
this.setState({ saved: true }, () => setTimeout(() => this.setState({ saved: false }), 2000));
|
||||
}
|
||||
}
|
||||
|
||||
_reset (callback) {
|
||||
this.setState({ value: this.props.value }, callback);
|
||||
}
|
||||
|
||||
_isDirty () {
|
||||
return !this.state.saving && this.props.value !== null && this.state.value !== null && this.state.value !== this.props.value;
|
||||
}
|
||||
|
||||
render () {
|
||||
const { account, intl } = this.props;
|
||||
const { value, saved } = this.state;
|
||||
|
||||
if (!account) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='account__header__account-note'>
|
||||
<label htmlFor={`account-note-${account.get('id')}`}>
|
||||
<FormattedMessage id='account.account_note_header' defaultMessage='Note' /> <InlineAlert show={saved} />
|
||||
</label>
|
||||
|
||||
<Textarea
|
||||
id={`account-note-${account.get('id')}`}
|
||||
className='account__header__account-note__content'
|
||||
disabled={this.props.value === null || value === null}
|
||||
placeholder={intl.formatMessage(messages.placeholder)}
|
||||
value={value || ''}
|
||||
onChange={this.handleChange}
|
||||
onKeyDown={this.handleKeyDown}
|
||||
onBlur={this.handleBlur}
|
||||
ref={this.setTextareaRef}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@ -8,9 +8,11 @@ import { autoPlayGif, me, isStaff } from 'mastodon/initial_state';
|
||||
import classNames from 'classnames';
|
||||
import Icon from 'mastodon/components/icon';
|
||||
import Avatar from 'mastodon/components/avatar';
|
||||
import { shortNumberFormat } from 'mastodon/utils/numbers';
|
||||
import { counterRenderer } from 'mastodon/components/common_counter';
|
||||
import ShortNumber from 'mastodon/components/short_number';
|
||||
import { NavLink } from 'react-router-dom';
|
||||
import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
|
||||
import AccountNoteContainer from '../containers/account_note_container';
|
||||
|
||||
const messages = defineMessages({
|
||||
unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
|
||||
@ -312,20 +314,31 @@ class Header extends ImmutablePureComponent {
|
||||
</div>
|
||||
)}
|
||||
|
||||
{account.get('id') !== me && <AccountNoteContainer account={account} />}
|
||||
|
||||
{account.get('note').length > 0 && account.get('note') !== '<p></p>' && <div className='account__header__content' dangerouslySetInnerHTML={content} />}
|
||||
</div>
|
||||
|
||||
<div className='account__header__extra__links'>
|
||||
<NavLink isActive={this.isStatusesPageActive} activeClassName='active' to={`/accounts/${account.get('id')}`} title={intl.formatNumber(account.get('statuses_count'))}>
|
||||
<strong>{shortNumberFormat(account.get('statuses_count'))}</strong> <FormattedMessage id='account.posts' defaultMessage='Toots' />
|
||||
<ShortNumber
|
||||
value={account.get('statuses_count')}
|
||||
renderer={counterRenderer('statuses')}
|
||||
/>
|
||||
</NavLink>
|
||||
|
||||
<NavLink exact activeClassName='active' to={`/accounts/${account.get('id')}/following`} title={intl.formatNumber(account.get('following_count'))}>
|
||||
<strong>{shortNumberFormat(account.get('following_count'))}</strong> <FormattedMessage id='account.follows' defaultMessage='Follows' />
|
||||
<ShortNumber
|
||||
value={account.get('following_count')}
|
||||
renderer={counterRenderer('following')}
|
||||
/>
|
||||
</NavLink>
|
||||
|
||||
<NavLink exact activeClassName='active' to={`/accounts/${account.get('id')}/followers`} title={intl.formatNumber(account.get('followers_count'))}>
|
||||
<strong>{shortNumberFormat(account.get('followers_count'))}</strong> <FormattedMessage id='account.followers' defaultMessage='Followers' />
|
||||
<ShortNumber
|
||||
value={account.get('followers_count')}
|
||||
renderer={counterRenderer('followers')}
|
||||
/>
|
||||
</NavLink>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -0,0 +1,17 @@
|
||||
import { connect } from 'react-redux';
|
||||
import { submitAccountNote } from 'mastodon/actions/account_notes';
|
||||
import AccountNote from '../components/account_note';
|
||||
|
||||
const mapStateToProps = (state, { account }) => ({
|
||||
value: account.getIn(['relationship', 'note']),
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch, { account }) => ({
|
||||
|
||||
onSave (value) {
|
||||
dispatch(submitAccountNote(account.get('id'), value));
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(AccountNote);
|
@ -1,7 +1,7 @@
|
||||
import { decode } from 'blurhash';
|
||||
import Blurhash from 'mastodon/components/blurhash';
|
||||
import classNames from 'classnames';
|
||||
import Icon from 'mastodon/components/icon';
|
||||
import { autoPlayGif, displayMedia } from 'mastodon/initial_state';
|
||||
import { autoPlayGif, displayMedia, useBlurhash } from 'mastodon/initial_state';
|
||||
import { isIOS } from 'mastodon/is_mobile';
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
@ -21,34 +21,6 @@ export default class MediaItem extends ImmutablePureComponent {
|
||||
loaded: false,
|
||||
};
|
||||
|
||||
componentDidMount () {
|
||||
if (this.props.attachment.get('blurhash')) {
|
||||
this._decode();
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate (prevProps) {
|
||||
if (prevProps.attachment.get('blurhash') !== this.props.attachment.get('blurhash') && this.props.attachment.get('blurhash')) {
|
||||
this._decode();
|
||||
}
|
||||
}
|
||||
|
||||
_decode () {
|
||||
const hash = this.props.attachment.get('blurhash');
|
||||
const pixels = decode(hash, 32, 32);
|
||||
|
||||
if (pixels) {
|
||||
const ctx = this.canvas.getContext('2d');
|
||||
const imageData = new ImageData(pixels, 32, 32);
|
||||
|
||||
ctx.putImageData(imageData, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
setCanvasRef = c => {
|
||||
this.canvas = c;
|
||||
}
|
||||
|
||||
handleImageLoad = () => {
|
||||
this.setState({ loaded: true });
|
||||
}
|
||||
@ -89,57 +61,9 @@ export default class MediaItem extends ImmutablePureComponent {
|
||||
const width = `${Math.floor((displayWidth - 4) / 3) - 4}px`;
|
||||
const height = width;
|
||||
const status = attachment.get('status');
|
||||
const title = status.get('spoiler_text') || attachment.get('description');
|
||||
const title = status.get('spoiler_text') || attachment.get('description');
|
||||
|
||||
let thumbnail = '';
|
||||
let icon;
|
||||
|
||||
if (attachment.get('type') === 'unknown') {
|
||||
// Skip
|
||||
} else if (attachment.get('type') === 'audio') {
|
||||
thumbnail = (
|
||||
<span className='account-gallery__item__icons'>
|
||||
<Icon id='music' />
|
||||
</span>
|
||||
);
|
||||
} else if (attachment.get('type') === 'image') {
|
||||
const focusX = attachment.getIn(['meta', 'focus', 'x']) || 0;
|
||||
const focusY = attachment.getIn(['meta', 'focus', 'y']) || 0;
|
||||
const x = ((focusX / 2) + .5) * 100;
|
||||
const y = ((focusY / -2) + .5) * 100;
|
||||
|
||||
thumbnail = (
|
||||
<img
|
||||
src={attachment.get('preview_url')}
|
||||
alt={attachment.get('description')}
|
||||
title={attachment.get('description')}
|
||||
style={{ objectPosition: `${x}% ${y}%` }}
|
||||
onLoad={this.handleImageLoad}
|
||||
/>
|
||||
);
|
||||
} else if (['gifv', 'video'].indexOf(attachment.get('type')) !== -1) {
|
||||
const autoPlay = !isIOS() && autoPlayGif;
|
||||
const label = attachment.get('type') === 'video' ? <Icon id='play' /> : 'GIF';
|
||||
|
||||
thumbnail = (
|
||||
<div className={classNames('media-gallery__gifv', { autoplay: autoPlay })}>
|
||||
<video
|
||||
className='media-gallery__item-gifv-thumbnail'
|
||||
aria-label={attachment.get('description')}
|
||||
title={attachment.get('description')}
|
||||
role='application'
|
||||
src={attachment.get('url')}
|
||||
onMouseEnter={this.handleMouseEnter}
|
||||
onMouseLeave={this.handleMouseLeave}
|
||||
autoPlay={autoPlay}
|
||||
loop
|
||||
muted
|
||||
/>
|
||||
|
||||
<span className='media-gallery__gifv__label'>{label}</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
let thumbnail, label, icon, content;
|
||||
|
||||
if (!visible) {
|
||||
icon = (
|
||||
@ -147,14 +71,72 @@ export default class MediaItem extends ImmutablePureComponent {
|
||||
<Icon id='eye-slash' />
|
||||
</span>
|
||||
);
|
||||
} else {
|
||||
if (['audio', 'video'].includes(attachment.get('type'))) {
|
||||
content = (
|
||||
<img
|
||||
src={attachment.get('preview_url') || attachment.getIn(['account', 'avatar_static'])}
|
||||
alt={attachment.get('description')}
|
||||
onLoad={this.handleImageLoad}
|
||||
/>
|
||||
);
|
||||
|
||||
if (attachment.get('type') === 'audio') {
|
||||
label = <Icon id='music' />;
|
||||
} else {
|
||||
label = <Icon id='play' />;
|
||||
}
|
||||
} else if (attachment.get('type') === 'image') {
|
||||
const focusX = attachment.getIn(['meta', 'focus', 'x']) || 0;
|
||||
const focusY = attachment.getIn(['meta', 'focus', 'y']) || 0;
|
||||
const x = ((focusX / 2) + .5) * 100;
|
||||
const y = ((focusY / -2) + .5) * 100;
|
||||
|
||||
content = (
|
||||
<img
|
||||
src={attachment.get('preview_url')}
|
||||
alt={attachment.get('description')}
|
||||
style={{ objectPosition: `${x}% ${y}%` }}
|
||||
onLoad={this.handleImageLoad}
|
||||
/>
|
||||
);
|
||||
} else if (attachment.get('type') === 'gifv') {
|
||||
content = (
|
||||
<video
|
||||
className='media-gallery__item-gifv-thumbnail'
|
||||
aria-label={attachment.get('description')}
|
||||
role='application'
|
||||
src={attachment.get('url')}
|
||||
onMouseEnter={this.handleMouseEnter}
|
||||
onMouseLeave={this.handleMouseLeave}
|
||||
autoPlay={!isIOS() && autoPlayGif}
|
||||
loop
|
||||
muted
|
||||
/>
|
||||
);
|
||||
|
||||
label = 'GIF';
|
||||
}
|
||||
|
||||
thumbnail = (
|
||||
<div className='media-gallery__gifv'>
|
||||
{content}
|
||||
|
||||
<span className='media-gallery__gifv__label'>{label}</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='account-gallery__item' style={{ width, height }}>
|
||||
<a className='media-gallery__item-thumbnail' href={status.get('url')} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>
|
||||
<canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />
|
||||
{visible && thumbnail}
|
||||
{!visible && icon}
|
||||
<Blurhash
|
||||
hash={attachment.get('blurhash')}
|
||||
className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })}
|
||||
dummy={!useBlurhash}
|
||||
/>
|
||||
|
||||
{visible ? thumbnail : icon}
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
|
@ -101,9 +101,9 @@ class AccountGallery extends ImmutablePureComponent {
|
||||
|
||||
handleOpenMedia = attachment => {
|
||||
if (attachment.get('type') === 'video') {
|
||||
this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status') }));
|
||||
this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status'), options: { autoPlay: true } }));
|
||||
} else if (attachment.get('type') === 'audio') {
|
||||
this.props.dispatch(openModal('AUDIO', { media: attachment, status: attachment.get('status') }));
|
||||
this.props.dispatch(openModal('AUDIO', { media: attachment, status: attachment.get('status'), options: { autoPlay: true } }));
|
||||
} else {
|
||||
const media = attachment.getIn(['status', 'media_attachments']);
|
||||
const index = media.findIndex(x => x.get('id') === attachment.get('id'));
|
||||
|
@ -23,6 +23,7 @@ export default class Header extends ImmutablePureComponent {
|
||||
onUnblockDomain: PropTypes.func.isRequired,
|
||||
onEndorseToggle: PropTypes.func.isRequired,
|
||||
onAddToList: PropTypes.func.isRequired,
|
||||
onEditAccountNote: PropTypes.func.isRequired,
|
||||
hideTabs: PropTypes.bool,
|
||||
domain: PropTypes.string.isRequired,
|
||||
};
|
||||
@ -83,6 +84,10 @@ export default class Header extends ImmutablePureComponent {
|
||||
this.props.onAddToList(this.props.account);
|
||||
}
|
||||
|
||||
handleEditAccountNote = () => {
|
||||
this.props.onEditAccountNote(this.props.account);
|
||||
}
|
||||
|
||||
render () {
|
||||
const { account, hideTabs, identity_proofs } = this.props;
|
||||
|
||||
@ -108,6 +113,7 @@ export default class Header extends ImmutablePureComponent {
|
||||
onUnblockDomain={this.handleUnblockDomain}
|
||||
onEndorseToggle={this.handleEndorseToggle}
|
||||
onAddToList={this.handleAddToList}
|
||||
onEditAccountNote={this.handleEditAccountNote}
|
||||
domain={this.props.domain}
|
||||
/>
|
||||
|
||||
|
@ -14,6 +14,9 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import { fetchAccountIdentityProofs } from '../../actions/identity_proofs';
|
||||
import MissingIndicator from 'mastodon/components/missing_indicator';
|
||||
import TimelineHint from 'mastodon/components/timeline_hint';
|
||||
import { me } from 'mastodon/initial_state';
|
||||
import { connectTimeline, disconnectTimeline } from 'mastodon/actions/timelines';
|
||||
|
||||
const emptyList = ImmutableList();
|
||||
|
||||
@ -21,6 +24,8 @@ const mapStateToProps = (state, { params: { accountId }, withReplies = false })
|
||||
const path = withReplies ? `${accountId}:with_replies` : accountId;
|
||||
|
||||
return {
|
||||
remote: !!(state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username'])),
|
||||
remoteUrl: state.getIn(['accounts', accountId, 'url']),
|
||||
isAccount: !!state.getIn(['accounts', accountId]),
|
||||
statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),
|
||||
featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], emptyList),
|
||||
@ -30,6 +35,14 @@ const mapStateToProps = (state, { params: { accountId }, withReplies = false })
|
||||
};
|
||||
};
|
||||
|
||||
const RemoteHint = ({ url }) => (
|
||||
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.statuses' defaultMessage='Older toots' />} />
|
||||
);
|
||||
|
||||
RemoteHint.propTypes = {
|
||||
url: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default @connect(mapStateToProps)
|
||||
class AccountTimeline extends ImmutablePureComponent {
|
||||
|
||||
@ -44,32 +57,54 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||
withReplies: PropTypes.bool,
|
||||
blockedBy: PropTypes.bool,
|
||||
isAccount: PropTypes.bool,
|
||||
remote: PropTypes.bool,
|
||||
remoteUrl: PropTypes.string,
|
||||
multiColumn: PropTypes.bool,
|
||||
};
|
||||
|
||||
componentWillMount () {
|
||||
const { params: { accountId }, withReplies } = this.props;
|
||||
const { params: { accountId }, withReplies, dispatch } = this.props;
|
||||
|
||||
this.props.dispatch(fetchAccount(accountId));
|
||||
this.props.dispatch(fetchAccountIdentityProofs(accountId));
|
||||
dispatch(fetchAccount(accountId));
|
||||
dispatch(fetchAccountIdentityProofs(accountId));
|
||||
|
||||
if (!withReplies) {
|
||||
this.props.dispatch(expandAccountFeaturedTimeline(accountId));
|
||||
dispatch(expandAccountFeaturedTimeline(accountId));
|
||||
}
|
||||
|
||||
this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));
|
||||
dispatch(expandAccountTimeline(accountId, { withReplies }));
|
||||
|
||||
if (accountId === me) {
|
||||
dispatch(connectTimeline(`account:${me}`));
|
||||
}
|
||||
}
|
||||
|
||||
componentWillReceiveProps (nextProps) {
|
||||
const { dispatch } = this.props;
|
||||
|
||||
if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
|
||||
this.props.dispatch(fetchAccount(nextProps.params.accountId));
|
||||
this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
|
||||
dispatch(fetchAccount(nextProps.params.accountId));
|
||||
dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
|
||||
|
||||
if (!nextProps.withReplies) {
|
||||
this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
|
||||
dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
|
||||
}
|
||||
|
||||
this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
|
||||
dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
|
||||
}
|
||||
|
||||
if (nextProps.params.accountId === me && this.props.params.accountId !== me) {
|
||||
dispatch(connectTimeline(`account:${me}`));
|
||||
} else if (this.props.params.accountId === me && nextProps.params.accountId !== me) {
|
||||
dispatch(disconnectTimeline(`account:${me}`));
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
const { dispatch, params: { accountId } } = this.props;
|
||||
|
||||
if (accountId === me) {
|
||||
dispatch(disconnectTimeline(`account:${me}`));
|
||||
}
|
||||
}
|
||||
|
||||
@ -78,7 +113,7 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||
}
|
||||
|
||||
render () {
|
||||
const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, isAccount, multiColumn } = this.props;
|
||||
const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, isAccount, multiColumn, remote, remoteUrl } = this.props;
|
||||
|
||||
if (!isAccount) {
|
||||
return (
|
||||
@ -97,7 +132,17 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||
);
|
||||
}
|
||||
|
||||
const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;
|
||||
let emptyMessage;
|
||||
|
||||
if (blockedBy) {
|
||||
emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
|
||||
} else if (remote && statusIds.isEmpty()) {
|
||||
emptyMessage = <RemoteHint url={remoteUrl} />;
|
||||
} else {
|
||||
emptyMessage = <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;
|
||||
}
|
||||
|
||||
const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
|
||||
|
||||
return (
|
||||
<Column>
|
||||
@ -106,6 +151,7 @@ class AccountTimeline extends ImmutablePureComponent {
|
||||
<StatusList
|
||||
prepend={<HeaderContainer accountId={this.props.params.accountId} />}
|
||||
alwaysPrepend
|
||||
append={remoteMessage}
|
||||
scrollKey='account_timeline'
|
||||
statusIds={blockedBy ? emptyList : statusIds}
|
||||
featuredStatusIds={featuredStatusIds}
|
||||
|
@ -1,11 +1,13 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import WaveSurfer from 'wavesurfer.js';
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
import { formatTime } from 'mastodon/features/video';
|
||||
import Icon from 'mastodon/components/icon';
|
||||
import classNames from 'classnames';
|
||||
import { throttle } from 'lodash';
|
||||
import { getPointerPosition, fileNameFromURL } from 'mastodon/features/video';
|
||||
import { debounce } from 'lodash';
|
||||
import Visualizer from './visualizer';
|
||||
|
||||
const messages = defineMessages({
|
||||
play: { id: 'video.play', defaultMessage: 'Play' },
|
||||
@ -15,131 +17,155 @@ const messages = defineMessages({
|
||||
download: { id: 'video.download', defaultMessage: 'Download file' },
|
||||
});
|
||||
|
||||
const TICK_SIZE = 10;
|
||||
const PADDING = 180;
|
||||
|
||||
export default @injectIntl
|
||||
class Audio extends React.PureComponent {
|
||||
|
||||
static propTypes = {
|
||||
src: PropTypes.string.isRequired,
|
||||
alt: PropTypes.string,
|
||||
poster: PropTypes.string,
|
||||
duration: PropTypes.number,
|
||||
peaks: PropTypes.arrayOf(PropTypes.number),
|
||||
width: PropTypes.number,
|
||||
height: PropTypes.number,
|
||||
preload: PropTypes.bool,
|
||||
editable: PropTypes.bool,
|
||||
fullscreen: PropTypes.bool,
|
||||
intl: PropTypes.object.isRequired,
|
||||
cacheWidth: PropTypes.func,
|
||||
backgroundColor: PropTypes.string,
|
||||
foregroundColor: PropTypes.string,
|
||||
accentColor: PropTypes.string,
|
||||
autoPlay: PropTypes.bool,
|
||||
};
|
||||
|
||||
state = {
|
||||
width: this.props.width,
|
||||
currentTime: 0,
|
||||
buffer: 0,
|
||||
duration: null,
|
||||
paused: true,
|
||||
muted: false,
|
||||
volume: 0.5,
|
||||
dragging: false,
|
||||
};
|
||||
|
||||
// Hard coded in components.scss
|
||||
// Any way to get ::before values programatically?
|
||||
volWidth = 50;
|
||||
volOffset = 70;
|
||||
constructor (props) {
|
||||
super(props);
|
||||
this.visualizer = new Visualizer(TICK_SIZE);
|
||||
}
|
||||
|
||||
volHandleOffset = v => {
|
||||
const offset = v * this.volWidth + this.volOffset;
|
||||
setPlayerRef = c => {
|
||||
this.player = c;
|
||||
|
||||
return (offset > 110) ? 110 : offset;
|
||||
if (this.player) {
|
||||
this._setDimensions();
|
||||
}
|
||||
}
|
||||
|
||||
_setDimensions () {
|
||||
const width = this.player.offsetWidth;
|
||||
const height = this.props.fullscreen ? this.player.offsetHeight : (width / (16/9));
|
||||
|
||||
if (this.props.cacheWidth) {
|
||||
this.props.cacheWidth(width);
|
||||
}
|
||||
|
||||
this.setState({ width, height });
|
||||
}
|
||||
|
||||
setSeekRef = c => {
|
||||
this.seek = c;
|
||||
}
|
||||
|
||||
setVolumeRef = c => {
|
||||
this.volume = c;
|
||||
}
|
||||
|
||||
setWaveformRef = c => {
|
||||
this.waveform = c;
|
||||
setAudioRef = c => {
|
||||
this.audio = c;
|
||||
|
||||
if (this.audio) {
|
||||
this.setState({ volume: this.audio.volume, muted: this.audio.muted });
|
||||
}
|
||||
}
|
||||
|
||||
setCanvasRef = c => {
|
||||
this.canvas = c;
|
||||
|
||||
this.visualizer.setCanvas(c);
|
||||
}
|
||||
|
||||
componentDidMount () {
|
||||
if (this.waveform) {
|
||||
this._updateWaveform();
|
||||
}
|
||||
|
||||
window.addEventListener('scroll', this.handleScroll);
|
||||
window.addEventListener('resize', this.handleResize, { passive: true });
|
||||
}
|
||||
|
||||
componentDidUpdate (prevProps) {
|
||||
if (this.waveform && prevProps.src !== this.props.src) {
|
||||
this._updateWaveform();
|
||||
componentDidUpdate (prevProps, prevState) {
|
||||
if (prevProps.src !== this.props.src || this.state.width !== prevState.width || this.state.height !== prevState.height || prevProps.accentColor !== this.props.accentColor) {
|
||||
this._clear();
|
||||
this._draw();
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
window.removeEventListener('scroll', this.handleScroll);
|
||||
|
||||
if (this.wavesurfer) {
|
||||
this.wavesurfer.destroy();
|
||||
this.wavesurfer = null;
|
||||
}
|
||||
}
|
||||
|
||||
_updateWaveform () {
|
||||
const { src, height, duration, peaks, preload } = this.props;
|
||||
|
||||
const progressColor = window.getComputedStyle(document.querySelector('.audio-player__progress-placeholder')).getPropertyValue('background-color');
|
||||
const waveColor = window.getComputedStyle(document.querySelector('.audio-player__wave-placeholder')).getPropertyValue('background-color');
|
||||
|
||||
if (this.wavesurfer) {
|
||||
this.wavesurfer.destroy();
|
||||
this.loaded = false;
|
||||
}
|
||||
|
||||
const wavesurfer = WaveSurfer.create({
|
||||
container: this.waveform,
|
||||
height,
|
||||
barWidth: 3,
|
||||
cursorWidth: 0,
|
||||
progressColor,
|
||||
waveColor,
|
||||
backend: 'MediaElement',
|
||||
interact: preload,
|
||||
});
|
||||
|
||||
wavesurfer.setVolume(this.state.volume);
|
||||
|
||||
if (preload) {
|
||||
wavesurfer.load(src);
|
||||
this.loaded = true;
|
||||
} else {
|
||||
wavesurfer.load(src, peaks, 'none', duration);
|
||||
this.loaded = false;
|
||||
}
|
||||
|
||||
wavesurfer.on('ready', () => this.setState({ duration: Math.floor(wavesurfer.getDuration()) }));
|
||||
wavesurfer.on('audioprocess', () => this.setState({ currentTime: Math.floor(wavesurfer.getCurrentTime()) }));
|
||||
wavesurfer.on('pause', () => this.setState({ paused: true }));
|
||||
wavesurfer.on('play', () => this.setState({ paused: false }));
|
||||
wavesurfer.on('volume', volume => this.setState({ volume }));
|
||||
wavesurfer.on('mute', muted => this.setState({ muted }));
|
||||
|
||||
this.wavesurfer = wavesurfer;
|
||||
window.removeEventListener('resize', this.handleResize);
|
||||
}
|
||||
|
||||
togglePlay = () => {
|
||||
if (this.state.paused) {
|
||||
if (!this.props.preload && !this.loaded) {
|
||||
this.wavesurfer.createBackend();
|
||||
this.wavesurfer.createPeakCache();
|
||||
this.wavesurfer.load(this.props.src);
|
||||
this.wavesurfer.toggleInteraction();
|
||||
this.loaded = true;
|
||||
}
|
||||
|
||||
this.setState({ paused: false }, () => this.wavesurfer.play());
|
||||
this.setState({ paused: false }, () => this.audio.play());
|
||||
} else {
|
||||
this.setState({ paused: true }, () => this.wavesurfer.pause());
|
||||
this.setState({ paused: true }, () => this.audio.pause());
|
||||
}
|
||||
}
|
||||
|
||||
handleResize = debounce(() => {
|
||||
if (this.player) {
|
||||
this._setDimensions();
|
||||
}
|
||||
}, 250, {
|
||||
trailing: true,
|
||||
});
|
||||
|
||||
handlePlay = () => {
|
||||
this.setState({ paused: false });
|
||||
|
||||
if (this.canvas && !this.audioContext) {
|
||||
this._initAudioContext();
|
||||
}
|
||||
|
||||
if (this.audioContext && this.audioContext.state === 'suspended') {
|
||||
this.audioContext.resume();
|
||||
}
|
||||
|
||||
this._renderCanvas();
|
||||
}
|
||||
|
||||
handlePause = () => {
|
||||
this.setState({ paused: true });
|
||||
|
||||
if (this.audioContext) {
|
||||
this.audioContext.suspend();
|
||||
}
|
||||
}
|
||||
|
||||
handleProgress = () => {
|
||||
const lastTimeRange = this.audio.buffered.length - 1;
|
||||
|
||||
if (lastTimeRange > -1) {
|
||||
this.setState({ buffer: Math.ceil(this.audio.buffered.end(lastTimeRange) / this.audio.duration * 100) });
|
||||
}
|
||||
}
|
||||
|
||||
toggleMute = () => {
|
||||
const muted = !this.state.muted;
|
||||
this.setState({ muted }, () => this.wavesurfer.setMute(muted));
|
||||
|
||||
this.setState({ muted }, () => {
|
||||
this.audio.muted = muted;
|
||||
});
|
||||
}
|
||||
|
||||
handleVolumeMouseDown = e => {
|
||||
@ -161,86 +187,239 @@ class Audio extends React.PureComponent {
|
||||
document.removeEventListener('touchend', this.handleVolumeMouseUp, true);
|
||||
}
|
||||
|
||||
handleMouseDown = e => {
|
||||
document.addEventListener('mousemove', this.handleMouseMove, true);
|
||||
document.addEventListener('mouseup', this.handleMouseUp, true);
|
||||
document.addEventListener('touchmove', this.handleMouseMove, true);
|
||||
document.addEventListener('touchend', this.handleMouseUp, true);
|
||||
|
||||
this.setState({ dragging: true });
|
||||
this.audio.pause();
|
||||
this.handleMouseMove(e);
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}
|
||||
|
||||
handleMouseUp = () => {
|
||||
document.removeEventListener('mousemove', this.handleMouseMove, true);
|
||||
document.removeEventListener('mouseup', this.handleMouseUp, true);
|
||||
document.removeEventListener('touchmove', this.handleMouseMove, true);
|
||||
document.removeEventListener('touchend', this.handleMouseUp, true);
|
||||
|
||||
this.setState({ dragging: false });
|
||||
this.audio.play();
|
||||
}
|
||||
|
||||
handleMouseMove = throttle(e => {
|
||||
const { x } = getPointerPosition(this.seek, e);
|
||||
const currentTime = this.audio.duration * x;
|
||||
|
||||
if (!isNaN(currentTime)) {
|
||||
this.setState({ currentTime }, () => {
|
||||
this.audio.currentTime = currentTime;
|
||||
});
|
||||
}
|
||||
}, 15);
|
||||
|
||||
handleTimeUpdate = () => {
|
||||
this.setState({
|
||||
currentTime: this.audio.currentTime,
|
||||
duration: Math.floor(this.audio.duration),
|
||||
});
|
||||
}
|
||||
|
||||
handleMouseVolSlide = throttle(e => {
|
||||
const rect = this.volume.getBoundingClientRect();
|
||||
const x = (e.clientX - rect.left) / this.volWidth; // x position within the element.
|
||||
const { x } = getPointerPosition(this.volume, e);
|
||||
|
||||
if(!isNaN(x)) {
|
||||
let slideamt = x;
|
||||
|
||||
if (x > 1) {
|
||||
slideamt = 1;
|
||||
} else if(x < 0) {
|
||||
slideamt = 0;
|
||||
}
|
||||
|
||||
this.wavesurfer.setVolume(slideamt);
|
||||
this.setState({ volume: x }, () => {
|
||||
this.audio.volume = x;
|
||||
});
|
||||
}
|
||||
}, 60);
|
||||
}, 15);
|
||||
|
||||
handleScroll = throttle(() => {
|
||||
if (!this.waveform || !this.wavesurfer) {
|
||||
if (!this.canvas || !this.audio) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { top, height } = this.waveform.getBoundingClientRect();
|
||||
const { top, height } = this.canvas.getBoundingClientRect();
|
||||
const inView = (top <= (window.innerHeight || document.documentElement.clientHeight)) && (top + height >= 0);
|
||||
|
||||
if (!this.state.paused && !inView) {
|
||||
this.setState({ paused: true }, () => this.wavesurfer.pause());
|
||||
this.setState({ paused: true }, () => this.audio.pause());
|
||||
}
|
||||
}, 150, { trailing: true })
|
||||
}, 150, { trailing: true });
|
||||
|
||||
handleMouseEnter = () => {
|
||||
this.setState({ hovered: true });
|
||||
}
|
||||
|
||||
handleMouseLeave = () => {
|
||||
this.setState({ hovered: false });
|
||||
}
|
||||
|
||||
handleLoadedData = () => {
|
||||
const { autoPlay } = this.props;
|
||||
|
||||
if (autoPlay) {
|
||||
this.audio.play();
|
||||
}
|
||||
}
|
||||
|
||||
_initAudioContext () {
|
||||
const context = new AudioContext();
|
||||
const source = context.createMediaElementSource(this.audio);
|
||||
|
||||
this.visualizer.setAudioContext(context, source);
|
||||
source.connect(context.destination);
|
||||
|
||||
this.audioContext = context;
|
||||
}
|
||||
|
||||
handleDownload = () => {
|
||||
fetch(this.props.src).then(res => res.blob()).then(blob => {
|
||||
const element = document.createElement('a');
|
||||
const objectURL = URL.createObjectURL(blob);
|
||||
|
||||
element.setAttribute('href', objectURL);
|
||||
element.setAttribute('download', fileNameFromURL(this.props.src));
|
||||
|
||||
document.body.appendChild(element);
|
||||
element.click();
|
||||
document.body.removeChild(element);
|
||||
|
||||
URL.revokeObjectURL(objectURL);
|
||||
}).catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
}
|
||||
|
||||
_renderCanvas () {
|
||||
requestAnimationFrame(() => {
|
||||
if (!this.audio) return;
|
||||
|
||||
this.handleTimeUpdate();
|
||||
this._clear();
|
||||
this._draw();
|
||||
|
||||
if (!this.state.paused) {
|
||||
this._renderCanvas();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_clear() {
|
||||
this.visualizer.clear(this.state.width, this.state.height);
|
||||
}
|
||||
|
||||
_draw() {
|
||||
this.visualizer.draw(this._getCX(), this._getCY(), this._getAccentColor(), this._getRadius(), this._getScaleCoefficient());
|
||||
}
|
||||
|
||||
_getRadius () {
|
||||
return parseInt(((this.state.height || this.props.height) - (PADDING * this._getScaleCoefficient()) * 2) / 2);
|
||||
}
|
||||
|
||||
_getScaleCoefficient () {
|
||||
return (this.state.height || this.props.height) / 982;
|
||||
}
|
||||
|
||||
_getCX() {
|
||||
return Math.floor(this.state.width / 2);
|
||||
}
|
||||
|
||||
_getCY() {
|
||||
return Math.floor(this._getRadius() + (PADDING * this._getScaleCoefficient()));
|
||||
}
|
||||
|
||||
_getAccentColor () {
|
||||
return this.props.accentColor || '#ffffff';
|
||||
}
|
||||
|
||||
_getBackgroundColor () {
|
||||
return this.props.backgroundColor || '#000000';
|
||||
}
|
||||
|
||||
_getForegroundColor () {
|
||||
return this.props.foregroundColor || '#ffffff';
|
||||
}
|
||||
|
||||
render () {
|
||||
const { height, intl, alt, editable } = this.props;
|
||||
const { paused, muted, volume, currentTime } = this.state;
|
||||
|
||||
const volumeWidth = muted ? 0 : volume * this.volWidth;
|
||||
const volumeHandleLoc = muted ? this.volHandleOffset(0) : this.volHandleOffset(volume);
|
||||
const { src, intl, alt, editable, autoPlay } = this.props;
|
||||
const { paused, muted, volume, currentTime, duration, buffer, dragging } = this.state;
|
||||
const progress = (currentTime / duration) * 100;
|
||||
|
||||
return (
|
||||
<div className={classNames('audio-player', { editable })}>
|
||||
<div className='audio-player__progress-placeholder' style={{ display: 'none' }} />
|
||||
<div className='audio-player__wave-placeholder' style={{ display: 'none' }} />
|
||||
|
||||
<div
|
||||
className='audio-player__waveform'
|
||||
aria-label={alt}
|
||||
title={alt}
|
||||
style={{ height }}
|
||||
ref={this.setWaveformRef}
|
||||
<div className={classNames('audio-player', { editable })} ref={this.setPlayerRef} style={{ backgroundColor: this._getBackgroundColor(), color: this._getForegroundColor(), width: '100%', height: this.props.fullscreen ? '100%' : (this.state.height || this.props.height) }} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
|
||||
<audio
|
||||
src={src}
|
||||
ref={this.setAudioRef}
|
||||
preload={autoPlay ? 'auto' : 'none'}
|
||||
onPlay={this.handlePlay}
|
||||
onPause={this.handlePause}
|
||||
onProgress={this.handleProgress}
|
||||
onLoadedData={this.handleLoadedData}
|
||||
crossOrigin='anonymous'
|
||||
/>
|
||||
|
||||
<canvas
|
||||
role='button'
|
||||
className='audio-player__canvas'
|
||||
width={this.state.width}
|
||||
height={this.state.height}
|
||||
style={{ width: '100%', position: 'absolute', top: 0, left: 0 }}
|
||||
ref={this.setCanvasRef}
|
||||
onClick={this.togglePlay}
|
||||
title={alt}
|
||||
aria-label={alt}
|
||||
/>
|
||||
|
||||
<img
|
||||
src={this.props.poster}
|
||||
alt=''
|
||||
width={(this._getRadius() - TICK_SIZE) * 2}
|
||||
height={(this._getRadius() - TICK_SIZE) * 2}
|
||||
style={{ position: 'absolute', left: this._getCX(), top: this._getCY(), transform: 'translate(-50%, -50%)', borderRadius: '50%', pointerEvents: 'none' }}
|
||||
/>
|
||||
|
||||
<div className='video-player__seek' onMouseDown={this.handleMouseDown} ref={this.setSeekRef}>
|
||||
<div className='video-player__seek__buffer' style={{ width: `${buffer}%` }} />
|
||||
<div className='video-player__seek__progress' style={{ width: `${progress}%`, backgroundColor: this._getAccentColor() }} />
|
||||
|
||||
<span
|
||||
className={classNames('video-player__seek__handle', { active: dragging })}
|
||||
tabIndex='0'
|
||||
style={{ left: `${progress}%`, backgroundColor: this._getAccentColor() }}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className='video-player__controls active'>
|
||||
<div className='video-player__buttons-bar'>
|
||||
<div className='video-player__buttons left'>
|
||||
<button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} onClick={this.togglePlay}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
|
||||
<button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
|
||||
|
||||
<div className='video-player__volume' onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
|
||||
|
||||
<div className='video-player__volume__current' style={{ width: `${volumeWidth}px` }} />
|
||||
<div className={classNames('video-player__volume', { active: this.state.hovered })} ref={this.setVolumeRef} onMouseDown={this.handleVolumeMouseDown}>
|
||||
<div className='video-player__volume__current' style={{ width: `${volume * 100}%`, backgroundColor: this._getAccentColor() }} />
|
||||
|
||||
<span
|
||||
className={classNames('video-player__volume__handle')}
|
||||
tabIndex='0'
|
||||
style={{ left: `${volumeHandleLoc}px` }}
|
||||
style={{ left: `${volume * 100}%`, backgroundColor: this._getAccentColor() }}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<span>
|
||||
<span className='video-player__time-current'>{formatTime(currentTime)}</span>
|
||||
<span className='video-player__time'>
|
||||
<span className='video-player__time-current'>{formatTime(Math.floor(currentTime))}</span>
|
||||
<span className='video-player__time-sep'>/</span>
|
||||
<span className='video-player__time-total'>{formatTime(this.state.duration || Math.floor(this.props.duration))}</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className='video-player__buttons right'>
|
||||
<button type='button' title={intl.formatMessage(messages.download)} aria-label={intl.formatMessage(messages.download)}>
|
||||
<a className='video-player__download__icon' href={this.props.src} download>
|
||||
<Icon id={'download'} fixedWidth />
|
||||
</a>
|
||||
</button>
|
||||
<button type='button' title={intl.formatMessage(messages.download)} aria-label={intl.formatMessage(messages.download)} onClick={this.handleDownload}><Icon id='download' fixedWidth /></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
136
app/javascript/mastodon/features/audio/visualizer.js
Normal file
136
app/javascript/mastodon/features/audio/visualizer.js
Normal file
@ -0,0 +1,136 @@
|
||||
/*
|
||||
Copyright (c) 2020 by Alex Permyakov (https://codepen.io/alexdevp/pen/RNELPV)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
const hex2rgba = (hex, alpha = 1) => {
|
||||
const [r, g, b] = hex.match(/\w\w/g).map(x => parseInt(x, 16));
|
||||
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
||||
};
|
||||
|
||||
export default class Visualizer {
|
||||
|
||||
constructor (tickSize) {
|
||||
this.tickSize = tickSize;
|
||||
}
|
||||
|
||||
setCanvas(canvas) {
|
||||
this.canvas = canvas;
|
||||
if (canvas) {
|
||||
this.context = canvas.getContext('2d');
|
||||
}
|
||||
}
|
||||
|
||||
setAudioContext(context, source) {
|
||||
const analyser = context.createAnalyser();
|
||||
|
||||
analyser.smoothingTimeConstant = 0.6;
|
||||
analyser.fftSize = 2048;
|
||||
|
||||
source.connect(analyser);
|
||||
|
||||
this.analyser = analyser;
|
||||
}
|
||||
|
||||
getTickPoints (count) {
|
||||
const coords = [];
|
||||
|
||||
for(let i = 0; i < count; i++) {
|
||||
const rad = Math.PI * 2 * i / count;
|
||||
coords.push({ x: Math.cos(rad), y: -Math.sin(rad) });
|
||||
}
|
||||
|
||||
return coords;
|
||||
}
|
||||
|
||||
drawTick (cx, cy, mainColor, x1, y1, x2, y2) {
|
||||
const dx1 = Math.ceil(cx + x1);
|
||||
const dy1 = Math.ceil(cy + y1);
|
||||
const dx2 = Math.ceil(cx + x2);
|
||||
const dy2 = Math.ceil(cy + y2);
|
||||
|
||||
const gradient = this.context.createLinearGradient(dx1, dy1, dx2, dy2);
|
||||
|
||||
const lastColor = hex2rgba(mainColor, 0);
|
||||
|
||||
gradient.addColorStop(0, mainColor);
|
||||
gradient.addColorStop(0.6, mainColor);
|
||||
gradient.addColorStop(1, lastColor);
|
||||
|
||||
this.context.beginPath();
|
||||
this.context.strokeStyle = gradient;
|
||||
this.context.lineWidth = 2;
|
||||
this.context.moveTo(dx1, dy1);
|
||||
this.context.lineTo(dx2, dy2);
|
||||
this.context.stroke();
|
||||
}
|
||||
|
||||
getTicks (count, size, radius, scaleCoefficient) {
|
||||
const ticks = this.getTickPoints(count);
|
||||
const lesser = 200;
|
||||
const m = [];
|
||||
const bufferLength = this.analyser ? this.analyser.frequencyBinCount : 0;
|
||||
const frequencyData = new Uint8Array(bufferLength);
|
||||
const allScales = [];
|
||||
|
||||
if (this.analyser) {
|
||||
this.analyser.getByteFrequencyData(frequencyData);
|
||||
}
|
||||
|
||||
ticks.forEach((tick, i) => {
|
||||
const coef = 1 - i / (ticks.length * 2.5);
|
||||
|
||||
let delta = ((frequencyData[i] || 0) - lesser * coef) * scaleCoefficient;
|
||||
|
||||
if (delta < 0) {
|
||||
delta = 0;
|
||||
}
|
||||
|
||||
const k = radius / (radius - (size + delta));
|
||||
|
||||
const x1 = tick.x * (radius - size);
|
||||
const y1 = tick.y * (radius - size);
|
||||
const x2 = x1 * k;
|
||||
const y2 = y1 * k;
|
||||
|
||||
m.push({ x1, y1, x2, y2 });
|
||||
|
||||
if (i < 20) {
|
||||
let scale = delta / (200 * scaleCoefficient);
|
||||
scale = scale < 1 ? 1 : scale;
|
||||
allScales.push(scale);
|
||||
}
|
||||
});
|
||||
|
||||
const scale = allScales.reduce((pv, cv) => pv + cv, 0) / allScales.length;
|
||||
|
||||
return m.map(({ x1, y1, x2, y2 }) => ({
|
||||
x1: x1,
|
||||
y1: y1,
|
||||
x2: x2 * scale,
|
||||
y2: y2 * scale,
|
||||
}));
|
||||
}
|
||||
|
||||
clear (width, height) {
|
||||
this.context.clearRect(0, 0, width, height);
|
||||
}
|
||||
|
||||
draw (cx, cy, color, radius, coefficient) {
|
||||
this.context.save();
|
||||
|
||||
const ticks = this.getTicks(parseInt(360 * coefficient), this.tickSize, radius, coefficient);
|
||||
|
||||
ticks.forEach(tick => {
|
||||
this.drawTick(cx, cy, color, tick.x1, tick.y1, tick.x2, tick.y2);
|
||||
});
|
||||
|
||||
this.context.restore();
|
||||
}
|
||||
|
||||
}
|
@ -199,12 +199,13 @@ class EmojiPickerMenu extends React.PureComponent {
|
||||
};
|
||||
}
|
||||
|
||||
handleClick = emoji => {
|
||||
handleClick = (emoji, event) => {
|
||||
if (!emoji.native) {
|
||||
emoji.native = emoji.colons;
|
||||
}
|
||||
|
||||
this.props.onClose();
|
||||
if (!(event.ctrlKey || event.metaKey)) {
|
||||
this.props.onClose();
|
||||
}
|
||||
this.props.onPick(emoji);
|
||||
}
|
||||
|
||||
|
@ -7,11 +7,9 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
|
||||
const messages = defineMessages({
|
||||
upload: { id: 'upload_button.label', defaultMessage: 'Add media ({formats})' },
|
||||
upload: { id: 'upload_button.label', defaultMessage: 'Add images, a video or an audio file' },
|
||||
});
|
||||
|
||||
const SUPPORTED_FORMATS = 'JPEG, PNG, GIF, WebM, MP4, MOV, OGG, WAV, MP3, FLAC';
|
||||
|
||||
const makeMapStateToProps = () => {
|
||||
const mapStateToProps = state => ({
|
||||
acceptContentTypes: state.getIn(['media_attachments', 'accept_content_types']),
|
||||
@ -60,11 +58,13 @@ class UploadButton extends ImmutablePureComponent {
|
||||
return null;
|
||||
}
|
||||
|
||||
const message = intl.formatMessage(messages.upload);
|
||||
|
||||
return (
|
||||
<div className='compose-form__upload-button'>
|
||||
<IconButton icon='paperclip' title={intl.formatMessage(messages.upload, { formats: SUPPORTED_FORMATS })} disabled={disabled} onClick={this.handleClick} className='compose-form__upload-button-icon' size={18} inverted style={iconStyle} />
|
||||
<IconButton icon='paperclip' title={message} disabled={disabled} onClick={this.handleClick} className='compose-form__upload-button-icon' size={18} inverted style={iconStyle} />
|
||||
<label>
|
||||
<span style={{ display: 'none' }}>{intl.formatMessage(messages.upload, { formats: SUPPORTED_FORMATS })}</span>
|
||||
<span style={{ display: 'none' }}>{message}</span>
|
||||
<input
|
||||
key={resetFileKey}
|
||||
ref={this.setRef}
|
||||
|
@ -36,6 +36,7 @@ class Conversation extends ImmutablePureComponent {
|
||||
accounts: ImmutablePropTypes.list.isRequired,
|
||||
lastStatus: ImmutablePropTypes.map,
|
||||
unread:PropTypes.bool.isRequired,
|
||||
scrollKey: PropTypes.string,
|
||||
onMoveUp: PropTypes.func,
|
||||
onMoveDown: PropTypes.func,
|
||||
markRead: PropTypes.func.isRequired,
|
||||
@ -127,7 +128,7 @@ class Conversation extends ImmutablePureComponent {
|
||||
}
|
||||
|
||||
render () {
|
||||
const { accounts, lastStatus, unread, intl } = this.props;
|
||||
const { accounts, lastStatus, unread, scrollKey, intl } = this.props;
|
||||
|
||||
if (lastStatus === null) {
|
||||
return null;
|
||||
@ -194,7 +195,15 @@ class Conversation extends ImmutablePureComponent {
|
||||
<IconButton className='status__action-bar-button' title={intl.formatMessage(messages.reply)} icon='reply' onClick={this.handleReply} />
|
||||
|
||||
<div className='status__action-bar-dropdown'>
|
||||
<DropdownMenuContainer status={lastStatus} items={menu} icon='ellipsis-h' size={18} direction='right' title={intl.formatMessage(messages.more)} />
|
||||
<DropdownMenuContainer
|
||||
scrollKey={scrollKey}
|
||||
status={lastStatus}
|
||||
items={menu}
|
||||
icon='ellipsis-h'
|
||||
size={18}
|
||||
direction='right'
|
||||
title={intl.formatMessage(messages.more)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -10,6 +10,7 @@ export default class ConversationsList extends ImmutablePureComponent {
|
||||
|
||||
static propTypes = {
|
||||
conversations: ImmutablePropTypes.list.isRequired,
|
||||
scrollKey: PropTypes.string.isRequired,
|
||||
hasMore: PropTypes.bool,
|
||||
isLoading: PropTypes.bool,
|
||||
onLoadMore: PropTypes.func,
|
||||
@ -58,13 +59,14 @@ export default class ConversationsList extends ImmutablePureComponent {
|
||||
const { conversations, onLoadMore, ...other } = this.props;
|
||||
|
||||
return (
|
||||
<ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} scrollKey='direct' ref={this.setRef}>
|
||||
<ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} ref={this.setRef}>
|
||||
{conversations.map(item => (
|
||||
<ConversationContainer
|
||||
key={item.get('id')}
|
||||
conversationId={item.get('id')}
|
||||
onMoveUp={this.handleMoveUp}
|
||||
onMoveDown={this.handleMoveDown}
|
||||
scrollKey={this.props.scrollKey}
|
||||
/>
|
||||
))}
|
||||
</ScrollableList>
|
||||
|
@ -11,8 +11,14 @@ import RelativeTimestamp from 'mastodon/components/relative_timestamp';
|
||||
import IconButton from 'mastodon/components/icon_button';
|
||||
import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
|
||||
import { autoPlayGif, me, unfollowModal } from 'mastodon/initial_state';
|
||||
import { shortNumberFormat } from 'mastodon/utils/numbers';
|
||||
import { followAccount, unfollowAccount, blockAccount, unblockAccount, unmuteAccount } from 'mastodon/actions/accounts';
|
||||
import ShortNumber from 'mastodon/components/short_number';
|
||||
import {
|
||||
followAccount,
|
||||
unfollowAccount,
|
||||
blockAccount,
|
||||
unblockAccount,
|
||||
unmuteAccount,
|
||||
} from 'mastodon/actions/accounts';
|
||||
import { openModal } from 'mastodon/actions/modal';
|
||||
import { initMuteModal } from 'mastodon/actions/mutes';
|
||||
|
||||
@ -22,7 +28,10 @@ const messages = defineMessages({
|
||||
requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },
|
||||
unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
|
||||
unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
|
||||
unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
|
||||
unfollowConfirm: {
|
||||
id: 'confirmations.unfollow.confirm',
|
||||
defaultMessage: 'Unfollow',
|
||||
},
|
||||
});
|
||||
|
||||
const makeMapStateToProps = () => {
|
||||
@ -36,15 +45,25 @@ const makeMapStateToProps = () => {
|
||||
};
|
||||
|
||||
const mapDispatchToProps = (dispatch, { intl }) => ({
|
||||
|
||||
onFollow (account) {
|
||||
if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {
|
||||
onFollow(account) {
|
||||
if (
|
||||
account.getIn(['relationship', 'following']) ||
|
||||
account.getIn(['relationship', 'requested'])
|
||||
) {
|
||||
if (unfollowModal) {
|
||||
dispatch(openModal('CONFIRM', {
|
||||
message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
|
||||
confirm: intl.formatMessage(messages.unfollowConfirm),
|
||||
onConfirm: () => dispatch(unfollowAccount(account.get('id'))),
|
||||
}));
|
||||
dispatch(
|
||||
openModal('CONFIRM', {
|
||||
message: (
|
||||
<FormattedMessage
|
||||
id='confirmations.unfollow.message'
|
||||
defaultMessage='Are you sure you want to unfollow {name}?'
|
||||
values={{ name: <strong>@{account.get('acct')}</strong> }}
|
||||
/>
|
||||
),
|
||||
confirm: intl.formatMessage(messages.unfollowConfirm),
|
||||
onConfirm: () => dispatch(unfollowAccount(account.get('id'))),
|
||||
}),
|
||||
);
|
||||
} else {
|
||||
dispatch(unfollowAccount(account.get('id')));
|
||||
}
|
||||
@ -53,7 +72,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
|
||||
}
|
||||
},
|
||||
|
||||
onBlock (account) {
|
||||
onBlock(account) {
|
||||
if (account.getIn(['relationship', 'blocking'])) {
|
||||
dispatch(unblockAccount(account.get('id')));
|
||||
} else {
|
||||
@ -61,17 +80,17 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
|
||||
}
|
||||
},
|
||||
|
||||
onMute (account) {
|
||||
onMute(account) {
|
||||
if (account.getIn(['relationship', 'muting'])) {
|
||||
dispatch(unmuteAccount(account.get('id')));
|
||||
} else {
|
||||
dispatch(initMuteModal(account));
|
||||
}
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
export default @injectIntl
|
||||
export default
|
||||
@injectIntl
|
||||
@connect(makeMapStateToProps, mapDispatchToProps)
|
||||
class AccountCard extends ImmutablePureComponent {
|
||||
|
||||
@ -83,7 +102,7 @@ class AccountCard extends ImmutablePureComponent {
|
||||
onMute: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
_updateEmojis () {
|
||||
_updateEmojis() {
|
||||
const node = this.node;
|
||||
|
||||
if (!node || autoPlayGif) {
|
||||
@ -104,68 +123,113 @@ class AccountCard extends ImmutablePureComponent {
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount () {
|
||||
componentDidMount() {
|
||||
this._updateEmojis();
|
||||
}
|
||||
|
||||
componentDidUpdate () {
|
||||
componentDidUpdate() {
|
||||
this._updateEmojis();
|
||||
}
|
||||
|
||||
handleEmojiMouseEnter = ({ target }) => {
|
||||
target.src = target.getAttribute('data-original');
|
||||
}
|
||||
};
|
||||
|
||||
handleEmojiMouseLeave = ({ target }) => {
|
||||
target.src = target.getAttribute('data-static');
|
||||
}
|
||||
};
|
||||
|
||||
handleFollow = () => {
|
||||
this.props.onFollow(this.props.account);
|
||||
}
|
||||
};
|
||||
|
||||
handleBlock = () => {
|
||||
this.props.onBlock(this.props.account);
|
||||
}
|
||||
};
|
||||
|
||||
handleMute = () => {
|
||||
this.props.onMute(this.props.account);
|
||||
}
|
||||
};
|
||||
|
||||
setRef = (c) => {
|
||||
this.node = c;
|
||||
}
|
||||
};
|
||||
|
||||
render () {
|
||||
render() {
|
||||
const { account, intl } = this.props;
|
||||
|
||||
let buttons;
|
||||
|
||||
if (account.get('id') !== me && account.get('relationship', null) !== null) {
|
||||
if (
|
||||
account.get('id') !== me &&
|
||||
account.get('relationship', null) !== null
|
||||
) {
|
||||
const following = account.getIn(['relationship', 'following']);
|
||||
const requested = account.getIn(['relationship', 'requested']);
|
||||
const blocking = account.getIn(['relationship', 'blocking']);
|
||||
const muting = account.getIn(['relationship', 'muting']);
|
||||
const blocking = account.getIn(['relationship', 'blocking']);
|
||||
const muting = account.getIn(['relationship', 'muting']);
|
||||
|
||||
if (requested) {
|
||||
buttons = <IconButton disabled icon='hourglass' title={intl.formatMessage(messages.requested)} />;
|
||||
buttons = (
|
||||
<IconButton
|
||||
disabled
|
||||
icon='hourglass'
|
||||
title={intl.formatMessage(messages.requested)}
|
||||
/>
|
||||
);
|
||||
} else if (blocking) {
|
||||
buttons = <IconButton active icon='unlock' title={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.handleBlock} />;
|
||||
buttons = (
|
||||
<IconButton
|
||||
active
|
||||
icon='unlock'
|
||||
title={intl.formatMessage(messages.unblock, {
|
||||
name: account.get('username'),
|
||||
})}
|
||||
onClick={this.handleBlock}
|
||||
/>
|
||||
);
|
||||
} else if (muting) {
|
||||
buttons = <IconButton active icon='volume-up' title={intl.formatMessage(messages.unmute, { name: account.get('username') })} onClick={this.handleMute} />;
|
||||
buttons = (
|
||||
<IconButton
|
||||
active
|
||||
icon='volume-up'
|
||||
title={intl.formatMessage(messages.unmute, {
|
||||
name: account.get('username'),
|
||||
})}
|
||||
onClick={this.handleMute}
|
||||
/>
|
||||
);
|
||||
} else if (!account.get('moved') || following) {
|
||||
buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />;
|
||||
buttons = (
|
||||
<IconButton
|
||||
icon={following ? 'user-times' : 'user-plus'}
|
||||
title={intl.formatMessage(
|
||||
following ? messages.unfollow : messages.follow,
|
||||
)}
|
||||
onClick={this.handleFollow}
|
||||
active={following}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='directory__card'>
|
||||
<div className='directory__card__img'>
|
||||
<img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' />
|
||||
<img
|
||||
src={
|
||||
autoPlayGif ? account.get('header') : account.get('header_static')
|
||||
}
|
||||
alt=''
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className='directory__card__bar'>
|
||||
<Permalink className='directory__card__bar__name' href={account.get('url')} to={`/accounts/${account.get('id')}`}>
|
||||
<Permalink
|
||||
className='directory__card__bar__name'
|
||||
href={account.get('url')}
|
||||
to={`/accounts/${account.get('id')}`}
|
||||
>
|
||||
<Avatar account={account} size={48} />
|
||||
<DisplayName account={account} />
|
||||
</Permalink>
|
||||
@ -176,13 +240,44 @@ class AccountCard extends ImmutablePureComponent {
|
||||
</div>
|
||||
|
||||
<div className='directory__card__extra' ref={this.setRef}>
|
||||
<div className='account__header__content' dangerouslySetInnerHTML={{ __html: account.get('note_emojified') }} />
|
||||
<div
|
||||
className='account__header__content'
|
||||
dangerouslySetInnerHTML={{ __html: account.get('note_emojified') }}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className='directory__card__extra'>
|
||||
<div className='accounts-table__count'>{shortNumberFormat(account.get('statuses_count'))} <small><FormattedMessage id='account.posts' defaultMessage='Toots' /></small></div>
|
||||
<div className='accounts-table__count'>{shortNumberFormat(account.get('followers_count'))} <small><FormattedMessage id='account.followers' defaultMessage='Followers' /></small></div>
|
||||
<div className='accounts-table__count'>{account.get('last_status_at') === null ? <FormattedMessage id='account.never_active' defaultMessage='Never' /> : <RelativeTimestamp timestamp={account.get('last_status_at')} />} <small><FormattedMessage id='account.last_status' defaultMessage='Last active' /></small></div>
|
||||
<div className='accounts-table__count'>
|
||||
<ShortNumber value={account.get('statuses_count')} />
|
||||
<small>
|
||||
<FormattedMessage id='account.posts' defaultMessage='Toots' />
|
||||
</small>
|
||||
</div>
|
||||
<div className='accounts-table__count'>
|
||||
<ShortNumber value={account.get('followers_count')} />{' '}
|
||||
<small>
|
||||
<FormattedMessage
|
||||
id='account.followers'
|
||||
defaultMessage='Followers'
|
||||
/>
|
||||
</small>
|
||||
</div>
|
||||
<div className='accounts-table__count'>
|
||||
{account.get('last_status_at') === null ? (
|
||||
<FormattedMessage
|
||||
id='account.never_active'
|
||||
defaultMessage='Never'
|
||||
/>
|
||||
) : (
|
||||
<RelativeTimestamp timestamp={account.get('last_status_at')} />
|
||||
)}{' '}
|
||||
<small>
|
||||
<FormattedMessage
|
||||
id='account.last_status'
|
||||
defaultMessage='Last active'
|
||||
/>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
@ -76,7 +76,17 @@ describe('emoji', () => {
|
||||
|
||||
it('skips the textual presentation VS15 character', () => {
|
||||
expect(emojify('✴︎')) // This is U+2734 EIGHT POINTED BLACK STAR then U+FE0E VARIATION SELECTOR-15
|
||||
.toEqual('<img draggable="false" class="emojione" alt="✴" title=":eight_pointed_black_star:" src="/emoji/2734.svg" />');
|
||||
.toEqual('<img draggable="false" class="emojione" alt="✴" title=":eight_pointed_black_star:" src="/emoji/2734_border.svg" />');
|
||||
});
|
||||
|
||||
it('does an simple emoji properly', () => {
|
||||
expect(emojify('♀♂'))
|
||||
.toEqual('<img draggable="false" class="emojione" alt="♀" title=":female_sign:" src="/emoji/2640.svg" /><img draggable="false" class="emojione" alt="♂" title=":male_sign:" src="/emoji/2642.svg" />');
|
||||
});
|
||||
|
||||
it('does an emoji containing ZWJ properly', () => {
|
||||
expect(emojify('💂♀️💂♂️'))
|
||||
.toEqual('<img draggable="false" class="emojione" alt="💂\u200D♀️" title=":female-guard:" src="/emoji/1f482-200d-2640-fe0f_border.svg" /><img draggable="false" class="emojione" alt="💂\u200D♂️" title=":male-guard:" src="/emoji/1f482-200d-2642-fe0f_border.svg" />');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -6,6 +6,20 @@ const trie = new Trie(Object.keys(unicodeMapping));
|
||||
|
||||
const assetHost = process.env.CDN_HOST || '';
|
||||
|
||||
// Convert to file names from emojis. (For different variation selector emojis)
|
||||
const emojiFilenames = (emojis) => {
|
||||
return emojis.map(v => unicodeMapping[v].filename);
|
||||
};
|
||||
|
||||
// Emoji requiring extra borders depending on theme
|
||||
const darkEmoji = emojiFilenames(['🎱', '🐜', '⚫', '🖤', '⬛', '◼️', '◾', '◼️', '✒️', '▪️', '💣', '🎳', '📷', '📸', '♣️', '🕶️', '✴️', '🔌', '💂♀️', '📽️', '🍳', '🦍', '💂', '🔪', '🕳️', '🕹️', '🕋', '🖊️', '🖋️', '💂♂️', '🎤', '🎓', '🎥', '🎼', '♠️', '🎩', '🦃', '📼', '📹', '🎮', '🐃', '🏴']);
|
||||
const lightEmoji = emojiFilenames(['👽', '⚾', '🐔', '☁️', '💨', '🕊️', '👀', '🍥', '👻', '🐐', '❕', '❔', '⛸️', '🌩️', '🔊', '🔇', '📃', '🌧️', '🐏', '🍚', '🍙', '🐓', '🐑', '💀', '☠️', '🌨️', '🔉', '🔈', '💬', '💭', '🏐', '🏳️', '⚪', '⬜', '◽', '◻️', '▫️']);
|
||||
|
||||
const emojiFilename = (filename) => {
|
||||
const borderedEmoji = (document.body && document.body.classList.contains('theme-mastodon-light')) ? lightEmoji : darkEmoji;
|
||||
return borderedEmoji.includes(filename) ? (filename + '_border') : filename;
|
||||
};
|
||||
|
||||
const emojify = (str, customEmojis = {}) => {
|
||||
const tagCharsWithoutEmojis = '<&';
|
||||
const tagCharsWithEmojis = Object.keys(customEmojis).length ? '<&:' : '<&';
|
||||
@ -60,7 +74,7 @@ const emojify = (str, customEmojis = {}) => {
|
||||
} else { // matched to unicode emoji
|
||||
const { filename, shortCode } = unicodeMapping[match];
|
||||
const title = shortCode ? `:${shortCode}:` : '';
|
||||
replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${assetHost}/emoji/${filename}.svg" />`;
|
||||
replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${assetHost}/emoji/${emojiFilename(filename)}.svg" />`;
|
||||
rend = i + match.length;
|
||||
// If the matched character was followed by VS15 (for selecting text presentation), skip it.
|
||||
if (str.codePointAt(rend) === 65038) {
|
||||
|
@ -17,8 +17,11 @@ import HeaderContainer from '../account_timeline/containers/header_container';
|
||||
import ColumnBackButton from '../../components/column_back_button';
|
||||
import ScrollableList from '../../components/scrollable_list';
|
||||
import MissingIndicator from 'mastodon/components/missing_indicator';
|
||||
import TimelineHint from 'mastodon/components/timeline_hint';
|
||||
|
||||
const mapStateToProps = (state, props) => ({
|
||||
remote: !!(state.getIn(['accounts', props.params.accountId, 'acct']) !== state.getIn(['accounts', props.params.accountId, 'username'])),
|
||||
remoteUrl: state.getIn(['accounts', props.params.accountId, 'url']),
|
||||
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
||||
accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
|
||||
hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
|
||||
@ -26,6 +29,14 @@ const mapStateToProps = (state, props) => ({
|
||||
blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
|
||||
});
|
||||
|
||||
const RemoteHint = ({ url }) => (
|
||||
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.followers' defaultMessage='Followers' />} />
|
||||
);
|
||||
|
||||
RemoteHint.propTypes = {
|
||||
url: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default @connect(mapStateToProps)
|
||||
class Followers extends ImmutablePureComponent {
|
||||
|
||||
@ -38,6 +49,8 @@ class Followers extends ImmutablePureComponent {
|
||||
isLoading: PropTypes.bool,
|
||||
blockedBy: PropTypes.bool,
|
||||
isAccount: PropTypes.bool,
|
||||
remote: PropTypes.bool,
|
||||
remoteUrl: PropTypes.string,
|
||||
multiColumn: PropTypes.bool,
|
||||
};
|
||||
|
||||
@ -60,7 +73,7 @@ class Followers extends ImmutablePureComponent {
|
||||
}, 300, { leading: true });
|
||||
|
||||
render () {
|
||||
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading } = this.props;
|
||||
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
|
||||
|
||||
if (!isAccount) {
|
||||
return (
|
||||
@ -78,7 +91,17 @@ class Followers extends ImmutablePureComponent {
|
||||
);
|
||||
}
|
||||
|
||||
const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
|
||||
let emptyMessage;
|
||||
|
||||
if (blockedBy) {
|
||||
emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
|
||||
} else if (remote && accountIds.isEmpty()) {
|
||||
emptyMessage = <RemoteHint url={remoteUrl} />;
|
||||
} else {
|
||||
emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
|
||||
}
|
||||
|
||||
const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
|
||||
|
||||
return (
|
||||
<Column>
|
||||
@ -92,6 +115,7 @@ class Followers extends ImmutablePureComponent {
|
||||
shouldUpdateScroll={shouldUpdateScroll}
|
||||
prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
|
||||
alwaysPrepend
|
||||
append={remoteMessage}
|
||||
emptyMessage={emptyMessage}
|
||||
bindToDocument={!multiColumn}
|
||||
>
|
||||
|
@ -17,8 +17,11 @@ import HeaderContainer from '../account_timeline/containers/header_container';
|
||||
import ColumnBackButton from '../../components/column_back_button';
|
||||
import ScrollableList from '../../components/scrollable_list';
|
||||
import MissingIndicator from 'mastodon/components/missing_indicator';
|
||||
import TimelineHint from 'mastodon/components/timeline_hint';
|
||||
|
||||
const mapStateToProps = (state, props) => ({
|
||||
remote: !!(state.getIn(['accounts', props.params.accountId, 'acct']) !== state.getIn(['accounts', props.params.accountId, 'username'])),
|
||||
remoteUrl: state.getIn(['accounts', props.params.accountId, 'url']),
|
||||
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
||||
accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
|
||||
hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
|
||||
@ -26,6 +29,14 @@ const mapStateToProps = (state, props) => ({
|
||||
blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
|
||||
});
|
||||
|
||||
const RemoteHint = ({ url }) => (
|
||||
<TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.follows' defaultMessage='Follows' />} />
|
||||
);
|
||||
|
||||
RemoteHint.propTypes = {
|
||||
url: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default @connect(mapStateToProps)
|
||||
class Following extends ImmutablePureComponent {
|
||||
|
||||
@ -38,6 +49,8 @@ class Following extends ImmutablePureComponent {
|
||||
isLoading: PropTypes.bool,
|
||||
blockedBy: PropTypes.bool,
|
||||
isAccount: PropTypes.bool,
|
||||
remote: PropTypes.bool,
|
||||
remoteUrl: PropTypes.string,
|
||||
multiColumn: PropTypes.bool,
|
||||
};
|
||||
|
||||
@ -60,7 +73,7 @@ class Following extends ImmutablePureComponent {
|
||||
}, 300, { leading: true });
|
||||
|
||||
render () {
|
||||
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading } = this.props;
|
||||
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
|
||||
|
||||
if (!isAccount) {
|
||||
return (
|
||||
@ -78,7 +91,17 @@ class Following extends ImmutablePureComponent {
|
||||
);
|
||||
}
|
||||
|
||||
const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
|
||||
let emptyMessage;
|
||||
|
||||
if (blockedBy) {
|
||||
emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
|
||||
} else if (remote && accountIds.isEmpty()) {
|
||||
emptyMessage = <RemoteHint url={remoteUrl} />;
|
||||
} else {
|
||||
emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
|
||||
}
|
||||
|
||||
const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
|
||||
|
||||
return (
|
||||
<Column>
|
||||
@ -92,6 +115,7 @@ class Following extends ImmutablePureComponent {
|
||||
shouldUpdateScroll={shouldUpdateScroll}
|
||||
prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
|
||||
alwaysPrepend
|
||||
append={remoteMessage}
|
||||
emptyMessage={emptyMessage}
|
||||
bindToDocument={!multiColumn}
|
||||
>
|
||||
|
@ -4,6 +4,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
import Toggle from 'react-toggle';
|
||||
import AsyncSelect from 'react-select/async';
|
||||
import { NonceProvider } from 'react-select';
|
||||
import SettingToggle from '../../notifications/components/setting_toggle';
|
||||
|
||||
const messages = defineMessages({
|
||||
@ -58,18 +59,20 @@ class ColumnSettings extends React.PureComponent {
|
||||
{this.modeLabel(mode)}
|
||||
</span>
|
||||
|
||||
<AsyncSelect
|
||||
isMulti
|
||||
autoFocus
|
||||
value={this.tags(mode)}
|
||||
onChange={this.onSelect(mode)}
|
||||
loadOptions={this.props.onLoad}
|
||||
className='column-select__container'
|
||||
classNamePrefix='column-select'
|
||||
name='tags'
|
||||
placeholder={this.props.intl.formatMessage(messages.placeholder)}
|
||||
noOptionsMessage={this.noOptionsMessage}
|
||||
/>
|
||||
<NonceProvider nonce={document.querySelector('meta[name=style-nonce]').content}>
|
||||
<AsyncSelect
|
||||
isMulti
|
||||
autoFocus
|
||||
value={this.tags(mode)}
|
||||
onChange={this.onSelect(mode)}
|
||||
loadOptions={this.props.onLoad}
|
||||
className='column-select__container'
|
||||
classNamePrefix='column-select'
|
||||
name='tags'
|
||||
placeholder={this.props.intl.formatMessage(messages.placeholder)}
|
||||
noOptionsMessage={this.noOptionsMessage}
|
||||
/>
|
||||
</NonceProvider>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ import { connectHashtagStream } from '../../actions/streaming';
|
||||
import { isEqual } from 'lodash';
|
||||
|
||||
const mapStateToProps = (state, props) => ({
|
||||
hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0,
|
||||
hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}${props.params.local ? ':local' : ''}`, 'unread']) > 0,
|
||||
});
|
||||
|
||||
export default @connect(mapStateToProps)
|
||||
@ -76,13 +76,13 @@ class HashtagTimeline extends React.PureComponent {
|
||||
this.column.scrollTop();
|
||||
}
|
||||
|
||||
_subscribe (dispatch, id, tags = {}) {
|
||||
_subscribe (dispatch, id, tags = {}, local) {
|
||||
let any = (tags.any || []).map(tag => tag.value);
|
||||
let all = (tags.all || []).map(tag => tag.value);
|
||||
let none = (tags.none || []).map(tag => tag.value);
|
||||
|
||||
[id, ...any].map(tag => {
|
||||
this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => {
|
||||
this.disconnects.push(dispatch(connectHashtagStream(id, tag, local, status => {
|
||||
let tags = status.tags.map(tag => tag.name);
|
||||
|
||||
return all.filter(tag => tags.includes(tag)).length === all.length &&
|
||||
@ -100,7 +100,7 @@ class HashtagTimeline extends React.PureComponent {
|
||||
const { dispatch } = this.props;
|
||||
const { id, tags, local } = this.props.params;
|
||||
|
||||
this._subscribe(dispatch, id, tags);
|
||||
this._subscribe(dispatch, id, tags, local);
|
||||
dispatch(expandHashtagTimeline(id, { tags, local }));
|
||||
}
|
||||
|
||||
@ -110,8 +110,8 @@ class HashtagTimeline extends React.PureComponent {
|
||||
|
||||
if (id !== params.id || !isEqual(tags, params.tags) || !isEqual(local, params.local)) {
|
||||
this._unsubscribe();
|
||||
this._subscribe(dispatch, id, tags);
|
||||
dispatch(clearTimeline(`hashtag:${id}`));
|
||||
this._subscribe(dispatch, id, tags, local);
|
||||
dispatch(clearTimeline(`hashtag:${id}${local ? ':local' : ''}`));
|
||||
dispatch(expandHashtagTimeline(id, { tags, local }));
|
||||
}
|
||||
}
|
||||
@ -131,7 +131,7 @@ class HashtagTimeline extends React.PureComponent {
|
||||
|
||||
render () {
|
||||
const { shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props;
|
||||
const { id } = this.props.params;
|
||||
const { id, local } = this.props.params;
|
||||
const pinned = !!columnId;
|
||||
|
||||
return (
|
||||
@ -153,7 +153,7 @@ class HashtagTimeline extends React.PureComponent {
|
||||
<StatusListContainer
|
||||
trackScroll={!pinned}
|
||||
scrollKey={`hashtag_timeline-${columnId}`}
|
||||
timelineId={`hashtag:${id}`}
|
||||
timelineId={`hashtag:${id}${local ? ':local' : ''}`}
|
||||
onLoadMore={this.handleLoadMore}
|
||||
emptyMessage={<FormattedMessage id='empty_column.hashtag' defaultMessage='There is nothing in this hashtag yet.' />}
|
||||
shouldUpdateScroll={shouldUpdateScroll}
|
||||
|
@ -88,6 +88,10 @@ class KeyboardShortcuts extends ImmutablePureComponent {
|
||||
<td><kbd>alt</kbd>+<kbd>n</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.toot' defaultMessage='to start a brand new toot' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>alt</kbd>+<kbd>x</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.spoilers' defaultMessage='to show/hide CW field' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>backspace</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.back' defaultMessage='to navigate back' /></td>
|
||||
|
@ -201,10 +201,6 @@ class ActionBar extends React.PureComponent {
|
||||
if (me === status.getIn(['account', 'id'])) {
|
||||
if (publicStatus) {
|
||||
menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });
|
||||
} else {
|
||||
if (status.get('visibility') === 'private') {
|
||||
menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancel_reblog_private : messages.reblog_private), action: this.handleReblogClick });
|
||||
}
|
||||
}
|
||||
|
||||
menu.push(null);
|
||||
@ -261,14 +257,23 @@ class ActionBar extends React.PureComponent {
|
||||
replyIcon = 'reply-all';
|
||||
}
|
||||
|
||||
let reblogIcon = 'retweet';
|
||||
if (status.get('visibility') === 'direct') reblogIcon = 'envelope';
|
||||
else if (status.get('visibility') === 'private') reblogIcon = 'lock';
|
||||
const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';
|
||||
|
||||
let reblogTitle;
|
||||
if (status.get('reblogged')) {
|
||||
reblogTitle = intl.formatMessage(messages.cancel_reblog_private);
|
||||
} else if (publicStatus) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog);
|
||||
} else if (reblogPrivate) {
|
||||
reblogTitle = intl.formatMessage(messages.reblog_private);
|
||||
} else {
|
||||
reblogTitle = intl.formatMessage(messages.cannot_reblog);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='detailed-status__action-bar'>
|
||||
<div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /></div>
|
||||
<div className='detailed-status__button'><IconButton disabled={!publicStatus} active={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>
|
||||
<div className='detailed-status__button'><IconButton disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} /></div>
|
||||
<div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>
|
||||
{shareButton}
|
||||
<div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>
|
||||
|
@ -2,9 +2,13 @@ import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import Immutable from 'immutable';
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import punycode from 'punycode';
|
||||
import classnames from 'classnames';
|
||||
import Icon from 'mastodon/components/icon';
|
||||
import { useBlurhash } from 'mastodon/initial_state';
|
||||
import Blurhash from 'mastodon/components/blurhash';
|
||||
import { debounce } from 'lodash';
|
||||
|
||||
const IDNA_PREFIX = 'xn--';
|
||||
|
||||
@ -63,6 +67,7 @@ export default class Card extends React.PureComponent {
|
||||
compact: PropTypes.bool,
|
||||
defaultWidth: PropTypes.number,
|
||||
cacheWidth: PropTypes.func,
|
||||
sensitive: PropTypes.bool,
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
@ -72,15 +77,46 @@ export default class Card extends React.PureComponent {
|
||||
|
||||
state = {
|
||||
width: this.props.defaultWidth || 280,
|
||||
previewLoaded: false,
|
||||
embedded: false,
|
||||
revealed: !this.props.sensitive,
|
||||
};
|
||||
|
||||
componentWillReceiveProps (nextProps) {
|
||||
if (!Immutable.is(this.props.card, nextProps.card)) {
|
||||
this.setState({ embedded: false });
|
||||
this.setState({ embedded: false, previewLoaded: false });
|
||||
}
|
||||
if (this.props.sensitive !== nextProps.sensitive) {
|
||||
this.setState({ revealed: !nextProps.sensitive });
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount () {
|
||||
window.addEventListener('resize', this.handleResize, { passive: true });
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
window.removeEventListener('resize', this.handleResize);
|
||||
}
|
||||
|
||||
_setDimensions () {
|
||||
const width = this.node.offsetWidth;
|
||||
|
||||
if (this.props.cacheWidth) {
|
||||
this.props.cacheWidth(width);
|
||||
}
|
||||
|
||||
this.setState({ width });
|
||||
}
|
||||
|
||||
handleResize = debounce(() => {
|
||||
if (this.node) {
|
||||
this._setDimensions();
|
||||
}
|
||||
}, 250, {
|
||||
trailing: true,
|
||||
});
|
||||
|
||||
handlePhotoClick = () => {
|
||||
const { card, onOpenMedia } = this.props;
|
||||
|
||||
@ -113,12 +149,23 @@ export default class Card extends React.PureComponent {
|
||||
}
|
||||
|
||||
setRef = c => {
|
||||
if (c) {
|
||||
if (this.props.cacheWidth) this.props.cacheWidth(c.offsetWidth);
|
||||
this.setState({ width: c.offsetWidth });
|
||||
this.node = c;
|
||||
|
||||
if (this.node) {
|
||||
this._setDimensions();
|
||||
}
|
||||
}
|
||||
|
||||
handleImageLoad = () => {
|
||||
this.setState({ previewLoaded: true });
|
||||
}
|
||||
|
||||
handleReveal = e => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
this.setState({ revealed: true });
|
||||
}
|
||||
|
||||
renderVideo () {
|
||||
const { card } = this.props;
|
||||
const content = { __html: addAutoPlay(card.get('html')) };
|
||||
@ -138,7 +185,7 @@ export default class Card extends React.PureComponent {
|
||||
|
||||
render () {
|
||||
const { card, maxDescription, compact } = this.props;
|
||||
const { width, embedded } = this.state;
|
||||
const { width, embedded, revealed } = this.state;
|
||||
|
||||
if (card === null) {
|
||||
return null;
|
||||
@ -161,7 +208,26 @@ export default class Card extends React.PureComponent {
|
||||
);
|
||||
|
||||
let embed = '';
|
||||
let thumbnail = <div style={{ backgroundImage: `url(${card.get('image')})`, width: horizontal ? width : null, height: horizontal ? height : null }} className='status-card__image-image' />;
|
||||
let canvas = (
|
||||
<Blurhash
|
||||
className={classnames('status-card__image-preview', {
|
||||
'status-card__image-preview--hidden': revealed && this.state.previewLoaded,
|
||||
})}
|
||||
hash={card.get('blurhash')}
|
||||
dummy={!useBlurhash}
|
||||
/>
|
||||
);
|
||||
let thumbnail = <img src={card.get('image')} alt='' style={{ width: horizontal ? width : null, height: horizontal ? height : null, visibility: revealed ? null : 'hidden' }} onLoad={this.handleImageLoad} className='status-card__image-image' />;
|
||||
let spoilerButton = (
|
||||
<button type='button' onClick={this.handleReveal} className='spoiler-button__overlay'>
|
||||
<span className='spoiler-button__overlay__label'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span>
|
||||
</button>
|
||||
);
|
||||
spoilerButton = (
|
||||
<div className={classnames('spoiler-button', { 'spoiler-button--minified': revealed })}>
|
||||
{spoilerButton}
|
||||
</div>
|
||||
);
|
||||
|
||||
if (interactive) {
|
||||
if (embedded) {
|
||||
@ -175,20 +241,24 @@ export default class Card extends React.PureComponent {
|
||||
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
{canvas}
|
||||
{thumbnail}
|
||||
|
||||
<div className='status-card__actions'>
|
||||
<div>
|
||||
<button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
|
||||
{horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
|
||||
{revealed && (
|
||||
<div className='status-card__actions'>
|
||||
<div>
|
||||
<button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
|
||||
{horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{!revealed && spoilerButton}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={className} ref={this.setRef}>
|
||||
<div className={className} ref={this.setRef} onClick={revealed ? null : this.handleReveal} role={revealed ? 'button' : null}>
|
||||
{embed}
|
||||
{!compact && description}
|
||||
</div>
|
||||
@ -196,6 +266,7 @@ export default class Card extends React.PureComponent {
|
||||
} else if (card.get('image')) {
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
{canvas}
|
||||
{thumbnail}
|
||||
</div>
|
||||
);
|
||||
|
@ -6,7 +6,7 @@ import DisplayName from '../../../components/display_name';
|
||||
import StatusContent from '../../../components/status_content';
|
||||
import MediaGallery from '../../../components/media_gallery';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { defineMessages, injectIntl, FormattedDate } from 'react-intl';
|
||||
import { injectIntl, defineMessages, FormattedDate } from 'react-intl';
|
||||
import Card from './card';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import Video from '../../video';
|
||||
@ -17,11 +17,15 @@ import Icon from 'mastodon/components/icon';
|
||||
import AnimatedNumber from 'mastodon/components/animated_number';
|
||||
|
||||
const messages = defineMessages({
|
||||
public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
|
||||
unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },
|
||||
private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },
|
||||
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },
|
||||
local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' },
|
||||
});
|
||||
|
||||
@injectIntl
|
||||
export default class DetailedStatus extends ImmutablePureComponent {
|
||||
export default @injectIntl
|
||||
class DetailedStatus extends ImmutablePureComponent {
|
||||
|
||||
static contextTypes = {
|
||||
router: PropTypes.object,
|
||||
@ -96,9 +100,8 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||
|
||||
render () {
|
||||
const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;
|
||||
const intl = this.props.intl;
|
||||
const outerStyle = { boxSizing: 'border-box' };
|
||||
const { compact } = this.props;
|
||||
const { intl, compact } = this.props;
|
||||
|
||||
if (!status) {
|
||||
return null;
|
||||
@ -124,8 +127,11 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||
src={attachment.get('url')}
|
||||
alt={attachment.get('description')}
|
||||
duration={attachment.getIn(['meta', 'original', 'duration'], 0)}
|
||||
height={110}
|
||||
preload
|
||||
poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])}
|
||||
backgroundColor={attachment.getIn(['meta', 'colors', 'background'])}
|
||||
foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])}
|
||||
accentColor={attachment.getIn(['meta', 'colors', 'accent'])}
|
||||
height={150}
|
||||
/>
|
||||
);
|
||||
} else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
|
||||
@ -160,38 +166,48 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||
);
|
||||
}
|
||||
} else if (status.get('spoiler_text').length === 0) {
|
||||
media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;
|
||||
media = <Card sensitive={status.get('sensitive')} onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;
|
||||
}
|
||||
|
||||
if (status.get('application')) {
|
||||
applicationLink = <span> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></span>;
|
||||
applicationLink = <React.Fragment> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></React.Fragment>;
|
||||
}
|
||||
|
||||
if (status.get('visibility') === 'direct') {
|
||||
reblogIcon = 'envelope';
|
||||
} else if (status.get('visibility') === 'private') {
|
||||
reblogIcon = 'lock';
|
||||
}
|
||||
const visibilityIconInfo = {
|
||||
'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },
|
||||
'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },
|
||||
'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },
|
||||
'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) },
|
||||
};
|
||||
|
||||
const visibilityIcon = visibilityIconInfo[status.get('visibility')];
|
||||
const visibilityLink = <React.Fragment> · <Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></React.Fragment>;
|
||||
|
||||
if (['private', 'direct'].includes(status.get('visibility'))) {
|
||||
reblogLink = <Icon id={reblogIcon} />;
|
||||
reblogLink = '';
|
||||
} else if (this.context.router) {
|
||||
reblogLink = (
|
||||
<Link to={`/statuses/${status.get('id')}/reblogs`} className='detailed-status__link'>
|
||||
<Icon id={reblogIcon} />
|
||||
<span className='detailed-status__reblogs'>
|
||||
<AnimatedNumber value={status.get('reblogs_count')} />
|
||||
</span>
|
||||
</Link>
|
||||
<React.Fragment>
|
||||
<React.Fragment> · </React.Fragment>
|
||||
<Link to={`/statuses/${status.get('id')}/reblogs`} className='detailed-status__link'>
|
||||
<Icon id={reblogIcon} />
|
||||
<span className='detailed-status__reblogs'>
|
||||
<AnimatedNumber value={status.get('reblogs_count')} />
|
||||
</span>
|
||||
</Link>
|
||||
</React.Fragment>
|
||||
);
|
||||
} else {
|
||||
reblogLink = (
|
||||
<a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>
|
||||
<Icon id={reblogIcon} />
|
||||
<span className='detailed-status__reblogs'>
|
||||
<AnimatedNumber value={status.get('reblogs_count')} />
|
||||
</span>
|
||||
</a>
|
||||
<React.Fragment>
|
||||
<React.Fragment> · </React.Fragment>
|
||||
<a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>
|
||||
<Icon id={reblogIcon} />
|
||||
<span className='detailed-status__reblogs'>
|
||||
<AnimatedNumber value={status.get('reblogs_count')} />
|
||||
</span>
|
||||
</a>
|
||||
</React.Fragment>
|
||||
);
|
||||
}
|
||||
|
||||
@ -221,7 +237,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||
|
||||
return (
|
||||
<div style={outerStyle}>
|
||||
<div ref={this.setRef} className={classNames('detailed-status', { compact })}>
|
||||
<div ref={this.setRef} className={classNames('detailed-status', `detailed-status-${status.get('visibility')}`, { compact })}>
|
||||
<a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='detailed-status__display-name'>
|
||||
<div className='detailed-status__display-avatar'><Avatar account={status.get('account')} size={48} /></div>
|
||||
<DisplayName account={status.get('account')} localDomain={this.props.domain} />
|
||||
@ -234,7 +250,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||
<div className='detailed-status__meta'>
|
||||
<a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener noreferrer'>
|
||||
<FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />
|
||||
</a>{applicationLink} · {reblogLink} · {favouriteLink}{localOnly}
|
||||
</a>{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink}{localOnly}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,25 +1,24 @@
|
||||
import { render, fireEvent, screen } from '@testing-library/react';
|
||||
import React from 'react';
|
||||
import { mount } from 'enzyme';
|
||||
import Column from '../column';
|
||||
import ColumnHeader from '../column_header';
|
||||
|
||||
describe('<Column />', () => {
|
||||
describe('<ColumnHeader /> click handler', () => {
|
||||
it('runs the scroll animation if the column contains scrollable content', () => {
|
||||
const wrapper = mount(
|
||||
const scrollToMock = jest.fn();
|
||||
const { container } = render(
|
||||
<Column heading='notifications'>
|
||||
<div className='scrollable' />
|
||||
</Column>,
|
||||
);
|
||||
const scrollToMock = jest.fn();
|
||||
wrapper.find(Column).find('.scrollable').getDOMNode().scrollTo = scrollToMock;
|
||||
wrapper.find(ColumnHeader).find('button').simulate('click');
|
||||
container.querySelector('.scrollable').scrollTo = scrollToMock;
|
||||
fireEvent.click(screen.getByText('notifications'));
|
||||
expect(scrollToMock).toHaveBeenCalledWith({ behavior: 'smooth', top: 0 });
|
||||
});
|
||||
|
||||
it('does not try to scroll if there is no scrollable content', () => {
|
||||
const wrapper = mount(<Column heading='notifications' />);
|
||||
wrapper.find(ColumnHeader).find('button').simulate('click');
|
||||
render(<Column heading='notifications' />);
|
||||
fireEvent.click(screen.getByText('notifications'));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -2,17 +2,27 @@ import React from 'react';
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import PropTypes from 'prop-types';
|
||||
import Audio from 'mastodon/features/audio';
|
||||
import { connect } from 'react-redux';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import { previewState } from './video_modal';
|
||||
import classNames from 'classnames';
|
||||
import Icon from 'mastodon/components/icon';
|
||||
|
||||
export default class AudioModal extends ImmutablePureComponent {
|
||||
const mapStateToProps = (state, { status }) => ({
|
||||
account: state.getIn(['accounts', status.get('account')]),
|
||||
});
|
||||
|
||||
export default @connect(mapStateToProps)
|
||||
class AudioModal extends ImmutablePureComponent {
|
||||
|
||||
static propTypes = {
|
||||
media: ImmutablePropTypes.map.isRequired,
|
||||
status: ImmutablePropTypes.map,
|
||||
options: PropTypes.shape({
|
||||
autoPlay: PropTypes.bool,
|
||||
}),
|
||||
account: ImmutablePropTypes.map,
|
||||
onClose: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
@ -50,7 +60,8 @@ export default class AudioModal extends ImmutablePureComponent {
|
||||
}
|
||||
|
||||
render () {
|
||||
const { media, status } = this.props;
|
||||
const { media, status, account } = this.props;
|
||||
const options = this.props.options || {};
|
||||
|
||||
return (
|
||||
<div className='modal-root__modal audio-modal'>
|
||||
@ -59,8 +70,12 @@ export default class AudioModal extends ImmutablePureComponent {
|
||||
src={media.get('url')}
|
||||
alt={media.get('description')}
|
||||
duration={media.getIn(['meta', 'original', 'duration'], 0)}
|
||||
height={135}
|
||||
preload
|
||||
height={150}
|
||||
poster={media.get('preview_url') || account.get('avatar_static')}
|
||||
backgroundColor={media.getIn(['meta', 'colors', 'background'])}
|
||||
foregroundColor={media.getIn(['meta', 'colors', 'foreground'])}
|
||||
accentColor={media.getIn(['meta', 'colors', 'accent'])}
|
||||
autoPlay={options.autoPlay}
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
@ -10,10 +10,15 @@ import DisplayName from '../../../components/display_name';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import Icon from 'mastodon/components/icon';
|
||||
import AttachmentList from 'mastodon/components/attachment_list';
|
||||
import classNames from 'classnames';
|
||||
|
||||
const messages = defineMessages({
|
||||
cancel_reblog: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
|
||||
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
||||
public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
|
||||
unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },
|
||||
private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },
|
||||
direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },
|
||||
});
|
||||
|
||||
export default @injectIntl
|
||||
@ -55,14 +60,24 @@ class BoostModal extends ImmutablePureComponent {
|
||||
const { status, intl } = this.props;
|
||||
const buttonText = status.get('reblogged') ? messages.cancel_reblog : messages.reblog;
|
||||
|
||||
const visibilityIconInfo = {
|
||||
'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },
|
||||
'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },
|
||||
'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },
|
||||
'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) },
|
||||
};
|
||||
|
||||
const visibilityIcon = visibilityIconInfo[status.get('visibility')];
|
||||
|
||||
return (
|
||||
<div className='modal-root__modal boost-modal'>
|
||||
<div className='boost-modal__container'>
|
||||
<div className='status light'>
|
||||
<div className={classNames('status', `status-${status.get('visibility')}`, 'light')}>
|
||||
<div className='boost-modal__status-header'>
|
||||
<div className='boost-modal__status-time'>
|
||||
<a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
|
||||
</div>
|
||||
<span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
|
||||
|
||||
<a onClick={this.handleAccountClick} href={status.getIn(['account', 'url'])} className='status__display-name'>
|
||||
<div className='status__avatar'>
|
||||
|
@ -1,16 +1,36 @@
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import PropTypes from 'prop-types';
|
||||
import SearchContainer from 'mastodon/features/compose/containers/search_container';
|
||||
import ComposeFormContainer from 'mastodon/features/compose/containers/compose_form_container';
|
||||
import NavigationContainer from 'mastodon/features/compose/containers/navigation_container';
|
||||
import LinkFooter from './link_footer';
|
||||
import { changeComposing } from 'mastodon/actions/compose';
|
||||
|
||||
const ComposePanel = () => (
|
||||
<div className='compose-panel'>
|
||||
<SearchContainer openInRoute />
|
||||
<NavigationContainer />
|
||||
<ComposeFormContainer singleColumn />
|
||||
<LinkFooter withHotkeys />
|
||||
</div>
|
||||
);
|
||||
export default @connect()
|
||||
class ComposePanel extends React.PureComponent {
|
||||
|
||||
export default ComposePanel;
|
||||
static propTypes = {
|
||||
dispatch: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
onFocus = () => {
|
||||
this.props.dispatch(changeComposing(true));
|
||||
}
|
||||
|
||||
onBlur = () => {
|
||||
this.props.dispatch(changeComposing(false));
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div className='compose-panel' onFocus={this.onFocus}>
|
||||
<SearchContainer openInRoute />
|
||||
<NavigationContainer onClose={this.onBlur} />
|
||||
<ComposeFormContainer singleColumn />
|
||||
<LinkFooter withHotkeys />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import { connect } from 'react-redux';
|
||||
import classNames from 'classnames';
|
||||
import { changeUploadCompose } from '../../../actions/compose';
|
||||
import { changeUploadCompose, uploadThumbnail } from '../../../actions/compose';
|
||||
import { getPointerPosition } from '../../video';
|
||||
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
|
||||
import IconButton from 'mastodon/components/icon_button';
|
||||
@ -17,15 +17,19 @@ import CharacterCounter from 'mastodon/features/compose/components/character_cou
|
||||
import { length } from 'stringz';
|
||||
import { Tesseract as fetchTesseract } from 'mastodon/features/ui/util/async-components';
|
||||
import GIFV from 'mastodon/components/gifv';
|
||||
import { me } from 'mastodon/initial_state';
|
||||
|
||||
const messages = defineMessages({
|
||||
close: { id: 'lightbox.close', defaultMessage: 'Close' },
|
||||
apply: { id: 'upload_modal.apply', defaultMessage: 'Apply' },
|
||||
placeholder: { id: 'upload_modal.description_placeholder', defaultMessage: 'A quick brown fox jumps over the lazy dog' },
|
||||
chooseImage: { id: 'upload_modal.choose_image', defaultMessage: 'Choose image' },
|
||||
});
|
||||
|
||||
const mapStateToProps = (state, { id }) => ({
|
||||
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
|
||||
account: state.getIn(['accounts', me]),
|
||||
isUploadingThumbnail: state.getIn(['compose', 'isUploadingThumbnail']),
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch, { id }) => ({
|
||||
@ -34,6 +38,10 @@ const mapDispatchToProps = (dispatch, { id }) => ({
|
||||
dispatch(changeUploadCompose(id, { description, focus: `${x.toFixed(2)},${y.toFixed(2)}` }));
|
||||
},
|
||||
|
||||
onSelectThumbnail: files => {
|
||||
dispatch(uploadThumbnail(id, files[0]));
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
const removeExtraLineBreaks = str => str.replace(/\n\n/g, '******')
|
||||
@ -78,6 +86,10 @@ class FocalPointModal extends ImmutablePureComponent {
|
||||
|
||||
static propTypes = {
|
||||
media: ImmutablePropTypes.map.isRequired,
|
||||
account: ImmutablePropTypes.map.isRequired,
|
||||
isUploadingThumbnail: PropTypes.bool,
|
||||
onSave: PropTypes.func.isRequired,
|
||||
onSelectThumbnail: PropTypes.func.isRequired,
|
||||
onClose: PropTypes.func.isRequired,
|
||||
intl: PropTypes.object.isRequired,
|
||||
};
|
||||
@ -232,13 +244,29 @@ class FocalPointModal extends ImmutablePureComponent {
|
||||
}).catch(() => this.setState({ detecting: false }));
|
||||
}
|
||||
|
||||
handleThumbnailChange = e => {
|
||||
if (e.target.files.length > 0) {
|
||||
this.setState({ dirty: true });
|
||||
this.props.onSelectThumbnail(e.target.files);
|
||||
}
|
||||
}
|
||||
|
||||
setFileInputRef = c => {
|
||||
this.fileInput = c;
|
||||
}
|
||||
|
||||
handleFileInputClick = () => {
|
||||
this.fileInput.click();
|
||||
}
|
||||
|
||||
render () {
|
||||
const { media, intl, onClose } = this.props;
|
||||
const { media, intl, account, onClose, isUploadingThumbnail } = this.props;
|
||||
const { x, y, dragging, description, dirty, detecting, progress } = this.state;
|
||||
|
||||
const width = media.getIn(['meta', 'original', 'width']) || null;
|
||||
const height = media.getIn(['meta', 'original', 'height']) || null;
|
||||
const focals = ['image', 'gifv'].includes(media.get('type'));
|
||||
const thumbnailable = ['audio', 'video'].includes(media.get('type'));
|
||||
|
||||
const previewRatio = 16/9;
|
||||
const previewWidth = 200;
|
||||
@ -265,6 +293,30 @@ class FocalPointModal extends ImmutablePureComponent {
|
||||
<div className='report-modal__comment'>
|
||||
{focals && <p><FormattedMessage id='upload_modal.hint' defaultMessage='Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.' /></p>}
|
||||
|
||||
{thumbnailable && (
|
||||
<React.Fragment>
|
||||
<label className='setting-text-label' htmlFor='upload-modal__thumbnail'><FormattedMessage id='upload_form.thumbnail' defaultMessage='Change thumbnail' /></label>
|
||||
|
||||
<Button disabled={isUploadingThumbnail} text={intl.formatMessage(messages.chooseImage)} onClick={this.handleFileInputClick} />
|
||||
|
||||
<label>
|
||||
<span style={{ display: 'none' }}>{intl.formatMessage(messages.chooseImage)}</span>
|
||||
|
||||
<input
|
||||
id='upload-modal__thumbnail'
|
||||
ref={this.setFileInputRef}
|
||||
type='file'
|
||||
accept='image/png,image/jpeg'
|
||||
onChange={this.handleThumbnailChange}
|
||||
style={{ display: 'none' }}
|
||||
disabled={isUploadingThumbnail}
|
||||
/>
|
||||
</label>
|
||||
|
||||
<hr className='setting-divider' />
|
||||
</React.Fragment>
|
||||
)}
|
||||
|
||||
<label className='setting-text-label' htmlFor='upload-modal__description'>
|
||||
{descriptionLabel}
|
||||
</label>
|
||||
@ -290,7 +342,7 @@ class FocalPointModal extends ImmutablePureComponent {
|
||||
<CharacterCounter max={1500} text={detecting ? '' : description} />
|
||||
</div>
|
||||
|
||||
<Button disabled={!dirty || detecting || length(description) > 1500} text={intl.formatMessage(messages.apply)} onClick={this.handleSubmit} />
|
||||
<Button disabled={!dirty || detecting || isUploadingThumbnail || length(description) > 1500} text={intl.formatMessage(messages.apply)} onClick={this.handleSubmit} />
|
||||
</div>
|
||||
|
||||
<div className='focal-point-modal__content'>
|
||||
@ -325,7 +377,10 @@ class FocalPointModal extends ImmutablePureComponent {
|
||||
src={media.get('url')}
|
||||
duration={media.getIn(['meta', 'original', 'duration'], 0)}
|
||||
height={150}
|
||||
preload
|
||||
poster={media.get('preview_url') || account.get('avatar_static')}
|
||||
backgroundColor={media.getIn(['meta', 'colors', 'background'])}
|
||||
foregroundColor={media.getIn(['meta', 'colors', 'foreground'])}
|
||||
accentColor={media.getIn(['meta', 'colors', 'accent'])}
|
||||
editable
|
||||
/>
|
||||
)}
|
||||
|
@ -17,6 +17,8 @@ const makeGetStatusIds = (pending = false) => createSelector([
|
||||
const statusForId = statuses.get(id);
|
||||
let showStatus = true;
|
||||
|
||||
if (statusForId.get('account') === me) return true;
|
||||
|
||||
if (columnSettings.getIn(['shows', 'reblog']) === false) {
|
||||
showStatus = showStatus && statusForId.get('reblog') === null;
|
||||
}
|
||||
|
@ -10,13 +10,13 @@ import LoadingBarContainer from './containers/loading_bar_container';
|
||||
import ModalContainer from './containers/modal_container';
|
||||
import { isMobile } from '../../is_mobile';
|
||||
import { debounce } from 'lodash';
|
||||
import { uploadCompose, resetCompose } from '../../actions/compose';
|
||||
import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../actions/compose';
|
||||
import { expandHomeTimeline } from '../../actions/timelines';
|
||||
import { expandNotifications } from '../../actions/notifications';
|
||||
import { fetchFilters } from '../../actions/filters';
|
||||
import { clearHeight } from '../../actions/height_cache';
|
||||
import { focusApp, unfocusApp } from 'mastodon/actions/app';
|
||||
import { submitMarkers } from 'mastodon/actions/markers';
|
||||
import { synchronouslySubmitMarkers } from 'mastodon/actions/markers';
|
||||
import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';
|
||||
import UploadArea from './components/upload_area';
|
||||
import ColumnsAreaContainer from './containers/columns_area_container';
|
||||
@ -76,6 +76,7 @@ const keyMap = {
|
||||
new: 'n',
|
||||
search: 's',
|
||||
forceNew: 'option+n',
|
||||
toggleComposeSpoilers: 'option+x',
|
||||
focusColumn: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
|
||||
reply: 'r',
|
||||
favourite: 'f',
|
||||
@ -251,9 +252,10 @@ class UI extends React.PureComponent {
|
||||
handleBeforeUnload = e => {
|
||||
const { intl, dispatch, isComposing, hasComposingText, hasMediaAttachments } = this.props;
|
||||
|
||||
dispatch(submitMarkers());
|
||||
dispatch(synchronouslySubmitMarkers());
|
||||
|
||||
if (isComposing && (hasComposingText || hasMediaAttachments)) {
|
||||
e.preventDefault();
|
||||
// Setting returnValue to any string causes confirmation dialog.
|
||||
// Many browsers no longer display this text to users,
|
||||
// but we set user-friendly message for other browsers, e.g. Edge.
|
||||
@ -374,7 +376,7 @@ class UI extends React.PureComponent {
|
||||
|
||||
componentDidMount () {
|
||||
this.hotkeys.__mousetrap__.stopCallback = (e, element) => {
|
||||
return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName);
|
||||
return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName) && !e.altKey;
|
||||
};
|
||||
}
|
||||
|
||||
@ -419,6 +421,11 @@ class UI extends React.PureComponent {
|
||||
this.props.dispatch(resetCompose());
|
||||
}
|
||||
|
||||
handleHotkeyToggleComposeSpoilers = e => {
|
||||
e.preventDefault();
|
||||
this.props.dispatch(changeComposeSpoilerness());
|
||||
}
|
||||
|
||||
handleHotkeyFocusColumn = e => {
|
||||
const index = (e.key * 1) + 1; // First child is drawer, skip that
|
||||
const column = this.node.querySelector(`.column:nth-child(${index})`);
|
||||
@ -514,6 +521,7 @@ class UI extends React.PureComponent {
|
||||
new: this.handleHotkeyNew,
|
||||
search: this.handleHotkeySearch,
|
||||
forceNew: this.handleHotkeyForceNew,
|
||||
toggleComposeSpoilers: this.handleHotkeyToggleComposeSpoilers,
|
||||
focusColumn: this.handleHotkeyFocusColumn,
|
||||
back: this.handleHotkeyBack,
|
||||
goToHome: this.handleHotkeyGoToHome,
|
||||
|
@ -2,12 +2,12 @@ import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
import { fromJS, is } from 'immutable';
|
||||
import { throttle } from 'lodash';
|
||||
import { throttle, debounce } from 'lodash';
|
||||
import classNames from 'classnames';
|
||||
import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen';
|
||||
import { displayMedia, useBlurhash } from '../../initial_state';
|
||||
import Icon from 'mastodon/components/icon';
|
||||
import { decode } from 'blurhash';
|
||||
import Blurhash from 'mastodon/components/blurhash';
|
||||
|
||||
const messages = defineMessages({
|
||||
play: { id: 'video.play', defaultMessage: 'Play' },
|
||||
@ -19,7 +19,6 @@ const messages = defineMessages({
|
||||
close: { id: 'video.close', defaultMessage: 'Close video' },
|
||||
fullscreen: { id: 'video.fullscreen', defaultMessage: 'Full screen' },
|
||||
exit_fullscreen: { id: 'video.exit_fullscreen', defaultMessage: 'Exit full screen' },
|
||||
download: { id: 'video.download', defaultMessage: 'Download file' },
|
||||
});
|
||||
|
||||
export const formatTime = secondsNum => {
|
||||
@ -87,6 +86,14 @@ export const getPointerPosition = (el, event) => {
|
||||
return position;
|
||||
};
|
||||
|
||||
export const fileNameFromURL = str => {
|
||||
const url = new URL(str);
|
||||
const pathname = url.pathname;
|
||||
const index = pathname.lastIndexOf('/');
|
||||
|
||||
return pathname.substring(index + 1);
|
||||
};
|
||||
|
||||
export default @injectIntl
|
||||
class Video extends React.PureComponent {
|
||||
|
||||
@ -126,29 +133,26 @@ class Video extends React.PureComponent {
|
||||
revealed: this.props.visible !== undefined ? this.props.visible : (displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all'),
|
||||
};
|
||||
|
||||
// Hard-coded in components.scss
|
||||
// Any way to get ::before values programatically?
|
||||
volWidth = 50;
|
||||
volOffset = 70;
|
||||
|
||||
volHandleOffset = v => {
|
||||
const offset = v * this.volWidth + this.volOffset;
|
||||
|
||||
return (offset > 110) ? 110 : offset;
|
||||
}
|
||||
|
||||
setPlayerRef = c => {
|
||||
this.player = c;
|
||||
|
||||
if (c) {
|
||||
if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth);
|
||||
|
||||
this.setState({
|
||||
containerWidth: c.offsetWidth,
|
||||
});
|
||||
if (this.player) {
|
||||
this._setDimensions();
|
||||
}
|
||||
}
|
||||
|
||||
_setDimensions () {
|
||||
const width = this.player.offsetWidth;
|
||||
|
||||
if (this.props.cacheWidth) {
|
||||
this.props.cacheWidth(width);
|
||||
}
|
||||
|
||||
this.setState({
|
||||
containerWidth: width,
|
||||
});
|
||||
}
|
||||
|
||||
setVideoRef = c => {
|
||||
this.video = c;
|
||||
|
||||
@ -165,23 +169,32 @@ class Video extends React.PureComponent {
|
||||
this.volume = c;
|
||||
}
|
||||
|
||||
setCanvasRef = c => {
|
||||
this.canvas = c;
|
||||
}
|
||||
|
||||
handleClickRoot = e => e.stopPropagation();
|
||||
|
||||
handlePlay = () => {
|
||||
this.setState({ paused: false });
|
||||
this._updateTime();
|
||||
}
|
||||
|
||||
handlePause = () => {
|
||||
this.setState({ paused: true });
|
||||
}
|
||||
|
||||
_updateTime () {
|
||||
requestAnimationFrame(() => {
|
||||
if (!this.video) return;
|
||||
|
||||
this.handleTimeUpdate();
|
||||
|
||||
if (!this.state.paused) {
|
||||
this._updateTime();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
handleTimeUpdate = () => {
|
||||
this.setState({
|
||||
currentTime: Math.floor(this.video.currentTime),
|
||||
currentTime: this.video.currentTime,
|
||||
duration: Math.floor(this.video.duration),
|
||||
});
|
||||
}
|
||||
@ -206,22 +219,14 @@ class Video extends React.PureComponent {
|
||||
}
|
||||
|
||||
handleMouseVolSlide = throttle(e => {
|
||||
const rect = this.volume.getBoundingClientRect();
|
||||
const x = (e.clientX - rect.left) / this.volWidth; //x position within the element.
|
||||
const { x } = getPointerPosition(this.volume, e);
|
||||
|
||||
if(!isNaN(x)) {
|
||||
let slideamt = x;
|
||||
|
||||
if(x > 1) {
|
||||
slideamt = 1;
|
||||
} else if(x < 0) {
|
||||
slideamt = 0;
|
||||
}
|
||||
|
||||
this.video.volume = slideamt;
|
||||
this.setState({ volume: slideamt });
|
||||
this.setState({ volume: x }, () => {
|
||||
this.video.volume = x;
|
||||
});
|
||||
}
|
||||
}, 60);
|
||||
}, 15);
|
||||
|
||||
handleMouseDown = e => {
|
||||
document.addEventListener('mousemove', this.handleMouseMove, true);
|
||||
@ -249,13 +254,14 @@ class Video extends React.PureComponent {
|
||||
|
||||
handleMouseMove = throttle(e => {
|
||||
const { x } = getPointerPosition(this.seek, e);
|
||||
const currentTime = Math.floor(this.video.duration * x);
|
||||
const currentTime = this.video.duration * x;
|
||||
|
||||
if (!isNaN(currentTime)) {
|
||||
this.video.currentTime = currentTime;
|
||||
this.setState({ currentTime });
|
||||
this.setState({ currentTime }, () => {
|
||||
this.video.currentTime = currentTime;
|
||||
});
|
||||
}
|
||||
}, 60);
|
||||
}, 15);
|
||||
|
||||
togglePlay = () => {
|
||||
if (this.state.paused) {
|
||||
@ -280,14 +286,12 @@ class Video extends React.PureComponent {
|
||||
document.addEventListener('MSFullscreenChange', this.handleFullscreenChange, true);
|
||||
|
||||
window.addEventListener('scroll', this.handleScroll);
|
||||
|
||||
if (this.props.blurhash) {
|
||||
this._decode();
|
||||
}
|
||||
window.addEventListener('resize', this.handleResize, { passive: true });
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
window.removeEventListener('scroll', this.handleScroll);
|
||||
window.removeEventListener('resize', this.handleResize);
|
||||
|
||||
document.removeEventListener('fullscreenchange', this.handleFullscreenChange, true);
|
||||
document.removeEventListener('webkitfullscreenchange', this.handleFullscreenChange, true);
|
||||
@ -305,25 +309,15 @@ class Video extends React.PureComponent {
|
||||
if (prevState.revealed && !this.state.revealed && this.video) {
|
||||
this.video.pause();
|
||||
}
|
||||
|
||||
if (prevProps.blurhash !== this.props.blurhash && this.props.blurhash) {
|
||||
this._decode();
|
||||
}
|
||||
}
|
||||
|
||||
_decode () {
|
||||
if (!useBlurhash) return;
|
||||
|
||||
const hash = this.props.blurhash;
|
||||
const pixels = decode(hash, 32, 32);
|
||||
|
||||
if (pixels) {
|
||||
const ctx = this.canvas.getContext('2d');
|
||||
const imageData = new ImageData(pixels, 32, 32);
|
||||
|
||||
ctx.putImageData(imageData, 0, 0);
|
||||
handleResize = debounce(() => {
|
||||
if (this.player) {
|
||||
this._setDimensions();
|
||||
}
|
||||
}
|
||||
}, 250, {
|
||||
trailing: true,
|
||||
});
|
||||
|
||||
handleScroll = throttle(() => {
|
||||
if (!this.video) {
|
||||
@ -381,8 +375,10 @@ class Video extends React.PureComponent {
|
||||
}
|
||||
|
||||
handleProgress = () => {
|
||||
if (this.video.buffered.length > 0) {
|
||||
this.setState({ buffer: this.video.buffered.end(0) / this.video.duration * 100 });
|
||||
const lastTimeRange = this.video.buffered.length - 1;
|
||||
|
||||
if (lastTimeRange > -1) {
|
||||
this.setState({ buffer: Math.ceil(this.video.buffered.end(lastTimeRange) / this.video.duration * 100) });
|
||||
}
|
||||
}
|
||||
|
||||
@ -418,12 +414,9 @@ class Video extends React.PureComponent {
|
||||
}
|
||||
|
||||
render () {
|
||||
const { preview, src, inline, startTime, onOpenVideo, onCloseVideo, intl, alt, detailed, sensitive, link, editable } = this.props;
|
||||
const { preview, src, inline, startTime, onOpenVideo, onCloseVideo, intl, alt, detailed, sensitive, link, editable, blurhash } = this.props;
|
||||
const { containerWidth, currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state;
|
||||
const progress = (currentTime / duration) * 100;
|
||||
|
||||
const volumeWidth = (muted) ? 0 : volume * this.volWidth;
|
||||
const volumeHandleLoc = (muted) ? this.volHandleOffset(0) : this.volHandleOffset(volume);
|
||||
const playerStyle = {};
|
||||
|
||||
let { width, height } = this.props;
|
||||
@ -464,7 +457,13 @@ class Video extends React.PureComponent {
|
||||
onClick={this.handleClickRoot}
|
||||
tabIndex={0}
|
||||
>
|
||||
<canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': revealed })} />
|
||||
<Blurhash
|
||||
hash={blurhash}
|
||||
className={classNames('media-gallery__preview', {
|
||||
'media-gallery__preview--hidden': revealed,
|
||||
})}
|
||||
dummy={!useBlurhash}
|
||||
/>
|
||||
|
||||
{(revealed || editable) && <video
|
||||
ref={this.setVideoRef}
|
||||
@ -481,7 +480,6 @@ class Video extends React.PureComponent {
|
||||
onClick={this.togglePlay}
|
||||
onPlay={this.handlePlay}
|
||||
onPause={this.handlePause}
|
||||
onTimeUpdate={this.handleTimeUpdate}
|
||||
onLoadedData={this.handleLoadedData}
|
||||
onProgress={this.handleProgress}
|
||||
onVolumeChange={this.handleVolumeChange}
|
||||
@ -510,19 +508,19 @@ class Video extends React.PureComponent {
|
||||
<button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} onClick={this.togglePlay} autoFocus={detailed}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
|
||||
<button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
|
||||
|
||||
<div className='video-player__volume' onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
|
||||
|
||||
<div className='video-player__volume__current' style={{ width: `${volumeWidth}px` }} />
|
||||
<div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
|
||||
<div className='video-player__volume__current' style={{ width: `${volume * 100}%` }} />
|
||||
|
||||
<span
|
||||
className={classNames('video-player__volume__handle')}
|
||||
tabIndex='0'
|
||||
style={{ left: `${volumeHandleLoc}px` }}
|
||||
style={{ left: `${volume * 100}%` }}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{(detailed || fullscreen) && (
|
||||
<span>
|
||||
<span className='video-player__time-current'>{formatTime(currentTime)}</span>
|
||||
<span className='video-player__time'>
|
||||
<span className='video-player__time-current'>{formatTime(Math.floor(currentTime))}</span>
|
||||
<span className='video-player__time-sep'>/</span>
|
||||
<span className='video-player__time-total'>{formatTime(duration)}</span>
|
||||
</span>
|
||||
@ -535,7 +533,6 @@ class Video extends React.PureComponent {
|
||||
{(!onCloseVideo && !editable && !fullscreen) && <button type='button' title={intl.formatMessage(messages.hide)} aria-label={intl.formatMessage(messages.hide)} onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>}
|
||||
{(!fullscreen && onOpenVideo) && <button type='button' title={intl.formatMessage(messages.expand)} aria-label={intl.formatMessage(messages.expand)} onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>}
|
||||
{onCloseVideo && <button type='button' title={intl.formatMessage(messages.close)} aria-label={intl.formatMessage(messages.close)} onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>}
|
||||
<button type='button' title={intl.formatMessage(messages.download)} aria-label={intl.formatMessage(messages.download)}><a className='video-player__download__icon' href={this.props.src} download><Icon id={'download'} fixedWidth /></a></button>
|
||||
<button type='button' title={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "ملاحظة",
|
||||
"account.add_or_remove_from_list": "أضفه أو أزله من القائمة",
|
||||
"account.badges.bot": "روبوت",
|
||||
"account.badges.group": "فريق",
|
||||
"account.block": "حظر @{name}",
|
||||
"account.block_domain": "إخفاء كل شيء قادم من اسم النطاق {domain}",
|
||||
"account.blocked": "محظور",
|
||||
"account.browse_more_on_origin_server": "تصفح المزيد على الملف التعريفي الأصلي",
|
||||
"account.cancel_follow_request": "إلغاء طلب المتابَعة",
|
||||
"account.direct": "رسالة خاصة إلى @{name}",
|
||||
"account.domain_blocked": "النطاق مخفي",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "تابِع",
|
||||
"account.followers": "مُتابِعون",
|
||||
"account.followers.empty": "لا أحد يتبع هذا الحساب بعد.",
|
||||
"account.follows": "يتابع",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "هذا الحساب لا يتبع أحدًا بعد.",
|
||||
"account.follows_you": "يتابعك",
|
||||
"account.hide_reblogs": "إخفاء ترقيات @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "في انتظار الموافقة. اضْغَطْ/ي لإلغاء طلب المتابعة",
|
||||
"account.share": "شارك ملف تعريف @{name}",
|
||||
"account.show_reblogs": "اعرض ترقيات @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "إلغاء الحظر عن @{name}",
|
||||
"account.unblock_domain": "فك الخْفى عن {domain}",
|
||||
"account.unendorse": "أزل ترويجه مِن الملف التعريفي",
|
||||
"account.unfollow": "إلغاء المتابعة",
|
||||
"account.unmute": "إلغاء الكتم عن @{name}",
|
||||
"account.unmute_notifications": "إلغاء كتم إخطارات @{name}",
|
||||
"account_note.placeholder": "انقر لإضافة ملاحظة",
|
||||
"alert.rate_limited.message": "يرجى إعادة المحاولة بعد {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "المعدل محدود",
|
||||
"alert.unexpected.message": "لقد طرأ هناك خطأ غير متوقّع.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "عرض الإعدادات",
|
||||
"column_header.unpin": "فك التدبيس",
|
||||
"column_subheading.settings": "الإعدادات",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "المحلي فقط",
|
||||
"community.column_settings.media_only": "الوسائط فقط",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "عن بُعد فقط",
|
||||
"compose_form.direct_message_warning": "لن يَظهر هذا التبويق إلا للمستخدمين المذكورين.",
|
||||
"compose_form.direct_message_warning_learn_more": "اقرأ المزيد",
|
||||
"compose_form.hashtag_warning": "هذا التبويق لن يُدرَج تحت أي وسم كان بما أنه غير مُدرَج. لا يُسمح بالبحث إلّا عن التبويقات العمومية عن طريق الوسوم.",
|
||||
@ -110,7 +115,7 @@
|
||||
"confirmations.logout.confirm": "خروج",
|
||||
"confirmations.logout.message": "متأكد من أنك تريد الخروج؟",
|
||||
"confirmations.mute.confirm": "أكتم",
|
||||
"confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
|
||||
"confirmations.mute.explanation": "هذا سيخفي المنشورات عنهم وتلك المشار فيها إليهم، لكنه سيسمح لهم برؤية منشوراتك ومتابعتك.",
|
||||
"confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟",
|
||||
"confirmations.redraft.confirm": "إزالة و إعادة الصياغة",
|
||||
"confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.",
|
||||
@ -160,7 +165,7 @@
|
||||
"empty_column.mutes": "لم تقم بكتم أي مستخدم بعد.",
|
||||
"empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.",
|
||||
"empty_column.public": "لا يوجد أي شيء هنا! قم بنشر شيء ما للعامة، أو اتبع المستخدمين الآخرين المتواجدين على الخوادم الأخرى لملء خيط المحادثات",
|
||||
"error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
|
||||
"error.unexpected_crash.explanation": "نظرا لوجود خطأ في التعليمات البرمجية أو مشكلة توافق مع المتصفّح، تعذر عرض هذه الصفحة بشكل صحيح.",
|
||||
"error.unexpected_crash.next_steps": "حاول إعادة إنعاش الصفحة. إن لم تُحلّ المشكلة ، يمكنك دائمًا استخدام ماستدون عبر متصفّح آخر أو تطبيق أصلي.",
|
||||
"errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة",
|
||||
"errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "ترخيص",
|
||||
"follow_request.reject": "رفض",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "تم الحفظ",
|
||||
"getting_started.developers": "المُطوِّرون",
|
||||
"getting_started.directory": "دليل الصفحات التعريفية",
|
||||
"getting_started.documentation": "الدليل",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "للردّ",
|
||||
"keyboard_shortcuts.requests": "لفتح قائمة طلبات المتابعة",
|
||||
"keyboard_shortcuts.search": "للتركيز على البحث",
|
||||
"keyboard_shortcuts.spoilers": "لإظهار/إخفاء حقلCW",
|
||||
"keyboard_shortcuts.start": "لفتح عمود \"هيا نبدأ\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "لعرض أو إخفاء النص مِن وراء التحذير",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "لعرض/إخفاء الوسائط",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# دقيقة} other {# دقائق}} متبقية",
|
||||
"time_remaining.moments": "لحظات متبقية",
|
||||
"time_remaining.seconds": "{number, plural, one {# ثانية} other {# ثوانٍ}} متبقية",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, zero {} one {شخص واحد} two {شخصين} few {أشخاص} many {أشخاص} other {أشخاص}} تتحدّث",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} من الخوادم الأخرى لا يتم عرضها.",
|
||||
"timeline_hint.resources.followers": "المتابِعون",
|
||||
"timeline_hint.resources.follows": "المتابَعون",
|
||||
"timeline_hint.resources.statuses": "التبويقات القديمة",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "المتداولة الآن",
|
||||
"ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.",
|
||||
"units.short.billion": "{count} مليار",
|
||||
"units.short.million": "{count} مليون",
|
||||
"units.short.thousand": "{count} ألف",
|
||||
"upload_area.title": "اسحب ثم أفلت للرفع",
|
||||
"upload_button.label": "إضافة وسائط ({formats})",
|
||||
"upload_error.limit": "لقد تم بلوغ الحد الأقصى المسموح به لإرسال الملفات.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "وصف للأشخاص ذي قِصر السمع",
|
||||
"upload_form.description": "وصف للمعاقين بصريا",
|
||||
"upload_form.edit": "تعديل",
|
||||
"upload_form.thumbnail": "غيّر الصورة المصغرة",
|
||||
"upload_form.undo": "حذف",
|
||||
"upload_form.video_description": "وصف للمعاقين بصريا أو لِذي قِصر السمع",
|
||||
"upload_modal.analyzing_picture": "جارٍ فحص الصورة…",
|
||||
"upload_modal.apply": "طبّق",
|
||||
"upload_modal.choose_image": "اختر صورة",
|
||||
"upload_modal.description_placeholder": "نصٌّ حكيمٌ لهُ سِرٌّ قاطِعٌ وَذُو شَأنٍ عَظيمٍ مكتوبٌ على ثوبٍ أخضرَ ومُغلفٌ بجلدٍ أزرق",
|
||||
"upload_modal.detect_text": "اكتشف النص مِن الصورة",
|
||||
"upload_modal.edit_media": "تعديل الوسائط",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Amestar o desaniciar de les llistes",
|
||||
"account.badges.bot": "Robó",
|
||||
"account.badges.group": "Grupu",
|
||||
"account.block": "Bloquiar a @{name}",
|
||||
"account.block_domain": "Anubrir tolo de {domain}",
|
||||
"account.blocked": "Blocked",
|
||||
"account.blocked": "Bloquiada",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Encaboxar la solicitú de siguimientu",
|
||||
"account.direct": "Unviar un mensaxe direutu a @{name}",
|
||||
"account.domain_blocked": "Dominiu anubríu",
|
||||
@ -13,12 +15,13 @@
|
||||
"account.follow": "Siguir",
|
||||
"account.followers": "Siguidores",
|
||||
"account.followers.empty": "Naide sigue a esti usuariu entá.",
|
||||
"account.follows": "Follows",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Esti usuariu entá nun sigue a naide.",
|
||||
"account.follows_you": "Síguete",
|
||||
"account.hide_reblogs": "Anubrir les comparticiones de @{name}",
|
||||
"account.last_status": "Last active",
|
||||
"account.link_verified_on": "Ownership of this link was checked on {date}",
|
||||
"account.last_status": "Cabera actividá",
|
||||
"account.link_verified_on": "La propiedá d'esti enllaz foi comprobada'l {date}",
|
||||
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
|
||||
"account.media": "Media",
|
||||
"account.mention": "Mentar a @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Esperando pola aprobación. Calca pa encaboxar la solicitú de siguimientu",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Amosar les comparticiones de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Desbloquiar a @{name}",
|
||||
"account.unblock_domain": "Amosar {domain}",
|
||||
"account.unendorse": "Nun destacar nel perfil",
|
||||
"account.unfollow": "Dexar de siguir",
|
||||
"account.unmute": "Unmute @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "Asocedió un fallu inesperáu.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Autorizar",
|
||||
"follow_request.reject": "Refugar",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Desendolcadores",
|
||||
"getting_started.directory": "Direutoriu de perfiles",
|
||||
"getting_started.documentation": "Documentación",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "pa responder",
|
||||
"keyboard_shortcuts.requests": "p'abrir la llista de solicitúes de siguimientu",
|
||||
"keyboard_shortcuts.search": "pa enfocar la gueta",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "p'abrir la columna «entamar»",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -417,20 +424,29 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minutu restante} other {# minutos restantes}}",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# segundu restante} other {# segundos restantes}}",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {persones}} falando",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "El borrador va perdese si coles de Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Arrastra y suelta pa xubir",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "La xuba de ficheros nun ta permitida con encuestes.",
|
||||
"upload_form.audio_description": "Descripción pa persones con perda auditiva",
|
||||
"upload_form.description": "Descripción pa discapacitaos visuales",
|
||||
"upload_form.edit": "Editar",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Desaniciar",
|
||||
"upload_form.video_description": "Descripción pa persones con perda auditiva o discapacidá visual",
|
||||
"upload_modal.analyzing_picture": "Analizando la semeya…",
|
||||
"upload_modal.apply": "Aplicar",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Deteutar el testu de la semeya",
|
||||
"upload_modal.edit_media": "Edición",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Добави или премахни от списъците",
|
||||
"account.badges.bot": "бот",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Блокирай",
|
||||
"account.block_domain": "скрий всичко от (домейн)",
|
||||
"account.blocked": "Блокирани",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Откажи искането за следване",
|
||||
"account.direct": "Direct Message @{name}",
|
||||
"account.domain_blocked": "Скрит домейн",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Последвай",
|
||||
"account.followers": "Последователи",
|
||||
"account.followers.empty": "Все още никой не следва този потребител.",
|
||||
"account.follows": "Следвам",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Този потребител все още не следва никого.",
|
||||
"account.follows_you": "Твой последовател",
|
||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "В очакване на одобрение",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Show boosts from @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Не блокирай",
|
||||
"account.unblock_domain": "Unhide {domain}",
|
||||
"account.unendorse": "Don't feature on profile",
|
||||
"account.unfollow": "Не следвай",
|
||||
"account.unmute": "Unmute @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "An unexpected error occurred.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Authorize",
|
||||
"follow_request.reject": "Reject",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -262,7 +269,7 @@
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "Зареждане...",
|
||||
"media_gallery.toggle_visible": "Hide media",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "Not found",
|
||||
"missing_indicator.sublabel": "This resource could not be found",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Добави медия",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Отмяна",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "তালিকাতে যুক্ত বা অপসারণ করুন",
|
||||
"account.badges.bot": "বট",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "@{name} কে ব্লক করুন",
|
||||
"account.block_domain": "{domain} থেকে সব আড়াল করুন",
|
||||
"account.blocked": "অবরুদ্ধ",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "অনুসরণ অনুরোধ বাতিল করুন",
|
||||
"account.direct": "@{name} কে সরাসরি বার্তা",
|
||||
"account.domain_blocked": "ডোমেন গোপন করুন",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "অনুসরণ করুন",
|
||||
"account.followers": "অনুসরণকারী",
|
||||
"account.followers.empty": "এই সদস্যকে এখনো কেউ অনুসরণ করে না।.",
|
||||
"account.follows": "যাদেরকে অনুসরণ করেন",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "এই সদস্য কাওকে এখনো অনুসরণ করেন না.",
|
||||
"account.follows_you": "আপনাকে অনুসরণ করে",
|
||||
"account.hide_reblogs": "@{name}'র সমর্থনগুলি লুকিয়ে ফেলুন",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "অনুমতির অপেক্ষা। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন",
|
||||
"account.share": "@{name} র প্রোফাইল অন্যদের দেখান",
|
||||
"account.show_reblogs": "@{name} র সমর্থনগুলো দেখান",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "@{name} র কার্যকলাপ দেখুন",
|
||||
"account.unblock_domain": "{domain} কে আবার দেখুন",
|
||||
"account.unendorse": "আপনার নিজের পাতায় এটা দেখবেন না",
|
||||
"account.unfollow": "অনুসরণ না করতে",
|
||||
"account.unmute": "@{name} র কার্যকলাপ আবার দেখুন",
|
||||
"account.unmute_notifications": "@{name} র প্রজ্ঞাপন দেখুন",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
|
||||
"alert.rate_limited.title": "হার সীমিত",
|
||||
"alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "অনুমতি দিন",
|
||||
"follow_request.reject": "প্রত্যাখ্যান করুন",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "তৈরিকারকদের জন্য",
|
||||
"getting_started.directory": "নিজস্ব-পাতাগুলির তালিকা",
|
||||
"getting_started.documentation": "নথিপত্র",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "মতামত দিতে",
|
||||
"keyboard_shortcuts.requests": "অনুসরণ অনুরোধের তালিকা দেখতে",
|
||||
"keyboard_shortcuts.search": "খোঁজার অংশে ফোকাস করতে",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "\"প্রথম শুরুর\" কলাম বের করতে",
|
||||
"keyboard_shortcuts.toggle_hidden": "CW লেখা দেখতে বা লুকাতে",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "ভিডিও/ছবি দেখতে বা বন্ধ করতে",
|
||||
@ -412,9 +419,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# মিনিট} other {# মিনিট}} বাকি আছে",
|
||||
"time_remaining.moments": "সময় বাকি আছে",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} বাকি আছে",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} কথা বলছে",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "বর্তমানে জনপ্রিয়",
|
||||
"ui.beforeunload": "যে পর্যন্ত এটা লেখা হয়েছে, মাস্টাডন থেকে চলে গেলে এটা মুছে যাবে।",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "টেনে এখানে ছেড়ে দিলে এখানে যুক্ত করা যাবে",
|
||||
"upload_button.label": "ছবি বা ভিডিও যুক্ত করতে (এসব ধরণের: JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "যা যুক্ত করতে চাচ্ছেন সেটি বেশি বড়, এখানকার সর্বাধিকের মেমোরির উপরে চলে গেছে।",
|
||||
@ -422,10 +436,12 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "যারা দেখতে পায়না তাদের জন্য এটা বর্ণনা করতে",
|
||||
"upload_form.edit": "সম্পাদন",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "মুছে ফেলতে",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…",
|
||||
"upload_modal.apply": "প্রয়োগ করুন",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "ছবি থেকে পাঠ্য সনাক্ত করুন",
|
||||
"upload_modal.edit_media": "মিডিয়া সম্পাদনা করুন",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Notenn",
|
||||
"account.add_or_remove_from_list": "Ouzhpenn pe dilemel eus al listennadoù",
|
||||
"account.badges.bot": "Robot",
|
||||
"account.badges.group": "Strollad",
|
||||
"account.block": "Berzañ @{name}",
|
||||
"account.block_domain": "Berzañ pep tra eus {domain}",
|
||||
"account.blocked": "Stanket",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Nullañ ar bedadenn heuliañ",
|
||||
"account.direct": "Kas ur gemennadenn da @{name}",
|
||||
"account.domain_blocked": "Domani berzet",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Heuliañ",
|
||||
"account.followers": "Heulier·ezed·ien",
|
||||
"account.followers.empty": "Den na heul an implijer-mañ c'hoazh.",
|
||||
"account.follows": "Koumanantoù",
|
||||
"account.followers_counter": "{count, plural, other{{counter} Heulier}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Heuliañ}}",
|
||||
"account.follows.empty": "An implijer·ez-mañ na heul den ebet.",
|
||||
"account.follows_you": "Ho heul",
|
||||
"account.hide_reblogs": "Kuzh toudoù rannet gant @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "O c'hortoz an asant. Klikit evit nullañ ar goulenn heuliañ",
|
||||
"account.share": "Skignañ profil @{name}",
|
||||
"account.show_reblogs": "Diskouez skignadennoù @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Diverzañ @{name}",
|
||||
"account.unblock_domain": "Diverzañ an domani {domain}",
|
||||
"account.unendorse": "Paouez da lakaat war-wel war ar profil",
|
||||
"account.unfollow": "Diheuliañ",
|
||||
"account.unmute": "Diguzhat @{name}",
|
||||
"account.unmute_notifications": "Diguzhat kemennoù a @{name}",
|
||||
"account_note.placeholder": "Klikit evit ouzhpenniñ un notenn",
|
||||
"alert.rate_limited.message": "Klaskit en-dro a-benn {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Feur bevennet",
|
||||
"alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Diskouez an arventennoù",
|
||||
"column_header.unpin": "Dispilhennañ",
|
||||
"column_subheading.settings": "Arventennoù",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Nemet lec'hel",
|
||||
"community.column_settings.media_only": "Nemet Mediaoù",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Nemet a-bell",
|
||||
"compose_form.direct_message_warning": "An toud-mañ a vo kaset nemet d'an implijer·ezed·ien meneget.",
|
||||
"compose_form.direct_message_warning_learn_more": "Gouzout hiroc'h",
|
||||
"compose_form.hashtag_warning": "Ne vo ket lakaet an toud-mañ er rolloù gerioù-klik dre mard eo anlistennet. N'eus nemet an toudoù foran a c'hall bezañ klasket dre c'her-klik.",
|
||||
@ -167,12 +172,13 @@
|
||||
"follow_request.authorize": "Aotren",
|
||||
"follow_request.reject": "Nac'hañ",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Enrollet",
|
||||
"getting_started.developers": "Diorroerien",
|
||||
"getting_started.directory": "Roll ar profiloù",
|
||||
"getting_started.documentation": "Teuliadur",
|
||||
"getting_started.heading": "Loc'hañ",
|
||||
"getting_started.invite": "Pediñ tud",
|
||||
"getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
|
||||
"getting_started.open_source_notice": "Mastodoñ zo ur meziant digor e darzh. Gallout a rit kenoberzhiañ dezhañ pe danevellañ kudennoù war GitHub e {github}.",
|
||||
"getting_started.security": "Arventennoù ar gont",
|
||||
"getting_started.terms": "Divizoù gwerzhañ hollek",
|
||||
"hashtag.column_header.tag_mode.all": "ha {additional}",
|
||||
@ -187,14 +193,14 @@
|
||||
"home.column_settings.basic": "Diazez",
|
||||
"home.column_settings.show_reblogs": "Diskouez ar skignadennoù",
|
||||
"home.column_settings.show_replies": "Diskouez ar respontoù",
|
||||
"home.hide_announcements": "Hide announcements",
|
||||
"home.show_announcements": "Show announcements",
|
||||
"home.hide_announcements": "Kuzhat ar c'hemennoù",
|
||||
"home.show_announcements": "Diskouez ar c'hemennoù",
|
||||
"intervals.full.days": "{number, plural, one {# devezh} other{# a zevezhioù}}",
|
||||
"intervals.full.hours": "{number, plural, one {# eurvezh} other{# eurvezh}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# munut} other{# a vunutoù}}",
|
||||
"introduction.federation.action": "Da-heul",
|
||||
"introduction.federation.federated.headline": "Kevreet",
|
||||
"introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
|
||||
"introduction.federation.federated.text": "Embannadennoù publik eus dafariaded all ar c'hevrebed a yo war-wel er red-amzer kevredet.",
|
||||
"introduction.federation.home.headline": "Degemer",
|
||||
"introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
|
||||
"introduction.federation.local.headline": "Lec'hel",
|
||||
@ -217,13 +223,13 @@
|
||||
"keyboard_shortcuts.description": "Deskrivadur",
|
||||
"keyboard_shortcuts.direct": "to open direct messages column",
|
||||
"keyboard_shortcuts.down": "to move down in the list",
|
||||
"keyboard_shortcuts.enter": "to open status",
|
||||
"keyboard_shortcuts.enter": "evit digeriñ un toud",
|
||||
"keyboard_shortcuts.favourite": "to favourite",
|
||||
"keyboard_shortcuts.favourites": "to open favourites list",
|
||||
"keyboard_shortcuts.federated": "to open federated timeline",
|
||||
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
|
||||
"keyboard_shortcuts.home": "to open home timeline",
|
||||
"keyboard_shortcuts.hotkey": "Hotkey",
|
||||
"keyboard_shortcuts.hotkey": "Berradur",
|
||||
"keyboard_shortcuts.legend": "to display this legend",
|
||||
"keyboard_shortcuts.local": "to open local timeline",
|
||||
"keyboard_shortcuts.mention": "to mention author",
|
||||
@ -236,16 +242,17 @@
|
||||
"keyboard_shortcuts.reply": "da respont",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
"keyboard_shortcuts.toot": "to start a brand new toot",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "da guzhat/ziguzhat ur media",
|
||||
"keyboard_shortcuts.toot": "da gregiñ gant un toud nevez-flamm",
|
||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
||||
"keyboard_shortcuts.up": "to move up in the list",
|
||||
"lightbox.close": "Serriñ",
|
||||
"lightbox.next": "Next",
|
||||
"lightbox.previous": "Previous",
|
||||
"lightbox.view_context": "View context",
|
||||
"lightbox.next": "Da-heul",
|
||||
"lightbox.previous": "A-raok",
|
||||
"lightbox.view_context": "Diskouez ar c'hemperzh",
|
||||
"lists.account.add": "Ouzhpennañ d'al listenn",
|
||||
"lists.account.remove": "Lemel kuit eus al listenn",
|
||||
"lists.delete": "Dilemel al listenn",
|
||||
@ -291,14 +298,14 @@
|
||||
"notification.own_poll": "Your poll has ended",
|
||||
"notification.poll": "A poll you have voted in has ended",
|
||||
"notification.reblog": "{name} boosted your status",
|
||||
"notifications.clear": "Clear notifications",
|
||||
"notifications.clear": "Skarzhañ ar c'hemennoù",
|
||||
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
|
||||
"notifications.column_settings.alert": "Desktop notifications",
|
||||
"notifications.column_settings.alert": "Kemennoù war ar burev",
|
||||
"notifications.column_settings.favourite": "Ar re vuiañ-karet:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Display all categories",
|
||||
"notifications.column_settings.filter_bar.advanced": "Skrammañ an-holl rummadoù",
|
||||
"notifications.column_settings.filter_bar.category": "Barrenn siloù prim",
|
||||
"notifications.column_settings.filter_bar.show": "Diskouez",
|
||||
"notifications.column_settings.follow": "New followers:",
|
||||
"notifications.column_settings.follow": "Heulierien nevez:",
|
||||
"notifications.column_settings.follow_request": "New follow requests:",
|
||||
"notifications.column_settings.mention": "Menegoù:",
|
||||
"notifications.column_settings.poll": "Disoc'hoù ar sontadeg:",
|
||||
@ -309,7 +316,7 @@
|
||||
"notifications.filter.all": "Pep tra",
|
||||
"notifications.filter.boosts": "Skignadennoù",
|
||||
"notifications.filter.favourites": "Muiañ-karet",
|
||||
"notifications.filter.follows": "Follows",
|
||||
"notifications.filter.follows": "Heuliañ",
|
||||
"notifications.filter.mentions": "Menegoù",
|
||||
"notifications.filter.polls": "Disoc'hoù ar sontadegoù",
|
||||
"notifications.group": "{count} a gemennoù",
|
||||
@ -343,8 +350,8 @@
|
||||
"report.forward": "Treuzkas da: {target}",
|
||||
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
|
||||
"report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
|
||||
"report.placeholder": "Additional comments",
|
||||
"report.submit": "Submit",
|
||||
"report.placeholder": "Askelennoù ouzhpenn",
|
||||
"report.submit": "Kinnig",
|
||||
"report.target": "Report {target}",
|
||||
"search.placeholder": "Klask",
|
||||
"search_popout.search_format": "Advanced search format",
|
||||
@ -360,24 +367,24 @@
|
||||
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
|
||||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_status": "Open this status in the moderation interface",
|
||||
"status.block": "Block @{name}",
|
||||
"status.block": "Berzañ @{name}",
|
||||
"status.bookmark": "Ouzhpennañ d'ar sinedoù",
|
||||
"status.cancel_reblog_private": "Unboost",
|
||||
"status.cannot_reblog": "This post cannot be boosted",
|
||||
"status.copy": "Copy link to status",
|
||||
"status.copy": "Eilañ liamm an toud",
|
||||
"status.delete": "Dilemel",
|
||||
"status.detailed_status": "Detailed conversation view",
|
||||
"status.direct": "Kas ur c'hemennad da @{name}",
|
||||
"status.embed": "Enframmañ",
|
||||
"status.favourite": "Muiañ-karet",
|
||||
"status.filtered": "Filtered",
|
||||
"status.filtered": "Silet",
|
||||
"status.load_more": "Kargañ muioc'h",
|
||||
"status.media_hidden": "Media kuzhet",
|
||||
"status.mention": "Menegiñ @{name}",
|
||||
"status.more": "Muioc'h",
|
||||
"status.mute": "Kuzhat @{name}",
|
||||
"status.mute_conversation": "Kuzhat ar gaozeadenn",
|
||||
"status.open": "Expand this status",
|
||||
"status.open": "Kreskaat an toud-mañ",
|
||||
"status.pin": "Spilhennañ d'ar profil",
|
||||
"status.pinned": "Toud spilhennet",
|
||||
"status.read_more": "Lenn muioc'h",
|
||||
@ -386,23 +393,23 @@
|
||||
"status.reblogged_by": "{name} boosted",
|
||||
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
|
||||
"status.redraft": "Delete & re-draft",
|
||||
"status.remove_bookmark": "Remove bookmark",
|
||||
"status.remove_bookmark": "Dilemel ar sined",
|
||||
"status.reply": "Respont",
|
||||
"status.replyAll": "Reply to thread",
|
||||
"status.replyAll": "Respont d'ar gaozeadenn",
|
||||
"status.report": "Disklêriañ @{name}",
|
||||
"status.sensitive_warning": "Sensitive content",
|
||||
"status.share": "Rannañ",
|
||||
"status.show_less": "Show less",
|
||||
"status.show_less": "Diskouez nebeutoc'h",
|
||||
"status.show_less_all": "Show less for all",
|
||||
"status.show_more": "Show more",
|
||||
"status.show_more": "Diskouez muioc'h",
|
||||
"status.show_more_all": "Show more for all",
|
||||
"status.show_thread": "Show thread",
|
||||
"status.uncached_media_warning": "Not available",
|
||||
"status.show_thread": "Diskouez ar gaozeadenn",
|
||||
"status.uncached_media_warning": "Dihegerz",
|
||||
"status.unmute_conversation": "Diguzhat ar gaozeadenn",
|
||||
"status.unpin": "Dispilhennañ eus ar profil",
|
||||
"suggestions.dismiss": "Dismiss suggestion",
|
||||
"suggestions.header": "You might be interested in…",
|
||||
"tabs_bar.federated_timeline": "Federated",
|
||||
"tabs_bar.federated_timeline": "Kevredet",
|
||||
"tabs_bar.home": "Degemer",
|
||||
"tabs_bar.local_timeline": "Lec'hel",
|
||||
"tabs_bar.notifications": "Kemennoù",
|
||||
@ -412,9 +419,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Heulier·ezed·ien",
|
||||
"timeline_hint.resources.follows": "Heuliañ",
|
||||
"timeline_hint.resources.statuses": "Toudoù koshoc'h",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Luskad ar mare",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Ouzhpennañ ur media ({formats})",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
@ -422,22 +436,24 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Aozañ",
|
||||
"upload_form.thumbnail": "Kemmañ ar velvenn",
|
||||
"upload_form.undo": "Dilemel",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.apply": "Arloañ",
|
||||
"upload_modal.choose_image": "Dibab ur skeudenn",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
"upload_modal.detect_text": "Dinoiñ testenn diouzh ar skeudenn",
|
||||
"upload_modal.edit_media": "Embann ar media",
|
||||
"upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
|
||||
"upload_modal.preview_label": "Preview ({ratio})",
|
||||
"upload_modal.preview_label": "Rakwel ({ratio})",
|
||||
"upload_progress.label": "O pellgargañ...",
|
||||
"video.close": "Close video",
|
||||
"video.close": "Serriñ ar video",
|
||||
"video.download": "Pellgargañ ar restr",
|
||||
"video.exit_fullscreen": "Exit full screen",
|
||||
"video.exit_fullscreen": "Kuitaat ar mod skramm leun",
|
||||
"video.expand": "Expand video",
|
||||
"video.fullscreen": "Full screen",
|
||||
"video.hide": "Hide video",
|
||||
"video.fullscreen": "Skramm a-bezh",
|
||||
"video.hide": "Kuzhat ar video",
|
||||
"video.mute": "Mute sound",
|
||||
"video.pause": "Pause",
|
||||
"video.play": "Play",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "La teva nota per a @{name}",
|
||||
"account.add_or_remove_from_list": "Afegir o Treure de les llistes",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Grup",
|
||||
"account.block": "Bloqueja @{name}",
|
||||
"account.block_domain": "Amaga-ho tot de {domain}",
|
||||
"account.blocked": "Bloquejat",
|
||||
"account.browse_more_on_origin_server": "Navega més en el perfil original",
|
||||
"account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
|
||||
"account.direct": "Missatge directe @{name}",
|
||||
"account.domain_blocked": "Domini ocult",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Segueix",
|
||||
"account.followers": "Seguidors",
|
||||
"account.followers.empty": "Encara ningú no segueix aquest usuari.",
|
||||
"account.follows": "Seguiments",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Seguint}}",
|
||||
"account.follows.empty": "Aquest usuari encara no segueix a ningú.",
|
||||
"account.follows_you": "Et segueix",
|
||||
"account.hide_reblogs": "Amaga els impulsos de @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Esperant aprovació. Clic per a cancel·lar la petició de seguiment",
|
||||
"account.share": "Comparteix el perfil de @{name}",
|
||||
"account.show_reblogs": "Mostra els impulsos de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
|
||||
"account.unblock": "Desbloqueja @{name}",
|
||||
"account.unblock_domain": "Mostra {domain}",
|
||||
"account.unendorse": "No recomanar en el perfil",
|
||||
"account.unfollow": "Deixa de seguir",
|
||||
"account.unmute": "Treure silenci de @{name}",
|
||||
"account.unmute_notifications": "Activar notificacions de @{name}",
|
||||
"account_note.placeholder": "Sense comentaris",
|
||||
"alert.rate_limited.message": "Si us plau torna-ho a provar després de {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Límit de freqüència",
|
||||
"alert.unexpected.message": "S'ha produït un error inesperat.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Mostra la configuració",
|
||||
"column_header.unpin": "No fixis",
|
||||
"column_subheading.settings": "Configuració",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Només local",
|
||||
"community.column_settings.media_only": "Només multimèdia",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Només remot",
|
||||
"compose_form.direct_message_warning": "Aquest tut només serà enviat als usuaris esmentats.",
|
||||
"compose_form.direct_message_warning_learn_more": "Aprèn més",
|
||||
"compose_form.hashtag_warning": "Aquesta tut no es mostrarà en cap etiqueta ja que no està llistat. Només els tuts públics poden ser cercats per etiqueta.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Autoritzar",
|
||||
"follow_request.reject": "Rebutjar",
|
||||
"follow_requests.unlocked_explanation": "Tot i que el teu compte no està bloquejat, el personal de {domain} ha pensat que és possible que vulguis revisar les sol·licituds de seguiment d’aquests comptes de forma manual.",
|
||||
"generic.saved": "Guardat",
|
||||
"getting_started.developers": "Desenvolupadors",
|
||||
"getting_started.directory": "Directori de perfils",
|
||||
"getting_started.documentation": "Documentació",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "respondre",
|
||||
"keyboard_shortcuts.requests": "per a obrir la llista de sol·licituds de seguiment",
|
||||
"keyboard_shortcuts.search": "per a centrar la cerca",
|
||||
"keyboard_shortcuts.spoilers": "mostrar/amagar el camp CW",
|
||||
"keyboard_shortcuts.start": "per a obrir la columna \"Començar\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "per a mostrar o amagar text sota CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "per a mostrar o amagar contingut multimèdia",
|
||||
@ -353,7 +360,7 @@
|
||||
"report.target": "Informes {target}",
|
||||
"search.placeholder": "Cercar",
|
||||
"search_popout.search_format": "Format de cerca avançada",
|
||||
"search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les marcades com a favorites, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
|
||||
"search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les marcades com a preferides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
|
||||
"search_popout.tips.hashtag": "etiqueta",
|
||||
"search_popout.tips.status": "tut",
|
||||
"search_popout.tips.text": "El text simple retorna coincidències amb els noms de visualització, els noms d'usuari i les etiquetes",
|
||||
@ -369,7 +376,7 @@
|
||||
"status.bookmark": "Marcador",
|
||||
"status.cancel_reblog_private": "Desfer l'impuls",
|
||||
"status.cannot_reblog": "Aquesta publicació no pot ser impulsada",
|
||||
"status.copy": "Copia l'enllaç al tut",
|
||||
"status.copy": "Copia l'enllaç a l'estat",
|
||||
"status.delete": "Esborrar",
|
||||
"status.detailed_status": "Visualització detallada de la conversa",
|
||||
"status.direct": "Missatge directe @{name}",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minut} other {# minuts}} restants",
|
||||
"time_remaining.moments": "Moments restants",
|
||||
"time_remaining.seconds": "{number, plural, one {# segon} other {# segons}} restants",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {persones}} parlant-hi",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} dels altres servidors no son mostrats.",
|
||||
"timeline_hint.resources.followers": "Seguidors",
|
||||
"timeline_hint.resources.follows": "Seguiments",
|
||||
"timeline_hint.resources.statuses": "Tuts més antics",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persones}} parlant-hi",
|
||||
"trends.trending_now": "Ara en tendència",
|
||||
"ui.beforeunload": "El teu esborrany es perdrà si surts de Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Arrossega i deixa anar per a carregar",
|
||||
"upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Descriviu per a les persones amb pèrdua auditiva",
|
||||
"upload_form.description": "Descriure els problemes visuals",
|
||||
"upload_form.edit": "Edita",
|
||||
"upload_form.thumbnail": "Canvia la miniatura",
|
||||
"upload_form.undo": "Esborra",
|
||||
"upload_form.video_description": "Descriu per a les persones amb pèrdua auditiva o deficiència visual",
|
||||
"upload_modal.analyzing_picture": "Analitzant imatge…",
|
||||
"upload_modal.apply": "Aplica",
|
||||
"upload_modal.choose_image": "Tria imatge",
|
||||
"upload_modal.description_placeholder": "Uns salts ràpids de guineu marró sobre el gos gandul",
|
||||
"upload_modal.detect_text": "Detecta el text de l'imatge",
|
||||
"upload_modal.edit_media": "Editar multimèdia",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "A vostra nota per @{name}",
|
||||
"account.add_or_remove_from_list": "Aghjunghje o toglie da e liste",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Gruppu",
|
||||
"account.block": "Bluccà @{name}",
|
||||
"account.block_domain": "Piattà u duminiu {domain}",
|
||||
"account.blocked": "Bluccatu",
|
||||
"account.browse_more_on_origin_server": "Vede di più nant'à u prufile uriginale",
|
||||
"account.cancel_follow_request": "Annullà a dumanda d'abbunamentu",
|
||||
"account.direct": "Missaghju direttu @{name}",
|
||||
"account.domain_blocked": "Duminiu piattatu",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Siguità",
|
||||
"account.followers": "Abbunati",
|
||||
"account.followers.empty": "Nisunu hè abbunatu à st'utilizatore.",
|
||||
"account.follows": "Abbunamenti",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Abbunatu} other {{counter} Abbunati}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Abbunamentu} other {{counter} Abbunamenti}}",
|
||||
"account.follows.empty": "St'utilizatore ùn seguita nisunu.",
|
||||
"account.follows_you": "Vi seguita",
|
||||
"account.hide_reblogs": "Piattà spartere da @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "In attesa d'apprubazione. Cliccate per annullà a dumanda",
|
||||
"account.share": "Sparte u prufile di @{name}",
|
||||
"account.show_reblogs": "Vede spartere da @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Statutu} other {{counter} Statuti}}",
|
||||
"account.unblock": "Sbluccà @{name}",
|
||||
"account.unblock_domain": "Ùn piattà più {domain}",
|
||||
"account.unendorse": "Ùn fà figurà nant'à u prufilu",
|
||||
"account.unfollow": "Ùn siguità più",
|
||||
"account.unmute": "Ùn piattà più @{name}",
|
||||
"account.unmute_notifications": "Ùn piattà più nutificazione da @{name}",
|
||||
"account_note.placeholder": "Senza cummentariu",
|
||||
"alert.rate_limited.message": "Pruvate ancu dop'à {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Ghjettu limitatu",
|
||||
"alert.unexpected.message": "Un prublemu inaspettatu hè accadutu.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Mustrà i parametri",
|
||||
"column_header.unpin": "Spuntarulà",
|
||||
"column_subheading.settings": "Parametri",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Solu lucale",
|
||||
"community.column_settings.media_only": "Solu media",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Solu distante",
|
||||
"compose_form.direct_message_warning": "Solu l'utilizatori mintuvati puderenu vede stu statutu.",
|
||||
"compose_form.direct_message_warning_learn_more": "Amparà di più",
|
||||
"compose_form.hashtag_warning": "Stu statutu ùn hè \"Micca listatu\" è ùn sarà micca listatu indè e circate da hashtag. Per esse vistu in quesse, u statutu deve esse \"Pubblicu\".",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Auturizà",
|
||||
"follow_request.reject": "Righjittà",
|
||||
"follow_requests.unlocked_explanation": "U vostru contu ùn hè micca privatu, ma a squadra d'amministrazione di {domain} pensa chì e dumande d'abbunamentu di questi conti anu bisognu d'esse verificate manualmente.",
|
||||
"generic.saved": "Salvatu",
|
||||
"getting_started.developers": "Sviluppatori",
|
||||
"getting_started.directory": "Annuariu di i prufili",
|
||||
"getting_started.documentation": "Ducumentazione",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "risponde",
|
||||
"keyboard_shortcuts.requests": "per apre a lista di dumande d'abbunamentu",
|
||||
"keyboard_shortcuts.search": "fucalizà nant'à l'area di circata",
|
||||
"keyboard_shortcuts.spoilers": "per mustrà/piattà u campu CW",
|
||||
"keyboard_shortcuts.start": "per apre a culonna \"per principià\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "vede/piattà u testu daretu à l'avertimentu CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "vede/piattà i media",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minuta ferma} other {# minute fermanu}} left",
|
||||
"time_remaining.moments": "Ci fermanu qualchi mumentu",
|
||||
"time_remaining.seconds": "{number, plural, one {# siconda ferma} other {# siconde fermanu}}",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} parlanu",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} da l'altri servori ùn so micca affissati·e.",
|
||||
"timeline_hint.resources.followers": "Abbunati",
|
||||
"timeline_hint.resources.follows": "Abbunamenti",
|
||||
"timeline_hint.resources.statuses": "Statuti più anziani",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona chì parla} other {{counter} persone chì parlanu}}",
|
||||
"trends.trending_now": "Tindenze d'avà",
|
||||
"ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.",
|
||||
"units.short.billion": "{count}G",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop per caricà un fugliale",
|
||||
"upload_button.label": "Aghjunghje un media ({formats})",
|
||||
"upload_error.limit": "Limita di caricamentu di fugliali trapassata.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Discrizzione per i ciochi",
|
||||
"upload_form.description": "Discrive per i malvistosi",
|
||||
"upload_form.edit": "Mudificà",
|
||||
"upload_form.thumbnail": "Cambià vignetta",
|
||||
"upload_form.undo": "Sguassà",
|
||||
"upload_form.video_description": "Discrizzione per i ciochi o cechi",
|
||||
"upload_modal.analyzing_picture": "Analisi di u ritrattu…",
|
||||
"upload_modal.apply": "Affettà",
|
||||
"upload_modal.choose_image": "Cambià ritrattu",
|
||||
"upload_modal.description_placeholder": "Chì tempi brevi ziu, quandu solfeghji",
|
||||
"upload_modal.detect_text": "Ditettà testu da u ritrattu",
|
||||
"upload_modal.edit_media": "Cambià media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Přidat nebo odstranit ze seznamů",
|
||||
"account.badges.bot": "Robot",
|
||||
"account.badges.group": "Skupina",
|
||||
"account.block": "Zablokovat uživatele @{name}",
|
||||
"account.block_domain": "Skrýt vše ze serveru {domain}",
|
||||
"account.blocked": "Blokováno",
|
||||
"account.browse_more_on_origin_server": "Více na původním profilu",
|
||||
"account.cancel_follow_request": "Zrušit žádost o sledování",
|
||||
"account.direct": "Poslat uživateli @{name} přímou zprávu",
|
||||
"account.domain_blocked": "Doména skryta",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Sledovat",
|
||||
"account.followers": "Sledující",
|
||||
"account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
|
||||
"account.follows": "Sledovaní",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Tento uživatel ještě nikoho nesleduje.",
|
||||
"account.follows_you": "Sleduje vás",
|
||||
"account.hide_reblogs": "Skrýt boosty od uživatele @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Čeká na schválení. Kliknutím žádost o sledování zrušíte",
|
||||
"account.share": "Sdílet profil uživatele @{name}",
|
||||
"account.show_reblogs": "Zobrazit boosty od uživatele @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Odblokovat uživatele @{name}",
|
||||
"account.unblock_domain": "Odkrýt doménu {domain}",
|
||||
"account.unendorse": "Nezvýrazňovat na profilu",
|
||||
"account.unfollow": "Přestat sledovat",
|
||||
"account.unmute": "Odkrýt uživatele @{name}",
|
||||
"account.unmute_notifications": "Odkrýt oznámení od uživatele @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Zkuste to prosím znovu za {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rychlost omezena",
|
||||
"alert.unexpected.message": "Objevila se neočekávaná chyba.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Zobrazit nastavení",
|
||||
"column_header.unpin": "Odepnout",
|
||||
"column_subheading.settings": "Nastavení",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Pouze místní",
|
||||
"community.column_settings.media_only": "Pouze média",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Pouze vzdálené",
|
||||
"compose_form.direct_message_warning": "Tento toot bude odeslán pouze zmíněným uživatelům.",
|
||||
"compose_form.direct_message_warning_learn_more": "Zjistit více",
|
||||
"compose_form.hashtag_warning": "Tento toot nebude zobrazen pod žádným hashtagem, neboť je neuvedený. Pouze veřejné tooty mohou být vyhledány podle hashtagu.",
|
||||
@ -171,7 +176,8 @@
|
||||
"federation.local_only.short": "Local-only",
|
||||
"follow_request.authorize": "Autorizovat",
|
||||
"follow_request.reject": "Odmítnout",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, {domain} si myslí, že budete chtít následující požadavky na sledování zkontrolovat ručně.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Vývojáři",
|
||||
"getting_started.directory": "Adresář profilů",
|
||||
"getting_started.documentation": "Dokumentace",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "odpovědět",
|
||||
"keyboard_shortcuts.requests": "otevření seznamu požadavků o sledování",
|
||||
"keyboard_shortcuts.search": "zaměření na hledání",
|
||||
"keyboard_shortcuts.spoilers": "zobrazit/skrýt pole CW",
|
||||
"keyboard_shortcuts.start": "otevření sloupce „začínáme“",
|
||||
"keyboard_shortcuts.toggle_hidden": "zobrazení/skrytí textu za varováním o obsahu",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "zobrazení/skrytí médií",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {Zbývá # minuta} few {Zbývají # minuty} many {Zbývá # minut} other {Zbývá # minut}}",
|
||||
"time_remaining.moments": "Zbývá několik sekund",
|
||||
"time_remaining.seconds": "{number, plural, one {Zbývá # sekunda} few {Zbývají # sekundy} many {Zbývá # sekund} other {Zbývá # sekund}}",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {člověk} few {lidé} many {lidí} other {lidí}} hovoří",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} z jiných serveru se nezobrazuje.",
|
||||
"timeline_hint.resources.followers": "Sledující",
|
||||
"timeline_hint.resources.follows": "Sleduje",
|
||||
"timeline_hint.resources.statuses": "Starší tooty",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Aktuální trendy",
|
||||
"ui.beforeunload": "Pokud Mastodon opustíte, váš koncept se ztratí.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Nahrajte přetažením",
|
||||
"upload_button.label": "Přidat média ({formats})",
|
||||
"upload_error.limit": "Byl překročen limit nahraných souborů.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Popis pro sluchově postižené",
|
||||
"upload_form.description": "Popis pro zrakově postižené",
|
||||
"upload_form.edit": "Upravit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Smazat",
|
||||
"upload_form.video_description": "Popis pro sluchově či zrakově postižené",
|
||||
"upload_modal.analyzing_picture": "Analyzuji obrázek…",
|
||||
"upload_modal.apply": "Použít",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "Příliš žluťoučký kůň úpěl ďábelské ódy",
|
||||
"upload_modal.detect_text": "Detekovat text z obrázku",
|
||||
"upload_modal.edit_media": "Upravit média",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Ychwanegu neu Dileu o'r rhestrau",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Grŵp",
|
||||
"account.block": "Blocio @{name}",
|
||||
"account.block_domain": "Cuddio popeth rhag {domain}",
|
||||
"account.blocked": "Blociwyd",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Canslo cais dilyn",
|
||||
"account.direct": "Neges breifat @{name}",
|
||||
"account.domain_blocked": "Parth wedi ei guddio",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Dilyn",
|
||||
"account.followers": "Dilynwyr",
|
||||
"account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.",
|
||||
"account.follows": "Yn dilyn",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.",
|
||||
"account.follows_you": "Yn eich dilyn chi",
|
||||
"account.hide_reblogs": "Cuddio bwstiau o @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
|
||||
"account.share": "Rhannwch broffil @{name}",
|
||||
"account.show_reblogs": "Dangos bwstiau o @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Dadflocio @{name}",
|
||||
"account.unblock_domain": "Dadguddio {domain}",
|
||||
"account.unendorse": "Peidio a'i arddangos ar fy mhroffil",
|
||||
"account.unfollow": "Dad-ddilyn",
|
||||
"account.unmute": "Dad-dawelu @{name}",
|
||||
"account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Ceisiwch eto ar ôl {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Cyfradd gyfyngedig",
|
||||
"alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Dangos gosodiadau",
|
||||
"column_header.unpin": "Dadbinio",
|
||||
"column_subheading.settings": "Gosodiadau",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Lleol yn unig",
|
||||
"community.column_settings.media_only": "Cyfryngau yn unig",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Anghysbell yn unig",
|
||||
"compose_form.direct_message_warning": "Mi fydd y tŵt hwn ond yn cael ei anfon at y defnyddwyr sy'n cael eu crybwyll.",
|
||||
"compose_form.direct_message_warning_learn_more": "Dysgu mwy",
|
||||
"compose_form.hashtag_warning": "Ni fydd y tŵt hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond tŵtiau cyhoeddus gellid chwilota amdanynt drwy hashnod.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Caniatau",
|
||||
"follow_request.reject": "Gwrthod",
|
||||
"follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, oedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Datblygwyr",
|
||||
"getting_started.directory": "Cyfeiriadur proffil",
|
||||
"getting_started.documentation": "Dogfennaeth",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "i ateb",
|
||||
"keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn",
|
||||
"keyboard_shortcuts.search": "i ffocysu chwilio",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "i agor colofn \"dechrau arni\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "i ddangos/cuddio testun tu ôl i CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "i ddangos/gyddio cyfryngau",
|
||||
@ -413,9 +420,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# funud} other {# o funudau}} ar ôl",
|
||||
"time_remaining.moments": "Munudau ar ôl",
|
||||
"time_remaining.seconds": "{number, plural, one {# eiliad} other {# o eiliadau}} ar ôl",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Yn tueddu nawr",
|
||||
"ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Llusgwch & gollwing i uwchlwytho",
|
||||
"upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Wedi mynd heibio'r uchafswm terfyn uwchlwytho.",
|
||||
@ -423,10 +437,12 @@
|
||||
"upload_form.audio_description": "Disgrifio ar gyfer pobl sydd â cholled clyw",
|
||||
"upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
|
||||
"upload_form.edit": "Golygu",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Dileu",
|
||||
"upload_form.video_description": "Disgrifio ar gyfer pobl sydd â cholled clyw neu amhariad golwg",
|
||||
"upload_modal.analyzing_picture": "Dadansoddi llun…",
|
||||
"upload_modal.apply": "Gweithredu",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "Mae ei phen bach llawn jocs, 'run peth a fy nghot golff, rhai dyddiau",
|
||||
"upload_modal.detect_text": "Canfod testun o'r llun",
|
||||
"upload_modal.edit_media": "Golygu cyfryngau",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Tilføj eller fjern fra lister",
|
||||
"account.badges.bot": "Robot",
|
||||
"account.badges.group": "Gruppe",
|
||||
"account.block": "Bloker @{name}",
|
||||
"account.block_domain": "Skjul alt fra {domain}",
|
||||
"account.blocked": "Blokeret",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Annullér følgeranmodning",
|
||||
"account.direct": "Send en direkte besked til @{name}",
|
||||
"account.domain_blocked": "Domænet er blevet skjult",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Følg",
|
||||
"account.followers": "Følgere",
|
||||
"account.followers.empty": "Der er endnu ingen der følger denne bruger.",
|
||||
"account.follows": "Følger",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Denne bruger følger endnu ikke nogen.",
|
||||
"account.follows_you": "Følger dig",
|
||||
"account.hide_reblogs": "Skjul fremhævelserne fra @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Afventer godkendelse. Tryk for at annullere følgeanmodning",
|
||||
"account.share": "Del @{name}s profil",
|
||||
"account.show_reblogs": "Vis fremhævelserne fra @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Fjern blokeringen af @{name}",
|
||||
"account.unblock_domain": "Skjul ikke længere {domain}",
|
||||
"account.unendorse": "Fremhæv ikke på profil",
|
||||
"account.unfollow": "Følg ikke længere",
|
||||
"account.unmute": "Fjern dæmpningen af @{name}",
|
||||
"account.unmute_notifications": "Fjern dæmpningen af notifikationer fra @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Prøv venligst igen efter {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Gradsbegrænset",
|
||||
"alert.unexpected.message": "Der opstod en uventet fejl.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Godkend",
|
||||
"follow_request.reject": "Afvis",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Udviklere",
|
||||
"getting_started.directory": "Profilliste",
|
||||
"getting_started.documentation": "Dokumentation",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "for at svare",
|
||||
"keyboard_shortcuts.requests": "for at åbne listen over følgeranmodninger",
|
||||
"keyboard_shortcuts.search": "for at fokusere søgningen",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "for at åbne \"kom igen\" kolonnen",
|
||||
"keyboard_shortcuts.toggle_hidden": "for at vise/skjule tekst bag CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "for at vise/skjule medier",
|
||||
@ -413,9 +420,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minut} other {# minutter}} tilbage",
|
||||
"time_remaining.moments": "Få øjeblikke tilbage",
|
||||
"time_remaining.seconds": "{number, plural, one {# sekund} other {# sekunder}} tilbage",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {personer}} snakker",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Hot lige nu",
|
||||
"ui.beforeunload": "Din kladde vil gå tabt hvis du forlader Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Træk og slip for at uploade",
|
||||
"upload_button.label": "Tilføj medie (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Uploadgrænse overskredet.",
|
||||
@ -423,10 +437,12 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Beskriv for svagtseende",
|
||||
"upload_form.edit": "Redigér",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Slet",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyserer billede…",
|
||||
"upload_modal.apply": "Anvend",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "En hurtig brun ræv hopper over den dovne hund",
|
||||
"upload_modal.detect_text": "Find tekst i billede på automatisk vis",
|
||||
"upload_modal.edit_media": "Redigér medie",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Deine Notiz für @{name}",
|
||||
"account.add_or_remove_from_list": "Hinzufügen oder Entfernen von Listen",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Gruppe",
|
||||
"account.block": "@{name} blockieren",
|
||||
"account.block_domain": "Alles von {domain} blockieren",
|
||||
"account.blocked": "Blockiert",
|
||||
"account.browse_more_on_origin_server": "Mehr auf dem Originalprofil durchsuchen",
|
||||
"account.cancel_follow_request": "Folgeanfrage abbrechen",
|
||||
"account.direct": "Direktnachricht an @{name}",
|
||||
"account.domain_blocked": "Domain versteckt",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Folgen",
|
||||
"account.followers": "Folgende",
|
||||
"account.followers.empty": "Diesem Profil folgt noch niemand.",
|
||||
"account.follows": "Folgt",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Folgender} other {{counter} Folgende}}",
|
||||
"account.follows.empty": "Dieses Profil folgt noch niemandem.",
|
||||
"account.follows_you": "Folgt dir",
|
||||
"account.hide_reblogs": "Geteilte Beiträge von @{name} verbergen",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Warte auf Erlaubnis. Klicke zum Abbrechen",
|
||||
"account.share": "Profil von @{name} teilen",
|
||||
"account.show_reblogs": "Von @{name} geteilte Beiträge anzeigen",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
|
||||
"account.unblock": "@{name} entblocken",
|
||||
"account.unblock_domain": "Blockieren von {domain} beenden",
|
||||
"account.unendorse": "Nicht auf Profil hervorheben",
|
||||
"account.unfollow": "Entfolgen",
|
||||
"account.unmute": "@{name} nicht mehr stummschalten",
|
||||
"account.unmute_notifications": "Benachrichtigungen von @{name} einschalten",
|
||||
"account_note.placeholder": "Kein Kommentar angegeben",
|
||||
"alert.rate_limited.message": "Bitte versuche es nach {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Anfragelimit überschritten",
|
||||
"alert.unexpected.message": "Ein unerwarteter Fehler ist aufgetreten.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Einstellungen anzeigen",
|
||||
"column_header.unpin": "Lösen",
|
||||
"column_subheading.settings": "Einstellungen",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Nur lokal",
|
||||
"community.column_settings.media_only": "Nur Medien",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Nur entfernt",
|
||||
"compose_form.direct_message_warning": "Dieser Beitrag wird nur für die erwähnten Nutzer sichtbar sein.",
|
||||
"compose_form.direct_message_warning_learn_more": "Mehr erfahren",
|
||||
"compose_form.hashtag_warning": "Dieser Beitrag wird nicht durch Hashtags entdeckbar sein, weil er ungelistet ist. Nur öffentliche Beiträge tauchen in Hashtag-Zeitleisten auf.",
|
||||
@ -89,7 +94,7 @@
|
||||
"compose_form.poll.remove_option": "Wahl entfernen",
|
||||
"compose_form.poll.switch_to_multiple": "Umfrage ändern, um mehrere Optionen zu erlauben",
|
||||
"compose_form.poll.switch_to_single": "Umfrage ändern, um eine einzige Wahl zu erlauben",
|
||||
"compose_form.publish": "Tröt",
|
||||
"compose_form.publish": "Beitrag",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.sensitive.hide": "Medien als heikel markieren",
|
||||
"compose_form.sensitive.marked": "Medien sind als heikel markiert",
|
||||
@ -113,7 +118,7 @@
|
||||
"confirmations.mute.explanation": "Dies wird Beiträge von dieser Person und Beiträge, die diese Person erwähnen, ausblenden, aber es wird der Person trotzdem erlauben, deine Beiträge zu sehen und dir zu folgen.",
|
||||
"confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?",
|
||||
"confirmations.redraft.confirm": "Löschen und neu erstellen",
|
||||
"confirmations.redraft.message": "Bist du dir sicher, dass du diesen Beitrag löschen und neu erstellen möchtest? Favorisierungen, geteilte Beiträge und Antworten werden verloren gehen.",
|
||||
"confirmations.redraft.message": "Bist du dir sicher, dass du diesen Beitrag löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Beitrag werden verwaist sein.",
|
||||
"confirmations.reply.confirm": "Antworten",
|
||||
"confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?",
|
||||
"confirmations.unfollow.confirm": "Entfolgen",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Erlauben",
|
||||
"follow_request.reject": "Ablehnen",
|
||||
"follow_requests.unlocked_explanation": "Auch wenn dein Konto nicht gesperrt ist, haben die Mitarbeiter von {domain} gedacht, dass es besser wäre den Follow manuell zu bestätigen.",
|
||||
"generic.saved": "Gespeichert",
|
||||
"getting_started.developers": "Entwickler",
|
||||
"getting_started.directory": "Profilverzeichnis",
|
||||
"getting_started.documentation": "Dokumentation",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "antworten",
|
||||
"keyboard_shortcuts.requests": "Liste der Folge-Anfragen öffnen",
|
||||
"keyboard_shortcuts.search": "Suche fokussieren",
|
||||
"keyboard_shortcuts.spoilers": "um CW-Feld anzuzeigen/auszublenden",
|
||||
"keyboard_shortcuts.start": "\"Erste Schritte\"-Spalte öffnen",
|
||||
"keyboard_shortcuts.toggle_hidden": "Text hinter einer Inhaltswarnung verstecken/anzeigen",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Medien hinter einer Inhaltswarnung verstecken/anzeigen",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# Minute} other {# Minuten}} verbleibend",
|
||||
"time_remaining.moments": "Schließt in Kürze",
|
||||
"time_remaining.seconds": "{number, plural, one {# Sekunde} other {# Sekunden}} verbleibend",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, eine {Person} other {Personen}} reden darüber",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} von anderen Servern werden nicht angezeigt.",
|
||||
"timeline_hint.resources.followers": "Follower",
|
||||
"timeline_hint.resources.follows": "Folgt",
|
||||
"timeline_hint.resources.statuses": "Ältere Toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} Person redet darüber} other {{counter} Personen reden darüber}}",
|
||||
"trends.trending_now": "In den Trends",
|
||||
"ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Zum Hochladen hereinziehen",
|
||||
"upload_button.label": "Mediendatei hinzufügen ({formats})",
|
||||
"upload_error.limit": "Dateiupload-Limit erreicht.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Beschreibe die Audiodatei für Menschen mit Hörschädigungen",
|
||||
"upload_form.description": "Für Menschen mit Sehbehinderung beschreiben",
|
||||
"upload_form.edit": "Bearbeiten",
|
||||
"upload_form.thumbnail": "Miniaturansicht ändern",
|
||||
"upload_form.undo": "Löschen",
|
||||
"upload_form.video_description": "Beschreibe das Video für Menschen mit einer Hör- oder Sehbehinderung",
|
||||
"upload_modal.analyzing_picture": "Analysiere Bild…",
|
||||
"upload_modal.apply": "Übernehmen",
|
||||
"upload_modal.choose_image": "Bild auswählen",
|
||||
"upload_modal.description_placeholder": "Die heiße Zypernsonne quälte Max und Victoria ja böse auf dem Weg bis zur Küste",
|
||||
"upload_modal.detect_text": "Text aus Bild erkennen",
|
||||
"upload_modal.edit_media": "Medien bearbeiten",
|
||||
|
@ -139,6 +139,23 @@
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/column_header.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"id": "account.statuses_counter"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"id": "account.following_counter"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"id": "account.followers_counter"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/common_counter.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
@ -172,8 +189,8 @@
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"id": "trends.count_by_accounts"
|
||||
"defaultMessage": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"id": "trends.counter_by_accounts"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/hashtag.json"
|
||||
@ -217,7 +234,7 @@
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Hide media",
|
||||
"defaultMessage": "Hide {number, plural, one {image} other {images}}",
|
||||
"id": "media_gallery.toggle_visible"
|
||||
},
|
||||
{
|
||||
@ -340,6 +357,23 @@
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/relative_timestamp.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "{count}K",
|
||||
"id": "units.short.thousand"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "{count}M",
|
||||
"id": "units.short.million"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "{count}B",
|
||||
"id": "units.short.billion"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/short_number.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
@ -496,6 +530,22 @@
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Public",
|
||||
"id": "privacy.public.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Unlisted",
|
||||
"id": "privacy.unlisted.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Followers-only",
|
||||
"id": "privacy.private.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Direct",
|
||||
"id": "privacy.direct.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Filtered",
|
||||
"id": "status.filtered"
|
||||
@ -511,6 +561,19 @@
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/status.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "{resource} from other servers are not displayed.",
|
||||
"id": "timeline_hint.remote_resource_not_displayed"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Browse more on the original profile",
|
||||
"id": "account.browse_more_on_origin_server"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/timeline_hint.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
@ -623,6 +686,10 @@
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Older toots",
|
||||
"id": "timeline_hint.resources.statuses"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Profile unavailable",
|
||||
"id": "empty_column.account_unavailable"
|
||||
@ -634,6 +701,23 @@
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/account_timeline/index.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Click to add a note",
|
||||
"id": "account_note.placeholder"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Saved",
|
||||
"id": "generic.saved"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Note",
|
||||
"id": "account.account_note_header"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/account/components/account_note.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
@ -787,18 +871,6 @@
|
||||
{
|
||||
"defaultMessage": "Group",
|
||||
"id": "account.badges.group"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Toots",
|
||||
"id": "account.posts"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Follows",
|
||||
"id": "account.follows"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Followers",
|
||||
"id": "account.followers"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/account/components/header.json"
|
||||
@ -1218,7 +1290,7 @@
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Add media ({formats})",
|
||||
"defaultMessage": "Add images, a video or an audio file",
|
||||
"id": "upload_button.label"
|
||||
}
|
||||
],
|
||||
@ -1571,6 +1643,10 @@
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Followers",
|
||||
"id": "timeline_hint.resources.followers"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Profile unavailable",
|
||||
"id": "empty_column.account_unavailable"
|
||||
@ -1584,6 +1660,10 @@
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Follows",
|
||||
"id": "timeline_hint.resources.follows"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Profile unavailable",
|
||||
"id": "empty_column.account_unavailable"
|
||||
@ -1949,6 +2029,10 @@
|
||||
"defaultMessage": "to start a brand new toot",
|
||||
"id": "keyboard_shortcuts.toot"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "to show/hide CW field",
|
||||
"id": "keyboard_shortcuts.spoilers"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "to navigate back",
|
||||
"id": "keyboard_shortcuts.back"
|
||||
@ -2458,6 +2542,31 @@
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Sensitive content",
|
||||
"id": "status.sensitive_warning"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/status/components/card.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "Public",
|
||||
"id": "privacy.public.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Unlisted",
|
||||
"id": "privacy.unlisted.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Followers-only",
|
||||
"id": "privacy.private.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Direct",
|
||||
"id": "privacy.direct.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "This post is only visible by other users of your instance",
|
||||
"id": "status.local_only"
|
||||
@ -2583,6 +2692,22 @@
|
||||
"defaultMessage": "Boost",
|
||||
"id": "status.reblog"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Public",
|
||||
"id": "privacy.public.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Unlisted",
|
||||
"id": "privacy.unlisted.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Followers-only",
|
||||
"id": "privacy.private.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Direct",
|
||||
"id": "privacy.direct.short"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "You can press {combo} to skip this next time",
|
||||
"id": "boost_modal.combo"
|
||||
@ -2677,6 +2802,10 @@
|
||||
"defaultMessage": "A quick brown fox jumps over the lazy dog",
|
||||
"id": "upload_modal.description_placeholder"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Choose image",
|
||||
"id": "upload_modal.choose_image"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Describe for people with hearing loss",
|
||||
"id": "upload_form.audio_description"
|
||||
@ -2697,6 +2826,10 @@
|
||||
"defaultMessage": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
|
||||
"id": "upload_modal.hint"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Change thumbnail",
|
||||
"id": "upload_form.thumbnail"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Analyzing picture…",
|
||||
"id": "upload_modal.analyzing_picture"
|
||||
@ -2992,10 +3125,6 @@
|
||||
"defaultMessage": "Exit full screen",
|
||||
"id": "video.exit_fullscreen"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Download file",
|
||||
"id": "video.download"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Sensitive content",
|
||||
"id": "status.sensitive_warning"
|
||||
@ -3007,4 +3136,4 @@
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/video/index.json"
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Σημείωση",
|
||||
"account.add_or_remove_from_list": "Προσθήκη ή Αφαίρεση από λίστες",
|
||||
"account.badges.bot": "Μποτ",
|
||||
"account.badges.group": "Ομάδα",
|
||||
"account.block": "Αποκλεισμός @{name}",
|
||||
"account.block_domain": "Απόκρυψη όλων από {domain}",
|
||||
"account.blocked": "Αποκλεισμένος/η",
|
||||
"account.browse_more_on_origin_server": "Δες περισσότερα στο αρχικό προφίλ",
|
||||
"account.cancel_follow_request": "Ακύρωση αιτήματος παρακολούθησης",
|
||||
"account.direct": "Προσωπικό μήνυμα προς @{name}",
|
||||
"account.domain_blocked": "Κρυμμένος τομέας",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Ακολούθησε",
|
||||
"account.followers": "Ακόλουθοι",
|
||||
"account.followers.empty": "Κανείς δεν ακολουθεί αυτό τον χρήστη ακόμα.",
|
||||
"account.follows": "Ακολουθεί",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Ακόλουθος} other {{counter} Ακόλουθοι}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Ακολουθεί}}",
|
||||
"account.follows.empty": "Αυτός ο χρήστης δεν ακολουθεί κανέναν ακόμα.",
|
||||
"account.follows_you": "Σε ακολουθεί",
|
||||
"account.hide_reblogs": "Απόκρυψη προωθήσεων από @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Εκκρεμεί έγκριση. Κάνε κλικ για να ακυρώσεις το αίτημα παρακολούθησης",
|
||||
"account.share": "Μοίρασμα του προφίλ @{name}",
|
||||
"account.show_reblogs": "Εμφάνιση προωθήσεων από @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Τουτ} other {{counter} Τουτ}}",
|
||||
"account.unblock": "Ξεμπλόκαρε @{name}",
|
||||
"account.unblock_domain": "Αποκάλυψε το {domain}",
|
||||
"account.unendorse": "Άνευ προβολής στο προφίλ",
|
||||
"account.unfollow": "Διακοπή παρακολούθησης",
|
||||
"account.unmute": "Διακοπή αποσιώπησης @{name}",
|
||||
"account.unmute_notifications": "Διακοπή αποσιώπησης ειδοποιήσεων του/της @{name}",
|
||||
"account_note.placeholder": "Κλικ για να βάλεις σημείωση",
|
||||
"alert.rate_limited.message": "Παρακαλούμε δοκίμασε ξανά αφού περάσει η {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Περιορισμός συχνότητας",
|
||||
"alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Εμφάνιση ρυθμίσεων",
|
||||
"column_header.unpin": "Ξεκαρφίτσωμα",
|
||||
"column_subheading.settings": "Ρυθμίσεις",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Τοπικά μόνο",
|
||||
"community.column_settings.media_only": "Μόνο πολυμέσα",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Απομακρυσμένα μόνο",
|
||||
"compose_form.direct_message_warning": "Αυτό το τουτ θα σταλεί μόνο στους αναφερόμενους χρήστες.",
|
||||
"compose_form.direct_message_warning_learn_more": "Μάθετε περισσότερα",
|
||||
"compose_form.hashtag_warning": "Αυτό το τουτ δεν θα εμφανίζεται κάτω από κανένα hashtag καθώς είναι αφανές. Μόνο τα δημόσια τουτ μπορούν να αναζητηθούν ανά hashtag.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Ενέκρινε",
|
||||
"follow_request.reject": "Απέρριψε",
|
||||
"follow_requests.unlocked_explanation": "Παρόλο που ο λογαριασμός σου δεν είναι κλειδωμένος, οι διαχειριστές του {domain} θεώρησαν πως ίσως να θέλεις να ελέγξεις χειροκίνητα αυτά τα αιτήματα ακολούθησης.",
|
||||
"generic.saved": "Αποθηκεύτηκε",
|
||||
"getting_started.developers": "Ανάπτυξη",
|
||||
"getting_started.directory": "Κατάλογος λογαριασμών",
|
||||
"getting_started.documentation": "Τεκμηρίωση",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "απάντηση",
|
||||
"keyboard_shortcuts.requests": "άνοιγμα λίστας αιτημάτων παρακολούθησης",
|
||||
"keyboard_shortcuts.search": "εστίαση αναζήτησης",
|
||||
"keyboard_shortcuts.spoilers": "εμφάνιση/απόκρυψη πεδίου CW",
|
||||
"keyboard_shortcuts.start": "άνοιγμα κολώνας \"Ξεκινώντας\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "εμφάνιση/απόκρυψη κειμένου πίσω από την προειδοποίηση",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "εμφάνιση/απόκρυψη πολυμέσων",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "απομένουν {number, plural, one {# λεπτό} other {# λεπτά}}",
|
||||
"time_remaining.moments": "Απομένουν στιγμές",
|
||||
"time_remaining.seconds": "απομένουν {number, plural, one {# δευτερόλεπτο} other {# δευτερόλεπτα}}",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {άτομο μιλάει} other {άτομα μιλάνε}}",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} από άλλους διακομιστές δεν εμφανίζονται.",
|
||||
"timeline_hint.resources.followers": "Ακόλουθοι",
|
||||
"timeline_hint.resources.follows": "Ακολουθεί",
|
||||
"timeline_hint.resources.statuses": "Παλαιότερα τουτ",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} άτομο μιλάει} other {{counter} άτομα μιλάνε}}",
|
||||
"trends.trending_now": "Δημοφιλή τώρα",
|
||||
"ui.beforeunload": "Το προσχέδιό σου θα χαθεί αν φύγεις από το Mastodon.",
|
||||
"units.short.billion": "{count}Δ",
|
||||
"units.short.million": "{count}Ε",
|
||||
"units.short.thousand": "{count}Χ",
|
||||
"upload_area.title": "Drag & drop για να ανεβάσεις",
|
||||
"upload_button.label": "Πρόσθεσε πολυμέσα ({formats})",
|
||||
"upload_error.limit": "Υπέρβαση ορίου μεγέθους ανεβασμένων αρχείων.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Περιγραφή για άτομα με προβλήματα ακοής",
|
||||
"upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης",
|
||||
"upload_form.edit": "Ενημέρωση",
|
||||
"upload_form.thumbnail": "Αλλαγή μικρογραφίας",
|
||||
"upload_form.undo": "Διαγραφή",
|
||||
"upload_form.video_description": "Περιγραφή για άτομα με προβλήματα ακοής ή όρασης",
|
||||
"upload_modal.analyzing_picture": "Ανάλυση εικόνας…",
|
||||
"upload_modal.apply": "Εφαρμογή",
|
||||
"upload_modal.choose_image": "Επιλογή εικόνας",
|
||||
"upload_modal.description_placeholder": "Λύκος μαύρος και ισχνός του πατέρα του καημός",
|
||||
"upload_modal.detect_text": "Αναγνώριση κειμένου από την εικόνα",
|
||||
"upload_modal.edit_media": "Επεξεργασία Πολυμέσων",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Block @{name}",
|
||||
"account.block_domain": "Block domain {domain}",
|
||||
"account.blocked": "Blocked",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.direct": "Direct message @{name}",
|
||||
"account.domain_blocked": "Domain blocked",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Follow",
|
||||
"account.followers": "Followers",
|
||||
"account.followers.empty": "No one follows this user yet.",
|
||||
"account.follows": "Follows",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "This user doesn't follow anyone yet.",
|
||||
"account.follows_you": "Follows you",
|
||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Awaiting approval. Click to cancel follow request",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Show boosts from @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Unblock @{name}",
|
||||
"account.unblock_domain": "Unblock domain {domain}",
|
||||
"account.unendorse": "Don't feature on profile",
|
||||
"account.unfollow": "Unfollow",
|
||||
"account.unmute": "Unmute @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "Click to add note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "An unexpected error occurred.",
|
||||
@ -102,7 +107,7 @@
|
||||
"confirmations.block.confirm": "Block",
|
||||
"confirmations.block.message": "Are you sure you want to block {name}?",
|
||||
"confirmations.delete.confirm": "Delete",
|
||||
"confirmations.delete.message": "Are you sure you want to delete this status?",
|
||||
"confirmations.delete.message": "Are you sure you want to delete this toot?",
|
||||
"confirmations.delete_list.confirm": "Delete",
|
||||
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
|
||||
"confirmations.domain_block.confirm": "Block entire domain",
|
||||
@ -113,7 +118,7 @@
|
||||
"confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
|
||||
"confirmations.mute.message": "Are you sure you want to mute {name}?",
|
||||
"confirmations.redraft.confirm": "Delete & redraft",
|
||||
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
|
||||
"confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
|
||||
"confirmations.reply.confirm": "Reply",
|
||||
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
|
||||
"confirmations.unfollow.confirm": "Unfollow",
|
||||
@ -126,7 +131,7 @@
|
||||
"directory.local": "From {domain} only",
|
||||
"directory.new_arrivals": "New arrivals",
|
||||
"directory.recently_active": "Recently active",
|
||||
"embed.instructions": "Embed this status on your website by copying the code below.",
|
||||
"embed.instructions": "Embed this toot on your website by copying the code below.",
|
||||
"embed.preview": "Here is what it will look like:",
|
||||
"emoji_button.activity": "Activity",
|
||||
"emoji_button.custom": "Custom",
|
||||
@ -155,7 +160,7 @@
|
||||
"empty_column.hashtag": "There is nothing in this hashtag yet.",
|
||||
"empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
|
||||
"empty_column.home.public_timeline": "the public timeline",
|
||||
"empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
|
||||
"empty_column.list": "There is nothing in this list yet. When members of this list post new toots, they will appear here.",
|
||||
"empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
|
||||
"empty_column.mutes": "You haven't muted any users yet.",
|
||||
"empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Authorize",
|
||||
"follow_request.reject": "Reject",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -217,12 +223,12 @@
|
||||
"keyboard_shortcuts.back": "to navigate back",
|
||||
"keyboard_shortcuts.blocked": "to open blocked users list",
|
||||
"keyboard_shortcuts.boost": "to boost",
|
||||
"keyboard_shortcuts.column": "to focus a status in one of the columns",
|
||||
"keyboard_shortcuts.column": "to focus a toot in one of the columns",
|
||||
"keyboard_shortcuts.compose": "to focus the compose textarea",
|
||||
"keyboard_shortcuts.description": "Description",
|
||||
"keyboard_shortcuts.direct": "to open direct messages column",
|
||||
"keyboard_shortcuts.down": "to move down in the list",
|
||||
"keyboard_shortcuts.enter": "to open status",
|
||||
"keyboard_shortcuts.enter": "to open toot",
|
||||
"keyboard_shortcuts.favourite": "to favourite",
|
||||
"keyboard_shortcuts.favourites": "to open favourites list",
|
||||
"keyboard_shortcuts.federated": "to open federated timeline",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -262,7 +269,7 @@
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "Loading...",
|
||||
"media_gallery.toggle_visible": "Hide media",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "Not found",
|
||||
"missing_indicator.sublabel": "This resource could not be found",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
@ -289,13 +296,13 @@
|
||||
"navigation_bar.preferences": "Preferences",
|
||||
"navigation_bar.public_timeline": "Federated timeline",
|
||||
"navigation_bar.security": "Security",
|
||||
"notification.favourite": "{name} favourited your status",
|
||||
"notification.favourite": "{name} favourited your toot",
|
||||
"notification.follow": "{name} followed you",
|
||||
"notification.follow_request": "{name} has requested to follow you",
|
||||
"notification.mention": "{name} mentioned you",
|
||||
"notification.own_poll": "Your poll has ended",
|
||||
"notification.poll": "A poll you have voted in has ended",
|
||||
"notification.reblog": "{name} boosted your status",
|
||||
"notification.reblog": "{name} boosted your toot",
|
||||
"notifications.clear": "Clear notifications",
|
||||
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
|
||||
"notifications.column_settings.alert": "Desktop notifications",
|
||||
@ -326,7 +333,7 @@
|
||||
"poll.voted": "You voted for this answer",
|
||||
"poll_button.add_poll": "Add a poll",
|
||||
"poll_button.remove_poll": "Remove poll",
|
||||
"privacy.change": "Adjust status privacy",
|
||||
"privacy.change": "Adjust toot privacy",
|
||||
"privacy.direct.long": "Visible for mentioned users only",
|
||||
"privacy.direct.short": "Direct",
|
||||
"privacy.private.long": "Visible for followers only",
|
||||
@ -353,9 +360,9 @@
|
||||
"report.target": "Reporting {target}",
|
||||
"search.placeholder": "Search",
|
||||
"search_popout.search_format": "Advanced search format",
|
||||
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||
"search_popout.tips.full_text": "Simple text returns toots you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||
"search_popout.tips.hashtag": "hashtag",
|
||||
"search_popout.tips.status": "status",
|
||||
"search_popout.tips.status": "toot",
|
||||
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||
"search_popout.tips.user": "user",
|
||||
"search_results.accounts": "People",
|
||||
@ -364,12 +371,12 @@
|
||||
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
|
||||
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
|
||||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_status": "Open this status in the moderation interface",
|
||||
"status.admin_status": "Open this toot in the moderation interface",
|
||||
"status.block": "Block @{name}",
|
||||
"status.bookmark": "Bookmark",
|
||||
"status.cancel_reblog_private": "Unboost",
|
||||
"status.cannot_reblog": "This post cannot be boosted",
|
||||
"status.copy": "Copy link to status",
|
||||
"status.copy": "Copy link to toot",
|
||||
"status.delete": "Delete",
|
||||
"status.detailed_status": "Detailed conversation view",
|
||||
"status.direct": "Direct message @{name}",
|
||||
@ -383,7 +390,7 @@
|
||||
"status.more": "More",
|
||||
"status.mute": "Mute @{name}",
|
||||
"status.mute_conversation": "Mute conversation",
|
||||
"status.open": "Expand this status",
|
||||
"status.open": "Expand this toot",
|
||||
"status.pin": "Pin on profile",
|
||||
"status.pinned": "Pinned toot",
|
||||
"status.read_more": "Read more",
|
||||
@ -418,20 +425,29 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Noto",
|
||||
"account.add_or_remove_from_list": "Aldoni al aŭ forigi el listoj",
|
||||
"account.badges.bot": "Roboto",
|
||||
"account.badges.group": "Grupo",
|
||||
"account.block": "Bloki @{name}",
|
||||
"account.block_domain": "Kaŝi ĉion de {domain}",
|
||||
"account.blocked": "Blokita",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Nuligi peton de sekvado",
|
||||
"account.direct": "Rekte mesaĝi @{name}",
|
||||
"account.domain_blocked": "Domajno kaŝita",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Sekvi",
|
||||
"account.followers": "Sekvantoj",
|
||||
"account.followers.empty": "Ankoraŭ neniu sekvas tiun uzanton.",
|
||||
"account.follows": "Sekvatoj",
|
||||
"account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}",
|
||||
"account.following_counter": "{count, plural, other{{counter} Sekvi}}",
|
||||
"account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.",
|
||||
"account.follows_you": "Sekvas vin",
|
||||
"account.hide_reblogs": "Kaŝi diskonigojn de @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Atendo de aprobo. Alklaku por nuligi peton de sekvado",
|
||||
"account.share": "Diskonigi la profilon de @{name}",
|
||||
"account.show_reblogs": "Montri diskonigojn de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Tooto} other {{counter} Tootoj}}",
|
||||
"account.unblock": "Malbloki @{name}",
|
||||
"account.unblock_domain": "Malkaŝi {domain}",
|
||||
"account.unendorse": "Ne montri en profilo",
|
||||
"account.unfollow": "Ne plu sekvi",
|
||||
"account.unmute": "Malsilentigi @{name}",
|
||||
"account.unmute_notifications": "Malsilentigi sciigojn de @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Bonvolu reprovi post {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Mesaĝkvante limigita",
|
||||
"alert.unexpected.message": "Neatendita eraro okazis.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Montri agordojn",
|
||||
"column_header.unpin": "Depingli",
|
||||
"column_subheading.settings": "Agordado",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Nur loka",
|
||||
"community.column_settings.media_only": "Nur aŭdovidaĵoj",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Nur malproksima",
|
||||
"compose_form.direct_message_warning": "Tiu mesaĝo estos sendita nur al menciitaj uzantoj.",
|
||||
"compose_form.direct_message_warning_learn_more": "Lerni pli",
|
||||
"compose_form.hashtag_warning": "Ĉi tiu mesaĝo ne estos listigita per ajna kradvorto. Nur publikaj mesaĝoj estas serĉeblaj per kradvortoj.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Rajtigi",
|
||||
"follow_request.reject": "Rifuzi",
|
||||
"follow_requests.unlocked_explanation": "137/5000\nKvankam via konto ne estas ŝlosita, la dungitaro de {domain} opiniis, ke vi eble volus revizii petojn de sekvadon el ĉi tiuj kontoj permane.",
|
||||
"generic.saved": "Konservita",
|
||||
"getting_started.developers": "Programistoj",
|
||||
"getting_started.directory": "Profilujo",
|
||||
"getting_started.documentation": "Dokumentado",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "respondi",
|
||||
"keyboard_shortcuts.requests": "malfermi la liston de petoj de sekvado",
|
||||
"keyboard_shortcuts.search": "enfokusigi la serĉilon",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "malfermi la kolumnon «por komenci»",
|
||||
"keyboard_shortcuts.toggle_hidden": "montri/kaŝi tekston malantaŭ enhava averto",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "montri/kaŝi aŭdovidaĵojn",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minuto} other {# minutoj}} restas",
|
||||
"time_remaining.moments": "Momenteto restas",
|
||||
"time_remaining.seconds": "{number, plural, one {# sekundo} other {# sekundoj}} restas",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {persono} other {personoj}} parolas",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Sekvantoj",
|
||||
"timeline_hint.resources.follows": "Sekvatoj",
|
||||
"timeline_hint.resources.statuses": "Pli malnovaj tootoj",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persono} other {{counter} personoj}} parolante",
|
||||
"trends.trending_now": "Nunaj furoraĵoj",
|
||||
"ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Altreni kaj lasi por alŝuti",
|
||||
"upload_button.label": "Aldoni aŭdovidaĵon (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Limo de dosiera alŝutado transpasita.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Priskribi por homoj kiuj malfacile aŭdi",
|
||||
"upload_form.description": "Priskribi por misvidantaj homoj",
|
||||
"upload_form.edit": "Redakti",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Forigi",
|
||||
"upload_form.video_description": "Priskribi por homoj kiuj malfacile aŭdi aŭ vidi",
|
||||
"upload_modal.analyzing_picture": "Bilda analizado…",
|
||||
"upload_modal.apply": "Apliki",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj",
|
||||
"upload_modal.detect_text": "Detekti tekston de la bildo",
|
||||
"upload_modal.edit_media": "Redakti aŭdovidaĵon",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Tu nota para @{name}",
|
||||
"account.add_or_remove_from_list": "Agregar o quitar de las listas",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Grupo",
|
||||
"account.block": "Bloquear a @{name}",
|
||||
"account.block_domain": "Ocultar todo de {domain}",
|
||||
"account.blocked": "Bloqueado",
|
||||
"account.browse_more_on_origin_server": "Explorar más en el perfil original",
|
||||
"account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
|
||||
"account.direct": "Mensaje directo a @{name}",
|
||||
"account.domain_blocked": "Dominio oculto",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Seguir",
|
||||
"account.followers": "Seguidores",
|
||||
"account.followers.empty": "Todavía nadie sigue a este usuario.",
|
||||
"account.follows": "Sigue",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Siguiendo}}",
|
||||
"account.follows.empty": "Todavía este usuario no sigue a nadie.",
|
||||
"account.follows_you": "Te sigue",
|
||||
"account.hide_reblogs": "Ocultar retoots de @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Esperando aprobación. Hacé clic para cancelar la solicitud de seguimiento.",
|
||||
"account.share": "Compartir el perfil de @{name}",
|
||||
"account.show_reblogs": "Mostrar retoots de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Desbloquear a @{name}",
|
||||
"account.unblock_domain": "Mostrar {domain}",
|
||||
"account.unendorse": "No destacar en el perfil",
|
||||
"account.unfollow": "Dejar de seguir",
|
||||
"account.unmute": "Dejar de silenciar a @{name}",
|
||||
"account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
|
||||
"account_note.placeholder": "No se ofreció ningún comentario",
|
||||
"alert.rate_limited.message": "Por favor, reintentá después de las {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Tarifa limitada",
|
||||
"alert.unexpected.message": "Ocurrió un error.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Mostrar configuración",
|
||||
"column_header.unpin": "Dejar de fijar",
|
||||
"column_subheading.settings": "Configuración",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Sólo local",
|
||||
"community.column_settings.media_only": "Sólo medios",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Sólo remoto",
|
||||
"compose_form.direct_message_warning": "Este toot sólo será enviado a los usuarios mencionados.",
|
||||
"compose_form.direct_message_warning_learn_more": "Aprendé más",
|
||||
"compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Autorizar",
|
||||
"follow_request.reject": "Rechazar",
|
||||
"follow_requests.unlocked_explanation": "A pesar de que tu cuenta no está bloqueada, el equipo de {domain} pensó que podrías querer revisar manualmente las solicitudes de seguimiento de estas cuentas.",
|
||||
"generic.saved": "Guardado",
|
||||
"getting_started.developers": "Desarrolladores",
|
||||
"getting_started.directory": "Directorio de perfiles",
|
||||
"getting_started.documentation": "Documentación",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "para responder",
|
||||
"keyboard_shortcuts.requests": "para abrir la lista de solicitudes de seguimiento",
|
||||
"keyboard_shortcuts.search": "para enfocar la búsqueda",
|
||||
"keyboard_shortcuts.spoilers": "para mostrar/ocultar el campo \"CW\"",
|
||||
"keyboard_shortcuts.start": "para abrir la columna \"Introducción\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "para mostrar/ocultar el texto detrás de la advertencia de contenido",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "para mostrar/ocultar los medios",
|
||||
@ -412,9 +419,16 @@
|
||||
"time_remaining.minutes": "{number, plural,one {queda # minuto} other {quedan # minutos}}",
|
||||
"time_remaining.moments": "Momentos restantes",
|
||||
"time_remaining.seconds": "{number, plural,one {queda # segundo} other {quedan # segundos}}",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {personas}} hablando",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} de otros servidores no se muestran.",
|
||||
"timeline_hint.resources.followers": "Seguidores",
|
||||
"timeline_hint.resources.follows": "Siguiendo",
|
||||
"timeline_hint.resources.statuses": "Toots antiguos",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} hablando",
|
||||
"trends.trending_now": "Tendencia ahora",
|
||||
"ui.beforeunload": "Tu borrador se perderá si abandonás Mastodon.",
|
||||
"units.short.billion": "{count}MM",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}mil",
|
||||
"upload_area.title": "Para subir, arrastrá y soltá",
|
||||
"upload_button.label": "Agregar medios ({formats})",
|
||||
"upload_error.limit": "Se excedió el límite de subida de archivos.",
|
||||
@ -422,10 +436,12 @@
|
||||
"upload_form.audio_description": "Describir para personas con problemas auditivos",
|
||||
"upload_form.description": "Agregar descripción para los usuarios con dificultades visuales",
|
||||
"upload_form.edit": "Editar",
|
||||
"upload_form.thumbnail": "Cambiar miniatura",
|
||||
"upload_form.undo": "Eliminar",
|
||||
"upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
|
||||
"upload_modal.analyzing_picture": "Analizando imagen…",
|
||||
"upload_modal.apply": "Aplicar",
|
||||
"upload_modal.choose_image": "Elegir imagen",
|
||||
"upload_modal.description_placeholder": "El veloz murciélago hindú comía feliz cardillo y kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja.",
|
||||
"upload_modal.detect_text": "Detectar texto de la imagen",
|
||||
"upload_modal.edit_media": "Editar medio",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Nota",
|
||||
"account.add_or_remove_from_list": "Agregar o eliminar de listas",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Grupo",
|
||||
"account.block": "Bloquear a @{name}",
|
||||
"account.block_domain": "Ocultar todo de {domain}",
|
||||
"account.blocked": "Bloqueado",
|
||||
"account.browse_more_on_origin_server": "Ver más en el perfil original",
|
||||
"account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
|
||||
"account.direct": "Mensaje directo a @{name}",
|
||||
"account.domain_blocked": "Dominio oculto",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Seguir",
|
||||
"account.followers": "Seguidores",
|
||||
"account.followers.empty": "Todavía nadie sigue a este usuario.",
|
||||
"account.follows": "Sigue",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Siguiendo}}",
|
||||
"account.follows.empty": "Este usuario todavía no sigue a nadie.",
|
||||
"account.follows_you": "Te sigue",
|
||||
"account.hide_reblogs": "Ocultar retoots de @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Esperando aprobación",
|
||||
"account.share": "Compartir el perfil de @{name}",
|
||||
"account.show_reblogs": "Mostrar retoots de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Desbloquear a @{name}",
|
||||
"account.unblock_domain": "Mostrar a {domain}",
|
||||
"account.unendorse": "No mostrar en el perfil",
|
||||
"account.unfollow": "Dejar de seguir",
|
||||
"account.unmute": "Dejar de silenciar a @{name}",
|
||||
"account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
|
||||
"account_note.placeholder": "Clic para añadir nota",
|
||||
"alert.rate_limited.message": "Por favor reintente después de {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Tarifa limitada",
|
||||
"alert.unexpected.message": "Hubo un error inesperado.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Mostrar ajustes",
|
||||
"column_header.unpin": "Dejar de fijar",
|
||||
"column_subheading.settings": "Ajustes",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Solo local",
|
||||
"community.column_settings.media_only": "Solo media",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Solo remoto",
|
||||
"compose_form.direct_message_warning": "Este toot solo será enviado a los usuarios mencionados.",
|
||||
"compose_form.direct_message_warning_learn_more": "Aprender mas",
|
||||
"compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Autorizar",
|
||||
"follow_request.reject": "Rechazar",
|
||||
"follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.",
|
||||
"generic.saved": "Guardado",
|
||||
"getting_started.developers": "Desarrolladores",
|
||||
"getting_started.directory": "Directorio de perfil",
|
||||
"getting_started.documentation": "Documentación",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "para responder",
|
||||
"keyboard_shortcuts.requests": "abrir la lista de peticiones de seguidores",
|
||||
"keyboard_shortcuts.search": "para poner el foco en la búsqueda",
|
||||
"keyboard_shortcuts.spoilers": "para mostrar/ocultar el campo CW",
|
||||
"keyboard_shortcuts.start": "abrir la columna \"comenzar\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "mostrar/ocultar texto tras aviso de contenido (CW)",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar medios",
|
||||
@ -394,7 +401,7 @@
|
||||
"status.redraft": "Borrar y volver a borrador",
|
||||
"status.remove_bookmark": "Eliminar marcador",
|
||||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder al hilo",
|
||||
"status.replyAll": "Responder al hilván",
|
||||
"status.report": "Reportar",
|
||||
"status.sensitive_warning": "Contenido sensible",
|
||||
"status.share": "Compartir",
|
||||
@ -402,7 +409,7 @@
|
||||
"status.show_less_all": "Mostrar menos para todo",
|
||||
"status.show_more": "Mostrar más",
|
||||
"status.show_more_all": "Mostrar más para todo",
|
||||
"status.show_thread": "Ver hilo",
|
||||
"status.show_thread": "Mostrar hilván",
|
||||
"status.uncached_media_warning": "No disponible",
|
||||
"status.unmute_conversation": "Dejar de silenciar conversación",
|
||||
"status.unpin": "Dejar de fijar",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minuto restante} other {# minutos restantes}}",
|
||||
"time_remaining.moments": "Momentos restantes",
|
||||
"time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {personas}} hablando",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} de otros servidores no se muestran.",
|
||||
"timeline_hint.resources.followers": "Seguidores",
|
||||
"timeline_hint.resources.follows": "Seguidos",
|
||||
"timeline_hint.resources.statuses": "Toots más antiguos",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} hablando",
|
||||
"trends.trending_now": "Tendencia ahora",
|
||||
"ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.",
|
||||
"units.short.billion": "{count}MM",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}mil",
|
||||
"upload_area.title": "Arrastra y suelta para subir",
|
||||
"upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Límite de subida de archivos excedido.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Describir para personas con problemas auditivos",
|
||||
"upload_form.description": "Describir para los usuarios con dificultad visual",
|
||||
"upload_form.edit": "Editar",
|
||||
"upload_form.thumbnail": "Cambiar miniatura",
|
||||
"upload_form.undo": "Borrar",
|
||||
"upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
|
||||
"upload_modal.analyzing_picture": "Analizando imagen…",
|
||||
"upload_modal.apply": "Aplicar",
|
||||
"upload_modal.choose_image": "Elegir imagen",
|
||||
"upload_modal.description_placeholder": "Un rápido zorro marrón salta sobre el perro perezoso",
|
||||
"upload_modal.detect_text": "Detectar texto de la imagen",
|
||||
"upload_modal.edit_media": "Editar multimedia",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Lisa või Eemalda nimekirjadest",
|
||||
"account.badges.bot": "Robot",
|
||||
"account.badges.group": "Grupp",
|
||||
"account.block": "Blokeeri @{name}",
|
||||
"account.block_domain": "Peida kõik domeenist {domain}",
|
||||
"account.blocked": "Blokeeritud",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Tühista jälgimistaotlus",
|
||||
"account.direct": "Otsesõnum @{name}",
|
||||
"account.domain_blocked": "Domeen peidetud",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Jälgi",
|
||||
"account.followers": "Jälgijad",
|
||||
"account.followers.empty": "Keegi ei jälgi seda kasutajat veel.",
|
||||
"account.follows": "Jälgib",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
|
||||
"account.follows_you": "Jälgib Teid",
|
||||
"account.hide_reblogs": "Peida upitused kasutajalt @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Ootab kinnitust. Klõpsa jälgimise soovi tühistamiseks",
|
||||
"account.share": "Jaga @{name} profiili",
|
||||
"account.show_reblogs": "Näita kasutaja @{name} upitusi",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Eemalda blokeering @{name}",
|
||||
"account.unblock_domain": "Tee {domain} nähtavaks",
|
||||
"account.unendorse": "Ära kuva profiilil",
|
||||
"account.unfollow": "Ära jälgi",
|
||||
"account.unmute": "Ära vaigista @{name}",
|
||||
"account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Palun proovi uuesti pärast {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Piiratud",
|
||||
"alert.unexpected.message": "Tekkis ootamatu viga.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Näita sätteid",
|
||||
"column_header.unpin": "Eemalda kinnitus",
|
||||
"column_subheading.settings": "Sätted",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Ainult kohalik",
|
||||
"community.column_settings.media_only": "Ainult meedia",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Ainult kaug",
|
||||
"compose_form.direct_message_warning": "See tuut saadetakse ainult mainitud kasutajatele.",
|
||||
"compose_form.direct_message_warning_learn_more": "Vaata veel",
|
||||
"compose_form.hashtag_warning": "Seda tuuti ei kuvata ühegi sildi all, sest see on kirjendamata. Ainult avalikud tuutid on sildi järgi otsitavad.",
|
||||
@ -166,7 +171,8 @@
|
||||
"errors.unexpected_crash.report_issue": "Teavita veast",
|
||||
"follow_request.authorize": "Autoriseeri",
|
||||
"follow_request.reject": "Hülga",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"follow_requests.unlocked_explanation": "Kuigi Teie konto pole lukustatud, soovitab {domain} personal siiski manuaalselt üle vaadata jälgimistaotlused nendelt kontodelt.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Arendajad",
|
||||
"getting_started.directory": "Profiili kataloog",
|
||||
"getting_started.documentation": "Dokumentatsioon",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "vastamiseks",
|
||||
"keyboard_shortcuts.requests": "avamaks jälgimistaotluste nimistut",
|
||||
"keyboard_shortcuts.search": "otsingu fokuseerimiseks",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "avamaks \"Alusta\" tulpa",
|
||||
"keyboard_shortcuts.toggle_hidden": "näitamaks/peitmaks teksti CW taga",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "et peita/näidata meediat",
|
||||
@ -412,9 +419,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} left",
|
||||
"time_remaining.moments": "Hetked jäänud",
|
||||
"time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {inimene} other {inimesed}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Praegu populaarne",
|
||||
"ui.beforeunload": "Teie mustand läheb kaotsi, kui lahkute Mastodonist.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Lohista & aseta üleslaadimiseks",
|
||||
"upload_button.label": "Lisa meedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Faili üleslaadimise limiit ületatud.",
|
||||
@ -422,10 +436,12 @@
|
||||
"upload_form.audio_description": "Kirjelda kuulmispuudega inimeste jaoks",
|
||||
"upload_form.description": "Kirjelda vaegnägijatele",
|
||||
"upload_form.edit": "Redigeeri",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Kustuta",
|
||||
"upload_form.video_description": "Kirjelda kuulmis- või nägemispuudega inimeste jaoks",
|
||||
"upload_modal.analyzing_picture": "Analüüsime pilti…",
|
||||
"upload_modal.apply": "Rakenda",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "Kiire pruun rebane hüppab üle laisa koera",
|
||||
"upload_modal.detect_text": "Tuvasta teksti pildilt",
|
||||
"upload_modal.edit_media": "Muuda meediat",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Gehitu edo kendu zerrendetatik",
|
||||
"account.badges.bot": "Bot-a",
|
||||
"account.badges.group": "Taldea",
|
||||
"account.block": "Blokeatu @{name}",
|
||||
"account.block_domain": "Ezkutatu {domain} domeinuko guztia",
|
||||
"account.blocked": "Blokeatuta",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Ezeztatu jarraitzeko eskaria",
|
||||
"account.direct": "Mezu zuzena @{name}(r)i",
|
||||
"account.domain_blocked": "Ezkutatutako domeinua",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Jarraitu",
|
||||
"account.followers": "Jarraitzaileak",
|
||||
"account.followers.empty": "Ez du inork erabiltzaile hau jarraitzen oraindik.",
|
||||
"account.follows": "Jarraitzen",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Erabiltzaile honek ez du inor jarraitzen oraindik.",
|
||||
"account.follows_you": "Jarraitzen dizu",
|
||||
"account.hide_reblogs": "Ezkutatu @{name}(r)en bultzadak",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Onarpenaren zain. Klikatu jarraitzeko eskaera ezeztatzeko",
|
||||
"account.share": "@{name}(e)ren profila elkarbanatu",
|
||||
"account.show_reblogs": "Erakutsi @{name}(r)en bultzadak",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Desblokeatu @{name}",
|
||||
"account.unblock_domain": "Berriz erakutsi {domain}",
|
||||
"account.unendorse": "Ez nabarmendu profilean",
|
||||
"account.unfollow": "Utzi jarraitzeari",
|
||||
"account.unmute": "Desmututu @{name}",
|
||||
"account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Saiatu {retry_time, time, medium} barru.",
|
||||
"alert.rate_limited.title": "Abiadura mugatua",
|
||||
"alert.unexpected.message": "Ustekabeko errore bat gertatu da.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Erakutsi ezarpenak",
|
||||
"column_header.unpin": "Desfinkatu",
|
||||
"column_subheading.settings": "Ezarpenak",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Lokala soilik",
|
||||
"community.column_settings.media_only": "Multimedia besterik ez",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Urrunekoa soilik",
|
||||
"compose_form.direct_message_warning": "Toot hau aipatutako erabiltzaileei besterik ez zaie bidaliko.",
|
||||
"compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
|
||||
"compose_form.hashtag_warning": "Toot hau ez da traoletan agertuko zerrendatu gabekoa baita. Traoletan toot publikoak besterik ez dira agertzen.",
|
||||
@ -171,7 +176,8 @@
|
||||
"federation.local_only.short": "Local-only",
|
||||
"follow_request.authorize": "Baimendu",
|
||||
"follow_request.reject": "Ukatu",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"follow_requests.unlocked_explanation": "Zure kontua blokeatuta ez badago ere, {domain} domeinuko arduradunek uste dute kontu hauetako jarraipen eskariak agian eskuz begiratu nahiko dituzula.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Garatzaileak",
|
||||
"getting_started.directory": "Profil-direktorioa",
|
||||
"getting_started.documentation": "Dokumentazioa",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "erantzutea",
|
||||
"keyboard_shortcuts.requests": "jarraitzeko eskarien zerrenda irekitzeko",
|
||||
"keyboard_shortcuts.search": "bilaketan fokua jartzea",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "\"Menua\" zutabea irekitzeko",
|
||||
"keyboard_shortcuts.toggle_hidden": "testua erakustea/ezkutatzea abisu baten atzean",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "multimedia erakutsi/ezkutatzeko",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {minutu #} other {# minutu}} amaitzeko",
|
||||
"time_remaining.moments": "Amaitzekotan",
|
||||
"time_remaining.seconds": "{number, plural, one {segundo #} other {# segundo}} amaitzeko",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {pertsona} other {pertsona}} hitz egiten",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Joera orain",
|
||||
"ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Arrastatu eta jaregin igotzeko",
|
||||
"upload_button.label": "Gehitu multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Fitxategi igoera muga gaindituta.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Deskribatu entzumen galera duten pertsonentzat",
|
||||
"upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat",
|
||||
"upload_form.edit": "Editatu",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Ezabatu",
|
||||
"upload_form.video_description": "Deskribatu entzumen galera edo ikusmen urritasuna duten pertsonentzat",
|
||||
"upload_modal.analyzing_picture": "Irudia aztertzen…",
|
||||
"upload_modal.apply": "Aplikatu",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "Vaudeville itxurako filmean yogi ñaño bat jipoitzen dute Quebec-en whiski truk",
|
||||
"upload_modal.detect_text": "Antzeman testua iruditik",
|
||||
"upload_modal.edit_media": "Editatu media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "یادداشت",
|
||||
"account.add_or_remove_from_list": "افزودن یا برداشتن از فهرستها",
|
||||
"account.badges.bot": "ربات",
|
||||
"account.badges.group": "گروه",
|
||||
"account.block": "مسدودسازی @{name}",
|
||||
"account.block_domain": "نهفتن همه چیز از {domain}",
|
||||
"account.blocked": "مسدود",
|
||||
"account.browse_more_on_origin_server": "مرور بیشتر روی نمایهٔ اصلی",
|
||||
"account.cancel_follow_request": "لغو درخواست پیگیری",
|
||||
"account.direct": "پیام خصوصی به @{name}",
|
||||
"account.domain_blocked": "دامنهٔ نهفته",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "پی بگیرید",
|
||||
"account.followers": "پیگیران",
|
||||
"account.followers.empty": "هنوز کسی پیگیر این کاربر نیست.",
|
||||
"account.follows": "پی میگیرد",
|
||||
"account.followers_counter": "{count, plural, one {{counter} پیگیر} other {{counter} پیگیر}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} پی میگیرد}}",
|
||||
"account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
|
||||
"account.follows_you": "پیگیر شماست",
|
||||
"account.hide_reblogs": "نهفتن بازبوقهای @{name}",
|
||||
@ -27,18 +30,20 @@
|
||||
"account.mute_notifications": "خموشاندن اعلانها از @{name}",
|
||||
"account.muted": "خموش",
|
||||
"account.never_active": "هرگز",
|
||||
"account.posts": "نوشتهها",
|
||||
"account.posts": "بوق",
|
||||
"account.posts_with_replies": "نوشتهها و پاسخها",
|
||||
"account.report": "گزارش @{name}",
|
||||
"account.requested": "منتظر پذیرش. برای لغو درخواست پیگیری کلیک کنید",
|
||||
"account.share": "همرسانی نمایهٔ @{name}",
|
||||
"account.show_reblogs": "نمایش بازبوقهای @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} بوق} other {{counter} بوق}}",
|
||||
"account.unblock": "رفع انسداد @{name}",
|
||||
"account.unblock_domain": "رفع نهفتن {domain}",
|
||||
"account.unendorse": "معرّفی نکردن در نمایه",
|
||||
"account.unfollow": "پایان پیگیری",
|
||||
"account.unmute": "رفع خموشی @{name}",
|
||||
"account.unmute_notifications": "رفع خموشی اعلانها از @{name}",
|
||||
"account_note.placeholder": "نظری فراهم نشده",
|
||||
"alert.rate_limited.message": "لطفاً پس از {retry_time, time, medium} دوباره بیازمایید.",
|
||||
"alert.rate_limited.title": "محدودیت تعداد",
|
||||
"alert.unexpected.message": "خطایی غیرمنتظره رخ داد.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "نمایش تنظیمات",
|
||||
"column_header.unpin": "رهاکردن",
|
||||
"column_subheading.settings": "تنظیمات",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "تنها بومی",
|
||||
"community.column_settings.media_only": "فقط رسانه",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "تنها دوردست",
|
||||
"compose_form.direct_message_warning": "این بوق تنها به کاربرانی که از آنها نام برده شده فرستاده خواهد شد.",
|
||||
"compose_form.direct_message_warning_learn_more": "بیشتر بدانید",
|
||||
"compose_form.hashtag_warning": "از آنجا که این بوق فهرستنشده است، در نتایج جستوجوی هشتگها پیدا نخواهد شد. تنها بوقهای عمومی را میتوان با جستوجوی هشتگ یافت.",
|
||||
@ -107,7 +112,7 @@
|
||||
"confirmations.delete_list.message": "مطمئنید میخواهید این فهرست را برای همیشه پاک کنید؟",
|
||||
"confirmations.domain_block.confirm": "نهفتن تمام دامنه",
|
||||
"confirmations.domain_block.message": "آیا جدی جدی میخواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدودسازی یا خموشاندن چند حساب خاص کافی است و توصیه میشود. پس از این کار شما هیچ نوشتهای را از این دامنه در فهرست نوشتههای عمومی یا اعلانهایتان نخواهید دید. پیگیرانتان از این دامنه هم حذف خواهند شد.",
|
||||
"confirmations.logout.confirm": "خروج",
|
||||
"confirmations.logout.confirm": "خروج از حساب",
|
||||
"confirmations.logout.message": "مطمئنید میخواهید خارج شوید؟",
|
||||
"confirmations.mute.confirm": "خموشاندن",
|
||||
"confirmations.mute.explanation": "این کار فرستههای آنها و فرستههایی را که از آنها نام برده پنهان میکند، ولی آنها همچنان اجازه دارند فرستههای شما را ببینند و شما را پی بگیرند.",
|
||||
@ -143,7 +148,7 @@
|
||||
"emoji_button.symbols": "نمادها",
|
||||
"emoji_button.travel": "سفر و مکان",
|
||||
"empty_column.account_timeline": "هیچ بوقی اینجا نیست!",
|
||||
"empty_column.account_unavailable": "نمایهٔ ناموجود",
|
||||
"empty_column.account_unavailable": "نمایهٔ موجود نیست",
|
||||
"empty_column.blocks": "هنوز کسی را مسدود نکردهاید.",
|
||||
"empty_column.bookmarked_statuses": "هنوز هیچ بوق نشانشدهای ندارید. وقتی بوقی را نشانکنید، اینجا دیده خواهد شد.",
|
||||
"empty_column.community": "فهرست نوشتههای محلی خالی است. چیزی بنویسید تا چرخش بچرخد!",
|
||||
@ -166,9 +171,10 @@
|
||||
"errors.unexpected_crash.report_issue": "گزارش مشکل",
|
||||
"follow_request.authorize": "اجازه دهید",
|
||||
"follow_request.reject": "رد کنید",
|
||||
"follow_requests.unlocked_explanation": "با یان که حسابتان قفل نیست، کارکنان {domain} فکر کردند که ممکن است بخواهید درخواستها از این حسابها را به صورت دستی بازبینی کنید.",
|
||||
"follow_requests.unlocked_explanation": "با این که حسابتان قفل نیست، کارکنان {domain} فکر کردند که ممکن است بخواهید درخواستها از این حسابها را به صورت دستی بازبینی کنید.",
|
||||
"generic.saved": "ذخیره شده",
|
||||
"getting_started.developers": "توسعهدهندگان",
|
||||
"getting_started.directory": "فهرست گزیدهٔ کاربران",
|
||||
"getting_started.directory": "فهرست نمایه",
|
||||
"getting_started.documentation": "مستندات",
|
||||
"getting_started.heading": "آغاز کنید",
|
||||
"getting_started.invite": "دعوت از دیگران",
|
||||
@ -179,7 +185,7 @@
|
||||
"hashtag.column_header.tag_mode.any": "یا {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "بدون {additional}",
|
||||
"hashtag.column_settings.select.no_options_message": "هیچ پیشنهادی پیدا نشد",
|
||||
"hashtag.column_settings.select.placeholder": "برچسبها را وارد کنید…",
|
||||
"hashtag.column_settings.select.placeholder": "هشتگها را وارد کنید…",
|
||||
"hashtag.column_settings.tag_mode.all": "همهٔ اینها",
|
||||
"hashtag.column_settings.tag_mode.any": "هرکدام از اینها",
|
||||
"hashtag.column_settings.tag_mode.none": "هیچکدام از اینها",
|
||||
@ -217,14 +223,14 @@
|
||||
"keyboard_shortcuts.description": "توضیح",
|
||||
"keyboard_shortcuts.direct": "برای گشودن ستون پیغامهای مستقیم",
|
||||
"keyboard_shortcuts.down": "برای پایین رفتن در فهرست",
|
||||
"keyboard_shortcuts.enter": "برای گشودن نوشته",
|
||||
"keyboard_shortcuts.enter": "برای گشودن وضعیت",
|
||||
"keyboard_shortcuts.favourite": "برای پسندیدن",
|
||||
"keyboard_shortcuts.favourites": "برای گشودن فهرست پسندیدهها",
|
||||
"keyboard_shortcuts.federated": "برای گشودن فهرست نوشتههای همهجا",
|
||||
"keyboard_shortcuts.heading": "میانبرهای صفحهکلید",
|
||||
"keyboard_shortcuts.home": "برای گشودن ستون اصلی پیگیریها",
|
||||
"keyboard_shortcuts.hotkey": "میانبر",
|
||||
"keyboard_shortcuts.legend": "برای نمایش این راهنما",
|
||||
"keyboard_shortcuts.legend": "برای نمایش این نشانه",
|
||||
"keyboard_shortcuts.local": "برای گشودن فهرست نوشتههای محلی",
|
||||
"keyboard_shortcuts.mention": "برای نامبردن از نویسنده",
|
||||
"keyboard_shortcuts.muted": "برای گشودن فهرست کاربران خموش",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "برای پاسخ",
|
||||
"keyboard_shortcuts.requests": "برای گشودن فهرست درخواستهای پیگیری",
|
||||
"keyboard_shortcuts.search": "برای تمرکز روی جستجو",
|
||||
"keyboard_shortcuts.spoilers": "نمایش/نهفتن زمینهٔ هشدار محتوا",
|
||||
"keyboard_shortcuts.start": "برای گشودن ستون «آغاز کنید»",
|
||||
"keyboard_shortcuts.toggle_hidden": "برای نمایش/نهفتن نوشتهٔ پشت هشدار محتوا",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "برای نمایش/نهفتن رسانه",
|
||||
@ -284,13 +291,13 @@
|
||||
"navigation_bar.preferences": "ترجیحات",
|
||||
"navigation_bar.public_timeline": "نوشتههای همهجا",
|
||||
"navigation_bar.security": "امنیت",
|
||||
"notification.favourite": "{name} نوشتهٔ شما را پسندید",
|
||||
"notification.favourite": "{name} وضعیتتان را برگزید",
|
||||
"notification.follow": "{name} پیگیرتان شد",
|
||||
"notification.follow_request": "{name} میخواهد پیگیر شما باشد",
|
||||
"notification.mention": "{name} از شما نام برد",
|
||||
"notification.own_poll": "نظرسنجی شما به پایان رسید",
|
||||
"notification.poll": "نظرسنجیای که در آن رأی دادید به پایان رسیده است",
|
||||
"notification.reblog": "{name} نوشتهٔ شما را بازبوقید",
|
||||
"notification.reblog": "{name} وضعیتتان را تقویت کرد",
|
||||
"notifications.clear": "پاککردن اعلانها",
|
||||
"notifications.clear_confirmation": "مطمئنید میخواهید همهٔ اعلانهایتان را برای همیشه پاک کنید؟",
|
||||
"notifications.column_settings.alert": "اعلانهای میزکار",
|
||||
@ -327,7 +334,7 @@
|
||||
"privacy.private.long": "ارسال فقط به پیگیران",
|
||||
"privacy.private.short": "خصوصی",
|
||||
"privacy.public.long": "ارسال به خطزمانی عمومی",
|
||||
"privacy.public.short": "عمومی",
|
||||
"privacy.public.short": "همگانی",
|
||||
"privacy.unlisted.long": "ارسال نکردن به خطزمانی عمومی",
|
||||
"privacy.unlisted.short": "فهرستنشده",
|
||||
"refresh": "بهروزرسانی",
|
||||
@ -348,13 +355,13 @@
|
||||
"report.target": "در حال گزارش {target}",
|
||||
"search.placeholder": "جستجو",
|
||||
"search_popout.search_format": "راهنمای جستجوی پیشرفته",
|
||||
"search_popout.tips.full_text": "جستجوی متنی ساده میتواند بوقهایی که شما نوشتهاید، پسندیدهاید، بازبوقیدهاید، یا در آنها از شما نام برده شده است را پیدا کند. همچنین نامهای کاربری، نام نمایشیافته، و هشتگها را هم شامل میشود.",
|
||||
"search_popout.tips.hashtag": "برچسب",
|
||||
"search_popout.tips.full_text": "جستوجوی متنی ساده وضعیتهایی که که نوشته، برگزیده، تقویتکرده یا در آنها اشارهشدهاید را به اضافهٔ نامهای کاربری، نامهای نمایشی و برچسبهای مطابق برمیگرداند.",
|
||||
"search_popout.tips.hashtag": "هشتگ",
|
||||
"search_popout.tips.status": "بوق",
|
||||
"search_popout.tips.text": "جستجوی متنی ساده برای نامها، نامهای کاربری، و برچسبها",
|
||||
"search_popout.tips.user": "کاربر",
|
||||
"search_results.accounts": "افراد",
|
||||
"search_results.hashtags": "برچسبها",
|
||||
"search_results.hashtags": "هشتگها",
|
||||
"search_results.statuses": "بوقها",
|
||||
"search_results.statuses_fts_disabled": "جستجوی محتوای بوقها در این کارساز ماستودون فعال نشده است.",
|
||||
"search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
|
||||
@ -404,7 +411,7 @@
|
||||
"suggestions.header": "شاید این هم برایتان جالب باشد…",
|
||||
"tabs_bar.federated_timeline": "همگانی",
|
||||
"tabs_bar.home": "خانه",
|
||||
"tabs_bar.local_timeline": "محلّی",
|
||||
"tabs_bar.local_timeline": "بومی",
|
||||
"tabs_bar.notifications": "اعلانها",
|
||||
"tabs_bar.search": "جستجو",
|
||||
"time_remaining.days": "{number, plural, one {# روز} other {# روز}} باقی مانده",
|
||||
@ -412,9 +419,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}} باقی مانده",
|
||||
"time_remaining.moments": "زمان باقیمانده",
|
||||
"time_remaining.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} باقی مانده",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {نفر نوشته است} other {نفر نوشتهاند}}",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} از دیگر کارسازها نمایش داده نمیشوند.",
|
||||
"timeline_hint.resources.followers": "پیگیر",
|
||||
"timeline_hint.resources.follows": "پی میگیرد",
|
||||
"timeline_hint.resources.statuses": "بوقهای قدیمیتر",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} نفر} other {{counter} نفر}} صحبت میکنند",
|
||||
"trends.trending_now": "پرطرفدار",
|
||||
"ui.beforeunload": "اگر از ماستودون خارج شوید پیشنویس شما از دست خواهد رفت.",
|
||||
"units.short.billion": "{count}میلیارد",
|
||||
"units.short.million": "{count}میلیون",
|
||||
"units.short.thousand": "{count}هزار",
|
||||
"upload_area.title": "برای بارگذاری به اینجا بکشید",
|
||||
"upload_button.label": "افزودن رسانه ({formats})",
|
||||
"upload_error.limit": "از حد مجاز باگذاری پرونده فراتر رفتید.",
|
||||
@ -422,10 +436,12 @@
|
||||
"upload_form.audio_description": "برای ناشنوایان توصیفش کنید",
|
||||
"upload_form.description": "برای کمبینایان توصیفش کنید",
|
||||
"upload_form.edit": "ویرایش",
|
||||
"upload_form.thumbnail": "تغییر بندانگشتی",
|
||||
"upload_form.undo": "حذف",
|
||||
"upload_form.video_description": "برای کمبینایان یا ناشنوایان توصیفش کنید",
|
||||
"upload_modal.analyzing_picture": "در حال پردازش تصویر…",
|
||||
"upload_modal.apply": "اعمال",
|
||||
"upload_modal.choose_image": "گزینش تصویر",
|
||||
"upload_modal.description_placeholder": "الا یا ایّها الساقی، ادر کأساً و ناولها",
|
||||
"upload_modal.detect_text": "تشخیص متن درون عکس",
|
||||
"upload_modal.edit_media": "ویرایش رسانه",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Muistiinpanot",
|
||||
"account.add_or_remove_from_list": "Lisää tai poista listoilta",
|
||||
"account.badges.bot": "Botti",
|
||||
"account.badges.group": "Ryhmä",
|
||||
"account.block": "Estä @{name}",
|
||||
"account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}",
|
||||
"account.blocked": "Estetty",
|
||||
"account.browse_more_on_origin_server": "Selaile lisää alkuperäisellä palvelimella",
|
||||
"account.cancel_follow_request": "Peruuta seurauspyyntö",
|
||||
"account.direct": "Viesti käyttäjälle @{name}",
|
||||
"account.domain_blocked": "Verkko-osoite piilotettu",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Seuraa",
|
||||
"account.followers": "Seuraajaa",
|
||||
"account.followers.empty": "Tällä käyttäjällä ei ole vielä seuraajia.",
|
||||
"account.follows": "Seuraa",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Tämä käyttäjä ei vielä seuraa ketään.",
|
||||
"account.follows_you": "Seuraa sinua",
|
||||
"account.hide_reblogs": "Piilota buustaukset käyttäjältä @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Odottaa hyväksyntää. Peruuta seuraamispyyntö klikkaamalla",
|
||||
"account.share": "Jaa käyttäjän @{name} profiili",
|
||||
"account.show_reblogs": "Näytä buustaukset käyttäjältä @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Salli @{name}",
|
||||
"account.unblock_domain": "Salli {domain}",
|
||||
"account.unendorse": "Poista suosittelu profiilistasi",
|
||||
"account.unfollow": "Lakkaa seuraamasta",
|
||||
"account.unmute": "Poista käyttäjän @{name} mykistys",
|
||||
"account.unmute_notifications": "Poista mykistys käyttäjän @{name} ilmoituksilta",
|
||||
"account_note.placeholder": "Lisää muistiinpano napsauttamalla",
|
||||
"alert.rate_limited.message": "Yritä uudestaan {retry_time, time, medium} jälkeen.",
|
||||
"alert.rate_limited.title": "Määrää rajoitettu",
|
||||
"alert.unexpected.message": "Tapahtui odottamaton virhe.",
|
||||
@ -74,7 +79,7 @@
|
||||
"column_header.show_settings": "Näytä asetukset",
|
||||
"column_header.unpin": "Poista kiinnitys",
|
||||
"column_subheading.settings": "Asetukset",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Vain paikalliset",
|
||||
"community.column_settings.media_only": "Vain media",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"compose_form.direct_message_warning": "Tämä tuuttaus näkyy vain mainituille käyttäjille.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Valtuuta",
|
||||
"follow_request.reject": "Hylkää",
|
||||
"follow_requests.unlocked_explanation": "Vaikka tilisi ei ole lukittu, {domain} ylläpitäjien mielestä haluat tarkistaa näiden tilien seurauspyynnöt manuaalisesti.",
|
||||
"generic.saved": "Tallennettu",
|
||||
"getting_started.developers": "Kehittäjille",
|
||||
"getting_started.directory": "Profiilihakemisto",
|
||||
"getting_started.documentation": "Documentaatio",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "vastaa",
|
||||
"keyboard_shortcuts.requests": "avaa lista seurauspyynnöistä",
|
||||
"keyboard_shortcuts.search": "siirry hakukenttään",
|
||||
"keyboard_shortcuts.spoilers": "näyttääksesi/piilottaaksesi CW kentän",
|
||||
"keyboard_shortcuts.start": "avaa \"Aloitus\" -sarake",
|
||||
"keyboard_shortcuts.toggle_hidden": "näytä/piilota sisältövaroituksella merkitty teksti",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "näytä/piilota media",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} jäljellä",
|
||||
"time_remaining.moments": "Hetki jäljellä",
|
||||
"time_remaining.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} jäljellä",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {henkilö} other {henkilöä}} keskustelee",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Seuraajat",
|
||||
"timeline_hint.resources.follows": "Seuraa",
|
||||
"timeline_hint.resources.statuses": "Vanhemmat tuuttaukset",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Suosittua nyt",
|
||||
"ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}m",
|
||||
"units.short.thousand": "{count}k",
|
||||
"upload_area.title": "Lataa raahaamalla ja pudottamalla tähän",
|
||||
"upload_button.label": "Lisää mediaa",
|
||||
"upload_error.limit": "Tiedostolatauksien raja ylitetty.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Kuvaile kuulovammaisille",
|
||||
"upload_form.description": "Anna kuvaus näkörajoitteisia varten",
|
||||
"upload_form.edit": "Muokkaa",
|
||||
"upload_form.thumbnail": "Vaihda pikkukuva",
|
||||
"upload_form.undo": "Peru",
|
||||
"upload_form.video_description": "Kuvaile kuulo- tai näkövammaisille",
|
||||
"upload_modal.analyzing_picture": "Analysoidaan kuvaa…",
|
||||
"upload_modal.apply": "Käytä",
|
||||
"upload_modal.choose_image": "Valitse kuva",
|
||||
"upload_modal.description_placeholder": "Eräänä jäätävänä ja pimeänä yönä gorilla ratkaisi sudokun kahdessa minuutissa",
|
||||
"upload_modal.detect_text": "Tunnista teksti kuvasta",
|
||||
"upload_modal.edit_media": "Muokkaa mediaa",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Ajouter ou retirer des listes",
|
||||
"account.badges.bot": "Robot",
|
||||
"account.badges.group": "Groupe",
|
||||
"account.block": "Bloquer @{name}",
|
||||
"account.block_domain": "Bloquer le domaine {domain}",
|
||||
"account.blocked": "Bloqué·e",
|
||||
"account.browse_more_on_origin_server": "Parcourir davantage sur le profil original",
|
||||
"account.cancel_follow_request": "Annuler la demande de suivi",
|
||||
"account.direct": "Envoyer un message direct à @{name}",
|
||||
"account.domain_blocked": "Domaine bloqué",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Suivre",
|
||||
"account.followers": "Abonné·e·s",
|
||||
"account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
|
||||
"account.follows": "Abonnements",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Abonné·e} other {{counter} Abonné·e·s}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Abonnements}}",
|
||||
"account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
|
||||
"account.follows_you": "Vous suit",
|
||||
"account.hide_reblogs": "Masquer les partages de @{name}",
|
||||
@ -33,14 +36,16 @@
|
||||
"account.requested": "En attente d’approbation. Cliquez pour annuler la requête",
|
||||
"account.share": "Partager le profil de @{name}",
|
||||
"account.show_reblogs": "Afficher les partages de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Pouet} other {{counter} Pouets}}",
|
||||
"account.unblock": "Débloquer @{name}",
|
||||
"account.unblock_domain": "Débloquer le domaine {domain}",
|
||||
"account.unendorse": "Ne plus recommander sur le profil",
|
||||
"account.unfollow": "Ne plus suivre",
|
||||
"account.unmute": "Ne plus masquer @{name}",
|
||||
"account.unmute_notifications": "Ne plus masquer les notifications de @{name}",
|
||||
"account_note.placeholder": "Cliquez pour ajouter une note",
|
||||
"alert.rate_limited.message": "Veuillez réessayer après {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Taux limité",
|
||||
"alert.rate_limited.title": "Débit limité",
|
||||
"alert.unexpected.message": "Une erreur inattendue s’est produite.",
|
||||
"alert.unexpected.title": "Oups !",
|
||||
"announcement.announcement": "Annonce",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Afficher les paramètres",
|
||||
"column_header.unpin": "Désépingler",
|
||||
"column_subheading.settings": "Paramètres",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Local seulement",
|
||||
"community.column_settings.media_only": "Média uniquement",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Distant seulement",
|
||||
"compose_form.direct_message_warning": "Ce pouet sera uniquement envoyé aux personnes mentionnées. Cependant, l’administration de votre instance et des instances réceptrices pourront inspecter ce message.",
|
||||
"compose_form.direct_message_warning_learn_more": "En savoir plus",
|
||||
"compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur « non listé ». Seuls les pouets avec une visibilité « publique » peuvent être recherchés par hashtag.",
|
||||
@ -102,7 +107,7 @@
|
||||
"confirmations.block.confirm": "Bloquer",
|
||||
"confirmations.block.message": "Voulez-vous vraiment bloquer {name} ?",
|
||||
"confirmations.delete.confirm": "Supprimer",
|
||||
"confirmations.delete.message": "Voulez-vous vraiment supprimer ce pouet ?",
|
||||
"confirmations.delete.message": "Confirmez-vous la suppression de ce pouet ?",
|
||||
"confirmations.delete_list.confirm": "Supprimer",
|
||||
"confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste ?",
|
||||
"confirmations.domain_block.confirm": "Bloquer tout le domaine",
|
||||
@ -113,7 +118,7 @@
|
||||
"confirmations.mute.explanation": "Cela masquera ses messages et les messages le ou la mentionnant, mais cela lui permettra quand même de voir vos messages et de vous suivre.",
|
||||
"confirmations.mute.message": "Voulez-vous vraiment masquer {name} ?",
|
||||
"confirmations.redraft.confirm": "Supprimer et ré-écrire",
|
||||
"confirmations.redraft.message": "Voulez-vous vraiment supprimer ce pouet pour le ré-écrire ? Ses partages ainsi que ses mises en favori seront perdu·e·s et ses réponses seront orphelines.",
|
||||
"confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer ce statut pour le ré-écrire ? Ses partages ainsi que ses mises en favori seront perdu·e·s et ses réponses seront orphelines.",
|
||||
"confirmations.reply.confirm": "Répondre",
|
||||
"confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez actuellement. Voulez-vous vraiment continuer ?",
|
||||
"confirmations.unfollow.confirm": "Ne plus suivre",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Accepter",
|
||||
"follow_request.reject": "Rejeter",
|
||||
"follow_requests.unlocked_explanation": "Même si votre compte n’est pas verrouillé, l’équipe de {domain} a pensé que vous pourriez vouloir consulter manuellement les demandes de suivi de ces comptes.",
|
||||
"generic.saved": "Sauvegardé",
|
||||
"getting_started.developers": "Développeur·euse·s",
|
||||
"getting_started.directory": "Annuaire des profils",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -212,12 +218,12 @@
|
||||
"keyboard_shortcuts.back": "revenir en arrière",
|
||||
"keyboard_shortcuts.blocked": "ouvrir la liste des comptes bloqués",
|
||||
"keyboard_shortcuts.boost": "partager",
|
||||
"keyboard_shortcuts.column": "cibler un pouet d’une des colonnes",
|
||||
"keyboard_shortcuts.column": "pour focaliser un statut dans l’une des colonnes",
|
||||
"keyboard_shortcuts.compose": "cibler la zone de rédaction",
|
||||
"keyboard_shortcuts.description": "Description",
|
||||
"keyboard_shortcuts.direct": "ouvrir la colonne des messages directs",
|
||||
"keyboard_shortcuts.down": "descendre dans la liste",
|
||||
"keyboard_shortcuts.enter": "ouvrir le pouet",
|
||||
"keyboard_shortcuts.enter": "pour ouvrir le statut",
|
||||
"keyboard_shortcuts.favourite": "ajouter aux favoris",
|
||||
"keyboard_shortcuts.favourites": "ouvrir la liste des favoris",
|
||||
"keyboard_shortcuts.federated": "ouvrir le fil public global",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "répondre",
|
||||
"keyboard_shortcuts.requests": "ouvrir la liste de demandes d’abonnement",
|
||||
"keyboard_shortcuts.search": "cibler la zone de recherche",
|
||||
"keyboard_shortcuts.spoilers": "pour afficher/masquer le champ CW",
|
||||
"keyboard_shortcuts.start": "ouvrir la colonne « Pour commencer »",
|
||||
"keyboard_shortcuts.toggle_hidden": "déplier/replier le texte derrière un CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "afficher/cacher les médias",
|
||||
@ -322,13 +329,13 @@
|
||||
"poll_button.add_poll": "Ajouter un sondage",
|
||||
"poll_button.remove_poll": "Supprimer le sondage",
|
||||
"privacy.change": "Ajuster la confidentialité du message",
|
||||
"privacy.direct.long": "N’envoyer qu’aux personnes mentionnées",
|
||||
"privacy.direct.long": "Visible uniquement par les comptes mentionnés",
|
||||
"privacy.direct.short": "Direct",
|
||||
"privacy.private.long": "Seul·e·s vos abonné·e·s verront vos statuts",
|
||||
"privacy.private.long": "Visible uniquement par vos abonné·e·s",
|
||||
"privacy.private.short": "Abonné·e·s uniquement",
|
||||
"privacy.public.long": "Afficher dans les fils publics",
|
||||
"privacy.public.long": "Visible par tou·te·s, affiché dans les fils publics",
|
||||
"privacy.public.short": "Public",
|
||||
"privacy.unlisted.long": "Ne pas afficher dans les fils publics",
|
||||
"privacy.unlisted.long": "Visible par tou·te·s, mais pas dans les fils publics",
|
||||
"privacy.unlisted.short": "Non listé",
|
||||
"refresh": "Actualiser",
|
||||
"regeneration_indicator.label": "Chargement…",
|
||||
@ -350,7 +357,7 @@
|
||||
"search_popout.search_format": "Recherche avancée",
|
||||
"search_popout.tips.full_text": "Un texte normal retourne les pouets que vous avez écris, mis en favori, partagés, ou vous mentionnant, ainsi que les identifiants, les noms affichés, et les hashtags des personnes et messages correspondant.",
|
||||
"search_popout.tips.hashtag": "hashtag",
|
||||
"search_popout.tips.status": "pouet",
|
||||
"search_popout.tips.status": "statuts",
|
||||
"search_popout.tips.text": "Un texte simple renvoie les noms affichés, les identifiants et les hashtags correspondants",
|
||||
"search_popout.tips.user": "utilisateur·ice",
|
||||
"search_results.accounts": "Comptes",
|
||||
@ -359,7 +366,7 @@
|
||||
"search_results.statuses_fts_disabled": "La recherche de pouets par leur contenu n'est pas activée sur ce serveur Mastodon.",
|
||||
"search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}",
|
||||
"status.admin_account": "Ouvrir l’interface de modération pour @{name}",
|
||||
"status.admin_status": "Ouvrir ce pouet dans l’interface de modération",
|
||||
"status.admin_status": "Ouvrir ce statut dans l’interface de modération",
|
||||
"status.block": "Bloquer @{name}",
|
||||
"status.bookmark": "Ajouter aux marque-pages",
|
||||
"status.cancel_reblog_private": "Annuler le partage",
|
||||
@ -378,7 +385,7 @@
|
||||
"status.more": "Plus",
|
||||
"status.mute": "Masquer @{name}",
|
||||
"status.mute_conversation": "Masquer la conversation",
|
||||
"status.open": "Voir les détails du pouet",
|
||||
"status.open": "Déplier ce statut",
|
||||
"status.pin": "Épingler sur le profil",
|
||||
"status.pinned": "Pouet épinglé",
|
||||
"status.read_more": "En savoir plus",
|
||||
@ -413,9 +420,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} restantes",
|
||||
"time_remaining.moments": "Encore quelques instants",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} restantes",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {personne discute} other {personnes discutent}}",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} des autres serveurs ne sont pas affichés.",
|
||||
"timeline_hint.resources.followers": "Les abonnés",
|
||||
"timeline_hint.resources.follows": "Les abonnements",
|
||||
"timeline_hint.resources.statuses": "Les anciens pouets",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} personne en parle} other {{counter} personnes en parlent}}",
|
||||
"trends.trending_now": "Tendance en ce moment",
|
||||
"ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Glissez et déposez pour envoyer",
|
||||
"upload_button.label": "Joindre un média ({formats})",
|
||||
"upload_error.limit": "Taille maximale d'envoi de fichier dépassée.",
|
||||
@ -423,10 +437,12 @@
|
||||
"upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition",
|
||||
"upload_form.description": "Décrire pour les malvoyant·e·s",
|
||||
"upload_form.edit": "Modifier",
|
||||
"upload_form.thumbnail": "Changer la vignette",
|
||||
"upload_form.undo": "Supprimer",
|
||||
"upload_form.video_description": "Décrire pour les personnes ayant des problèmes d’audition ou de vision",
|
||||
"upload_modal.analyzing_picture": "Analyse de l’image en cours…",
|
||||
"upload_modal.apply": "Appliquer",
|
||||
"upload_modal.choose_image": "Choisir une image",
|
||||
"upload_modal.description_placeholder": "Buvez de ce whisky que le patron juge fameux",
|
||||
"upload_modal.detect_text": "Détecter le texte de l’image",
|
||||
"upload_modal.edit_media": "Modifier le média",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Your note for @{name}",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Block @{name}",
|
||||
"account.block_domain": "Hide everything from {domain}",
|
||||
"account.blocked": "Blocked",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.direct": "Direct message @{name}",
|
||||
"account.domain_blocked": "Domain hidden",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Follow",
|
||||
"account.followers": "Followers",
|
||||
"account.followers.empty": "No one follows this user yet.",
|
||||
"account.follows": "Follows",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "This user doesn't follow anyone yet.",
|
||||
"account.follows_you": "Follows you",
|
||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Awaiting approval",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Show boosts from @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Unblock @{name}",
|
||||
"account.unblock_domain": "Unhide {domain}",
|
||||
"account.unendorse": "Don't feature on profile",
|
||||
"account.unfollow": "Unfollow",
|
||||
"account.unmute": "Unmute @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "No comment provided",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "An unexpected error occurred.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Authorize",
|
||||
"follow_request.reject": "Reject",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -412,9 +419,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
@ -422,10 +436,12 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "A túa nota para @{name}",
|
||||
"account.add_or_remove_from_list": "Engadir ou eliminar das listaxes",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Grupo",
|
||||
"account.block": "Bloquear @{name}",
|
||||
"account.block_domain": "Agochar todo de {domain}",
|
||||
"account.blocked": "Bloqueada",
|
||||
"account.browse_more_on_origin_server": "Busca máis no perfil orixinal",
|
||||
"account.cancel_follow_request": "Desbotar solicitude de seguimento",
|
||||
"account.direct": "Mensaxe directa @{name}",
|
||||
"account.domain_blocked": "Dominio agochado",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Seguir",
|
||||
"account.followers": "Seguidoras",
|
||||
"account.followers.empty": "Aínda ninguén segue esta usuaria.",
|
||||
"account.follows": "Seguindo",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Seguidora} other {{counter} Seguidoras}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Seguindo}}",
|
||||
"account.follows.empty": "Esta usuaria aínda non segue a ninguén.",
|
||||
"account.follows_you": "Séguete",
|
||||
"account.hide_reblogs": "Agochar repeticións de @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Agardando aprovación. Preme para desbotar a solicitude de seguimento",
|
||||
"account.share": "Compartir o perfil de @{name}",
|
||||
"account.show_reblogs": "Amosar compartidos de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Desbloquear @{name}",
|
||||
"account.unblock_domain": "Amosar {domain}",
|
||||
"account.unendorse": "Non amosar no perfil",
|
||||
"account.unfollow": "Deixar de seguir",
|
||||
"account.unmute": "Deixar de silenciar a @{name}",
|
||||
"account.unmute_notifications": "Deixar de silenciar as notificacións de @{name}",
|
||||
"account_note.placeholder": "Sen comentarios",
|
||||
"alert.rate_limited.message": "Téntao novamente após {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Límite de intentos",
|
||||
"alert.unexpected.message": "Ocorreu un erro non agardado.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Amosar axustes",
|
||||
"column_header.unpin": "Desapegar",
|
||||
"column_subheading.settings": "Axustes",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Só local",
|
||||
"community.column_settings.media_only": "Só multimedia",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Só remoto",
|
||||
"compose_form.direct_message_warning": "Este toot só será enviado ás usuarias mencionadas.",
|
||||
"compose_form.direct_message_warning_learn_more": "Coñecer máis",
|
||||
"compose_form.hashtag_warning": "Este toot non aparecerá baixo ningún cancelo (hashtag) porque non está listado. Só se poden procurar toots públicos por cancelos.",
|
||||
@ -155,7 +160,7 @@
|
||||
"empty_column.hashtag": "Aínda non hai nada con este cancelo.",
|
||||
"empty_column.home": "A túa cronoloxía inicial está baleira! Visita {public} ou emprega a procura para atopar outras usuarias.",
|
||||
"empty_column.home.public_timeline": "a cronoloxía pública",
|
||||
"empty_column.list": "Aínda non hai nada en esta lista. Cando as usuarias incluídas na lista publiquen mensaxes, aparecerán aquí.",
|
||||
"empty_column.list": "Aínda non hai nada nesta listaxe. Cando os usuarios incluídas na listaxe publiquen mensaxes, amosaranse aquí.",
|
||||
"empty_column.lists": "Aínda non tes listaxes. Cando crees unha, amosarase aquí.",
|
||||
"empty_column.mutes": "Aínda non silenciaches a ningúnha usuaria.",
|
||||
"empty_column.notifications": "Aínda non tes notificacións. Interactúa con outras para comezar unha conversa.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Autorizar",
|
||||
"follow_request.reject": "Rexeitar",
|
||||
"follow_requests.unlocked_explanation": "Malia que a túa conta non é privada, a administración de {domain} pensou que quizabes terías que revisar de xeito manual as solicitudes de seguiminto.",
|
||||
"generic.saved": "Gardado",
|
||||
"getting_started.developers": "Desenvolvedoras",
|
||||
"getting_started.directory": "Directorio local",
|
||||
"getting_started.documentation": "Documentación",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "para responder",
|
||||
"keyboard_shortcuts.requests": "para abrir a listaxe das peticións de seguimento",
|
||||
"keyboard_shortcuts.search": "para destacar a procura",
|
||||
"keyboard_shortcuts.spoilers": "mostrar/ocultar campo CW",
|
||||
"keyboard_shortcuts.start": "para abrir a columna dos \"primeiros pasos\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "para amosar/agochar texto detrás do aviso de contido (AC)",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "para amosar/agochar contido multimedia",
|
||||
@ -290,7 +297,7 @@
|
||||
"notification.mention": "{name} mencionoute",
|
||||
"notification.own_poll": "A túa enquisa rematou",
|
||||
"notification.poll": "Unha enquisa na que votaches rematou",
|
||||
"notification.reblog": "{name} promoveu o teu estado",
|
||||
"notification.reblog": "{name} compartiu o teu estado",
|
||||
"notifications.clear": "Limpar notificacións",
|
||||
"notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?",
|
||||
"notifications.column_settings.alert": "Notificacións de escritorio",
|
||||
@ -412,9 +419,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minuto} other {# minutos}} restantes",
|
||||
"time_remaining.moments": "Momentos restantes",
|
||||
"time_remaining.seconds": "{number, plural, one {# segundo} other {# segundos}} restantes",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {persoa} other {persoas}} falando",
|
||||
"timeline_hint.remote_resource_not_displayed": "Non se mostran {resource} desde outros servidores.",
|
||||
"timeline_hint.resources.followers": "Seguidoras",
|
||||
"timeline_hint.resources.follows": "Seguindo",
|
||||
"timeline_hint.resources.statuses": "Toots antigos",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persoa} other {{counter} persoas}} comentando",
|
||||
"trends.trending_now": "Tendencias actuais",
|
||||
"ui.beforeunload": "O borrador perderase se saes de Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Arrastra e solta para subir",
|
||||
"upload_button.label": "Engadir multimedia ({formats})",
|
||||
"upload_error.limit": "Límite máximo do ficheiro a subir excedido.",
|
||||
@ -422,10 +436,12 @@
|
||||
"upload_form.audio_description": "Describir para persoas con problemas auditivos",
|
||||
"upload_form.description": "Describir para persoas con problemas visuais",
|
||||
"upload_form.edit": "Editar",
|
||||
"upload_form.thumbnail": "Cambiar a miniatura",
|
||||
"upload_form.undo": "Eliminar",
|
||||
"upload_form.video_description": "Describir para persoas con problemas visuais ou auditivos",
|
||||
"upload_modal.analyzing_picture": "Estase a analizar a imaxe…",
|
||||
"upload_modal.apply": "Aplicar",
|
||||
"upload_modal.choose_image": "Elixir imaxe",
|
||||
"upload_modal.description_placeholder": "Un raposo veloz brinca sobre o can preguiceiro",
|
||||
"upload_modal.detect_text": "Detectar texto na imaxe",
|
||||
"upload_modal.edit_media": "Editar multimedia",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "ההודעה שלך ל@{name}",
|
||||
"account.add_or_remove_from_list": "הוסף או הסר מהרשימות",
|
||||
"account.badges.bot": "בוט",
|
||||
"account.badges.group": "Group",
|
||||
"account.badges.group": "קבוצה",
|
||||
"account.block": "חסימת @{name}",
|
||||
"account.block_domain": "להסתיר הכל מהקהילה {domain}",
|
||||
"account.blocked": "חסום",
|
||||
"account.browse_more_on_origin_server": "המשך לגלוש בפרופיל המקורי",
|
||||
"account.cancel_follow_request": "בטל בקשת מעקב",
|
||||
"account.direct": "Direct Message @{name}",
|
||||
"account.domain_blocked": "הדומיין חסוי",
|
||||
@ -13,55 +15,58 @@
|
||||
"account.follow": "מעקב",
|
||||
"account.followers": "עוקבים",
|
||||
"account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.",
|
||||
"account.follows": "נעקבים",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "משתמש זה לא עוקב אחר אף אחד עדיין.",
|
||||
"account.follows_you": "במעקב אחריך",
|
||||
"account.hide_reblogs": "להסתיר הידהודים מאת @{name}",
|
||||
"account.last_status": "פעילות אחרונה",
|
||||
"account.link_verified_on": "בעלות על הקישור הזה נבדקה לאחרונה ב{date}",
|
||||
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
|
||||
"account.locked_info": "מצב הפרטיות של החשבון הנוכחי הוגדר כנעול. בעל החשבון קובע באופן פרטני מי יכול לעקוב אחריו.",
|
||||
"account.media": "מדיה",
|
||||
"account.mention": "אזכור של @{name}",
|
||||
"account.moved_to": "החשבון {name} הועבר אל:",
|
||||
"account.mute": "להשתיק את @{name}",
|
||||
"account.mute_notifications": "להסתיר התראות מאת @{name}",
|
||||
"account.muted": "Muted",
|
||||
"account.never_active": "Never",
|
||||
"account.muted": "מושתק",
|
||||
"account.never_active": "אף פעם",
|
||||
"account.posts": "הודעות",
|
||||
"account.posts_with_replies": "Toots with replies",
|
||||
"account.report": "לדווח על @{name}",
|
||||
"account.requested": "בהמתנה לאישור",
|
||||
"account.share": "לשתף את הפרופיל של @{name}",
|
||||
"account.show_reblogs": "להראות הדהודים מאת @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "הסרת חסימה מעל @{name}",
|
||||
"account.unblock_domain": "הסר חסימה מקהילת {domain}",
|
||||
"account.unendorse": "לא להציג בפרופיל",
|
||||
"account.unfollow": "הפסקת מעקב",
|
||||
"account.unmute": "הפסקת השתקת @{name}",
|
||||
"account.unmute_notifications": "להפסיק הסתרת הודעות מעם @{name}",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"account_note.placeholder": "ללא הערה",
|
||||
"alert.rate_limited.message": "נא לנסות אחרי {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "מגבלות מיכסה",
|
||||
"alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
|
||||
"alert.unexpected.title": "אופס!",
|
||||
"announcement.announcement": "Announcement",
|
||||
"autosuggest_hashtag.per_week": "{count} per week",
|
||||
"announcement.announcement": "הודעה",
|
||||
"autosuggest_hashtag.per_week": "{count} לשבוע",
|
||||
"boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
|
||||
"bundle_column_error.body": "משהו השתבש בעת הצגת הרכיב הזה.",
|
||||
"bundle_column_error.retry": "לנסות שוב",
|
||||
"bundle_column_error.title": "Network error",
|
||||
"bundle_column_error.title": "שגיאת רשת",
|
||||
"bundle_modal_error.close": "לסגור",
|
||||
"bundle_modal_error.message": "משהו השתבש בעת טעינת הרכיב הזה.",
|
||||
"bundle_modal_error.retry": "לנסות שוב",
|
||||
"column.blocks": "חסימות",
|
||||
"column.bookmarks": "Bookmarks",
|
||||
"column.bookmarks": "סימניות",
|
||||
"column.community": "ציר זמן מקומי",
|
||||
"column.direct": "Direct messages",
|
||||
"column.directory": "Browse profiles",
|
||||
"column.direct": "הודעות ישירות",
|
||||
"column.directory": "גלוש פרופילים",
|
||||
"column.domain_blocks": "Hidden domains",
|
||||
"column.favourites": "חיבובים",
|
||||
"column.follow_requests": "בקשות מעקב",
|
||||
"column.home": "בבית",
|
||||
"column.lists": "Lists",
|
||||
"column.lists": "רשימות",
|
||||
"column.mutes": "השתקות",
|
||||
"column.notifications": "התראות",
|
||||
"column.pins": "Pinned toot",
|
||||
@ -74,11 +79,11 @@
|
||||
"column_header.show_settings": "הצגת העדפות",
|
||||
"column_header.unpin": "שחרור קיבוע",
|
||||
"column_subheading.settings": "אפשרויות",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "מקומי בלבד",
|
||||
"community.column_settings.media_only": "Media only",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "מרחוק בלבד",
|
||||
"compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
|
||||
"compose_form.direct_message_warning_learn_more": "Learn more",
|
||||
"compose_form.direct_message_warning_learn_more": "מידע נוסף",
|
||||
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
|
||||
"compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.",
|
||||
"compose_form.lock_disclaimer.lock": "נעול",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "קבלה",
|
||||
"follow_request.reject": "דחיה",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "לענות",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "להתמקד בחלון החיפוש",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "ניתן להעלות על ידי Drag & drop",
|
||||
"upload_button.label": "הוספת מדיה",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "תיאור לכבדי ראיה",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "ביטול",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "सूची में जोड़ें या हटाए",
|
||||
"account.badges.bot": "बॉट",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "@{name} को ब्लॉक करें",
|
||||
"account.block_domain": "{domain} के सारी चीज़े छुपाएं",
|
||||
"account.blocked": "ब्लॉक",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "फ़ॉलो रिक्वेस्ट रद्द करें",
|
||||
"account.direct": "प्रत्यक्ष संदेश @{name}",
|
||||
"account.domain_blocked": "छिपा हुआ डोमेन",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "फॉलो करें",
|
||||
"account.followers": "फॉलोवर",
|
||||
"account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है",
|
||||
"account.follows": "फॉलो करें",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "यह यूज़र् अभी तक किसी को फॉलो नहीं करता है।",
|
||||
"account.follows_you": "आपको फॉलो करता है",
|
||||
"account.hide_reblogs": "@{name} के बूस्ट छुपाएं",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "मंजूरी का इंतजार। फॉलो रिक्वेस्ट को रद्द करने के लिए क्लिक करें",
|
||||
"account.share": "@{name} की प्रोफाइल शेयर करे",
|
||||
"account.show_reblogs": "@{name} के बूस्ट दिखाए",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "@{name} को अनब्लॉक करें",
|
||||
"account.unblock_domain": "{domain} दिखाए",
|
||||
"account.unendorse": "प्रोफ़ाइल पर न दिखाए",
|
||||
"account.unfollow": "अनफॉलो करें",
|
||||
"account.unmute": "अनम्यूट @{name}",
|
||||
"account.unmute_notifications": "@{name} के नोटिफिकेशन अनम्यूट करे",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "कृप्या {retry_time, time, medium} के बाद दुबारा कोशिश करें",
|
||||
"alert.rate_limited.title": "सीमित दर",
|
||||
"alert.unexpected.message": "एक अप्रत्याशित त्रुटि हुई है!",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "अधिकार दें",
|
||||
"follow_request.reject": "अस्वीकार करें",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "डेवॅलपर्स",
|
||||
"getting_started.directory": "प्रोफ़ाइल निर्देशिका",
|
||||
"getting_started.documentation": "प्रलेखन",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "जवाब के लिए",
|
||||
"keyboard_shortcuts.requests": "फॉलो रिक्वेस्ट लिस्ट खोलने के लिए",
|
||||
"keyboard_shortcuts.search": "गहरी खोज के लिए",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -257,7 +264,7 @@
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "लोड हो रहा है...",
|
||||
"media_gallery.toggle_visible": "Hide media",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "नहीं मिला",
|
||||
"missing_indicator.sublabel": "यह संसाधन नहीं मिल सका।",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
@ -413,20 +420,29 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "संशोधन करें",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "मिटाए",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "लागू करें",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "मीडिया में संशोधन करें",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Blokiraj @{name}",
|
||||
"account.block_domain": "Sakrij sve sa {domain}",
|
||||
"account.blocked": "Blocked",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.direct": "Direct Message @{name}",
|
||||
"account.domain_blocked": "Domain hidden",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Slijedi",
|
||||
"account.followers": "Sljedbenici",
|
||||
"account.followers.empty": "No one follows this user yet.",
|
||||
"account.follows": "Slijedi",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "This user doesn't follow anyone yet.",
|
||||
"account.follows_you": "te slijedi",
|
||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Čeka pristanak",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Show boosts from @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Deblokiraj @{name}",
|
||||
"account.unblock_domain": "Poništi sakrivanje {domain}",
|
||||
"account.unendorse": "Don't feature on profile",
|
||||
"account.unfollow": "Prestani slijediti",
|
||||
"account.unmute": "Poništi utišavanje @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "An unexpected error occurred.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Autoriziraj",
|
||||
"follow_request.reject": "Odbij",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Povuci i spusti kako bi uploadao",
|
||||
"upload_button.label": "Dodaj media",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Poništi",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Megjegyzés @{name} fiókhoz",
|
||||
"account.add_or_remove_from_list": "Hozzáadás vagy eltávolítás a listáról",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Csoport",
|
||||
"account.block": "@{name} letiltása",
|
||||
"account.block_domain": "Minden elrejtése innen: {domain}",
|
||||
"account.blocked": "Letiltva",
|
||||
"account.browse_more_on_origin_server": "További böngészés az eredeti profilon",
|
||||
"account.cancel_follow_request": "Követési kérelem törlése",
|
||||
"account.direct": "Közvetlen üzenet @{name} számára",
|
||||
"account.domain_blocked": "Rejtett domain",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Követés",
|
||||
"account.followers": "Követő",
|
||||
"account.followers.empty": "Ezt a felhasználót még senki sem követi.",
|
||||
"account.follows": "Követések",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Követő} other {{counter} Követő}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Követett}}",
|
||||
"account.follows.empty": "Ez a felhasználó még senkit sem követ.",
|
||||
"account.follows_you": "Követ téged",
|
||||
"account.hide_reblogs": "@{name} megtolásainak némítása",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Engedélyre vár. Kattints a követési kérés visszavonásához",
|
||||
"account.share": "@{name} profiljának megosztása",
|
||||
"account.show_reblogs": "@{name} megtolásainak mutatása",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Tülk} other {{counter} Tülk}}",
|
||||
"account.unblock": "@{name} letiltásának feloldása",
|
||||
"account.unblock_domain": "{domain} elrejtésének feloldása",
|
||||
"account.unendorse": "Kiemelés törlése a profilodról",
|
||||
"account.unfollow": "Követés vége",
|
||||
"account.unmute": "@{name} némítás feloldása",
|
||||
"account.unmute_notifications": "@{name} némított értesítéseinek feloldása",
|
||||
"account_note.placeholder": "Nincs megjegyzés",
|
||||
"alert.rate_limited.message": "Próbáld újra {retry_time, time, medium} után.",
|
||||
"alert.rate_limited.title": "Forgalomkorlátozás",
|
||||
"alert.unexpected.message": "Váratlan hiba történt.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Beállítások mutatása",
|
||||
"column_header.unpin": "Kitűzés eltávolítása",
|
||||
"column_subheading.settings": "Beállítások",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Csak helyi",
|
||||
"community.column_settings.media_only": "Csak média",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Csak távoli",
|
||||
"compose_form.direct_message_warning": "Ezt a tülköt csak a benne megemlített felhasználók láthatják majd.",
|
||||
"compose_form.direct_message_warning_learn_more": "Tudj meg többet",
|
||||
"compose_form.hashtag_warning": "Ez a tülköd nem fog megjelenni semmilyen hashtag alatt mivel listázatlan. Csak nyilvános tülkök kereshetőek hashtaggel.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Engedélyezés",
|
||||
"follow_request.reject": "Elutasítás",
|
||||
"follow_requests.unlocked_explanation": "Bár a fiókod nincs zárolva, a(z) {domain} csapata úgy gondolta, hogy talán kézzel szeretnéd ellenőrizni a fiók követési kéréseit.",
|
||||
"generic.saved": "Elmentve",
|
||||
"getting_started.developers": "Fejlesztőknek",
|
||||
"getting_started.directory": "Profilok",
|
||||
"getting_started.documentation": "Dokumentáció",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "válasz",
|
||||
"keyboard_shortcuts.requests": "követési kérések listájának megnyitása",
|
||||
"keyboard_shortcuts.search": "fókuszálás a keresőre",
|
||||
"keyboard_shortcuts.spoilers": "CW mező mutatása/elrejtése",
|
||||
"keyboard_shortcuts.start": "\"Első lépések\" megnyitása",
|
||||
"keyboard_shortcuts.toggle_hidden": "tartalmi figyelmeztetéssel ellátott szöveg mutatása/elrejtése",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "média mutatása/elrejtése",
|
||||
@ -413,9 +420,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# perc} other {# perc}} van hátra",
|
||||
"time_remaining.moments": "Pillanatok vannak hátra",
|
||||
"time_remaining.seconds": "{number, plural, one {# másodperc} other {# másodperc}} van hátra",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {résztvevő} other {résztvevő}} beszélget",
|
||||
"timeline_hint.remote_resource_not_displayed": "más szerverekről származó {resource} tartalmakat nem mutatjuk.",
|
||||
"timeline_hint.resources.followers": "Követő",
|
||||
"timeline_hint.resources.follows": "Követett",
|
||||
"timeline_hint.resources.statuses": "Régi tülkök",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} személy} other {{counter} személy}} beszélget",
|
||||
"trends.trending_now": "Most felkapott",
|
||||
"ui.beforeunload": "A piszkozatod el fog veszni, ha elhagyod a Mastodont.",
|
||||
"units.short.billion": "{count}Mrd",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Húzd ide a feltöltéshez",
|
||||
"upload_button.label": "Média hozzáadása ({formats})",
|
||||
"upload_error.limit": "Túllépted a fájlfeltöltési korlátot.",
|
||||
@ -423,10 +437,12 @@
|
||||
"upload_form.audio_description": "Írja le a hallássérültek számára",
|
||||
"upload_form.description": "Leírás látáskorlátozottak számára",
|
||||
"upload_form.edit": "Szerkesztés",
|
||||
"upload_form.thumbnail": "Előnézet megváltoztatása",
|
||||
"upload_form.undo": "Törlés",
|
||||
"upload_form.video_description": "Írja le a hallás- vagy látássérültek számára",
|
||||
"upload_modal.analyzing_picture": "Kép elemzése…",
|
||||
"upload_modal.apply": "Alkalmaz",
|
||||
"upload_modal.choose_image": "Kép kiválasztása",
|
||||
"upload_modal.description_placeholder": "A gyors, barna róka átugrik a lusta kutya fölött",
|
||||
"upload_modal.detect_text": "Szöveg felismerése a képről",
|
||||
"upload_modal.edit_media": "Média szerkesztése",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Գրառում",
|
||||
"account.add_or_remove_from_list": "Աւելացնել կամ հեռացնել ցանկերից",
|
||||
"account.badges.bot": "Բոտ",
|
||||
"account.badges.group": "Խումբ",
|
||||
"account.block": "Արգելափակել @{name}֊ին",
|
||||
"account.block_domain": "Թաքցնել ամէնը հետեւեալ տիրոյթից՝ {domain}",
|
||||
"account.blocked": "Արգելափակուած է",
|
||||
"account.browse_more_on_origin_server": "Դիտել ավելին իրական պրոֆիլում",
|
||||
"account.cancel_follow_request": "չեղարկել հետեւելու հայցը",
|
||||
"account.direct": "Նամակ գրել @{name} -ին",
|
||||
"account.domain_blocked": "Տիրոյթը արգելափակուած է",
|
||||
@ -13,11 +15,12 @@
|
||||
"account.follow": "Հետեւել",
|
||||
"account.followers": "Հետեւողներ",
|
||||
"account.followers.empty": "Այս օգտատիրոջը դեռ ոչ մէկ չի հետեւում։",
|
||||
"account.follows": "Հետեւում է",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Հետևորդ} other {{counter} Հետևորդներ}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Հետևում են}}",
|
||||
"account.follows.empty": "Այս օգտատէրը դեռ ոչ մէկի չի հետեւում։",
|
||||
"account.follows_you": "Հետեւում է քեզ",
|
||||
"account.hide_reblogs": "Թաքցնել @{name}֊ի տարածածները",
|
||||
"account.last_status": "Վերջին անգամ ակտիւ էր",
|
||||
"account.last_status": "Վերջին թութը",
|
||||
"account.link_verified_on": "Սոյն յղման տիրապետումը ստուգուած է՝ {date}֊ին",
|
||||
"account.locked_info": "Սոյն հաշուի գաղտնիութեան մակարդակը նշուած է որպէս՝ փակ։ Հաշուի տէրն ընտրում է, թէ ով կարող է հետեւել իրեն։",
|
||||
"account.media": "Մեդիա",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Հաստատման կարիք ունի։ Սեղմիր՝ հետեւելու հայցը չեղարկելու համար։",
|
||||
"account.share": "Կիսուել @{name}֊ի էջով",
|
||||
"account.show_reblogs": "Ցուցադրել @{name}֊ի տարածածները",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Թութ} other {{counter} Թութեր}}",
|
||||
"account.unblock": "Ապաարգելափակել @{name}֊ին",
|
||||
"account.unblock_domain": "Ցուցադրել {domain} թաքցուած տիրոյթի գրառումները",
|
||||
"account.unendorse": "Չցուցադրել անձնական էջում",
|
||||
"account.unfollow": "Ապահետեւել",
|
||||
"account.unmute": "Ապալռեցնել @{name}֊ին",
|
||||
"account.unmute_notifications": "Միացնել ծանուցումները @{name}֊ից",
|
||||
"account_note.placeholder": "Սեղմեք գրառելու համար",
|
||||
"alert.rate_limited.message": "Փորձէք որոշ ժամանակ անց՝ {retry_time, time, medium}։",
|
||||
"alert.rate_limited.title": "Գործողութիւնների յաճախութիւնը գերազանցում է թոյլատրելին",
|
||||
"alert.unexpected.message": "Անսպասելի սխալ տեղի ունեցաւ։",
|
||||
@ -58,7 +63,7 @@
|
||||
"column.direct": "Հասցէագրուած հաղորդագրութիւններ",
|
||||
"column.directory": "Զննել անձնական էջերը",
|
||||
"column.domain_blocks": "Թաքցուած տիրոյթները",
|
||||
"column.favourites": "Հավանածներ",
|
||||
"column.favourites": "Հաւանածներ",
|
||||
"column.follow_requests": "Հետեւելու հայցեր",
|
||||
"column.home": "Հիմնական",
|
||||
"column.lists": "Ցանկեր",
|
||||
@ -68,27 +73,27 @@
|
||||
"column.public": "Դաշնային հոսք",
|
||||
"column_back_button.label": "Ետ",
|
||||
"column_header.hide_settings": "Թաքցնել կարգավորումները",
|
||||
"column_header.moveLeft_settings": "Տեղաշարժել սյունը ձախ",
|
||||
"column_header.moveRight_settings": "Տեղաշարժել սյունը աջ",
|
||||
"column_header.moveLeft_settings": "Տեղաշարժել սիւնը ձախ",
|
||||
"column_header.moveRight_settings": "Տեղաշարժել սիւնը աջ",
|
||||
"column_header.pin": "Ամրացնել",
|
||||
"column_header.show_settings": "Ցուցադրել կարգավորումները",
|
||||
"column_header.unpin": "Հանել",
|
||||
"column_subheading.settings": "Կարգավորումներ",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Միայն ներքին",
|
||||
"community.column_settings.media_only": "Media only",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Միայն հեռակա",
|
||||
"compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
|
||||
"compose_form.direct_message_warning_learn_more": "Իմանալ ավելին",
|
||||
"compose_form.hashtag_warning": "Այս թութը չի հաշվառվի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարավոր է որոնել պիտակներով։",
|
||||
"compose_form.lock_disclaimer": "Քո հաշիվը {locked} չէ։ Յուրաքանչյուր ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսված գրառումները։",
|
||||
"compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։",
|
||||
"compose_form.lock_disclaimer.lock": "փակ",
|
||||
"compose_form.placeholder": "Ի՞նչ կա մտքիդ",
|
||||
"compose_form.poll.add_option": "Աւելացնել տարբերակ",
|
||||
"compose_form.poll.duration": "Հարցման տեւողութիւնը",
|
||||
"compose_form.poll.option_placeholder": "Տարբերակ {number}",
|
||||
"compose_form.poll.remove_option": "Հեռացնել այս տարբերակը",
|
||||
"compose_form.poll.switch_to_multiple": "Հարցումը դարձնել բազմակի ընտրությամբ",
|
||||
"compose_form.poll.switch_to_single": "Հարցումը դարձնել եզակի ընտրությամբ",
|
||||
"compose_form.poll.switch_to_multiple": "Հարցումը դարձնել բազմակի ընտրութեամբ",
|
||||
"compose_form.poll.switch_to_single": "Հարցումը դարձնել եզակի ընտրութեամբ",
|
||||
"compose_form.publish": "Թթել",
|
||||
"compose_form.publish_loud": "Թթե՜լ",
|
||||
"compose_form.sensitive.hide": "Նշել մեդիան որպէս դիւրազգաց",
|
||||
@ -124,24 +129,24 @@
|
||||
"conversation.with": "{names}֊երի հետ",
|
||||
"directory.federated": "Յայտնի դաշնեզերքից",
|
||||
"directory.local": "{domain} տիրոյթից միայն",
|
||||
"directory.new_arrivals": "Նորութիւններ",
|
||||
"directory.new_arrivals": "Նորեկներ",
|
||||
"directory.recently_active": "Վերջերս ակտիւ",
|
||||
"embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։",
|
||||
"embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճէնել ներքինանալ կոդը։",
|
||||
"embed.preview": "Ահա, թե ինչ տեսք կունենա այն՝",
|
||||
"emoji_button.activity": "Զբաղմունքներ",
|
||||
"emoji_button.custom": "Հատուկ",
|
||||
"emoji_button.flags": "Դրոշներ",
|
||||
"emoji_button.food": "Կերուխում",
|
||||
"emoji_button.label": "Էմոջի ավելացնել",
|
||||
"emoji_button.nature": "Բնություն",
|
||||
"emoji_button.nature": "Բնութիւն",
|
||||
"emoji_button.not_found": "Նման էմոջիներ դեռ չեն հայտնաբերվել։ (╯°□°)╯︵ ┻━┻",
|
||||
"emoji_button.objects": "Առարկաներ",
|
||||
"emoji_button.people": "Մարդիկ",
|
||||
"emoji_button.recent": "Հաճախ օգտագործվող",
|
||||
"emoji_button.search": "Որոնել…",
|
||||
"emoji_button.search_results": "Որոնման արդյունքներ",
|
||||
"emoji_button.search_results": "Որոնման արդիւնքներ",
|
||||
"emoji_button.symbols": "Նշաններ",
|
||||
"emoji_button.travel": "Ուղեւորություն եւ տեղանքներ",
|
||||
"emoji_button.travel": "Ուղեւորութիւն եւ տեղանքներ",
|
||||
"empty_column.account_timeline": "Այստեղ թթեր չկա՛ն։",
|
||||
"empty_column.account_unavailable": "Անձնական էջը հասանելի չի",
|
||||
"empty_column.blocks": "Դու դեռ ոչ մէկի չես արգելափակել։",
|
||||
@ -151,31 +156,32 @@
|
||||
"empty_column.domain_blocks": "Թաքցուած տիրոյթներ դեռ չկան։",
|
||||
"empty_column.favourited_statuses": "Դու դեռ չունես որեւէ հաւանած թութ։ Երբ հաւանես, դրանք կերեւան այստեղ։",
|
||||
"empty_column.favourites": "Այս թութը ոչ մէկ դեռ չի հաւանել։ Հաւանողները կերեւան այստեղ, երբ նշեն թութը հաւանած։",
|
||||
"empty_column.follow_requests": "Դու դեռ չունես որեւէ հետևելու հայտ։ Բոլոր նման հայտերը կհայտնվեն այստեղ։",
|
||||
"empty_column.follow_requests": "Դու դեռ չունես որեւէ հետեւելու յայտ։ Բոլոր նման յայտերը կը յայտնուեն այստեղ։",
|
||||
"empty_column.hashtag": "Այս պիտակով դեռ ոչինչ չկա։",
|
||||
"empty_column.home": "Քո հիմնական հոսքը դատա՛րկ է։ Այցելի՛ր {public}ը կամ օգտվիր որոնումից՝ այլ մարդկանց հանդիպելու համար։",
|
||||
"empty_column.home.public_timeline": "հրապարակային հոսք",
|
||||
"empty_column.list": "Այս ցանկում դեռ ոչինչ չկա։ Երբ ցանկի անդամներից որեւէ մեկը նոր թութ գրի, այն կհայտնվի այստեղ։",
|
||||
"empty_column.lists": "Դուք դեռ չունեք ստեղծած ցանկ։ Ցանկ ստեղծելուն պես այն կհայտնվի այստեղ։",
|
||||
"empty_column.mutes": "Առայժմ ոչ ոքի չեք լռեցրել։",
|
||||
"empty_column.notifications": "Ոչ մի ծանուցում դեռ չունես։ Բզիր մյուսներին՝ խոսակցությունը սկսելու համար։",
|
||||
"empty_column.public": "Այստեղ բան չկա՛։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգույցներից էակների՝ այն լցնելու համար։",
|
||||
"error.unexpected_crash.explanation": "Մեր ծրագրակազմում վրիպակի կամ դիտարկչի անհամատեղելիության պատճառով այս էջը չի կարող լիարժեք պատկերվել։",
|
||||
"empty_column.notifications": "Ոչ մի ծանուցում դեռ չունես։ Բզիր միւսներին՝ խօսակցութիւնը սկսելու համար։",
|
||||
"empty_column.public": "Այստեղ բան չկա՛յ։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգոյցներից էակների՝ այն լցնելու համար։",
|
||||
"error.unexpected_crash.explanation": "Մեր ծրագրակազմում վրիպակի կամ դիտարկչի անհամատեղելիութեան պատճառով այս էջը չի կարող լիարժէք պատկերուել։",
|
||||
"error.unexpected_crash.next_steps": "Փորձիր թարմացնել էջը։ Եթե դա չօգնի ապա կարող ես օգտվել Մաստադոնից ուրիշ դիտարկիչով կամ հավելվածով։",
|
||||
"errors.unexpected_crash.copy_stacktrace": "Պատճենել սթաքթրեյսը սեղմատախտակին",
|
||||
"errors.unexpected_crash.report_issue": "Զեկուցել խնդրի մասին",
|
||||
"follow_request.authorize": "Վավերացնել",
|
||||
"follow_request.reject": "Մերժել",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"follow_requests.unlocked_explanation": "Այս հարցումը ուղարկված է հաշվից, որի համար {domain}-ի անձնակազմը միացրել է ձեռքով ստուգում։",
|
||||
"generic.saved": "Պահպանված է",
|
||||
"getting_started.developers": "Մշակողներ",
|
||||
"getting_started.directory": "Օգտատերերի շտեմարան",
|
||||
"getting_started.directory": "Օգտատէրերի շտեմարան",
|
||||
"getting_started.documentation": "Փաստաթղթեր",
|
||||
"getting_started.heading": "Ինչպես սկսել",
|
||||
"getting_started.invite": "Հրավիրել մարդկանց",
|
||||
"getting_started.invite": "Հրաւիրել մարդկանց",
|
||||
"getting_started.open_source_notice": "Մաստոդոնը բաց ելատեքստով ծրագրակազմ է։ Կարող ես ներդրում անել կամ վրեպներ զեկուցել ԳիթՀաբում՝ {github}։",
|
||||
"getting_started.security": "Հաշվի կարգավորումներ",
|
||||
"getting_started.terms": "Ծառայության պայմանները",
|
||||
"hashtag.column_header.tag_mode.all": "և {additional}",
|
||||
"getting_started.security": "Հաշուի կարգաւորումներ",
|
||||
"getting_started.terms": "Ծառայութեան պայմանները",
|
||||
"hashtag.column_header.tag_mode.all": "եւ {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "կամ {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "առանց {additional}",
|
||||
"hashtag.column_settings.select.no_options_message": "Առաջարկներ չկան",
|
||||
@ -187,34 +193,34 @@
|
||||
"home.column_settings.basic": "Հիմնական",
|
||||
"home.column_settings.show_reblogs": "Ցուցադրել տարածածները",
|
||||
"home.column_settings.show_replies": "Ցուցադրել պատասխանները",
|
||||
"home.hide_announcements": "Թաքցնել հայտարարությունները",
|
||||
"home.show_announcements": "Ցուցադրել հայտարարությունները",
|
||||
"home.hide_announcements": "Թաքցնել յայտարարութիւնները",
|
||||
"home.show_announcements": "Ցուցադրել յայտարարութիւնները",
|
||||
"intervals.full.days": "{number, plural, one {# օր} other {# օր}}",
|
||||
"intervals.full.hours": "{number, plural, one {# ժամ} other {# ժամ}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# րոպե} other {# րոպե}}",
|
||||
"introduction.federation.action": "Հաջորդ",
|
||||
"introduction.federation.federated.headline": "Դաշնային",
|
||||
"introduction.federation.federated.text": "Դաշտնեզերքի հարևան հանգույցների հանրային գրառումները կհայտնվեն դաշնային հոսքում։",
|
||||
"introduction.federation.federated.text": "Դաշնեզերքի հարեւան հանգոյցների հանրային գրառումները կը յայտնուեն դաշնային հոսքում։",
|
||||
"introduction.federation.home.headline": "Հիմնական",
|
||||
"introduction.federation.home.text": "Այն անձանց թթերը ում հետևում ես, կհայտնվի հիմնական հոսքում։ Դու կարող ես հետևել ցանկացած անձի ցանկացած հանգույցից։",
|
||||
"introduction.federation.home.text": "Այն անձանց թթերը ում հետևում ես, կը յայտնուեն հիմնական հոսքում։ Դու կարող ես հետեւել ցանկացած անձի ցանկացած հանգոյցից։",
|
||||
"introduction.federation.local.headline": "Տեղային",
|
||||
"introduction.federation.local.text": "Տեղական հոսքում կարող ես տեսնել քո հանգույցի բոլոր հանրային գրառումները։",
|
||||
"introduction.federation.local.text": "Տեղական հոսքում կարող ես տեսնել քո հանգոյցի բոլոր հանրային գրառումները։",
|
||||
"introduction.interactions.action": "Finish toot-orial!",
|
||||
"introduction.interactions.favourite.headline": "Նախընտրելի",
|
||||
"introduction.interactions.favourite.text": "Փոխանցիր հեղինակին որ քեզ դուր է եկել իր թութը հավանելով այն։",
|
||||
"introduction.interactions.reblog.headline": "Տարածել",
|
||||
"introduction.interactions.reblog.text": "Կիսիր այլ օգտատերերի թութերը քո հետևորդների հետ տարածելով դրանք քո անձնական էջում։",
|
||||
"introduction.interactions.reblog.text": "Կիսիր այլ օգտատէրերի թութերը քո հետեւողների հետ տարածելով դրանք քո անձնական էջում։",
|
||||
"introduction.interactions.reply.headline": "Պատասխանել",
|
||||
"introduction.interactions.reply.text": "Արձագանքիր ուրիշների և քո թթերին, դրանք կդարսվեն մեկ ընհանուր քննարկման շղթայով։",
|
||||
"introduction.interactions.reply.text": "Արձագանքիր ուրիշների եւ քո թթերին, դրանք կը դարսուեն մէկ ընդհանուր քննարկման շղթայով։",
|
||||
"introduction.welcome.action": "Գնացի՜նք։",
|
||||
"introduction.welcome.headline": "Առաջին քայլեր",
|
||||
"introduction.welcome.text": "Դաշնեզերքը ողջունում է ձեզ։ Շուտով կկարողանաս ուղարկել նամակներ ու շփվել տարբեր հանգույցների ընկերներիդ հետ։ Բայց մտապահիր {domain} հանգույցը, այն յուրահատուկ է, այստեղ է պահվում քո հաշիվը։",
|
||||
"introduction.welcome.text": "Դաշնեզերքը ողջունում է ձեզ։ Շուտով կը կարողանաս ուղարկել նամակներ ու շփուել տարբեր հանգոյցների ընկերներիդ հետ։ Բայց մտապահիր {domain} հանգոյցը, այն իւրայատուկ է, այստեղ է պահւում քո հաշիւը։",
|
||||
"keyboard_shortcuts.back": "ետ նավարկելու համար",
|
||||
"keyboard_shortcuts.blocked": "արգելափակված օգտատերերի ցանկը բացելու համար",
|
||||
"keyboard_shortcuts.boost": "տարածելու համար",
|
||||
"keyboard_shortcuts.column": "սյուներից մեկի վրա սեւեռվելու համար",
|
||||
"keyboard_shortcuts.column": "սիւներից մէկի վրայ սեւեռուելու համար",
|
||||
"keyboard_shortcuts.compose": "շարադրման տիրույթին սեւեռվելու համար",
|
||||
"keyboard_shortcuts.description": "Նկարագրություն",
|
||||
"keyboard_shortcuts.description": "Նկարագրութիւն",
|
||||
"keyboard_shortcuts.direct": "հասցեագրված գրվածքների հոսքը բացելու համար",
|
||||
"keyboard_shortcuts.down": "ցանկով ներքեւ շարժվելու համար",
|
||||
"keyboard_shortcuts.enter": "թութը բացելու համար",
|
||||
@ -229,13 +235,14 @@
|
||||
"keyboard_shortcuts.mention": "հեղինակին նշելու համար",
|
||||
"keyboard_shortcuts.muted": "լռեցված օգտատերերի ցանկը բացելու համար",
|
||||
"keyboard_shortcuts.my_profile": "սեփական էջին անցնելու համար",
|
||||
"keyboard_shortcuts.notifications": "ծանուցումեների սյունակը բացելու համար",
|
||||
"keyboard_shortcuts.notifications": "ծանուցումների սիւնակը բացելու համար",
|
||||
"keyboard_shortcuts.open_media": "ցուցադրել մեդիան",
|
||||
"keyboard_shortcuts.pinned": "ամրացուած թթերի ցանկը բացելու համար",
|
||||
"keyboard_shortcuts.profile": "հեղինակի անձնական էջը բացելու համար",
|
||||
"keyboard_shortcuts.reply": "պատասխանելու համար",
|
||||
"keyboard_shortcuts.requests": "հետեւելու հայցերի ցանկը դիտելու համար",
|
||||
"keyboard_shortcuts.search": "որոնման դաշտին սեւեռվելու համար",
|
||||
"keyboard_shortcuts.spoilers": "որպեսզի ցուցադրվի/թաքցվի CW դաշտը",
|
||||
"keyboard_shortcuts.start": "«սկսել» սիւնակը բացելու համար",
|
||||
"keyboard_shortcuts.toggle_hidden": "CW֊ի ետեւի տեքստը ցուցադրել֊թաքցնելու համար",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "մեդիան ցուցադրել֊թաքցնելու համար",
|
||||
@ -255,7 +262,7 @@
|
||||
"lists.new.title_placeholder": "Նոր ցանկի վերնագիր",
|
||||
"lists.search": "Փնտրել քո հետեւած մարդկանց մեջ",
|
||||
"lists.subheading": "Քո ցանկերը",
|
||||
"load_pending": "{count, plural, one {# նոր նյութ} other {# նոր նյութ}}",
|
||||
"load_pending": "{count, plural, one {# նոր նիւթ} other {# նոր նիւթ}}",
|
||||
"loading_indicator.label": "Բեռնվում է…",
|
||||
"media_gallery.toggle_visible": "Ցուցադրել/թաքցնել",
|
||||
"missing_indicator.label": "Չգտնվեց",
|
||||
@ -270,23 +277,23 @@
|
||||
"navigation_bar.discover": "Բացայայտել",
|
||||
"navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ",
|
||||
"navigation_bar.edit_profile": "Խմբագրել անձնական էջը",
|
||||
"navigation_bar.favourites": "Հավանածներ",
|
||||
"navigation_bar.favourites": "Հաւանածներ",
|
||||
"navigation_bar.filters": "Լռեցուած բառեր",
|
||||
"navigation_bar.follow_requests": "Հետեւելու հայցեր",
|
||||
"navigation_bar.follows_and_followers": "Հետեւածներ եւ հետեւողներ",
|
||||
"navigation_bar.info": "Այս հանգույցի մասին",
|
||||
"navigation_bar.info": "Այս հանգոյցի մասին",
|
||||
"navigation_bar.keyboard_shortcuts": "Ստեղնաշարի կարճատներ",
|
||||
"navigation_bar.lists": "Ցանկեր",
|
||||
"navigation_bar.logout": "Դուրս գալ",
|
||||
"navigation_bar.mutes": "Լռեցրած օգտատերեր",
|
||||
"navigation_bar.personal": "Անձնական",
|
||||
"navigation_bar.pins": "Ամրացված թթեր",
|
||||
"navigation_bar.preferences": "Նախապատվություններ",
|
||||
"navigation_bar.preferences": "Նախապատուութիւններ",
|
||||
"navigation_bar.public_timeline": "Դաշնային հոսք",
|
||||
"navigation_bar.security": "Անվտանգություն",
|
||||
"navigation_bar.security": "Անվտանգութիւն",
|
||||
"notification.favourite": "{name} հավանեց թութդ",
|
||||
"notification.follow": "{name} սկսեց հետեւել քեզ",
|
||||
"notification.follow_request": "{name} քեզ հետևելու հայց է ուղարկել",
|
||||
"notification.follow_request": "{name} քեզ հետեւելու հայց է ուղարկել",
|
||||
"notification.mention": "{name} նշեց քեզ",
|
||||
"notification.own_poll": "Հարցումդ աւարտուեց",
|
||||
"notification.poll": "Հարցումը, ուր դու քուէարկել ես, աւարտուեց։",
|
||||
@ -294,7 +301,7 @@
|
||||
"notifications.clear": "Մաքրել ծանուցումները",
|
||||
"notifications.clear_confirmation": "Վստա՞հ ես, որ ուզում ես մշտապես մաքրել քո բոլոր ծանուցումները։",
|
||||
"notifications.column_settings.alert": "Աշխատատիրույթի ծանուցումներ",
|
||||
"notifications.column_settings.favourite": "Հավանածներից՝",
|
||||
"notifications.column_settings.favourite": "Հաւանածներից՝",
|
||||
"notifications.column_settings.filter_bar.advanced": "Ցուցադրել բոլոր կատեգորիաները",
|
||||
"notifications.column_settings.filter_bar.category": "Արագ զտման վահանակ",
|
||||
"notifications.column_settings.filter_bar.show": "Ցուցադրել",
|
||||
@ -304,7 +311,7 @@
|
||||
"notifications.column_settings.poll": "Հարցման արդիւնքները՝",
|
||||
"notifications.column_settings.push": "Հրելու ծանուցումներ",
|
||||
"notifications.column_settings.reblog": "Տարածածներից՝",
|
||||
"notifications.column_settings.show": "Ցուցադրել սյունում",
|
||||
"notifications.column_settings.show": "Ցուցադրել սիւնում",
|
||||
"notifications.column_settings.sound": "Ձայն հանել",
|
||||
"notifications.filter.all": "Բոլորը",
|
||||
"notifications.filter.boosts": "Տարածածները",
|
||||
@ -321,7 +328,7 @@
|
||||
"poll.voted": "Դու քուէարկել ես այս տարբերակի համար",
|
||||
"poll_button.add_poll": "Աւելացնել հարցում",
|
||||
"poll_button.remove_poll": "Հեռացնել հարցումը",
|
||||
"privacy.change": "Կարգավորել թթի գաղտնիությունը",
|
||||
"privacy.change": "Կարգաւորել թթի գաղտնիութիւնը",
|
||||
"privacy.direct.long": "Թթել միայն նշված օգտատերերի համար",
|
||||
"privacy.direct.short": "Հասցեագրված",
|
||||
"privacy.private.long": "Թթել միայն հետեւողների համար",
|
||||
@ -343,7 +350,7 @@
|
||||
"report.forward": "Փոխանցել {target}֊ին",
|
||||
"report.forward_hint": "Այս հաշիւ այլ հանգոյցից է։ Ուղարկե՞մ այնտեղ էլ այս բողոքի անոնիմ պատճէնը։",
|
||||
"report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
|
||||
"report.placeholder": "Լրացուցիչ մեկնաբանություններ",
|
||||
"report.placeholder": "Լրացուցիչ մեկնաբանութիւններ",
|
||||
"report.submit": "Ուղարկել",
|
||||
"report.target": "Բողոքել {target}֊ի մասին",
|
||||
"search.placeholder": "Փնտրել",
|
||||
@ -357,7 +364,7 @@
|
||||
"search_results.hashtags": "Պիտակներ",
|
||||
"search_results.statuses": "Թթեր",
|
||||
"search_results.statuses_fts_disabled": "Այս հանգոյցում միացուած չէ ըստ բովանդակութեան թթեր փնտրելու հնարաւորութիւնը։",
|
||||
"search_results.total": "{count, number} {count, plural, one {արդյունք} other {արդյունք}}",
|
||||
"search_results.total": "{count, number} {count, plural, one {արդիւնք} other {արդիւնք}}",
|
||||
"status.admin_account": "Բացել @{name} օգտատիրոջ մոդերացիայի դիմերէսը։",
|
||||
"status.admin_status": "Բացել այս գրառումը մոդերատորի դիմերէսի մէջ",
|
||||
"status.block": "Արգելափակել @{name}֊ին",
|
||||
@ -372,12 +379,11 @@
|
||||
"status.favourite": "Հավանել",
|
||||
"status.filtered": "Զտված",
|
||||
"status.load_more": "Բեռնել ավելին",
|
||||
"status.local_only": "This post is only visible by other users of your instance",
|
||||
"status.media_hidden": "մեդիաբովանդակությունը թաքցված է",
|
||||
"status.media_hidden": "մեդիաբովանդակութիւնը թաքցուած է",
|
||||
"status.mention": "Նշել @{name}֊ին",
|
||||
"status.more": "Ավելին",
|
||||
"status.mute": "Լռեցնել @{name}֊ին",
|
||||
"status.mute_conversation": "Լռեցնել խոսակցությունը",
|
||||
"status.mute_conversation": "Լռեցնել խօսակցութիւնը",
|
||||
"status.open": "Ընդարձակել այս թութը",
|
||||
"status.pin": "Ամրացնել անձնական էջում",
|
||||
"status.pinned": "Ամրացված թութ",
|
||||
@ -385,13 +391,13 @@
|
||||
"status.reblog": "Տարածել",
|
||||
"status.reblog_private": "Տարածել սեփական լսարանին",
|
||||
"status.reblogged_by": "{name} տարածել է",
|
||||
"status.reblogs.empty": "Այս թութը ոչ մէկ դեռ չի տարածել։ Տարածողները կերեւան այստեղ, երբ որևէ մեկը տարածի։",
|
||||
"status.reblogs.empty": "Այս թութը ոչ մէկ դեռ չի տարածել։ Տարածողները կերեւան այստեղ, երբ որեւէ մէկը տարածի։",
|
||||
"status.redraft": "Ջնջել եւ վերակազմել",
|
||||
"status.remove_bookmark": "Հեռացնել էջանիշերից",
|
||||
"status.reply": "Պատասխանել",
|
||||
"status.replyAll": "Պատասխանել թելին",
|
||||
"status.report": "Բողոքել @{name}֊ից",
|
||||
"status.sensitive_warning": "Կասկածելի բովանդակություն",
|
||||
"status.sensitive_warning": "Կասկածելի բովանդակութիւն",
|
||||
"status.share": "Կիսվել",
|
||||
"status.show_less": "Պակաս",
|
||||
"status.show_less_all": "Թաքցնել բոլոր նախազգուշացնումները",
|
||||
@ -399,7 +405,7 @@
|
||||
"status.show_more_all": "Ցուցադրել բոլոր նախազգուշացնումները",
|
||||
"status.show_thread": "Բացել շղթան",
|
||||
"status.uncached_media_warning": "Անհասանելի",
|
||||
"status.unmute_conversation": "Ապալռեցնել խոսակցությունը",
|
||||
"status.unmute_conversation": "Ապալռեցնել խօսակցութիւնը",
|
||||
"status.unpin": "Հանել անձնական էջից",
|
||||
"suggestions.dismiss": "Անտեսել առաջարկը",
|
||||
"suggestions.header": "Միգուցե քեզ հետաքրքրի…",
|
||||
@ -411,34 +417,43 @@
|
||||
"time_remaining.days": "{number, plural, one {մնաց # օր} other {մնաց # օր}}",
|
||||
"time_remaining.hours": "{number, plural, one {# ժամ} other {# ժամ}} անց",
|
||||
"time_remaining.minutes": "{number, plural, one {# րոպե} other {# րոպե}} անց",
|
||||
"time_remaining.moments": "Մնացել է մի քանի վարկյան",
|
||||
"time_remaining.seconds": "{number, plural, one {# վայրկյան} other {# վայրկյան}} անց",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {հոգի} other {հոգի}} խոսում է սրա մասին",
|
||||
"time_remaining.moments": "Մնացել է մի քանի վարկեան",
|
||||
"time_remaining.seconds": "{number, plural, one {# վարկեան} other {# վարկեան}} անց",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} այլ սպասարկիչներից չեն ցուցադրվել:",
|
||||
"timeline_hint.resources.followers": "Հետևորդներ",
|
||||
"timeline_hint.resources.follows": "Հետևել",
|
||||
"timeline_hint.resources.statuses": "Հին թութեր",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} մարդ} other {{counter} մարդիկ}} խոսում են",
|
||||
"trends.trending_now": "Այժմ արդիական",
|
||||
"ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։",
|
||||
"units.short.billion": "{count}մլրդ",
|
||||
"units.short.million": "{count}մլն",
|
||||
"units.short.thousand": "{count}Հազ.",
|
||||
"upload_area.title": "Քաշիր ու նետիր՝ վերբեռնելու համար",
|
||||
"upload_button.label": "Ավելացնել մեդիա",
|
||||
"upload_error.limit": "Ֆայլի վերբեռնման սահմանաչափը գերազանցված է։",
|
||||
"upload_error.poll": "Հարցումների հետ ֆայլ կցել հնարավոր չէ։",
|
||||
"upload_form.audio_description": "Նկարագրիր ձայնագրության բովանդակությունը լսողական խնդիրներով անձանց համար",
|
||||
"upload_form.description": "Նկարագրություն ավելացրու տեսողական խնդիրներ ունեցողների համար",
|
||||
"upload_error.poll": "Հարցումների հետ նիշք կցել հնարաւոր չէ։",
|
||||
"upload_form.audio_description": "Նկարագրիր ձայնագրութեան բովանդակութիւնը լսողական խնդիրներով անձանց համար",
|
||||
"upload_form.description": "Նկարագիր՝ տեսողական խնդիրներ ունեցողների համար",
|
||||
"upload_form.edit": "Խմբագրել",
|
||||
"upload_form.thumbnail": "Փոխել պատկերակը",
|
||||
"upload_form.undo": "Հետարկել",
|
||||
"upload_form.video_description": "Նկարագրիր տեսանյութը լսողական կամ տեսողական խնդիրներով անձանց համար",
|
||||
"upload_form.video_description": "Նկարագրիր տեսանիւթը լսողական կամ տեսողական խնդիրներով անձանց համար",
|
||||
"upload_modal.analyzing_picture": "Լուսանկարի վերլուծում…",
|
||||
"upload_modal.apply": "Կիրառել",
|
||||
"upload_modal.description_placeholder": "Ճկուն շագանակագույն աղվեսը ցատկում է ծույլ շան վրայով",
|
||||
"upload_modal.choose_image": "Ընտրել նկար",
|
||||
"upload_modal.description_placeholder": "Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։",
|
||||
"upload_modal.detect_text": "Հայտնբերել տեքստը նկարից",
|
||||
"upload_modal.edit_media": "Խմբագրել մեդիան",
|
||||
"upload_modal.hint": "Սեղմեք և տեղաշարժեք նախատեսքի վրայի շրջանակը ընտրելու այն կետը որը միշտ տեսանելի կլինի մանրապատկերներում։",
|
||||
"upload_modal.hint": "Սեղմէք եւ տեղաշարժէք նախադիտման շրջանակը՝ որ ընտրէք մանրապատկերում միշտ տեսանելի կէտը։",
|
||||
"upload_modal.preview_label": "Նախադիտում ({ratio})",
|
||||
"upload_progress.label": "Վերբեռնվում է…",
|
||||
"video.close": "Փակել տեսագրությունը",
|
||||
"video.close": "Փակել տեսագրութիւնը",
|
||||
"video.download": "Ներբեռնել ֆայլը",
|
||||
"video.exit_fullscreen": "Անջատել լիաէկրան դիտումը",
|
||||
"video.expand": "Ընդարձակել տեսագրությունը",
|
||||
"video.expand": "Ընդարձակել տեսագրութիւնը",
|
||||
"video.fullscreen": "Լիաէկրան",
|
||||
"video.hide": "Թաքցնել տեսագրությունը",
|
||||
"video.hide": "Թաքցնել տեսագրութիւնը",
|
||||
"video.mute": "Լռեցնել ձայնը",
|
||||
"video.pause": "Դադար տալ",
|
||||
"video.play": "Նվագել",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Tambah atau Hapus dari daftar",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Grup",
|
||||
"account.block": "Blokir @{name}",
|
||||
"account.block_domain": "Sembunyikan segalanya dari {domain}",
|
||||
"account.blocked": "Terblokir",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Batalkan permintaan ikuti",
|
||||
"account.direct": "Direct Message @{name}",
|
||||
"account.domain_blocked": "Domain disembunyikan",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Ikuti",
|
||||
"account.followers": "Pengikut",
|
||||
"account.followers.empty": "Tidak ada satupun yang mengkuti pengguna ini saat ini.",
|
||||
"account.follows": "Mengikuti",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Pengguna ini belum mengikuti siapapun.",
|
||||
"account.follows_you": "Mengikuti anda",
|
||||
"account.hide_reblogs": "Sembunyikan boosts dari @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Menunggu persetujuan. Klik untuk membatalkan permintaan",
|
||||
"account.share": "Bagikan profil @{name}",
|
||||
"account.show_reblogs": "Tampilkan boost dari @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Hapus blokir @{name}",
|
||||
"account.unblock_domain": "Tampilkan {domain}",
|
||||
"account.unendorse": "Jangan tampilkan di profil",
|
||||
"account.unfollow": "Berhenti mengikuti",
|
||||
"account.unmute": "Berhenti membisukan @{name}",
|
||||
"account.unmute_notifications": "Munculkan notifikasi dari @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Tolong ulangi setelah {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Batasan tingkat",
|
||||
"alert.unexpected.message": "Terjadi kesalahan yang tidak terduga.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Izinkan",
|
||||
"follow_request.reject": "Tolak",
|
||||
"follow_requests.unlocked_explanation": "Meskipun akun Anda tidak dikunci, staf {domain} menyarankan Anda untuk meninjau permintaan mengikuti dari akun-akun ini secara manual.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Pengembang",
|
||||
"getting_started.directory": "Direktori profil",
|
||||
"getting_started.documentation": "Dokumentasi",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "balas",
|
||||
"keyboard_shortcuts.requests": "buka daftar permintaan ikuti",
|
||||
"keyboard_shortcuts.search": "untuk fokus mencari",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "buka kolom \"memulai\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "tampilkan/sembunyikan teks di belakang CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "tampilkan/sembunyikan media",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, other {# menit}} tersisa",
|
||||
"time_remaining.moments": "Momen tersisa",
|
||||
"time_remaining.seconds": "{number, plural, other {# detik}} tersisa",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, other {orang}} berbicara",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Sedang tren sekarang",
|
||||
"ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Seret & lepaskan untuk mengunggah",
|
||||
"upload_button.label": "Tambahkan media",
|
||||
"upload_error.limit": "Batas unggah berkas terlampaui.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Penjelasan untuk orang dengan gangguan pendengaran",
|
||||
"upload_form.description": "Deskripsikan untuk mereka yang tidak bisa melihat dengan jelas",
|
||||
"upload_form.edit": "Sunting",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Undo",
|
||||
"upload_form.video_description": "Penjelasan untuk orang dengan gangguan pendengaran atau penglihatan",
|
||||
"upload_modal.analyzing_picture": "Analisis gambar…",
|
||||
"upload_modal.apply": "Terapkan",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "Muharjo seorang xenofobia universal yang takut pada warga jazirah, contohnya Qatar",
|
||||
"upload_modal.detect_text": "Deteksi teks pada gambar",
|
||||
"upload_modal.edit_media": "Sunting media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Blokusar @{name}",
|
||||
"account.block_domain": "Hide everything from {domain}",
|
||||
"account.blocked": "Blocked",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.direct": "Direct Message @{name}",
|
||||
"account.domain_blocked": "Domain hidden",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Sequar",
|
||||
"account.followers": "Sequanti",
|
||||
"account.followers.empty": "No one follows this user yet.",
|
||||
"account.follows": "Sequas",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "This user doesn't follow anyone yet.",
|
||||
"account.follows_you": "Sequas tu",
|
||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Vartante aprobo",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Show boosts from @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Desblokusar @{name}",
|
||||
"account.unblock_domain": "Unhide {domain}",
|
||||
"account.unendorse": "Don't feature on profile",
|
||||
"account.unfollow": "Ne plus sequar",
|
||||
"account.unmute": "Ne plus celar @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "An unexpected error occurred.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Yurizar",
|
||||
"follow_request.reject": "Refuzar",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Tranar faligar por kargar",
|
||||
"upload_button.label": "Adjuntar kontenajo",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Desfacar",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Minnispunkturinn þinn fyrir @{name}",
|
||||
"account.add_or_remove_from_list": "Bæta á eða fjarlægja af listum",
|
||||
"account.badges.bot": "Róbót",
|
||||
"account.badges.group": "Hópur",
|
||||
"account.block": "Útiloka @{name}",
|
||||
"account.block_domain": "Fela allt frá {domain}",
|
||||
"account.blocked": "Útilokaður",
|
||||
"account.browse_more_on_origin_server": "Skoða nánari upplýsingar á notandasniðinu",
|
||||
"account.cancel_follow_request": "Hætta við beiðni um að fylgjast með",
|
||||
"account.direct": "Bein skilaboð til @{name}",
|
||||
"account.domain_blocked": "Lén falið",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Fylgjast með",
|
||||
"account.followers": "Fylgjendur",
|
||||
"account.followers.empty": "Ennþá fylgist enginn með þessum notanda.",
|
||||
"account.follows": "Fylgist með",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Þessi notandi fylgist ennþá ekki með neinum.",
|
||||
"account.follows_you": "Fylgir þér",
|
||||
"account.hide_reblogs": "Fela endurbirtingar fyrir @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Bíður eftir samþykki. Smelltu til að hætta við beiðni um að fylgjast með",
|
||||
"account.share": "Deila notandasniði fyrir @{name}",
|
||||
"account.show_reblogs": "Sýna endurbirtingar frá @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Aflétta útilokun af @{name}",
|
||||
"account.unblock_domain": "Hætta að fela {domain}",
|
||||
"account.unendorse": "Ekki birta á notandasniði",
|
||||
"account.unfollow": "Hætta að fylgja",
|
||||
"account.unmute": "Hætta að þagga niður í @{name}",
|
||||
"account.unmute_notifications": "Hætta að þagga tilkynningar frá @{name}",
|
||||
"account_note.placeholder": "Engin athugasemd gefin",
|
||||
"alert.rate_limited.message": "Prófaðu aftur eftir {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Með takmörkum",
|
||||
"alert.unexpected.message": "Upp kom óvænt villa.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "Birta stillingar",
|
||||
"column_header.unpin": "Losa",
|
||||
"column_subheading.settings": "Stillingar",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Einungis staðvært",
|
||||
"community.column_settings.media_only": "Einungis myndskrár",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Einungis fjartengt",
|
||||
"compose_form.direct_message_warning": "Þetta tíst verður aðeins sent á notendur sem minnst er á.",
|
||||
"compose_form.direct_message_warning_learn_more": "Kanna nánar",
|
||||
"compose_form.hashtag_warning": "Þetta tíst verður ekki talið með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum tístum eftir myllumerkjum.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Heimila",
|
||||
"follow_request.reject": "Hafna",
|
||||
"follow_requests.unlocked_explanation": "Jafnvel þótt aðgangurinn þinn sé ekki læstur, hafa umsjónarmenn {domain} ímyndað sér að þú gætir viljað yfirfara handvirkt fylgjendabeiðnir frá þessum notendum.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Forritarar",
|
||||
"getting_started.directory": "Notandasniðamappa",
|
||||
"getting_started.documentation": "Hjálparskjöl",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "að svara",
|
||||
"keyboard_shortcuts.requests": "að opna lista yfir fylgjendabeiðnir",
|
||||
"keyboard_shortcuts.search": "að setja virkni í leit",
|
||||
"keyboard_shortcuts.spoilers": "til að birta/fela reit með aðvörun vegna efnis",
|
||||
"keyboard_shortcuts.start": "að opna \"komast í gang\" dálk",
|
||||
"keyboard_shortcuts.toggle_hidden": "að birta/fela texta á bak við aðvörun vegna efnis",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "að birta/fela myndir",
|
||||
@ -412,9 +419,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# mínúta} other {# mínútur}} eftir",
|
||||
"time_remaining.moments": "Tími eftir",
|
||||
"time_remaining.seconds": "{number, plural, one {# sekúnda} other {# sekúndur}} eftir",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {aðili} other {aðilar}} að tala",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} frá öðrum netþjónum er ekki birt.",
|
||||
"timeline_hint.resources.followers": "Fylgjendur",
|
||||
"timeline_hint.resources.follows": "Fylgist með",
|
||||
"timeline_hint.resources.statuses": "Eldri tíst",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Í umræðunni núna",
|
||||
"ui.beforeunload": "Drögin tapast ef þú ferð út úr Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Dragðu-og-slepptu hér til að senda inn",
|
||||
"upload_button.label": "Bæta við ({formats}) myndskrá",
|
||||
"upload_error.limit": "Fór yfir takmörk á innsendingum skráa.",
|
||||
@ -422,10 +436,12 @@
|
||||
"upload_form.audio_description": "Lýstu þessu fyrir heyrnarskerta",
|
||||
"upload_form.description": "Lýstu þessu fyrir sjónskerta",
|
||||
"upload_form.edit": "Breyta",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Eyða",
|
||||
"upload_form.video_description": "Lýstu þessu fyrir fólk sem heyrir illa eða er með skerta sjón",
|
||||
"upload_modal.analyzing_picture": "Greini mynd…",
|
||||
"upload_modal.apply": "Virkja",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "Öllum dýrunum í skóginum þætti bezt að vera vinir",
|
||||
"upload_modal.detect_text": "Skynja texta úr mynd",
|
||||
"upload_modal.edit_media": "Breyta myndskrá",
|
||||
|
@ -1,25 +1,28 @@
|
||||
{
|
||||
"account.add_or_remove_from_list": "Aggiungi o togli dalle liste",
|
||||
"account.account_note_header": "La tua nota per @{name}",
|
||||
"account.add_or_remove_from_list": "Aggiungi o Rimuovi dagli elenchi",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Gruppo",
|
||||
"account.block": "Blocca @{name}",
|
||||
"account.block_domain": "Nascondi tutto da {domain}",
|
||||
"account.block_domain": "Blocca dominio {domain}",
|
||||
"account.blocked": "Bloccato",
|
||||
"account.cancel_follow_request": "Annulla richiesta di seguire",
|
||||
"account.direct": "Invia messaggio privato a @{name}",
|
||||
"account.domain_blocked": "Dominio nascosto",
|
||||
"account.browse_more_on_origin_server": "Naviga di più sul profilo originale",
|
||||
"account.cancel_follow_request": "Annulla richiesta di seguirti",
|
||||
"account.direct": "Messaggio diretto a @{name}",
|
||||
"account.domain_blocked": "Dominio bloccato",
|
||||
"account.edit_profile": "Modifica profilo",
|
||||
"account.endorse": "Metti in evidenza sul profilo",
|
||||
"account.endorse": "Mostra sul profilo",
|
||||
"account.follow": "Segui",
|
||||
"account.followers": "Seguaci",
|
||||
"account.followers.empty": "Ancora nessuno segue questo utente.",
|
||||
"account.follows": "Segue",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Seguace} other {{counter} Seguaci}}",
|
||||
"account.following_counter": "{count, plural, other {{counter} Seguiti}}",
|
||||
"account.follows.empty": "Questo utente non segue ancora nessuno.",
|
||||
"account.follows_you": "Ti segue",
|
||||
"account.hide_reblogs": "Nascondi condivisioni da @{name}",
|
||||
"account.hide_reblogs": "Nascondi incrementi da @{name}",
|
||||
"account.last_status": "Ultima attività",
|
||||
"account.link_verified_on": "La proprietà di questo link è stata controllata il {date}",
|
||||
"account.locked_info": "Il livello di privacy di questo account è impostato a \"bloccato\". Il proprietario esamina manualmente le richieste di seguirlo.",
|
||||
"account.locked_info": "Lo stato di privacy del profilo è impostato a bloccato. Il proprietario revisiona manualmente chi lo può seguire.",
|
||||
"account.media": "Media",
|
||||
"account.mention": "Menziona @{name}",
|
||||
"account.moved_to": "{name} si è trasferito su:",
|
||||
@ -30,17 +33,19 @@
|
||||
"account.posts": "Toot",
|
||||
"account.posts_with_replies": "Toot e risposte",
|
||||
"account.report": "Segnala @{name}",
|
||||
"account.requested": "In attesa di approvazione",
|
||||
"account.requested": "In attesa di approvazione. Clicca per annullare la richiesta di seguire",
|
||||
"account.share": "Condividi il profilo di @{name}",
|
||||
"account.show_reblogs": "Mostra condivisioni da @{name}",
|
||||
"account.show_reblogs": "Mostra incrementi da @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toot}}",
|
||||
"account.unblock": "Sblocca @{name}",
|
||||
"account.unblock_domain": "Non nascondere {domain}",
|
||||
"account.unendorse": "Non mettere in evidenza sul profilo",
|
||||
"account.unblock_domain": "Sblocca il dominio {domain}",
|
||||
"account.unendorse": "Non mostrare sul profilo",
|
||||
"account.unfollow": "Smetti di seguire",
|
||||
"account.unmute": "Non silenziare @{name}",
|
||||
"account.unmute_notifications": "Non silenziare più le notifiche da @{name}",
|
||||
"alert.rate_limited.message": "Riprova dopo {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Numero massimo di richieste superato",
|
||||
"account.unmute_notifications": "Non silenziare le notifiche da @{name}",
|
||||
"account_note.placeholder": "Nessun commento fornito",
|
||||
"alert.rate_limited.message": "Sei pregato di riprovare tra {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Intervallo limitato",
|
||||
"alert.unexpected.message": "Si è verificato un errore inatteso.",
|
||||
"alert.unexpected.title": "Oops!",
|
||||
"announcement.announcement": "Annuncio",
|
||||
@ -50,37 +55,37 @@
|
||||
"bundle_column_error.retry": "Riprova",
|
||||
"bundle_column_error.title": "Errore di rete",
|
||||
"bundle_modal_error.close": "Chiudi",
|
||||
"bundle_modal_error.message": "C'è stato un errore mentre questo componente veniva caricato.",
|
||||
"bundle_modal_error.message": "Qualcosa è andato storto durante il caricamento di questo componente.",
|
||||
"bundle_modal_error.retry": "Riprova",
|
||||
"column.blocks": "Utenti bloccati",
|
||||
"column.bookmarks": "Segnalibri",
|
||||
"column.community": "Timeline locale",
|
||||
"column.community": "Fuso orario locale",
|
||||
"column.direct": "Messaggi diretti",
|
||||
"column.directory": "Sfoglia profili",
|
||||
"column.domain_blocks": "Domini nascosti",
|
||||
"column.favourites": "Apprezzati",
|
||||
"column.follow_requests": "Richieste di amicizia",
|
||||
"column.directory": "Naviga profili",
|
||||
"column.domain_blocks": "Domini bloccati",
|
||||
"column.favourites": "Preferiti",
|
||||
"column.follow_requests": "Richieste di seguirti",
|
||||
"column.home": "Home",
|
||||
"column.lists": "Liste",
|
||||
"column.lists": "Elenchi",
|
||||
"column.mutes": "Utenti silenziati",
|
||||
"column.notifications": "Notifiche",
|
||||
"column.pins": "Toot fissati in cima",
|
||||
"column.public": "Timeline federata",
|
||||
"column.pins": "Toot in evidenza",
|
||||
"column.public": "Fuso orario federato",
|
||||
"column_back_button.label": "Indietro",
|
||||
"column_header.hide_settings": "Nascondi impostazioni",
|
||||
"column_header.moveLeft_settings": "Sposta colonna a sinistra",
|
||||
"column_header.moveRight_settings": "Sposta colonna a destra",
|
||||
"column_header.pin": "Fissa in cima",
|
||||
"column_header.pin": "Evidenzia",
|
||||
"column_header.show_settings": "Mostra impostazioni",
|
||||
"column_header.unpin": "Non fissare in cima",
|
||||
"column_header.unpin": "Non mettere in evidenza",
|
||||
"column_subheading.settings": "Impostazioni",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.media_only": "Solo media",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"compose_form.direct_message_warning": "Questo toot sarà mandato solo a tutti gli utenti menzionati.",
|
||||
"compose_form.direct_message_warning_learn_more": "Per saperne di più",
|
||||
"compose_form.hashtag_warning": "Questo toot non è listato, quindi non sarà trovato nelle ricerche per hashtag. Solo i toot pubblici possono essere cercati per hashtag.",
|
||||
"compose_form.lock_disclaimer": "Il tuo account non è {bloccato}. Chiunque può decidere di seguirti per vedere i tuoi post per soli seguaci.",
|
||||
"community.column_settings.local_only": "Solo Locale",
|
||||
"community.column_settings.media_only": "Solo Media",
|
||||
"community.column_settings.remote_only": "Solo Remoto",
|
||||
"compose_form.direct_message_warning": "Questo toot sarà inviato solo agli utenti menzionati.",
|
||||
"compose_form.direct_message_warning_learn_more": "Scopri di più",
|
||||
"compose_form.hashtag_warning": "Questo toot non sarà elencato sotto alcun hashtag poiché senza elenco. Solo i toot pubblici possono essere ricercati per hashtag.",
|
||||
"compose_form.lock_disclaimer": "Il tuo profilo non è {locked}. Chiunque può seguirti per vedere i tuoi post solo per seguaci.",
|
||||
"compose_form.lock_disclaimer.lock": "bloccato",
|
||||
"compose_form.placeholder": "A cosa stai pensando?",
|
||||
"compose_form.poll.add_option": "Aggiungi una scelta",
|
||||
@ -94,58 +99,58 @@
|
||||
"compose_form.sensitive.hide": "Segna media come sensibile",
|
||||
"compose_form.sensitive.marked": "Questo media è contrassegnato come sensibile",
|
||||
"compose_form.sensitive.unmarked": "Questo media non è contrassegnato come sensibile",
|
||||
"compose_form.spoiler.marked": "Il testo è nascosto dall'avviso",
|
||||
"compose_form.spoiler.marked": "Il testo è nascosto dietro l'avviso",
|
||||
"compose_form.spoiler.unmarked": "Il testo non è nascosto",
|
||||
"compose_form.spoiler_placeholder": "Content warning",
|
||||
"compose_form.spoiler_placeholder": "Scrivi qui il tuo avviso",
|
||||
"confirmation_modal.cancel": "Annulla",
|
||||
"confirmations.block.block_and_report": "Blocca & Segnala",
|
||||
"confirmations.block.confirm": "Blocca",
|
||||
"confirmations.block.message": "Sei sicuro di voler bloccare {name}?",
|
||||
"confirmations.delete.confirm": "Cancella",
|
||||
"confirmations.delete.message": "Sei sicuro di voler cancellare questo status?",
|
||||
"confirmations.delete.message": "Sei sicuro di voler cancellare questo toot?",
|
||||
"confirmations.delete_list.confirm": "Cancella",
|
||||
"confirmations.delete_list.message": "Sei sicuro di voler cancellare definitivamente questa lista?",
|
||||
"confirmations.domain_block.confirm": "Nascondi intero dominio",
|
||||
"confirmations.domain_block.message": "Sei davvero sicuro che vuoi bloccare l'intero {domain}? Nella maggior parte dei casi, pochi blocchi o silenziamenti mirati sono sufficienti e preferibili. Non vedrai nessun contenuto di quel dominio né nelle timeline pubbliche né nelle notifiche. I tuoi seguaci di quel dominio saranno eliminati.",
|
||||
"confirmations.logout.confirm": "Esci",
|
||||
"confirmations.logout.message": "Sei sicuro di voler uscire?",
|
||||
"confirmations.domain_block.confirm": "Blocca l'intero dominio",
|
||||
"confirmations.domain_block.message": "Sei davvero, davvero sicuro di voler bloccare l'intero {domain}? In molti casi pochi blocchi di destinazione o muti sono sufficienti e preferibili. Non vedrai il contenuto da quel dominio in alcuna linea temporale pubblica o nelle tue notifiche. i tuoi seguaci saranno rimossi da quel dominio.",
|
||||
"confirmations.logout.confirm": "Disconnettiti",
|
||||
"confirmations.logout.message": "Sei sicuro di volerti disconnettere?",
|
||||
"confirmations.mute.confirm": "Silenzia",
|
||||
"confirmations.mute.explanation": "I post scritti da loro e quelli che li menzionano saranno nascosti, ma loro continueranno a vedere i tuoi post e a poterti seguire.",
|
||||
"confirmations.mute.explanation": "Questo nasconderà i post da loro ed i post che li menzionano, ma consentirà ancora loro di vedere i tuoi post e di seguirti.",
|
||||
"confirmations.mute.message": "Sei sicuro di voler silenziare {name}?",
|
||||
"confirmations.redraft.confirm": "Cancella e riscrivi",
|
||||
"confirmations.redraft.message": "Sei sicuro di voler cancellare questo stato e riscriverlo? Perderai tutte le risposte, condivisioni e preferiti.",
|
||||
"confirmations.redraft.confirm": "Cancella e rivali",
|
||||
"confirmations.redraft.message": "Sei sicuro di voler eliminare questo toot e riscriverlo? I preferiti e gli incrementi saranno persi e le risposte al post originale saranno perse.",
|
||||
"confirmations.reply.confirm": "Rispondi",
|
||||
"confirmations.reply.message": "Se rispondi ora, il messaggio che stai componendo sarà sovrascritto. Sei sicuro di voler continuare?",
|
||||
"confirmations.reply.message": "Rispondere ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?",
|
||||
"confirmations.unfollow.confirm": "Smetti di seguire",
|
||||
"confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?",
|
||||
"confirmations.unfollow.message": "Sei sicuro di non voler più seguire {name}?",
|
||||
"conversation.delete": "Elimina conversazione",
|
||||
"conversation.mark_as_read": "Segna come letto",
|
||||
"conversation.open": "Visualizza conversazione",
|
||||
"conversation.with": "Con {names}",
|
||||
"directory.federated": "Da un fediverso noto",
|
||||
"directory.federated": "Da un fediverse noto",
|
||||
"directory.local": "Solo da {domain}",
|
||||
"directory.new_arrivals": "Nuovi arrivi",
|
||||
"directory.recently_active": "Attivo di recente",
|
||||
"embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.",
|
||||
"embed.instructions": "Incorpora questo toot sul tuo sito web copiando il codice sotto.",
|
||||
"embed.preview": "Ecco come apparirà:",
|
||||
"emoji_button.activity": "Attività",
|
||||
"emoji_button.custom": "Personalizzato",
|
||||
"emoji_button.flags": "Bandiere",
|
||||
"emoji_button.food": "Cibo e bevande",
|
||||
"emoji_button.flags": "Segnalazioni",
|
||||
"emoji_button.food": "Cibo & Bevande",
|
||||
"emoji_button.label": "Inserisci emoji",
|
||||
"emoji_button.nature": "Natura",
|
||||
"emoji_button.not_found": "Nessun emojos!! (╯°□°)╯︵ ┻━┻",
|
||||
"emoji_button.objects": "Oggetti",
|
||||
"emoji_button.people": "Persone",
|
||||
"emoji_button.recent": "Usati di frequente",
|
||||
"emoji_button.recent": "Usati frequentemente",
|
||||
"emoji_button.search": "Cerca...",
|
||||
"emoji_button.search_results": "Risultati della ricerca",
|
||||
"emoji_button.symbols": "Simboli",
|
||||
"emoji_button.travel": "Viaggi e luoghi",
|
||||
"empty_column.account_timeline": "Non ci sono toot qui!",
|
||||
"emoji_button.travel": "Viaggi & Luoghi",
|
||||
"empty_column.account_timeline": "Nessun toot qui!",
|
||||
"empty_column.account_unavailable": "Profilo non disponibile",
|
||||
"empty_column.blocks": "Non hai ancora bloccato nessun utente.",
|
||||
"empty_column.bookmarked_statuses": "Non hai ancora nessun toot tra i segnalibri. Quando ne aggiungerai qualcuno, comparirà qui.",
|
||||
"empty_column.blocks": "Non hai ancora bloccato alcun utente.",
|
||||
"empty_column.bookmarked_statuses": "Non hai ancora segnato alcun toot. Quando ne segni uno, sarà mostrato qui.",
|
||||
"empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!",
|
||||
"empty_column.direct": "Non hai ancora nessun messaggio privato. Quando ne manderai o riceverai qualcuno, apparirà qui.",
|
||||
"empty_column.domain_blocks": "Non vi sono domini nascosti.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Autorizza",
|
||||
"follow_request.reject": "Rifiuta",
|
||||
"follow_requests.unlocked_explanation": "Anche se il tuo account non è bloccato, lo staff di {domain} ha pensato che potresti voler esaminare manualmente le richieste di seguirti di questi account.",
|
||||
"generic.saved": "Salvato",
|
||||
"getting_started.developers": "Sviluppatori",
|
||||
"getting_started.directory": "Directory dei profili",
|
||||
"getting_started.documentation": "Documentazione",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "per rispondere",
|
||||
"keyboard_shortcuts.requests": "per aprire l'elenco delle richieste di seguirti",
|
||||
"keyboard_shortcuts.search": "per spostare il focus sulla ricerca",
|
||||
"keyboard_shortcuts.spoilers": "per mostrare/nascondere il campo CW",
|
||||
"keyboard_shortcuts.start": "per aprire la colonna \"Come iniziare\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "per mostrare/nascondere il testo dei CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "mostrare/nascondere media",
|
||||
@ -272,7 +279,7 @@
|
||||
"navigation_bar.edit_profile": "Modifica profilo",
|
||||
"navigation_bar.favourites": "Apprezzati",
|
||||
"navigation_bar.filters": "Parole silenziate",
|
||||
"navigation_bar.follow_requests": "Richieste di amicizia",
|
||||
"navigation_bar.follow_requests": "Richieste di seguirti",
|
||||
"navigation_bar.follows_and_followers": "Seguiti e seguaci",
|
||||
"navigation_bar.info": "Informazioni su questo server",
|
||||
"navigation_bar.keyboard_shortcuts": "Tasti di scelta rapida",
|
||||
@ -299,7 +306,7 @@
|
||||
"notifications.column_settings.filter_bar.category": "Filtro rapido",
|
||||
"notifications.column_settings.filter_bar.show": "Mostra",
|
||||
"notifications.column_settings.follow": "Nuovi seguaci:",
|
||||
"notifications.column_settings.follow_request": "Nuove richieste di essere seguito:",
|
||||
"notifications.column_settings.follow_request": "Nuove richieste di seguirti:",
|
||||
"notifications.column_settings.mention": "Menzioni:",
|
||||
"notifications.column_settings.poll": "Risultati del sondaggio:",
|
||||
"notifications.column_settings.push": "Notifiche push",
|
||||
@ -413,9 +420,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minuto} other {# minuti}} left",
|
||||
"time_remaining.moments": "Restano pochi istanti",
|
||||
"time_remaining.seconds": "{number, plural, one {# secondo} other {# secondi}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {persona ne sta} other {persone ne stanno}} parlando",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource] da altri server non sono mostrati.",
|
||||
"timeline_hint.resources.followers": "Seguaci",
|
||||
"timeline_hint.resources.follows": "Segue",
|
||||
"timeline_hint.resources.statuses": "Toot meno recenti",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persone}} ne parla·no",
|
||||
"trends.trending_now": "Di tendenza ora",
|
||||
"ui.beforeunload": "La bozza andrà persa se esci da Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Trascina per caricare",
|
||||
"upload_button.label": "Aggiungi file multimediale",
|
||||
"upload_error.limit": "Limite al caricamento di file superato.",
|
||||
@ -423,10 +437,12 @@
|
||||
"upload_form.audio_description": "Descrizione per persone con difetti uditivi",
|
||||
"upload_form.description": "Descrizione per utenti con disabilità visive",
|
||||
"upload_form.edit": "Modifica",
|
||||
"upload_form.thumbnail": "Cambia miniatura",
|
||||
"upload_form.undo": "Cancella",
|
||||
"upload_form.video_description": "Descrizione per persone con difetti uditivi o visivi",
|
||||
"upload_modal.analyzing_picture": "Analisi immagine…",
|
||||
"upload_modal.apply": "Applica",
|
||||
"upload_modal.choose_image": "Scegli immagine",
|
||||
"upload_modal.description_placeholder": "Ma la volpe col suo balzo ha raggiunto il quieto Fido",
|
||||
"upload_modal.detect_text": "Rileva testo dall'immagine",
|
||||
"upload_modal.edit_media": "Modifica media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "メモ",
|
||||
"account.add_or_remove_from_list": "リストから追加または外す",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "@{name}さんをブロック",
|
||||
"account.block_domain": "{domain}全体をブロック",
|
||||
"account.blocked": "ブロック済み",
|
||||
"account.browse_more_on_origin_server": "リモートで表示",
|
||||
"account.cancel_follow_request": "フォローリクエストを取り消す",
|
||||
"account.direct": "@{name}さんにダイレクトメッセージ",
|
||||
"account.domain_blocked": "ドメインブロック中",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "フォロー",
|
||||
"account.followers": "フォロワー",
|
||||
"account.followers.empty": "まだ誰もフォローしていません。",
|
||||
"account.follows": "フォロー",
|
||||
"account.followers_counter": "{counter} フォロワー",
|
||||
"account.following_counter": "{counter} フォロー",
|
||||
"account.follows.empty": "まだ誰もフォローしていません。",
|
||||
"account.follows_you": "フォローされています",
|
||||
"account.hide_reblogs": "@{name}さんからのブーストを非表示",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "フォロー承認待ちです。クリックしてキャンセル",
|
||||
"account.share": "@{name}さんのプロフィールを共有する",
|
||||
"account.show_reblogs": "@{name}さんからのブーストを表示",
|
||||
"account.statuses_counter": "{counter} 投稿",
|
||||
"account.unblock": "@{name}さんのブロックを解除",
|
||||
"account.unblock_domain": "{domain}のブロックを解除",
|
||||
"account.unendorse": "プロフィールから外す",
|
||||
"account.unfollow": "フォロー解除",
|
||||
"account.unmute": "@{name}さんのミュートを解除",
|
||||
"account.unmute_notifications": "@{name}さんからの通知を受け取るようにする",
|
||||
"account_note.placeholder": "クリックしてメモを追加",
|
||||
"alert.rate_limited.message": "{retry_time, time, medium} 以降に再度実行してください。",
|
||||
"alert.rate_limited.title": "制限に達しました",
|
||||
"alert.unexpected.message": "不明なエラーが発生しました。",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "設定を表示",
|
||||
"column_header.unpin": "ピン留めを外す",
|
||||
"column_subheading.settings": "設定",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "ローカルのみ表示",
|
||||
"community.column_settings.media_only": "メディアのみ表示",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "リモートのみ表示",
|
||||
"compose_form.direct_message_warning": "このトゥートはメンションされた人にのみ送信されます。",
|
||||
"compose_form.direct_message_warning_learn_more": "もっと詳しく",
|
||||
"compose_form.hashtag_warning": "このトゥートは公開設定ではないのでハッシュタグの一覧に表示されません。公開トゥートだけがハッシュタグで検索できます。",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "許可",
|
||||
"follow_request.reject": "拒否",
|
||||
"follow_requests.unlocked_explanation": "あなたのアカウントは承認制ではありませんが、{domain} のスタッフはこれらのアカウントからのフォローリクエストの確認が必要であると判断しました。",
|
||||
"generic.saved": "保存しました",
|
||||
"getting_started.developers": "開発",
|
||||
"getting_started.directory": "ディレクトリ",
|
||||
"getting_started.documentation": "ドキュメント",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "返信",
|
||||
"keyboard_shortcuts.requests": "フォローリクエストのリストを開く",
|
||||
"keyboard_shortcuts.search": "検索欄に移動",
|
||||
"keyboard_shortcuts.spoilers": "閲覧注意を表示する/隠す",
|
||||
"keyboard_shortcuts.start": "\"スタート\" カラムを開く",
|
||||
"keyboard_shortcuts.toggle_hidden": "CWで隠れた文を見る/隠す",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "非表示のメディアを見る/隠す",
|
||||
@ -418,20 +425,29 @@
|
||||
"time_remaining.minutes": "残り{number}分",
|
||||
"time_remaining.moments": "まもなく終了",
|
||||
"time_remaining.seconds": "残り{number}秒",
|
||||
"trends.count_by_accounts": "{count}人がトゥート",
|
||||
"timeline_hint.remote_resource_not_displayed": "他のサーバーの{resource}は表示されません。",
|
||||
"timeline_hint.resources.followers": "フォロワー",
|
||||
"timeline_hint.resources.follows": "フォロー",
|
||||
"timeline_hint.resources.statuses": "以前のトゥート",
|
||||
"trends.counter_by_accounts": "{counter} 人がトゥート",
|
||||
"trends.trending_now": "トレンドタグ",
|
||||
"ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "ドラッグ&ドロップでアップロード",
|
||||
"upload_button.label": "メディアを追加 ({formats})",
|
||||
"upload_button.label": "メディアを追加 (複数の画像または1つの動画か音声ファイル)",
|
||||
"upload_error.limit": "アップロードできる上限を超えています。",
|
||||
"upload_error.poll": "アンケートではファイルをアップロードできません。",
|
||||
"upload_form.audio_description": "聴取が難しいユーザーへの説明",
|
||||
"upload_form.description": "閲覧が難しいユーザーへの説明",
|
||||
"upload_form.edit": "編集",
|
||||
"upload_form.thumbnail": "サムネイルを変更",
|
||||
"upload_form.undo": "削除",
|
||||
"upload_form.video_description": "視聴が難しいユーザーへの説明",
|
||||
"upload_modal.analyzing_picture": "画像を解析中…",
|
||||
"upload_modal.apply": "適用",
|
||||
"upload_modal.choose_image": "画像を選択",
|
||||
"upload_modal.description_placeholder": "あのイーハトーヴォのすきとおった風",
|
||||
"upload_modal.detect_text": "画像からテキストを検出",
|
||||
"upload_modal.edit_media": "メディアを編集",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "ბოტი",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "დაბლოკე @{name}",
|
||||
"account.block_domain": "დაიმალოს ყველაფერი დომენიდან {domain}",
|
||||
"account.blocked": "დაიბლოკა",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.direct": "პირდაპირი წერილი @{name}-ს",
|
||||
"account.domain_blocked": "დომენი დამალულია",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "გაყოლა",
|
||||
"account.followers": "მიმდევრები",
|
||||
"account.followers.empty": "No one follows this user yet.",
|
||||
"account.follows": "მიდევნებები",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "This user doesn't follow anyone yet.",
|
||||
"account.follows_you": "მოგყვებათ",
|
||||
"account.hide_reblogs": "დაიმალოს ბუსტები @{name}-სგან",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "დამტკიცების მოლოდინში. დააწკაპუნეთ რომ უარყოთ დადევნების მოთხონვა",
|
||||
"account.share": "გააზიარე @{name}-ის პროფილი",
|
||||
"account.show_reblogs": "აჩვენე ბუსტები @{name}-სგან",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "განბლოკე @{name}",
|
||||
"account.unblock_domain": "გამოაჩინე {domain}",
|
||||
"account.unendorse": "არ გამოირჩეს პროფილზე",
|
||||
"account.unfollow": "ნუღარ მიჰყვები",
|
||||
"account.unmute": "ნუღარ აჩუმებ @{name}-ს",
|
||||
"account.unmute_notifications": "ნუღარ აჩუმებ შეტყობინებებს @{name}-სგან",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "წარმოიშვა მოულოდნელი შეცდომა.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "ავტორიზაცია",
|
||||
"follow_request.reject": "უარყოფა",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "დეველოპერები",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "დოკუმენტაცია",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "პასუხისთვის",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "ძიებაზე ფოკუსირებისთვის",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "გაფრთხილების უკან ტექსტის გამოსაჩენად/დასამალვად",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} საუბრობს",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "თქვენი დრაფტი გაუქმდება თუ დატოვებთ მასტოდონს.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "გადმოწიეთ და ჩააგდეთ ასატვირთათ",
|
||||
"upload_button.label": "მედიის დამატება",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "აღწერილობა ვიზუალურად უფასურისთვის",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "გაუქმება",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,24 +1,27 @@
|
||||
{
|
||||
"account.account_note_header": "Tazmilt",
|
||||
"account.add_or_remove_from_list": "Rnu neɣ kkes seg tebdarin",
|
||||
"account.badges.bot": "Aṛubut",
|
||||
"account.badges.group": "Agraw",
|
||||
"account.block": "Seḥbes @{name}",
|
||||
"account.block_domain": "Ffer kra i d-yekkan seg {domain}",
|
||||
"account.blocked": "Yettuseḥbes",
|
||||
"account.cancel_follow_request": "Sefsex asuter n uḍfaṛ",
|
||||
"account.blocked": "Yettusewḥel",
|
||||
"account.browse_more_on_origin_server": "Snirem ugar deg umeɣnu aneẓli",
|
||||
"account.cancel_follow_request": "Sefsex asuter n uḍfar",
|
||||
"account.direct": "Izen usrid i @{name}",
|
||||
"account.domain_blocked": "Taɣult yeffren",
|
||||
"account.edit_profile": "Ẓreg amaɣnu",
|
||||
"account.endorse": "Welleh fell-as deg umaɣnu-inek",
|
||||
"account.follow": "Ḍfeṛ",
|
||||
"account.followers": "Imeḍfaṛen",
|
||||
"account.follow": "Ḍfer",
|
||||
"account.followers": "Imeḍfaren",
|
||||
"account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.",
|
||||
"account.follows": "I yeṭṭafaṛ",
|
||||
"account.followers_counter": "{count, plural, one {{count} n umeḍfar} other {{count} n imeḍfaren}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.",
|
||||
"account.follows_you": "Yeṭṭafaṛ-ik",
|
||||
"account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}",
|
||||
"account.last_status": "Armud aneggaru",
|
||||
"account.link_verified_on": "Taγara n useγwen-a tettwasenqed ass n {date}",
|
||||
"account.link_verified_on": "Taɣara n useɣwen-a tettwasenqed ass n {date}",
|
||||
"account.locked_info": "Amiḍan-agi uslig isekweṛ. D bab-is kan i izemren ad yeǧǧ, s ufus-is, win ara t-iḍefṛen.",
|
||||
"account.media": "Amidya",
|
||||
"account.mention": "Bder-d @{name}",
|
||||
@ -32,13 +35,15 @@
|
||||
"account.report": "Cetki ɣef @{name}",
|
||||
"account.requested": "Di laɛḍil ad yettwaqbel. Ssit i wakken ad yefsex usuter n uḍfar",
|
||||
"account.share": "Bḍu amaɣnu n @{name}",
|
||||
"account.show_reblogs": "Sken-d inebḍa n @{name}",
|
||||
"account.show_reblogs": "Ssken-d inebḍa n @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Serreḥ i @{name}",
|
||||
"account.unblock_domain": "Sken-d {domain}",
|
||||
"account.unblock_domain": "Ssken-d {domain}",
|
||||
"account.unendorse": "Ur ttwellih ara fell-as deg umaɣnu-inek",
|
||||
"account.unfollow": "Ur ṭṭafaṛ ara",
|
||||
"account.unmute": "Kkes asgugem ɣef @{name}",
|
||||
"account.unmute_notifications": "Serreḥ ilɣa sɣur @{name}",
|
||||
"account_note.placeholder": "Ulac iwenniten",
|
||||
"alert.rate_limited.message": "Ma ulac aɣilif ɛreḍ tikelt-nniḍen akka {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Aktum s talast",
|
||||
"alert.unexpected.message": "Yeḍra-d unezri ur netturaǧu ara.",
|
||||
@ -71,12 +76,12 @@
|
||||
"column_header.moveLeft_settings": "Err ajgu ɣer tama tazelmaḍt",
|
||||
"column_header.moveRight_settings": "Err ajgu ɣer tama tayfust",
|
||||
"column_header.pin": "Senteḍ",
|
||||
"column_header.show_settings": "Sken iɣewwaṛen",
|
||||
"column_header.show_settings": "Ssken iɣewwaṛen",
|
||||
"column_header.unpin": "Kkes asenteḍ",
|
||||
"column_subheading.settings": "Iγewwaṛen",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"column_subheading.settings": "Iɣewwaṛen",
|
||||
"community.column_settings.local_only": "Adigan kan",
|
||||
"community.column_settings.media_only": "Allal n teywalt kan",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Anmeggag kan",
|
||||
"compose_form.direct_message_warning": "Tajewwaqt-a ad d-tettwasken kan i yimseqdacen i d-yettwabedren.",
|
||||
"compose_form.direct_message_warning_learn_more": "Issin ugar",
|
||||
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
|
||||
@ -94,33 +99,33 @@
|
||||
"compose_form.sensitive.hide": "Creḍ allal n teywalt d anafri",
|
||||
"compose_form.sensitive.marked": "Allal n teywalt yettwacreḍ d anafri",
|
||||
"compose_form.sensitive.unmarked": "Allal n teywalt ur yettwacreḍ ara d anafri",
|
||||
"compose_form.spoiler.marked": "Aḍris yeffer deffir n walγu",
|
||||
"compose_form.spoiler.marked": "Aḍris yeffer deffir n walɣu",
|
||||
"compose_form.spoiler.unmarked": "Aḍris ur yettwaffer ara",
|
||||
"compose_form.spoiler_placeholder": "Aru alγu-inek da",
|
||||
"compose_form.spoiler_placeholder": "Aru alɣu-inek da",
|
||||
"confirmation_modal.cancel": "Sefsex",
|
||||
"confirmations.block.block_and_report": "Sewḥel & sewɛed",
|
||||
"confirmations.block.confirm": "Sewḥel",
|
||||
"confirmations.block.message": "Tebγiḍ s tidet ad tesḥebseḍ {name}?",
|
||||
"confirmations.delete.confirm": "Kkes",
|
||||
"confirmations.delete.message": "Tebγiḍ s tidet ad tekkseḍ tasuffeγt-agi?",
|
||||
"confirmations.delete.message": "Tebɣiḍ s tidet ad tekkseḍ tasuffeɣt-agi?",
|
||||
"confirmations.delete_list.confirm": "Kkes",
|
||||
"confirmations.delete_list.message": "Tebγiḍ s tidet ad tekkseḍ umuγ-agi i lebda?",
|
||||
"confirmations.domain_block.confirm": "Ffer taγult meṛṛa",
|
||||
"confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?",
|
||||
"confirmations.domain_block.confirm": "Ffer taɣult meṛṛa",
|
||||
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
|
||||
"confirmations.logout.confirm": "Ffeγ",
|
||||
"confirmations.logout.message": "D tidet tebγiḍ ad teffγeḍ?",
|
||||
"confirmations.logout.confirm": "Ffeɣ",
|
||||
"confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?",
|
||||
"confirmations.mute.confirm": "Sgugem",
|
||||
"confirmations.mute.explanation": "Aya ad yeffer iznan-is d wid i deg d-yettwabder neγ d-tettwabder, maca xas akka yezmer neγ tezmer awali n yiznan-inek d uḍfaṛ-ik.",
|
||||
"confirmations.mute.message": "Tetḥeqqeḍ belli tebγiḍ ad ttegugmeḍ {name}?",
|
||||
"confirmations.mute.explanation": "Aya ad yeffer iznan-is d wid i deg d-yettwabder neɣ d-tettwabder, maca xas akka yezmer neɣ tezmer awali n yiznan-inek d uḍfaṛ-ik.",
|
||||
"confirmations.mute.message": "Tetḥeqqeḍ belli tebɣiḍ ad ttegugmeḍ {name}?",
|
||||
"confirmations.redraft.confirm": "Sfeḍ & Ɛiwed tira",
|
||||
"confirmations.redraft.message": "Tetḥeqqeḍ belli tebγiḍ tuksa n waddad-agi iwakken ad s-tɛiwdeḍ tira? Ismenyifen d beḍḍuwat ad ṛuḥen, ma d tiririyin-is ad uγalent d tigujilin.",
|
||||
"confirmations.redraft.message": "Tetḥeqqeḍ belli tebɣiḍ tuksa n waddad-agi iwakken ad s-tɛiwdeḍ tira? Ismenyifen d beḍḍuwat ad ṛuḥen, ma d tiririyin-is ad uɣalent d tigujilin.",
|
||||
"confirmations.reply.confirm": "Err",
|
||||
"confirmations.reply.message": "Tiririt akka tura ad k-degger izen-agi i tettaruḍ. Tebγiḍ ad tkemmleḍ?",
|
||||
"confirmations.reply.message": "Tiririt akka tura ad k-degger izen-agi i tettaruḍ. Tebɣiḍ ad tkemmleḍ?",
|
||||
"confirmations.unfollow.confirm": "Ur ḍḍafaṛ ara",
|
||||
"confirmations.unfollow.message": "Tetḥeqqeḍ belli tebγiḍ ur teṭafaṛeḍ ara {name}?",
|
||||
"confirmations.unfollow.message": "Tetḥeqqeḍ belli tebɣiḍ ur teṭafaṛeḍ ara {name}?",
|
||||
"conversation.delete": "Sfeḍ adiwenni",
|
||||
"conversation.mark_as_read": "Creḍ yettwaγṛa",
|
||||
"conversation.open": "Sken adiwenni",
|
||||
"conversation.mark_as_read": "Creḍ yettwaɣṛa",
|
||||
"conversation.open": "Ssken adiwenni",
|
||||
"conversation.with": "Akked {names}",
|
||||
"directory.federated": "Deg fedivers yettwasnen",
|
||||
"directory.local": "Seg {domain} kan",
|
||||
@ -135,48 +140,49 @@
|
||||
"emoji_button.label": "Sekcem imuji",
|
||||
"emoji_button.nature": "Agama",
|
||||
"emoji_button.not_found": "Ulac izamulen n yiḥulfan !! (╯°□°)╯︵ ┻━┻",
|
||||
"emoji_button.objects": "Tiγawsiwin",
|
||||
"emoji_button.objects": "Tiɣawsiwin",
|
||||
"emoji_button.people": "Medden",
|
||||
"emoji_button.recent": "Wid yettuseqdacen s waṭas",
|
||||
"emoji_button.search": "Nadi…",
|
||||
"emoji_button.search": "Nadi...",
|
||||
"emoji_button.search_results": "Igemmaḍ n unadi",
|
||||
"emoji_button.symbols": "Izamulen",
|
||||
"emoji_button.travel": "Imeḍqan d Yinigen",
|
||||
"empty_column.account_timeline": "Ulac tijewwaqin dagi!",
|
||||
"empty_column.account_unavailable": "Ur nufi ara amaγnu-a",
|
||||
"empty_column.account_unavailable": "Ur nufi ara amaɣnu-ayi",
|
||||
"empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.",
|
||||
"empty_column.bookmarked_statuses": "Ulac tijewwaqin i terniḍ γer yismenyifen-ik ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.",
|
||||
"empty_column.bookmarked_statuses": "Ulac tijewwaqin i terniḍ ɣer yismenyifen-ik ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.",
|
||||
"empty_column.community": "Tasuddemt tazayezt tadigant n yisallen d tilemt. Aru ihi kra akken ad tt-teččareḍ!",
|
||||
"empty_column.direct": "Ulac γur-k ula yiwen n yizen usrid. Ad d-yettwasken da, ticki tuzneḍ neγ teṭṭfeḍ-d yiwen.",
|
||||
"empty_column.domain_blocks": "Ulac kra n taγult yettwaffren ar tura.",
|
||||
"empty_column.direct": "Ulac ɣur-k ula yiwen n yizen usrid. Ad d-yettwasken da, ticki tuzneḍ neɣ teṭṭfeḍ-d yiwen.",
|
||||
"empty_column.domain_blocks": "Ulac kra n taɣult yettwaffren ar tura.",
|
||||
"empty_column.favourited_statuses": "Ulac ula yiwet n tjewwaqt deg yismenyifen-ik ar tura. Ticki Tella-d yiwet, ad d-ban da.",
|
||||
"empty_column.favourites": "Ula yiwen ur yerri tajewwaqt-agi deg yismenyifen-is. Melmi i d-yella waya, ad d-yettwasken da.",
|
||||
"empty_column.follow_requests": "Ulac γur-k ula yiwen n usuter n teḍfeṛt. Ticki teṭṭfeḍ-d yiwen ad d-yettwasken da.",
|
||||
"empty_column.hashtag": "Ar tura ulac kra n ugbur yesɛan assaγ γer uhacṭag-agi.",
|
||||
"empty_column.home": "Tasuddemt tagejdant n yisallen d tilemt! Ẓer {public} neγ nadi ad tafeḍ imseqdacen-nniḍen ad ten-ḍefṛeḍ.",
|
||||
"empty_column.follow_requests": "Ulac ɣur-k ula yiwen n usuter n teḍfeṛt. Ticki teṭṭfeḍ-d yiwen ad d-yettwasken da.",
|
||||
"empty_column.hashtag": "Ar tura ulac kra n ugbur yesɛan assaɣ ɣer uhacṭag-agi.",
|
||||
"empty_column.home": "Tasuddemt tagejdant n yisallen d tilemt! Ẓer {public} neɣ nadi ad tafeḍ imseqdacen-nniḍen ad ten-ḍefṛeḍ.",
|
||||
"empty_column.home.public_timeline": "tasuddemt tazayezt n yisallen",
|
||||
"empty_column.list": "Ar tura ur yelli kra deg umuγ-a. Ad d-yettwasken da ticki iɛeggalen n wumuγ-a suffγen-d kra.",
|
||||
"empty_column.lists": "Ulac γur-k kra n wumuγ yakan. Ad d-tettwasken da ticki tesluleḍ-d yiwet.",
|
||||
"empty_column.mutes": "Ulac γur-k imseqdacen i yettwasgugmen.",
|
||||
"empty_column.notifications": "Ulac γur-k tilγa. Sedmer akked yemdanen-nniḍen akken ad tebduḍ adiwenni.",
|
||||
"empty_column.public": "Ulac kra da! Aru kra, neγ ḍfeṛ imdanen i yellan deg yiqeddacen-nniḍen akken ad d-teččar tsuddemt tazayezt",
|
||||
"empty_column.list": "Ar tura ur yelli kra deg umuɣ-a. Ad d-yettwasken da ticki iɛeggalen n wumuɣ-a suffɣen-d kra.",
|
||||
"empty_column.lists": "Ulac ɣur-k kra n wumuɣ yakan. Ad d-tettwasken da ticki tesluleḍ-d yiwet.",
|
||||
"empty_column.mutes": "Ulac ɣur-k imseqdacen i yettwasgugmen.",
|
||||
"empty_column.notifications": "Ulac ɣur-k tilɣa. Sedmer akked yemdanen-nniḍen akken ad tebduḍ adiwenni.",
|
||||
"empty_column.public": "Ulac kra da! Aru kra, neɣ ḍfeṛ imdanen i yellan deg yiqeddacen-nniḍen akken ad d-teččar tsuddemt tazayezt",
|
||||
"error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
|
||||
"error.unexpected_crash.next_steps": "Smiren asebter-a, ma ur yekkis ara wugur, ẓer d akken tzemreḍ ad tesqedceḍ Maṣṭudun deg yiminig-nniḍen neγ deg usnas anaṣli.",
|
||||
"error.unexpected_crash.next_steps": "Smiren asebter-a, ma ur yekkis ara wugur, ẓer d akken tzemreḍ ad tesqedceḍ Maṣṭudun deg yiminig-nniḍen neɣ deg usnas anaṣli.",
|
||||
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
|
||||
"errors.unexpected_crash.report_issue": "Mmel ugur",
|
||||
"follow_request.authorize": "Ssireg",
|
||||
"follow_request.reject": "Agi",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Yettwasekles",
|
||||
"getting_started.developers": "Ineflayen",
|
||||
"getting_started.directory": "Akaram n imaγnuten",
|
||||
"getting_started.directory": "Akaram n imaɣnuten",
|
||||
"getting_started.documentation": "Amnir",
|
||||
"getting_started.heading": "Bdu",
|
||||
"getting_started.invite": "Snebgi-d imdanen",
|
||||
"getting_started.open_source_notice": "Maṣṭudun d aseγzan s uγbalu yeldin. Tzemreḍ ad tɛiwneḍ neγ ad temmleḍ uguren deg GitHub {github}.",
|
||||
"getting_started.security": "Iγewwaṛen n umiḍan",
|
||||
"getting_started.open_source_notice": "Maṣṭudun d aseɣzan s uɣbalu yeldin. Tzemreḍ ad tɛiwneḍ neɣ ad temmleḍ uguren deg GitHub {github}.",
|
||||
"getting_started.security": "Iɣewwaṛen n umiḍan",
|
||||
"getting_started.terms": "Tiwetlin n useqdec",
|
||||
"hashtag.column_header.tag_mode.all": "d {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "neγ {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "neɣ {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "war {additional}",
|
||||
"hashtag.column_settings.select.no_options_message": "Ulac isumar",
|
||||
"hashtag.column_settings.select.placeholder": "Rnu-d ihacṭagen…",
|
||||
@ -185,10 +191,10 @@
|
||||
"hashtag.column_settings.tag_mode.none": "Yiwen ala seg-sen",
|
||||
"hashtag.column_settings.tag_toggle": "Glu-d s yihacṭagen imerna i ujgu-agi",
|
||||
"home.column_settings.basic": "Igejdanen",
|
||||
"home.column_settings.show_reblogs": "Sken-d beṭṭu",
|
||||
"home.column_settings.show_replies": "Sken-d tiririyin",
|
||||
"home.hide_announcements": "Ffer ulγuyen",
|
||||
"home.show_announcements": "Sken-d ulγuyen",
|
||||
"home.column_settings.show_reblogs": "Ssken-d beṭṭu",
|
||||
"home.column_settings.show_replies": "Ssken-d tiririyin",
|
||||
"home.hide_announcements": "Ffer ulɣuyen",
|
||||
"home.show_announcements": "Ssken-d ulɣuyen",
|
||||
"intervals.full.days": "{number, plural, one {# n wass} other {# n wussan}}",
|
||||
"intervals.full.hours": "{number, plural, one {# n usarag} other {# n yesragen}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# n tesdat} other {# n tesdatin}}",
|
||||
@ -196,30 +202,30 @@
|
||||
"introduction.federation.federated.headline": "Amatu",
|
||||
"introduction.federation.federated.text": "Iznan izuyaz i d-yekkan seg yiqeddacen-nniḍen n fediverse ad banen deg tsuddemt tazayezt tamatut n yisallen.",
|
||||
"introduction.federation.home.headline": "Agejdan",
|
||||
"introduction.federation.home.text": "Iznan n yemdanen i teṭṭafaṛeḍ ad banen deg tsuddemt n umagger. Tzemreḍ ad tḍefṛeḍ win tebγiḍ deg uqeddac i tebγiḍ!",
|
||||
"introduction.federation.home.text": "Iznan n yemdanen i teṭṭafaṛeḍ ad banen deg tsuddemt n umagger. Tzemreḍ ad tḍefṛeḍ win tebɣiḍ deg uqeddac i tebɣiḍ!",
|
||||
"introduction.federation.local.headline": "Adigan",
|
||||
"introduction.federation.local.text": "Iznan izuyaz n yemdanen i yellan deg yiwen uqeddac akked kečč ad d-banen deg tsuddemt tazayezt tadigant.",
|
||||
"introduction.interactions.action": "Fakk tameskant!",
|
||||
"introduction.interactions.favourite.headline": "Ismenyifen",
|
||||
"introduction.interactions.favourite.text": "Tzemreḍ ad teǧǧeḍ kra n tjewwaqt i ticki, daγen ad tiniḍ i bab-is d akken taɛǧeb-ik, s tmerna-ines γer yismenyifen-ik.",
|
||||
"introduction.interactions.favourite.text": "Tzemreḍ ad teǧǧeḍ kra n tjewwaqt i ticki, daγen ad tiniḍ i bab-is d akken taɛǧeb-ik, s tmerna-ines ɣer yismenyifen-ik.",
|
||||
"introduction.interactions.reblog.headline": "Bḍu tikelt-nniḍen",
|
||||
"introduction.interactions.reblog.text": "Tzemreḍ ad tebḍuḍ tijewwaqin n medden akk d yimeḍfaṛen-ik s beṭṭu-nsent tikelt-nniḍen.",
|
||||
"introduction.interactions.reply.headline": "Err",
|
||||
"introduction.interactions.reply.text": "Tzemreḍ ad terreḍ γef tjewwaqin-ik·im akked tid n medden-nniḍen, aya atent-id-icudd ta deffir ta deg yiwen udiwenni.",
|
||||
"introduction.interactions.reply.text": "Tzemreḍ ad terreḍ ɣef tjewwaqin-ik·im akked tid n medden-nniḍen, aya atent-id-icudd ta deffir ta deg yiwen udiwenni.",
|
||||
"introduction.welcome.action": "Bdu!",
|
||||
"introduction.welcome.headline": "Isurifen imenza",
|
||||
"introduction.welcome.text": "Anṣuf γer fediverse! Deg kra n yimiren, ad tizmireḍ ad tzzuzreḍ iznan neγ ad tmeslayeḍ i yemddukkal deg waṭas n yiqeddacen. Maca aqeddac-agi, {domain}, mačči am wiyaḍ - deg-s i yella umaγnu-ik, ihi cfu γef yisem-is.",
|
||||
"keyboard_shortcuts.back": "uγal ar deffir",
|
||||
"keyboard_shortcuts.blocked": "akken ad teldiḍ umuγ n yimseqdacen yettwasḥebsen",
|
||||
"introduction.welcome.text": "Anṣuf ɣer fediverse! Deg kra n yimiren, ad tizmireḍ ad tzzuzreḍ iznan neγ ad tmeslayeḍ i yemddukkal deg waṭas n yiqeddacen. Maca aqeddac-agi, {domain}, mačči am wiyaḍ - deg-s i yella umaɣnu-ik, ihi cfu ɣef yisem-is.",
|
||||
"keyboard_shortcuts.back": "i tuɣalin ɣer deffir",
|
||||
"keyboard_shortcuts.blocked": "akken ad teldiḍ umuɣ n yimseqdacen yettwasḥebsen",
|
||||
"keyboard_shortcuts.boost": "i beṭṭu tikelt-nniḍen",
|
||||
"keyboard_shortcuts.column": "to focus a status in one of the columns",
|
||||
"keyboard_shortcuts.compose": "to focus the compose textarea",
|
||||
"keyboard_shortcuts.description": "Aglam",
|
||||
"keyboard_shortcuts.direct": "akken ad teldiḍ ajgu n yiznan usriden",
|
||||
"keyboard_shortcuts.down": "i kennu γer wadda n wumuγ",
|
||||
"keyboard_shortcuts.enter": "i tildin n tsuffeγt",
|
||||
"keyboard_shortcuts.favourite": "akken ad ternuḍ γer yismenyifen",
|
||||
"keyboard_shortcuts.favourites": "i tildin umuγ n yismenyifen",
|
||||
"keyboard_shortcuts.down": "i kennu ɣer wadda n tebdart",
|
||||
"keyboard_shortcuts.enter": "i tildin n tsuffeɣt",
|
||||
"keyboard_shortcuts.favourite": "akken ad ternuḍ ɣer yismenyifen",
|
||||
"keyboard_shortcuts.favourites": "i tildin umuɣ n yismenyifen",
|
||||
"keyboard_shortcuts.federated": "i tildin n tsuddemt tamatut n yisallen",
|
||||
"keyboard_shortcuts.heading": "Inegzumen n unasiw",
|
||||
"keyboard_shortcuts.home": "i tildin n tsuddemt tagejdant n yisallen",
|
||||
@ -227,40 +233,41 @@
|
||||
"keyboard_shortcuts.legend": "akken ad tsekneḍ taneffust-agi",
|
||||
"keyboard_shortcuts.local": "i tildin n tsuddemt tadigant n yisallen",
|
||||
"keyboard_shortcuts.mention": "akken ad d-bedreḍ ameskar",
|
||||
"keyboard_shortcuts.muted": "akken ad teldiḍ umuγ n yimseqdacen yettwasgugmen",
|
||||
"keyboard_shortcuts.my_profile": "akken ad d-teldiḍ amaγnu-ik",
|
||||
"keyboard_shortcuts.notifications": "akken ad d-teldiḍ ajgu n tilγa",
|
||||
"keyboard_shortcuts.open_media": "i taɣwalin yeldin ",
|
||||
"keyboard_shortcuts.pinned": "akken ad teldiḍ umuγ n tjewwiqin yettwasentḍen",
|
||||
"keyboard_shortcuts.profile": "akken ad d-teldiḍ amaγnu n umeskar",
|
||||
"keyboard_shortcuts.muted": "akken ad teldiḍ tabdart n yimseqdacen yettwasgugmen",
|
||||
"keyboard_shortcuts.my_profile": "akken ad d-teldiḍ amaɣnu-ik",
|
||||
"keyboard_shortcuts.notifications": "akken ad d-teldiḍ ajgu n tilɣa",
|
||||
"keyboard_shortcuts.open_media": "i tiɣwalin yeldin",
|
||||
"keyboard_shortcuts.pinned": "akken ad teldiḍ tabdart n tjewwiqin yettwasentḍen",
|
||||
"keyboard_shortcuts.profile": "akken ad d-teldiḍ amaɣnu n umeskar",
|
||||
"keyboard_shortcuts.reply": "i tririt",
|
||||
"keyboard_shortcuts.requests": "akken ad d-teldiḍ umuγ n yisuturen n teḍfeṛt",
|
||||
"keyboard_shortcuts.requests": "akken ad d-teldiḍ tabdert n yisuturen n teḍfeṛt",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "i uskan/tuffra n wurti CW",
|
||||
"keyboard_shortcuts.start": "akken ad d-teldiḍ ajgu n \"bdu\"",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_hidden": "i uskan/tuffra n uḍris deffir CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "i teskent/tuffra n yimidyaten",
|
||||
"keyboard_shortcuts.toot": "i wakken attebdud tajewwaqt tamaynut",
|
||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
||||
"keyboard_shortcuts.up": "i tulin γer d asawen n wumuγ",
|
||||
"keyboard_shortcuts.up": "i tulin ɣer d asawen n tebdart",
|
||||
"lightbox.close": "Mdel",
|
||||
"lightbox.next": "Γer zdat",
|
||||
"lightbox.previous": "Γer deffir",
|
||||
"lightbox.view_context": "Ẓer amnaḍ",
|
||||
"lists.account.add": "Rnu γer wumuγ",
|
||||
"lists.account.remove": "Kkes seg umuγ",
|
||||
"lists.delete": "Kkes umuγ",
|
||||
"lists.edit": "Ẓreg umuγ",
|
||||
"lists.account.add": "Rnu ɣer tebdart",
|
||||
"lists.account.remove": "Kkes seg tebdart",
|
||||
"lists.delete": "Kkes tabdart",
|
||||
"lists.edit": "Ẓreg tabdart",
|
||||
"lists.edit.submit": "Beddel azwel",
|
||||
"lists.new.create": "Rnu umuγ",
|
||||
"lists.new.title_placeholder": "Azwel amaynut n wumuγ",
|
||||
"lists.new.create": "Rnu tabdart",
|
||||
"lists.new.title_placeholder": "Azwel amaynut n tebdart",
|
||||
"lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ",
|
||||
"lists.subheading": "Umuγen-ik·im",
|
||||
"lists.subheading": "Tibdarin-ik·im",
|
||||
"load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}",
|
||||
"loading_indicator.label": "Yessalay-d…",
|
||||
"media_gallery.toggle_visible": "Sken / Ffer",
|
||||
"media_gallery.toggle_visible": "Ffer {number, plural, one {tugna} other {tugniwin}}",
|
||||
"missing_indicator.label": "Ulac-it",
|
||||
"missing_indicator.sublabel": "Ur nufi ara aγbalu-a",
|
||||
"mute_modal.hide_notifications": "Tebγiḍ ad teffreḍ talγutin n umseqdac-a?",
|
||||
"missing_indicator.sublabel": "Ur nufi ara aɣbalu-a",
|
||||
"mute_modal.hide_notifications": "Tebɣiḍ ad teffreḍ talɣutin n umseqdac-a?",
|
||||
"navigation_bar.apps": "Isnasen izirazen",
|
||||
"navigation_bar.blocks": "Imseqdacen yettusḥebsen",
|
||||
"navigation_bar.bookmarks": "Ticraḍ",
|
||||
@ -268,57 +275,57 @@
|
||||
"navigation_bar.compose": "Aru tajewwiqt tamaynut",
|
||||
"navigation_bar.direct": "Iznan usridden",
|
||||
"navigation_bar.discover": "Ẓer",
|
||||
"navigation_bar.domain_blocks": "Tiγula yeffren",
|
||||
"navigation_bar.edit_profile": "Ẓreg amaγnu",
|
||||
"navigation_bar.domain_blocks": "Tiɣula yeffren",
|
||||
"navigation_bar.edit_profile": "Ẓreg amaɣnu",
|
||||
"navigation_bar.favourites": "Ismenyifen",
|
||||
"navigation_bar.filters": "Awalen i yettwasgugmen",
|
||||
"navigation_bar.follow_requests": "Isuturen n teḍfeṛt",
|
||||
"navigation_bar.follows_and_followers": "Imeḍfaṛen akked wid i teṭṭafaṛeḍ",
|
||||
"navigation_bar.info": "Ɣef uqeddac-agi",
|
||||
"navigation_bar.keyboard_shortcuts": "Inegzumen n unasiw",
|
||||
"navigation_bar.lists": "Umuγen",
|
||||
"navigation_bar.logout": "Ffeγ",
|
||||
"navigation_bar.lists": "Tibdarin",
|
||||
"navigation_bar.logout": "Ffeɣ",
|
||||
"navigation_bar.mutes": "Iseqdacen yettwasusmen",
|
||||
"navigation_bar.personal": "Udmawan",
|
||||
"navigation_bar.pins": "Tijewwiqin yettwasentḍen",
|
||||
"navigation_bar.preferences": "Imenyafen",
|
||||
"navigation_bar.public_timeline": "Tasuddemt tazayezt tamatut",
|
||||
"navigation_bar.security": "Taγellist",
|
||||
"notification.favourite": "{name} yesmenyef tasuffeγt-ik",
|
||||
"navigation_bar.security": "Taɣellist",
|
||||
"notification.favourite": "{name} yesmenyef tasuffeɣt-ik·im",
|
||||
"notification.follow": "{name} yeṭṭafaṛ-ik",
|
||||
"notification.follow_request": "{name} yessuter-d ad k-yeḍfeṛ",
|
||||
"notification.mention": "{name} yebder-ik-id",
|
||||
"notification.own_poll": "Your poll has ended",
|
||||
"notification.own_poll": "Tafrant-ik·im tfuk",
|
||||
"notification.poll": "A poll you have voted in has ended",
|
||||
"notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen",
|
||||
"notifications.clear": "Sfeḍ tilγa",
|
||||
"notifications.clear_confirmation": "Tebγiḍ s tidet ad tekkseḍ akk tilγa-ik i lebda?",
|
||||
"notifications.column_settings.alert": "Tilγa n tnarit",
|
||||
"notifications.clear": "Sfeḍ tilɣa",
|
||||
"notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?",
|
||||
"notifications.column_settings.alert": "Tilɣa n tnarit",
|
||||
"notifications.column_settings.favourite": "Ismenyifen:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Sken-d meṛṛa tiggayin",
|
||||
"notifications.column_settings.filter_bar.advanced": "Ssken-d meṛṛa tiggayin",
|
||||
"notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib",
|
||||
"notifications.column_settings.filter_bar.show": "Sken",
|
||||
"notifications.column_settings.filter_bar.show": "Ssken",
|
||||
"notifications.column_settings.follow": "Imeḍfaṛen imaynuten:",
|
||||
"notifications.column_settings.follow_request": "Isuturen imaynuten n teḍfeṛt:",
|
||||
"notifications.column_settings.mention": "Abdar:",
|
||||
"notifications.column_settings.poll": "Igemmaḍ n usenqed:",
|
||||
"notifications.column_settings.push": "Tilγa yettudemmren",
|
||||
"notifications.column_settings.reblog": "Boosts:",
|
||||
"notifications.column_settings.show": "Sken-d tilγa deg ujgu",
|
||||
"notifications.column_settings.push": "Tilɣa yettudemmren",
|
||||
"notifications.column_settings.reblog": "Seǧhed:",
|
||||
"notifications.column_settings.show": "Ssken-d tilɣa deg ujgu",
|
||||
"notifications.column_settings.sound": "Rmed imesli",
|
||||
"notifications.filter.all": "Akk",
|
||||
"notifications.filter.boosts": "Boosts",
|
||||
"notifications.filter.boosts": "Seǧhed",
|
||||
"notifications.filter.favourites": "Ismenyifen",
|
||||
"notifications.filter.follows": "Yeṭafaṛ",
|
||||
"notifications.filter.mentions": "Abdar",
|
||||
"notifications.filter.polls": "Igemmaḍ n usenqed",
|
||||
"notifications.group": "{count} n tilγa",
|
||||
"notifications.group": "{count} n tilɣa",
|
||||
"poll.closed": "Ifukk",
|
||||
"poll.refresh": "Smiren",
|
||||
"poll.total_people": "{count, plural, one {# n wemdan} other {# n yemdanen}}",
|
||||
"poll.total_votes": "{count, plural, one {# n udγaṛ} other {# n yedγaṛen}}",
|
||||
"poll.vote": "Dγeṛ",
|
||||
"poll.voted": "Tdeγṛeḍ γef tririt-agi",
|
||||
"poll.total_votes": "{count, plural, one {# n udɣaṛ} other {# n yedɣaṛen}}",
|
||||
"poll.vote": "Dɣeṛ",
|
||||
"poll.voted": "Tdeɣṛeḍ ɣef tririt-ayi",
|
||||
"poll_button.add_poll": "Rnu asenqed",
|
||||
"poll_button.remove_poll": "Kkes asenqed",
|
||||
"privacy.change": "Adjust status privacy",
|
||||
@ -329,7 +336,7 @@
|
||||
"privacy.public.long": "Bḍu deg tsuddemt tazayezt",
|
||||
"privacy.public.short": "Azayez",
|
||||
"privacy.unlisted.long": "Ur beṭṭu ara deg tsuddemt tazayezt",
|
||||
"privacy.unlisted.short": "War umuγ",
|
||||
"privacy.unlisted.short": "War tabdert",
|
||||
"refresh": "Smiren",
|
||||
"regeneration_indicator.label": "Yessalay-d…",
|
||||
"regeneration_indicator.sublabel": "Tasuddemt tagejdant ara d-tettwaheggay!",
|
||||
@ -340,7 +347,7 @@
|
||||
"relative_time.seconds": "{number}tas",
|
||||
"relative_time.today": "assa",
|
||||
"reply_indicator.cancel": "Sefsex",
|
||||
"report.forward": "Bren-it γeṛ {target}",
|
||||
"report.forward": "Bren-it ɣeṛ {target}",
|
||||
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
|
||||
"report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
|
||||
"report.placeholder": "Iwenniten-nniḍen",
|
||||
@ -356,86 +363,95 @@
|
||||
"search_results.accounts": "Medden",
|
||||
"search_results.hashtags": "Ihacṭagen",
|
||||
"search_results.statuses": "Tibeṛṛaniyin",
|
||||
"search_results.statuses_fts_disabled": "Anadi γef tjewwiqin s ugbur-nsent ur yermid ara deg uqeddac-agi n Maṣṭudun.",
|
||||
"search_results.statuses_fts_disabled": "Anadi ɣef tjewwiqin s ugbur-nsent ur yermid ara deg uqeddac-agi n Maṣṭudun.",
|
||||
"search_results.total": "{count, number} {count, plural, one {n ugemmuḍ} other {n yigemmuḍen}}",
|
||||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_status": "Open this status in the moderation interface",
|
||||
"status.block": "Seḥbes @{name}",
|
||||
"status.bookmark": "Creḍ",
|
||||
"status.cancel_reblog_private": "Sefsex beṭṭu",
|
||||
"status.cannot_reblog": "Tasuffeγt-a ur tezmir ara ad tettwabḍu tikelt-nniḍen",
|
||||
"status.copy": "Nγel assaγ γer tasuffeγt",
|
||||
"status.cannot_reblog": "Tasuffeɣt-a ur tezmir ara ad tettwabḍu tikelt-nniḍen",
|
||||
"status.copy": "Nɣel assaɣ ɣer tasuffeɣt",
|
||||
"status.delete": "Kkes",
|
||||
"status.detailed_status": "Detailed conversation view",
|
||||
"status.direct": "Izen usrid i @{name}",
|
||||
"status.embed": "Embed",
|
||||
"status.favourite": "Rnu γer yismenyifen",
|
||||
"status.embed": "Seddu",
|
||||
"status.favourite": "Rnu ɣer yismenyifen",
|
||||
"status.filtered": "Yettwasizdeg",
|
||||
"status.load_more": "Sali ugar",
|
||||
"status.media_hidden": "Taγwalt tettwaffer",
|
||||
"status.media_hidden": "Taɣwalt tettwaffer",
|
||||
"status.mention": "Bder-d @{name}",
|
||||
"status.more": "Ugar",
|
||||
"status.mute": "Sussem @{name}",
|
||||
"status.mute_conversation": "Sgugem adiwenni",
|
||||
"status.open": "Semγeṛ tasuffeγt-agi",
|
||||
"status.pin": "Senteḍ-itt deg umaγnu",
|
||||
"status.open": "Semɣeṛ tasuffeɣt-ayi",
|
||||
"status.pin": "Senteḍ-itt deg umaɣnu",
|
||||
"status.pinned": "Tijewwiqin yettwasentḍen",
|
||||
"status.read_more": "Issin ugar",
|
||||
"status.reblog": "Bḍu",
|
||||
"status.reblog_private": "Boost to original audience",
|
||||
"status.reblogged_by": "{name} boosted",
|
||||
"status.reblogged_by": "Yebḍa-tt {name}",
|
||||
"status.reblogs.empty": "Ula yiwen ur yebḍi tajewwiqt-agi ar tura. Ticki yebḍa-tt yiwen, ad d-iban da.",
|
||||
"status.redraft": "Kkes tɛiwdeḍ tira",
|
||||
"status.remove_bookmark": "Kkes tacreḍt",
|
||||
"status.reply": "Err",
|
||||
"status.replyAll": "Err i lxiḍ",
|
||||
"status.report": "Cetki γef @{name}",
|
||||
"status.report": "Cetki ɣef @{name}",
|
||||
"status.sensitive_warning": "Agbur amḥulfu",
|
||||
"status.share": "Bḍu",
|
||||
"status.show_less": "Sken-d drus",
|
||||
"status.show_less": "Ssken-d drus",
|
||||
"status.show_less_all": "Semẓi akk tisuffγin",
|
||||
"status.show_more": "Sken-d ugar",
|
||||
"status.show_more": "Ssken-d ugar",
|
||||
"status.show_more_all": "Ẓerr ugar lebda",
|
||||
"status.show_thread": "Sken-d lxiḍ",
|
||||
"status.show_thread": "Ssken-d lxiḍ",
|
||||
"status.uncached_media_warning": "Ulac-it",
|
||||
"status.unmute_conversation": "Kkes asgugem n udiwenni",
|
||||
"status.unpin": "Kkes asenteḍ seg umaγnu",
|
||||
"status.unpin": "Kkes asenteḍ seg umaɣnu",
|
||||
"suggestions.dismiss": "Sefsex asumer",
|
||||
"suggestions.header": "Ahat ad tcelgeḍ deg…",
|
||||
"tabs_bar.federated_timeline": "Amatu",
|
||||
"tabs_bar.home": "Agejdan",
|
||||
"tabs_bar.local_timeline": "Adigan",
|
||||
"tabs_bar.notifications": "Tilγa",
|
||||
"tabs_bar.notifications": "Tilɣa",
|
||||
"tabs_bar.search": "Nadi",
|
||||
"time_remaining.days": "Mazal {number, plural, one {# n wass} other {# n wussan}}",
|
||||
"time_remaining.hours": "Mazal {number, plural, one {# n usrag} other {# n yesragen}}",
|
||||
"time_remaining.minutes": "Mazal {number, plural, one {# n tesdat} other {# n tesdatin}}",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "Mazal {number, plural, one {# n tasint} other {# n tsinin}} id yugran",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {n umdan} other {n yemdanen}} i yettmeslayen",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} seg yiqeddacen-nniḍen ur d-ttwaskanent ara.",
|
||||
"timeline_hint.resources.followers": "Imeḍfaṛen",
|
||||
"timeline_hint.resources.follows": "T·Yeṭafaṛ",
|
||||
"timeline_hint.resources.statuses": "Tijewwaqin tiqdimin",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Arewway-ik·im ad iruḥ ma yella tefeɣ-d deg Maṣṭudun.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Zuḥeb rnu sers i tasalyt",
|
||||
"upload_button.label": "Rnu Taγwalt ({formats})",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_button.label": "Rnu taɣwalt ({formats})",
|
||||
"upload_error.limit": "Asali n ufaylu iεedda talast.",
|
||||
"upload_error.poll": "Ur ittusireg ara usali n ufaylu s tefranin.",
|
||||
"upload_form.audio_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt",
|
||||
"upload_form.description": "Glem-d i yemdaneni yesɛan ugur deg yiẓri",
|
||||
"upload_form.edit": "Ẓreg",
|
||||
"upload_form.thumbnail": "Beddel tugna",
|
||||
"upload_form.undo": "Kkes",
|
||||
"upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neγ deg yiẓri",
|
||||
"upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neɣ deg yiẓri",
|
||||
"upload_modal.analyzing_picture": "Tasleḍt n tugna tetteddu…",
|
||||
"upload_modal.apply": "Snes",
|
||||
"upload_modal.description_placeholder": "Aberraγ arurad ineggez nnig n uqjun amuṭṭis",
|
||||
"upload_modal.choose_image": "Fren tugna",
|
||||
"upload_modal.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis",
|
||||
"upload_modal.detect_text": "Sefru-d aḍris seg tugna",
|
||||
"upload_modal.edit_media": "Ẓreg taγwalt",
|
||||
"upload_modal.edit_media": "Ẓreg taɣwalt",
|
||||
"upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
|
||||
"upload_modal.preview_label": "Taskant ({ratio})",
|
||||
"upload_progress.label": "Asali iteddu...",
|
||||
"video.close": "Mdel tabidyutt",
|
||||
"video.download": "Sidered afaylu",
|
||||
"video.exit_fullscreen": "Ffeγ seg ugdil aččuran",
|
||||
"video.expand": "Semγeṛ tavidyut",
|
||||
"video.exit_fullscreen": "Ffeɣ seg ugdil ačuran",
|
||||
"video.expand": "Semɣeṛ tavidyut",
|
||||
"video.fullscreen": "Agdil aččuran",
|
||||
"video.hide": "Ffer tabidyutt",
|
||||
"video.mute": "Gzem imesli",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Тізімге қосу немесе жою",
|
||||
"account.badges.bot": "Бот",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Бұғаттау @{name}",
|
||||
"account.block_domain": "Домендегі барлығын бұғатта {domain}",
|
||||
"account.blocked": "Бұғатталды",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Жазылуға сұранымды қайтару",
|
||||
"account.direct": "Жеке хат @{name}",
|
||||
"account.domain_blocked": "Домен жабық",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Жазылу",
|
||||
"account.followers": "Оқырмандар",
|
||||
"account.followers.empty": "Әлі ешкім жазылмаған.",
|
||||
"account.follows": "Жазылғандары",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Ешкімге жазылмапты.",
|
||||
"account.follows_you": "Сізге жазылыпты",
|
||||
"account.hide_reblogs": "@{name} атты қолданушының әрекеттерін жасыру",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Растауын күтіңіз. Жазылудан бас тарту үшін басыңыз",
|
||||
"account.share": "@{name} профилін бөлісу\"",
|
||||
"account.show_reblogs": "@{name} бөліскендерін көрсету",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Бұғаттан шығару @{name}",
|
||||
"account.unblock_domain": "Бұғаттан шығару {domain}",
|
||||
"account.unendorse": "Профильде рекомендемеу",
|
||||
"account.unfollow": "Оқымау",
|
||||
"account.unmute": "@{name} ескертпелерін қосу",
|
||||
"account.unmute_notifications": "@{name} ескертпелерін көрсету",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Қайтадан көріңіз {retry_time, time, medium} кейін.",
|
||||
"alert.rate_limited.title": "Бағалау шектеулі",
|
||||
"alert.unexpected.message": "Бір нәрсе дұрыс болмады.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Авторизация",
|
||||
"follow_request.reject": "Қабылдамау",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Жасаушылар тобы",
|
||||
"getting_started.directory": "Профильдер каталогы",
|
||||
"getting_started.documentation": "Құжаттама",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "жауап жазу",
|
||||
"keyboard_shortcuts.requests": "жазылу сұранымдарын қарау",
|
||||
"keyboard_shortcuts.search": "іздеу",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "бастапқы бағанға бару",
|
||||
"keyboard_shortcuts.toggle_hidden": "жабық мәтінді CW ашу/жабу",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "көрсет/жап",
|
||||
@ -413,9 +420,16 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# минут} other {# минут}}",
|
||||
"time_remaining.moments": "Қалған уақыт",
|
||||
"time_remaining.seconds": "{number, plural, one {# секунд} other {# секунд}}",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} жазған екен",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Тренд тақырыптар",
|
||||
"ui.beforeunload": "Mastodon желісінен шықсаңыз, нобайыңыз сақталмайды.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Жүктеу үшін сүйреп әкеліңіз",
|
||||
"upload_button.label": "Медиа қосу (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "Файл жүктеу лимитінен асып кеттіңіз.",
|
||||
@ -423,10 +437,12 @@
|
||||
"upload_form.audio_description": "Есту қабілеті нашар адамдарға сипаттама беріңіз",
|
||||
"upload_form.description": "Көру қабілеті нашар адамдар үшін сипаттаңыз",
|
||||
"upload_form.edit": "Түзету",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Өшіру",
|
||||
"upload_form.video_description": "Есту немесе көру қабілеті нашар адамдарға сипаттама беріңіз",
|
||||
"upload_modal.analyzing_picture": "Суретті анализ жасау…",
|
||||
"upload_modal.apply": "Қолдану",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "Щучинск съезіндегі өрт пе? Вагон-үй, аэромобиль һәм ұшақ фюзеляжы цехінен ғой",
|
||||
"upload_modal.detect_text": "Суреттен мәтін анықтау",
|
||||
"upload_modal.edit_media": "Медиафайлды өңдеу",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Block @{name}",
|
||||
"account.block_domain": "Hide everything from {domain}",
|
||||
"account.blocked": "Blocked",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.direct": "Direct message @{name}",
|
||||
"account.domain_blocked": "Domain hidden",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Follow",
|
||||
"account.followers": "Followers",
|
||||
"account.followers.empty": "No one follows this user yet.",
|
||||
"account.follows": "Follows",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "This user doesn't follow anyone yet.",
|
||||
"account.follows_you": "Follows you",
|
||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Awaiting approval",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Show boosts from @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Unblock @{name}",
|
||||
"account.unblock_domain": "Unhide {domain}",
|
||||
"account.unendorse": "Don't feature on profile",
|
||||
"account.unfollow": "Unfollow",
|
||||
"account.unmute": "Unmute @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "An unexpected error occurred.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Authorize",
|
||||
"follow_request.reject": "Reject",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -257,7 +264,7 @@
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "Loading...",
|
||||
"media_gallery.toggle_visible": "Hide media",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "Not found",
|
||||
"missing_indicator.sublabel": "This resource could not be found",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
@ -412,20 +419,29 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "노트",
|
||||
"account.add_or_remove_from_list": "리스트에 추가 혹은 삭제",
|
||||
"account.badges.bot": "봇",
|
||||
"account.badges.group": "그룹",
|
||||
"account.block": "@{name}을 차단",
|
||||
"account.block_domain": "{domain} 전체를 숨김",
|
||||
"account.blocked": "차단됨",
|
||||
"account.browse_more_on_origin_server": "원본 프로필에서 더 탐색하기",
|
||||
"account.cancel_follow_request": "팔로우 요청 취소",
|
||||
"account.direct": "@{name}의 다이렉트 메시지",
|
||||
"account.domain_blocked": "도메인 숨겨짐",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "팔로우",
|
||||
"account.followers": "팔로워",
|
||||
"account.followers.empty": "아직 아무도 이 유저를 팔로우하고 있지 않습니다.",
|
||||
"account.follows": "팔로우",
|
||||
"account.followers_counter": "{counter} 팔로워",
|
||||
"account.following_counter": "{counter} 팔로잉",
|
||||
"account.follows.empty": "이 유저는 아직 아무도 팔로우하고 있지 않습니다.",
|
||||
"account.follows_you": "날 팔로우합니다",
|
||||
"account.hide_reblogs": "@{name}의 부스트를 숨기기",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "승인 대기 중. 클릭해서 취소하기",
|
||||
"account.share": "@{name}의 프로파일 공유",
|
||||
"account.show_reblogs": "@{name}의 부스트 보기",
|
||||
"account.statuses_counter": "{counter} 툿",
|
||||
"account.unblock": "차단 해제",
|
||||
"account.unblock_domain": "{domain} 숨김 해제",
|
||||
"account.unendorse": "프로필에 나타내지 않기",
|
||||
"account.unfollow": "팔로우 해제",
|
||||
"account.unmute": "뮤트 해제",
|
||||
"account.unmute_notifications": "@{name}의 알림 뮤트 해제",
|
||||
"account_note.placeholder": "클릭해서 노트 추가",
|
||||
"alert.rate_limited.message": "{retry_time, time, medium}에 다시 시도해 주세요.",
|
||||
"alert.rate_limited.title": "빈도 제한",
|
||||
"alert.unexpected.message": "예측하지 못한 에러가 발생했습니다.",
|
||||
@ -74,9 +79,9 @@
|
||||
"column_header.show_settings": "설정 보이기",
|
||||
"column_header.unpin": "고정 해제",
|
||||
"column_subheading.settings": "설정",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "로컬만",
|
||||
"community.column_settings.media_only": "미디어만",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "원격만",
|
||||
"compose_form.direct_message_warning": "이 툿은 멘션 된 유저들에게만 보여집니다.",
|
||||
"compose_form.direct_message_warning_learn_more": "더 알아보기",
|
||||
"compose_form.hashtag_warning": "이 툿은 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 툿만이 해시태그로 검색 될 수 있습니다.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "허가",
|
||||
"follow_request.reject": "거부",
|
||||
"follow_requests.unlocked_explanation": "당신의 계정이 잠기지 않았다고 할 지라도, {domain}의 스탭은 당신이 이 계정들로부터의 팔로우 요청을 수동으로 확인하길 원한다고 생각했습니다.",
|
||||
"generic.saved": "저장됨",
|
||||
"getting_started.developers": "개발자",
|
||||
"getting_started.directory": "프로필 책자",
|
||||
"getting_started.documentation": "문서",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "답장",
|
||||
"keyboard_shortcuts.requests": "팔로우 요청 리스트 열기",
|
||||
"keyboard_shortcuts.search": "검색창에 포커스",
|
||||
"keyboard_shortcuts.spoilers": "CW 필드를 보이거나 숨기기",
|
||||
"keyboard_shortcuts.start": "\"시작하기\" 컬럼 열기",
|
||||
"keyboard_shortcuts.toggle_hidden": "CW로 가려진 텍스트를 표시/비표시",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "이미지 보이기/숨기기",
|
||||
@ -418,9 +425,16 @@
|
||||
"time_remaining.minutes": "{number} 분 남음",
|
||||
"time_remaining.moments": "남은 시간",
|
||||
"time_remaining.seconds": "{number} 초 남음",
|
||||
"trends.count_by_accounts": "{count} 명의 사람들이 말하고 있습니다",
|
||||
"timeline_hint.remote_resource_not_displayed": "다른 서버의 {resource}는 보여지지 않습니다.",
|
||||
"timeline_hint.resources.followers": "팔로워",
|
||||
"timeline_hint.resources.follows": "팔로우",
|
||||
"timeline_hint.resources.statuses": "이전 툿",
|
||||
"trends.counter_by_accounts": "{counter} 명이 말하는 중",
|
||||
"trends.trending_now": "지금 유행중",
|
||||
"ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.",
|
||||
"units.short.billion": "{count}십억",
|
||||
"units.short.million": "{count}백만",
|
||||
"units.short.thousand": "{count}천",
|
||||
"upload_area.title": "드래그 & 드롭으로 업로드",
|
||||
"upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)",
|
||||
"upload_error.limit": "파일 업로드 제한에 도달했습니다.",
|
||||
@ -428,10 +442,12 @@
|
||||
"upload_form.audio_description": "청각 장애인을 위한 설명",
|
||||
"upload_form.description": "시각장애인을 위한 설명",
|
||||
"upload_form.edit": "편집",
|
||||
"upload_form.thumbnail": "썸네일 변경",
|
||||
"upload_form.undo": "삭제",
|
||||
"upload_form.video_description": "청각, 시각 장애인을 위한 설명",
|
||||
"upload_modal.analyzing_picture": "이미지 분석 중…",
|
||||
"upload_modal.apply": "적용",
|
||||
"upload_modal.choose_image": "이미지 선택",
|
||||
"upload_modal.description_placeholder": "다람쥐 헌 쳇바퀴 타고파",
|
||||
"upload_modal.detect_text": "이미지에서 텍스트 추출",
|
||||
"upload_modal.edit_media": "미디어 편집",
|
||||
|
461
app/javascript/mastodon/locales/ku.json
Normal file
461
app/javascript/mastodon/locales/ku.json
Normal file
@ -0,0 +1,461 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Block @{name}",
|
||||
"account.block_domain": "Block domain {domain}",
|
||||
"account.blocked": "Blocked",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.direct": "Direct message @{name}",
|
||||
"account.domain_blocked": "Domain blocked",
|
||||
"account.edit_profile": "Edit profile",
|
||||
"account.endorse": "Feature on profile",
|
||||
"account.follow": "Follow",
|
||||
"account.followers": "Followers",
|
||||
"account.followers.empty": "No one follows this user yet.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "This user doesn't follow anyone yet.",
|
||||
"account.follows_you": "Follows you",
|
||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
||||
"account.last_status": "Last active",
|
||||
"account.link_verified_on": "Ownership of this link was checked on {date}",
|
||||
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
|
||||
"account.media": "Media",
|
||||
"account.mention": "Mention @{name}",
|
||||
"account.moved_to": "{name} has moved to:",
|
||||
"account.mute": "Mute @{name}",
|
||||
"account.mute_notifications": "Mute notifications from @{name}",
|
||||
"account.muted": "Muted",
|
||||
"account.never_active": "Never",
|
||||
"account.posts": "Toots",
|
||||
"account.posts_with_replies": "Toots and replies",
|
||||
"account.report": "Report @{name}",
|
||||
"account.requested": "Awaiting approval",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Show boosts from @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Unblock @{name}",
|
||||
"account.unblock_domain": "Unblock domain {domain}",
|
||||
"account.unendorse": "Don't feature on profile",
|
||||
"account.unfollow": "Unfollow",
|
||||
"account.unmute": "Unmute @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "An unexpected error occurred.",
|
||||
"alert.unexpected.title": "Oops!",
|
||||
"announcement.announcement": "Announcement",
|
||||
"autosuggest_hashtag.per_week": "{count} per week",
|
||||
"boost_modal.combo": "You can press {combo} to skip this next time",
|
||||
"bundle_column_error.body": "Something went wrong while loading this component.",
|
||||
"bundle_column_error.retry": "Try again",
|
||||
"bundle_column_error.title": "Network error",
|
||||
"bundle_modal_error.close": "Close",
|
||||
"bundle_modal_error.message": "Something went wrong while loading this component.",
|
||||
"bundle_modal_error.retry": "Try again",
|
||||
"column.blocks": "Blocked users",
|
||||
"column.bookmarks": "Bookmarks",
|
||||
"column.community": "Local timeline",
|
||||
"column.direct": "Direct messages",
|
||||
"column.directory": "Browse profiles",
|
||||
"column.domain_blocks": "Blocked domains",
|
||||
"column.favourites": "Favourites",
|
||||
"column.follow_requests": "Follow requests",
|
||||
"column.home": "Home",
|
||||
"column.lists": "Lists",
|
||||
"column.mutes": "Muted users",
|
||||
"column.notifications": "Notifications",
|
||||
"column.pins": "Pinned toot",
|
||||
"column.public": "Federated timeline",
|
||||
"column_back_button.label": "Back",
|
||||
"column_header.hide_settings": "Hide settings",
|
||||
"column_header.moveLeft_settings": "Move column to the left",
|
||||
"column_header.moveRight_settings": "Move column to the right",
|
||||
"column_header.pin": "Pin",
|
||||
"column_header.show_settings": "Show settings",
|
||||
"column_header.unpin": "Unpin",
|
||||
"column_subheading.settings": "Settings",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.media_only": "Media only",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
|
||||
"compose_form.direct_message_warning_learn_more": "Learn more",
|
||||
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
|
||||
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
|
||||
"compose_form.lock_disclaimer.lock": "locked",
|
||||
"compose_form.placeholder": "What is on your mind?",
|
||||
"compose_form.poll.add_option": "Add a choice",
|
||||
"compose_form.poll.duration": "Poll duration",
|
||||
"compose_form.poll.option_placeholder": "Choice {number}",
|
||||
"compose_form.poll.remove_option": "Remove this choice",
|
||||
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
|
||||
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
|
||||
"compose_form.publish": "Toot",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.sensitive.hide": "Mark media as sensitive",
|
||||
"compose_form.sensitive.marked": "Media is marked as sensitive",
|
||||
"compose_form.sensitive.unmarked": "Media is not marked as sensitive",
|
||||
"compose_form.spoiler.marked": "Text is hidden behind warning",
|
||||
"compose_form.spoiler.unmarked": "Text is not hidden",
|
||||
"compose_form.spoiler_placeholder": "Write your warning here",
|
||||
"confirmation_modal.cancel": "Cancel",
|
||||
"confirmations.block.block_and_report": "Block & Report",
|
||||
"confirmations.block.confirm": "Block",
|
||||
"confirmations.block.message": "Are you sure you want to block {name}?",
|
||||
"confirmations.delete.confirm": "Delete",
|
||||
"confirmations.delete.message": "Are you sure you want to delete this status?",
|
||||
"confirmations.delete_list.confirm": "Delete",
|
||||
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
|
||||
"confirmations.domain_block.confirm": "Hide entire domain",
|
||||
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
|
||||
"confirmations.logout.confirm": "Log out",
|
||||
"confirmations.logout.message": "Are you sure you want to log out?",
|
||||
"confirmations.mute.confirm": "Mute",
|
||||
"confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
|
||||
"confirmations.mute.message": "Are you sure you want to mute {name}?",
|
||||
"confirmations.redraft.confirm": "Delete & redraft",
|
||||
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
|
||||
"confirmations.reply.confirm": "Reply",
|
||||
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
|
||||
"confirmations.unfollow.confirm": "Unfollow",
|
||||
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
|
||||
"conversation.delete": "Delete conversation",
|
||||
"conversation.mark_as_read": "Mark as read",
|
||||
"conversation.open": "View conversation",
|
||||
"conversation.with": "With {names}",
|
||||
"directory.federated": "From known fediverse",
|
||||
"directory.local": "From {domain} only",
|
||||
"directory.new_arrivals": "New arrivals",
|
||||
"directory.recently_active": "Recently active",
|
||||
"embed.instructions": "Embed this status on your website by copying the code below.",
|
||||
"embed.preview": "Here is what it will look like:",
|
||||
"emoji_button.activity": "Activity",
|
||||
"emoji_button.custom": "Custom",
|
||||
"emoji_button.flags": "Flags",
|
||||
"emoji_button.food": "Food & Drink",
|
||||
"emoji_button.label": "Insert emoji",
|
||||
"emoji_button.nature": "Nature",
|
||||
"emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
|
||||
"emoji_button.objects": "Objects",
|
||||
"emoji_button.people": "People",
|
||||
"emoji_button.recent": "Frequently used",
|
||||
"emoji_button.search": "Search...",
|
||||
"emoji_button.search_results": "Search results",
|
||||
"emoji_button.symbols": "Symbols",
|
||||
"emoji_button.travel": "Travel & Places",
|
||||
"empty_column.account_timeline": "No toots here!",
|
||||
"empty_column.account_unavailable": "Profile unavailable",
|
||||
"empty_column.blocks": "You haven't blocked any users yet.",
|
||||
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
|
||||
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
|
||||
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
|
||||
"empty_column.domain_blocks": "There are no blocked domains yet.",
|
||||
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
|
||||
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
|
||||
"empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
|
||||
"empty_column.hashtag": "There is nothing in this hashtag yet.",
|
||||
"empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
|
||||
"empty_column.home.public_timeline": "the public timeline",
|
||||
"empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
|
||||
"empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
|
||||
"empty_column.mutes": "You haven't muted any users yet.",
|
||||
"empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
|
||||
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
|
||||
"error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
|
||||
"error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
|
||||
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
|
||||
"errors.unexpected_crash.report_issue": "Report issue",
|
||||
"follow_request.authorize": "Authorize",
|
||||
"follow_request.reject": "Reject",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
"getting_started.heading": "Getting started",
|
||||
"getting_started.invite": "Invite people",
|
||||
"getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
|
||||
"getting_started.security": "Security",
|
||||
"getting_started.terms": "Terms of service",
|
||||
"hashtag.column_header.tag_mode.all": "and {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "or {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "without {additional}",
|
||||
"hashtag.column_settings.select.no_options_message": "No suggestions found",
|
||||
"hashtag.column_settings.select.placeholder": "Enter hashtags…",
|
||||
"hashtag.column_settings.tag_mode.all": "All of these",
|
||||
"hashtag.column_settings.tag_mode.any": "Any of these",
|
||||
"hashtag.column_settings.tag_mode.none": "None of these",
|
||||
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
|
||||
"home.column_settings.basic": "Basic",
|
||||
"home.column_settings.show_reblogs": "Show boosts",
|
||||
"home.column_settings.show_replies": "Show replies",
|
||||
"home.hide_announcements": "Hide announcements",
|
||||
"home.show_announcements": "Show announcements",
|
||||
"intervals.full.days": "{number, plural, one {# day} other {# days}}",
|
||||
"intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
|
||||
"introduction.federation.action": "Next",
|
||||
"introduction.federation.federated.headline": "Federated",
|
||||
"introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
|
||||
"introduction.federation.home.headline": "Home",
|
||||
"introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
|
||||
"introduction.federation.local.headline": "Local",
|
||||
"introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
|
||||
"introduction.interactions.action": "Finish toot-orial!",
|
||||
"introduction.interactions.favourite.headline": "Favourite",
|
||||
"introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
|
||||
"introduction.interactions.reblog.headline": "Boost",
|
||||
"introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
|
||||
"introduction.interactions.reply.headline": "Reply",
|
||||
"introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
|
||||
"introduction.welcome.action": "Let's go!",
|
||||
"introduction.welcome.headline": "First steps",
|
||||
"introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
|
||||
"keyboard_shortcuts.back": "to navigate back",
|
||||
"keyboard_shortcuts.blocked": "to open blocked users list",
|
||||
"keyboard_shortcuts.boost": "to boost",
|
||||
"keyboard_shortcuts.column": "to focus a status in one of the columns",
|
||||
"keyboard_shortcuts.compose": "to focus the compose textarea",
|
||||
"keyboard_shortcuts.description": "Description",
|
||||
"keyboard_shortcuts.direct": "to open direct messages column",
|
||||
"keyboard_shortcuts.down": "to move down in the list",
|
||||
"keyboard_shortcuts.enter": "to open status",
|
||||
"keyboard_shortcuts.favourite": "to favourite",
|
||||
"keyboard_shortcuts.favourites": "to open favourites list",
|
||||
"keyboard_shortcuts.federated": "to open federated timeline",
|
||||
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
|
||||
"keyboard_shortcuts.home": "to open home timeline",
|
||||
"keyboard_shortcuts.hotkey": "Hotkey",
|
||||
"keyboard_shortcuts.legend": "to display this legend",
|
||||
"keyboard_shortcuts.local": "to open local timeline",
|
||||
"keyboard_shortcuts.mention": "to mention author",
|
||||
"keyboard_shortcuts.muted": "to open muted users list",
|
||||
"keyboard_shortcuts.my_profile": "to open your profile",
|
||||
"keyboard_shortcuts.notifications": "to open notifications column",
|
||||
"keyboard_shortcuts.open_media": "to open media",
|
||||
"keyboard_shortcuts.pinned": "to open pinned toots list",
|
||||
"keyboard_shortcuts.profile": "to open author's profile",
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
"keyboard_shortcuts.toot": "to start a brand new toot",
|
||||
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
|
||||
"keyboard_shortcuts.up": "to move up in the list",
|
||||
"lightbox.close": "Close",
|
||||
"lightbox.next": "Next",
|
||||
"lightbox.previous": "Previous",
|
||||
"lightbox.view_context": "View context",
|
||||
"lists.account.add": "Add to list",
|
||||
"lists.account.remove": "Remove from list",
|
||||
"lists.delete": "Delete list",
|
||||
"lists.edit": "Edit list",
|
||||
"lists.edit.submit": "Change title",
|
||||
"lists.new.create": "Add list",
|
||||
"lists.new.title_placeholder": "New list title",
|
||||
"lists.search": "Search among people you follow",
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "Loading...",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "Not found",
|
||||
"missing_indicator.sublabel": "This resource could not be found",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
"navigation_bar.apps": "Mobile apps",
|
||||
"navigation_bar.blocks": "Blocked users",
|
||||
"navigation_bar.bookmarks": "Bookmarks",
|
||||
"navigation_bar.community_timeline": "Local timeline",
|
||||
"navigation_bar.compose": "Compose new toot",
|
||||
"navigation_bar.direct": "Direct messages",
|
||||
"navigation_bar.discover": "Discover",
|
||||
"navigation_bar.domain_blocks": "Hidden domains",
|
||||
"navigation_bar.edit_profile": "Edit profile",
|
||||
"navigation_bar.favourites": "Favourites",
|
||||
"navigation_bar.filters": "Muted words",
|
||||
"navigation_bar.follow_requests": "Follow requests",
|
||||
"navigation_bar.follows_and_followers": "Follows and followers",
|
||||
"navigation_bar.info": "About this server",
|
||||
"navigation_bar.keyboard_shortcuts": "Hotkeys",
|
||||
"navigation_bar.lists": "Lists",
|
||||
"navigation_bar.logout": "Logout",
|
||||
"navigation_bar.mutes": "Muted users",
|
||||
"navigation_bar.personal": "Personal",
|
||||
"navigation_bar.pins": "Pinned toots",
|
||||
"navigation_bar.preferences": "Preferences",
|
||||
"navigation_bar.public_timeline": "Federated timeline",
|
||||
"navigation_bar.security": "Security",
|
||||
"notification.favourite": "{name} favourited your status",
|
||||
"notification.follow": "{name} followed you",
|
||||
"notification.follow_request": "{name} has requested to follow you",
|
||||
"notification.mention": "{name} mentioned you",
|
||||
"notification.own_poll": "Your poll has ended",
|
||||
"notification.poll": "A poll you have voted in has ended",
|
||||
"notification.reblog": "{name} boosted your status",
|
||||
"notifications.clear": "Clear notifications",
|
||||
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
|
||||
"notifications.column_settings.alert": "Desktop notifications",
|
||||
"notifications.column_settings.favourite": "Favourites:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Display all categories",
|
||||
"notifications.column_settings.filter_bar.category": "Quick filter bar",
|
||||
"notifications.column_settings.filter_bar.show": "Show",
|
||||
"notifications.column_settings.follow": "New followers:",
|
||||
"notifications.column_settings.follow_request": "New follow requests:",
|
||||
"notifications.column_settings.mention": "Mentions:",
|
||||
"notifications.column_settings.poll": "Poll results:",
|
||||
"notifications.column_settings.push": "Push notifications",
|
||||
"notifications.column_settings.reblog": "Boosts:",
|
||||
"notifications.column_settings.show": "Show in column",
|
||||
"notifications.column_settings.sound": "Play sound",
|
||||
"notifications.filter.all": "All",
|
||||
"notifications.filter.boosts": "Boosts",
|
||||
"notifications.filter.favourites": "Favourites",
|
||||
"notifications.filter.follows": "Follows",
|
||||
"notifications.filter.mentions": "Mentions",
|
||||
"notifications.filter.polls": "Poll results",
|
||||
"notifications.group": "{count} notifications",
|
||||
"poll.closed": "Closed",
|
||||
"poll.refresh": "Refresh",
|
||||
"poll.total_people": "{count, plural, one {# person} other {# people}}",
|
||||
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
|
||||
"poll.vote": "Vote",
|
||||
"poll.voted": "You voted for this answer",
|
||||
"poll_button.add_poll": "Add a poll",
|
||||
"poll_button.remove_poll": "Remove poll",
|
||||
"privacy.change": "Adjust status privacy",
|
||||
"privacy.direct.long": "Visible for mentioned users only",
|
||||
"privacy.direct.short": "Direct",
|
||||
"privacy.private.long": "Visible for followers only",
|
||||
"privacy.private.short": "Followers-only",
|
||||
"privacy.public.long": "Visible for all, shown in public timelines",
|
||||
"privacy.public.short": "Public",
|
||||
"privacy.unlisted.long": "Visible for all, but not in public timelines",
|
||||
"privacy.unlisted.short": "Unlisted",
|
||||
"refresh": "Refresh",
|
||||
"regeneration_indicator.label": "Loading…",
|
||||
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
|
||||
"relative_time.days": "{number}d",
|
||||
"relative_time.hours": "{number}h",
|
||||
"relative_time.just_now": "now",
|
||||
"relative_time.minutes": "{number}m",
|
||||
"relative_time.seconds": "{number}s",
|
||||
"relative_time.today": "today",
|
||||
"reply_indicator.cancel": "Cancel",
|
||||
"report.forward": "Forward to {target}",
|
||||
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
|
||||
"report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
|
||||
"report.placeholder": "Additional comments",
|
||||
"report.submit": "Submit",
|
||||
"report.target": "Report {target}",
|
||||
"search.placeholder": "Search",
|
||||
"search_popout.search_format": "Advanced search format",
|
||||
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||
"search_popout.tips.hashtag": "hashtag",
|
||||
"search_popout.tips.status": "status",
|
||||
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||
"search_popout.tips.user": "user",
|
||||
"search_results.accounts": "People",
|
||||
"search_results.hashtags": "Hashtags",
|
||||
"search_results.statuses": "Toots",
|
||||
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
|
||||
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
|
||||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_status": "Open this status in the moderation interface",
|
||||
"status.block": "Block @{name}",
|
||||
"status.bookmark": "Bookmark",
|
||||
"status.cancel_reblog_private": "Unboost",
|
||||
"status.cannot_reblog": "This post cannot be boosted",
|
||||
"status.copy": "Copy link to status",
|
||||
"status.delete": "Delete",
|
||||
"status.detailed_status": "Detailed conversation view",
|
||||
"status.direct": "Direct message @{name}",
|
||||
"status.embed": "Embed",
|
||||
"status.favourite": "Favourite",
|
||||
"status.filtered": "Filtered",
|
||||
"status.load_more": "Load more",
|
||||
"status.media_hidden": "Media hidden",
|
||||
"status.mention": "Mention @{name}",
|
||||
"status.more": "More",
|
||||
"status.mute": "Mute @{name}",
|
||||
"status.mute_conversation": "Mute conversation",
|
||||
"status.open": "Expand this status",
|
||||
"status.pin": "Pin on profile",
|
||||
"status.pinned": "Pinned toot",
|
||||
"status.read_more": "Read more",
|
||||
"status.reblog": "Boost",
|
||||
"status.reblog_private": "Boost to original audience",
|
||||
"status.reblogged_by": "{name} boosted",
|
||||
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
|
||||
"status.redraft": "Delete & re-draft",
|
||||
"status.remove_bookmark": "Remove bookmark",
|
||||
"status.reply": "Reply",
|
||||
"status.replyAll": "Reply to thread",
|
||||
"status.report": "Report @{name}",
|
||||
"status.sensitive_warning": "Sensitive content",
|
||||
"status.share": "Share",
|
||||
"status.show_less": "Show less",
|
||||
"status.show_less_all": "Show less for all",
|
||||
"status.show_more": "Show more",
|
||||
"status.show_more_all": "Show more for all",
|
||||
"status.show_thread": "Show thread",
|
||||
"status.uncached_media_warning": "Not available",
|
||||
"status.unmute_conversation": "Unmute conversation",
|
||||
"status.unpin": "Unpin from profile",
|
||||
"suggestions.dismiss": "Dismiss suggestion",
|
||||
"suggestions.header": "You might be interested in…",
|
||||
"tabs_bar.federated_timeline": "Federated",
|
||||
"tabs_bar.home": "Home",
|
||||
"tabs_bar.local_timeline": "Local",
|
||||
"tabs_bar.notifications": "Notifications",
|
||||
"tabs_bar.search": "Search",
|
||||
"time_remaining.days": "{number, plural, one {# day} other {# days}} left",
|
||||
"time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
"upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
|
||||
"upload_modal.preview_label": "Preview ({ratio})",
|
||||
"upload_progress.label": "Uploading…",
|
||||
"video.close": "Close video",
|
||||
"video.download": "Download file",
|
||||
"video.exit_fullscreen": "Exit full screen",
|
||||
"video.expand": "Expand video",
|
||||
"video.fullscreen": "Full screen",
|
||||
"video.hide": "Hide video",
|
||||
"video.mute": "Mute sound",
|
||||
"video.pause": "Pause",
|
||||
"video.play": "Play",
|
||||
"video.unmute": "Unmute sound"
|
||||
}
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Add or Remove from lists",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Block @{name}",
|
||||
"account.block_domain": "Hide everything from {domain}",
|
||||
"account.blocked": "Blocked",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.direct": "Direct message @{name}",
|
||||
"account.domain_blocked": "Domain hidden",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Follow",
|
||||
"account.followers": "Followers",
|
||||
"account.followers.empty": "No one follows this user yet.",
|
||||
"account.follows": "Follows",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "This user doesn't follow anyone yet.",
|
||||
"account.follows_you": "Follows you",
|
||||
"account.hide_reblogs": "Hide boosts from @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Awaiting approval",
|
||||
"account.share": "Share @{name}'s profile",
|
||||
"account.show_reblogs": "Show boosts from @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Unblock @{name}",
|
||||
"account.unblock_domain": "Unhide {domain}",
|
||||
"account.unendorse": "Don't feature on profile",
|
||||
"account.unfollow": "Unfollow",
|
||||
"account.unmute": "Unmute @{name}",
|
||||
"account.unmute_notifications": "Unmute notifications from @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "An unexpected error occurred.",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Authorize",
|
||||
"follow_request.reject": "Reject",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -262,7 +269,7 @@
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "Loading...",
|
||||
"media_gallery.toggle_visible": "Hide media",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "Not found",
|
||||
"missing_indicator.sublabel": "This resource could not be found",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
@ -418,20 +425,29 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,11 +1,13 @@
|
||||
{
|
||||
"account.account_note_header": "Piezīme",
|
||||
"account.add_or_remove_from_list": "Pievienot vai noņemt no saraksta",
|
||||
"account.badges.bot": "Bots",
|
||||
"account.badges.group": "Group",
|
||||
"account.badges.group": "Grupa",
|
||||
"account.block": "Bloķēt @{name}",
|
||||
"account.block_domain": "Slēpt visu no {domain}",
|
||||
"account.blocked": "Bloķēts",
|
||||
"account.cancel_follow_request": "Cancel follow request",
|
||||
"account.browse_more_on_origin_server": "Pārlūkot vairāk sākotnējā profilā",
|
||||
"account.cancel_follow_request": "Atcelt pieprasījumu",
|
||||
"account.direct": "Privātā ziņa @{name}",
|
||||
"account.domain_blocked": "Domēns ir paslēpts",
|
||||
"account.edit_profile": "Labot profilu",
|
||||
@ -13,11 +15,12 @@
|
||||
"account.follow": "Sekot",
|
||||
"account.followers": "Sekotāji",
|
||||
"account.followers.empty": "Šim lietotājam nav sekotāju.",
|
||||
"account.follows": "Seko",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
|
||||
"account.follows_you": "Seko tev",
|
||||
"account.hide_reblogs": "Paslēpt paceltos ierakstus no lietotāja @{name}",
|
||||
"account.last_status": "Last active",
|
||||
"account.last_status": "Pēdējā aktivitāte",
|
||||
"account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}",
|
||||
"account.locked_info": "Šī konta privātuma status ir iestatīts slēgts. Īpašnieks izskatīs un izvēlēsies kas viņam drīkst sekot.",
|
||||
"account.media": "Mēdiji",
|
||||
@ -26,19 +29,21 @@
|
||||
"account.mute": "Apklusināt @{name}",
|
||||
"account.mute_notifications": "Nerādīt paziņojumus no @{name}",
|
||||
"account.muted": "Apklusināts",
|
||||
"account.never_active": "Never",
|
||||
"account.never_active": "Nekad",
|
||||
"account.posts": "Ieraksti",
|
||||
"account.posts_with_replies": "Ieraksti un atbildes",
|
||||
"account.report": "Ziņot par lietotāju @{name}",
|
||||
"account.requested": "Gaidām apstiprinājumu. Nospied lai atceltu sekošanas pieparasījumu",
|
||||
"account.share": "Dalīties ar lietotāja @{name}'s profilu",
|
||||
"account.show_reblogs": "Parādīt lietotāja @{name} paceltos ierakstus",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Atbloķēt lietotāju @{name}",
|
||||
"account.unblock_domain": "Atbloķēt domēnu {domain}",
|
||||
"account.unendorse": "Neizcelt profilā",
|
||||
"account.unfollow": "Nesekot",
|
||||
"account.unmute": "Noņemt apklusinājumu no lietotāja @{name}",
|
||||
"account.unmute_notifications": "Rādīt paziņojumus no lietotāja @{name}",
|
||||
"account_note.placeholder": "Noklikšķiniet, lai pievienotu piezīmi",
|
||||
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "Negaidīta kļūda.",
|
||||
@ -53,7 +58,7 @@
|
||||
"bundle_modal_error.message": "Kaut kas nogāja greizi ielādējot šo komponenti.",
|
||||
"bundle_modal_error.retry": "Mēģini vēlreiz",
|
||||
"column.blocks": "Bloķētie lietotāji",
|
||||
"column.bookmarks": "Bookmarks",
|
||||
"column.bookmarks": "Grāmatzīmes",
|
||||
"column.community": "Lokālā laika līnija",
|
||||
"column.direct": "Privātās ziņas",
|
||||
"column.directory": "Browse profiles",
|
||||
@ -74,16 +79,16 @@
|
||||
"column_header.show_settings": "Rādīt iestatījumus",
|
||||
"column_header.unpin": "Atspraust",
|
||||
"column_subheading.settings": "Iestatījumi",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "Tikai vietējie",
|
||||
"community.column_settings.media_only": "Tikai mēdiji",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"community.column_settings.remote_only": "Tikai tālvadības",
|
||||
"compose_form.direct_message_warning": "Šis ziņojums tiks nosūtīts tikai pieminētajiem lietotājiem.",
|
||||
"compose_form.direct_message_warning_learn_more": "Papildus informācija",
|
||||
"compose_form.hashtag_warning": "Ziņojumu nebūs iespējams atrast zem haštagiem jo tas nav publisks. Tikai publiskos ziņojumus ir iespējams meklēt pēc tiem.",
|
||||
"compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var Tev sekot lai apskatītu tikai sekotājiem paredzētos ziņojumus.",
|
||||
"compose_form.lock_disclaimer.lock": "slēgts",
|
||||
"compose_form.placeholder": "Ko vēlies publicēt?",
|
||||
"compose_form.poll.add_option": "Add a choice",
|
||||
"compose_form.poll.add_option": "Pievienot izvēli",
|
||||
"compose_form.poll.duration": "Poll duration",
|
||||
"compose_form.poll.option_placeholder": "Choice {number}",
|
||||
"compose_form.poll.remove_option": "Remove this choice",
|
||||
@ -172,6 +177,7 @@
|
||||
"follow_request.authorize": "Autorizēt",
|
||||
"follow_request.reject": "Noraidīt",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Developers",
|
||||
"getting_started.directory": "Profile directory",
|
||||
"getting_started.documentation": "Documentation",
|
||||
@ -241,6 +247,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -262,7 +269,7 @@
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "Loading...",
|
||||
"media_gallery.toggle_visible": "Hide media",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "Not found",
|
||||
"missing_indicator.sublabel": "This resource could not be found",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
@ -418,20 +425,29 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "Note",
|
||||
"account.add_or_remove_from_list": "Додади или одстрани од листа",
|
||||
"account.badges.bot": "Бот",
|
||||
"account.badges.group": "Group",
|
||||
"account.block": "Блокирај @{name}",
|
||||
"account.block_domain": "Сокријај се од {domain}",
|
||||
"account.blocked": "Блокиран",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "Одкажи барање за следење",
|
||||
"account.direct": "Директна порана @{name}",
|
||||
"account.domain_blocked": "Скриен домен",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "Следи",
|
||||
"account.followers": "Следбеници",
|
||||
"account.followers.empty": "Никој не го следи овој корисник сеуште.",
|
||||
"account.follows": "Следи",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "Корисникот не следи никој сеуште.",
|
||||
"account.follows_you": "Те следи тебе",
|
||||
"account.hide_reblogs": "Сокриј буст од @{name}",
|
||||
@ -33,12 +36,14 @@
|
||||
"account.requested": "Се чека одобрување. Кликни за да одкажиш барање за следење",
|
||||
"account.share": "Сподели @{name} профил",
|
||||
"account.show_reblogs": "Прикажи бустови од @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "Одблокирај @{name}",
|
||||
"account.unblock_domain": "Прикажи {domain}",
|
||||
"account.unendorse": "Не прикажувај на профил",
|
||||
"account.unfollow": "Одследи",
|
||||
"account.unmute": "Зачути го @{name}",
|
||||
"account.unmute_notifications": "Исклучи известувања од @{name}",
|
||||
"account_note.placeholder": "Click to add a note",
|
||||
"alert.rate_limited.message": "Обидете се повторно после {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Rate limited",
|
||||
"alert.unexpected.message": "Неочекувана грешка.",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "Одобри",
|
||||
"follow_request.reject": "Одбиј",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "Saved",
|
||||
"getting_started.developers": "Програмери",
|
||||
"getting_started.directory": "Профил директориум",
|
||||
"getting_started.documentation": "Документација",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "одговори",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -257,7 +264,7 @@
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "Loading...",
|
||||
"media_gallery.toggle_visible": "Hide media",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "Not found",
|
||||
"missing_indicator.sublabel": "This resource could not be found",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
@ -412,20 +419,29 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# минута} other {# минути}} {number, plural, one {остана} other {останаа}}",
|
||||
"time_remaining.moments": "Уште некои мига",
|
||||
"time_remaining.seconds": "{number, plural, one {# секунда} other {# секунди}} {number, plural, one {остана} other {останаа}}",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
@ -1,10 +1,12 @@
|
||||
{
|
||||
"account.account_note_header": "കുറിപ്പ്",
|
||||
"account.add_or_remove_from_list": "പട്ടികയിൽ ചേർക്കുകയോ അല്ലെങ്കിൽ മാറ്റുകയോ ചെയ്യുക",
|
||||
"account.badges.bot": "റോബോട്ട്",
|
||||
"account.badges.group": "Group",
|
||||
"account.badges.group": "കൂട്ടം",
|
||||
"account.block": "@{name} നെ ബ്ലോക്ക് ചെയ്യുക",
|
||||
"account.block_domain": "{domain} ൽ നിന്നുള്ള എല്ലാം മറയ്കുക",
|
||||
"account.blocked": "തടഞ്ഞു",
|
||||
"account.browse_more_on_origin_server": "Browse more on the original profile",
|
||||
"account.cancel_follow_request": "പിന്തുടരാനുള്ള അപേക്ഷ നിരസിക്കുക",
|
||||
"account.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക",
|
||||
"account.domain_blocked": "മേഖല മറയ്ക്കപ്പെട്ടിരിക്കുന്നു",
|
||||
@ -13,7 +15,8 @@
|
||||
"account.follow": "പിന്തുടരുക",
|
||||
"account.followers": "പിന്തുടരുന്നവർ",
|
||||
"account.followers.empty": "ഈ ഉപയോക്താവിനെ ആരും ഇതുവരെ പിന്തുടരുന്നില്ല.",
|
||||
"account.follows": "പിന്തുടരുന്നു",
|
||||
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
|
||||
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
|
||||
"account.follows.empty": "ഈ ഉപയോക്താവ് ആരേയും ഇതുവരെ പിന്തുടരുന്നില്ല.",
|
||||
"account.follows_you": "നിങ്ങളെ പിന്തുടരുന്നു",
|
||||
"account.hide_reblogs": "@{name} ബൂസ്റ്റ് ചെയ്തവ മറയ്കുക",
|
||||
@ -33,17 +36,19 @@
|
||||
"account.requested": "അനുവാദത്തിനായി കാത്തിരിക്കുന്നു. പിന്തുടരാനുള്ള അപേക്ഷ റദ്ദാക്കുവാൻ ഞെക്കുക",
|
||||
"account.share": "@{name} ന്റെ പ്രൊഫൈൽ പങ്കുവെക്കുക",
|
||||
"account.show_reblogs": "@{name} ൽ നിന്നുള്ള ബൂസ്റ്റുകൾ കാണിക്കുക",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
|
||||
"account.unblock": "ബ്ലോക്ക് മാറ്റുക @{name}",
|
||||
"account.unblock_domain": "{domain} വെളിപ്പെടുത്തുക",
|
||||
"account.unendorse": "പ്രൊഫൈലിൽ പ്രകടമാക്കാതിരിക്കുക",
|
||||
"account.unfollow": "പിന്തുടരുന്നത് നിര്ത്തുക",
|
||||
"account.unmute": "നിശ്ശബ്ദമാക്കുന്നത് നിർത്തുക @{name}",
|
||||
"account.unmute_notifications": "@{name} യിൽ നിന്നുള്ള അറിയിപ്പുകൾ പ്രസിദ്ധപ്പെടുത്തുക",
|
||||
"account_note.placeholder": "കുറിപ്പ് ചേർക്കാൻ ക്ലിക്കുചെയ്യുക",
|
||||
"alert.rate_limited.message": "{retry_time, time, medium} നു ശേഷം വീണ്ടും ശ്രമിക്കുക.",
|
||||
"alert.rate_limited.title": "തോത് പരിമിതപ്പെടുത്തിയിരിക്കുന്നു",
|
||||
"alert.unexpected.message": "അപ്രതീക്ഷിതമായി എന്തോ സംഭവിച്ചു.",
|
||||
"alert.unexpected.title": "ശ്ശോ!",
|
||||
"announcement.announcement": "Announcement",
|
||||
"announcement.announcement": "അറിയിപ്പ്",
|
||||
"autosuggest_hashtag.per_week": "ആഴ്ച തോറും {count}",
|
||||
"boost_modal.combo": "അടുത്ത തവണ ഇത് ഒഴിവാക്കുവാൻ {combo} ഞെക്കാവുന്നതാണ്",
|
||||
"bundle_column_error.body": "ഈ ഘടകം പ്രദശിപ്പിക്കുമ്പോൾ എന്തോ കുഴപ്പം സംഭവിച്ചു.",
|
||||
@ -53,7 +58,7 @@
|
||||
"bundle_modal_error.message": "ഈ വെബ്പേജ് പ്രദർശിപ്പിക്കുമ്പോൾ എന്തോ കുഴപ്പം സംഭവിച്ചു.",
|
||||
"bundle_modal_error.retry": "വീണ്ടും ശ്രമിക്കുക",
|
||||
"column.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
|
||||
"column.bookmarks": "Bookmarks",
|
||||
"column.bookmarks": "ബുക്ക്മാർക്കുകൾ",
|
||||
"column.community": "പ്രാദേശികമായ സമയരേഖ",
|
||||
"column.direct": "നേരിട്ടുള്ള സന്ദേശങ്ങൾ",
|
||||
"column.directory": "പ്രൊഫൈലുകൾ മറിച്ചുനോക്കുക",
|
||||
@ -74,19 +79,19 @@
|
||||
"column_header.show_settings": "ക്രമീകരണങ്ങൾ കാണിക്കുക",
|
||||
"column_header.unpin": "ഇളക്കി മാറ്റുക",
|
||||
"column_subheading.settings": "ക്രമീകരണങ്ങള്",
|
||||
"community.column_settings.local_only": "Local only",
|
||||
"community.column_settings.local_only": "പ്രാദേശികം മാത്രം",
|
||||
"community.column_settings.media_only": "മാധ്യമങ്ങൾ മാത്രം",
|
||||
"community.column_settings.remote_only": "Remote only",
|
||||
"compose_form.direct_message_warning": "പരാമർശിക്കപ്പെട്ടിരിക്കുന്ന ഉപയോഗ്താക്കൾക്കെ ഈ ടൂട്ട് അയക്കപ്പെടുകയുള്ളു.",
|
||||
"compose_form.direct_message_warning_learn_more": "കൂടുതൽ പഠിക്കുക",
|
||||
"compose_form.hashtag_warning": "ഈ ടൂട്ട് പട്ടികയിൽ ഇല്ലാത്തതിനാൽ ഒരു ചർച്ചാവിഷയത്തിന്റെ പട്ടികയിലും പെടുകയില്ല. പരസ്യമായ ടൂട്ടുകൾ മാത്രമേ ചർച്ചാവിഷയം അടിസ്ഥാനമാക്കി തിരയുവാൻ സാധിക്കുകയുള്ളു.",
|
||||
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
|
||||
"compose_form.lock_disclaimer.lock": "locked",
|
||||
"compose_form.lock_disclaimer.lock": "ലോക്കുചെയ്തു",
|
||||
"compose_form.placeholder": "നിങ്ങളുടെ മനസ്സിൽ എന്താണ്?",
|
||||
"compose_form.poll.add_option": "Add a choice",
|
||||
"compose_form.poll.add_option": "ഒരു ചോയ്സ് ചേർക്കുക",
|
||||
"compose_form.poll.duration": "തിരഞ്ഞെടുപ്പിന്റെ സമയദൈർഖ്യം",
|
||||
"compose_form.poll.option_placeholder": "Choice {number}",
|
||||
"compose_form.poll.remove_option": "Remove this choice",
|
||||
"compose_form.poll.option_placeholder": "ചോയ്സ് {number}",
|
||||
"compose_form.poll.remove_option": "ഈ ഡിവൈസ് മാറ്റുക",
|
||||
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
|
||||
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
|
||||
"compose_form.publish": "ടൂട്ട്",
|
||||
@ -167,6 +172,7 @@
|
||||
"follow_request.authorize": "ചുമതലപ്പെടുത്തുക",
|
||||
"follow_request.reject": "നിരസിക്കുക",
|
||||
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
|
||||
"generic.saved": "സംരക്ഷിച്ചു",
|
||||
"getting_started.developers": "വികസിപ്പിക്കുന്നവർ",
|
||||
"getting_started.directory": "രൂപരേഖ നാമഗൃഹസൂചി",
|
||||
"getting_started.documentation": "രേഖാ സമാഹരണം",
|
||||
@ -187,8 +193,8 @@
|
||||
"home.column_settings.basic": "അടിസ്ഥാനം",
|
||||
"home.column_settings.show_reblogs": "ബൂസ്റ്റുകൾ കാണിക്കുക",
|
||||
"home.column_settings.show_replies": "മറുപടികൾ കാണിക്കുക",
|
||||
"home.hide_announcements": "Hide announcements",
|
||||
"home.show_announcements": "Show announcements",
|
||||
"home.hide_announcements": "പ്രഖ്യാപനങ്ങൾ മറയ്ക്കുക",
|
||||
"home.show_announcements": "പ്രഖ്യാപനങ്ങൾ കാണിക്കുക",
|
||||
"intervals.full.days": "{number, plural, one {# day} other {# days}}",
|
||||
"intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
|
||||
@ -236,6 +242,7 @@
|
||||
"keyboard_shortcuts.reply": "to reply",
|
||||
"keyboard_shortcuts.requests": "to open follow requests list",
|
||||
"keyboard_shortcuts.search": "to focus search",
|
||||
"keyboard_shortcuts.spoilers": "to show/hide CW field",
|
||||
"keyboard_shortcuts.start": "to open \"get started\" column",
|
||||
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
|
||||
@ -257,7 +264,7 @@
|
||||
"lists.subheading": "Your lists",
|
||||
"load_pending": "{count, plural, one {# new item} other {# new items}}",
|
||||
"loading_indicator.label": "Loading...",
|
||||
"media_gallery.toggle_visible": "Hide media",
|
||||
"media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
|
||||
"missing_indicator.label": "Not found",
|
||||
"missing_indicator.sublabel": "This resource could not be found",
|
||||
"mute_modal.hide_notifications": "Hide notifications from this user?",
|
||||
@ -365,15 +372,15 @@
|
||||
"status.cancel_reblog_private": "Unboost",
|
||||
"status.cannot_reblog": "This post cannot be boosted",
|
||||
"status.copy": "Copy link to status",
|
||||
"status.delete": "Delete",
|
||||
"status.detailed_status": "Detailed conversation view",
|
||||
"status.direct": "Direct message @{name}",
|
||||
"status.embed": "Embed",
|
||||
"status.favourite": "Favourite",
|
||||
"status.delete": "മായ്ക്കുക",
|
||||
"status.detailed_status": "വിശദമായ സംഭാഷണ കാഴ്ച",
|
||||
"status.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക",
|
||||
"status.embed": "ഉൾച്ചേർക്കുക",
|
||||
"status.favourite": "പ്രിയപ്പെട്ടത്",
|
||||
"status.filtered": "Filtered",
|
||||
"status.load_more": "Load more",
|
||||
"status.load_more": "കൂടുതൽ ലോഡു ചെയ്യുക",
|
||||
"status.media_hidden": "Media hidden",
|
||||
"status.mention": "Mention @{name}",
|
||||
"status.mention": "@{name} സൂചിപ്പിക്കുക",
|
||||
"status.more": "More",
|
||||
"status.mute": "Mute @{name}",
|
||||
"status.mute_conversation": "Mute conversation",
|
||||
@ -412,20 +419,29 @@
|
||||
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
|
||||
"time_remaining.moments": "Moments remaining",
|
||||
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
|
||||
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
|
||||
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
|
||||
"timeline_hint.resources.followers": "Followers",
|
||||
"timeline_hint.resources.follows": "Follows",
|
||||
"timeline_hint.resources.statuses": "Older toots",
|
||||
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
|
||||
"trends.trending_now": "Trending now",
|
||||
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
|
||||
"units.short.billion": "{count}B",
|
||||
"units.short.million": "{count}M",
|
||||
"units.short.thousand": "{count}K",
|
||||
"upload_area.title": "Drag & drop to upload",
|
||||
"upload_button.label": "Add media ({formats})",
|
||||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_form.audio_description": "Describe for people with hearing loss",
|
||||
"upload_form.description": "Describe for the visually impaired",
|
||||
"upload_form.edit": "Edit",
|
||||
"upload_form.thumbnail": "Change thumbnail",
|
||||
"upload_form.undo": "Delete",
|
||||
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
|
||||
"upload_modal.analyzing_picture": "Analyzing picture…",
|
||||
"upload_modal.apply": "Apply",
|
||||
"upload_modal.choose_image": "Choose image",
|
||||
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
|
||||
"upload_modal.detect_text": "Detect text from picture",
|
||||
"upload_modal.edit_media": "Edit media",
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user