Compare commits

...

17 Commits

Author SHA1 Message Date
Thomas Steiner
85980ac92e
Merge 7217edfd7f into 9a2be25199 2025-09-05 09:07:27 +00:00
Claire
9a2be25199
Fix missing beforeUnload confirmation when a quote post is being authored (#36034) 2025-09-05 08:51:49 +00:00
Claire
279405f2a7
Fix incorrect change of unlisted source strings (#36033) 2025-09-05 08:34:14 +00:00
Claire
497bfbc483
Fix source string for visibility dropdown hint (#36031) 2025-09-05 08:14:34 +00:00
github-actions[bot]
dd6bd681ea
New Crowdin Translations (automated) (#36029)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-05 08:14:25 +00:00
Claire
0d93801bde
Fix missing beforeUnload confirmation when a poll is being authored (#36030) 2025-09-05 08:07:59 +00:00
Thomas Steiner
7217edfd7f
Merge branch 'main' into translate-toots 2025-08-21 18:25:18 +02:00
Thomas Steiner
43f9ae9ee4
Merge branch 'main' into translate-toots 2025-08-20 09:50:56 +02:00
Thomas Steiner
e3a69530a7
Merge branch 'main' into translate-toots 2025-08-08 01:50:59 +02:00
Thomas Steiner
25309b92ad
Merge branch 'main' into translate-toots 2025-07-23 22:26:39 +05:30
Thomas Steiner
1f3e5b9324 Also allow private and direct statuses to be translated 2025-07-18 15:06:04 +02:00
Thomas Steiner
941e86e902
Merge branch 'main' into translate-toots 2025-07-18 14:34:47 +02:00
Thomas Steiner
7bdbf0c25b
Merge branch 'main' into translate-toots 2025-07-17 18:02:56 +02:00
Thomas Steiner
f2a151805f
Merge branch 'mastodon:main' into translate-toots 2025-07-14 13:43:44 +02:00
Thomas Steiner
46e3c18071 Make supported translate language detection dynamic 2025-06-30 11:10:27 +02:00
Thomas Steiner
6c38ab5b6b Make translate undo work 2025-06-22 13:14:45 +02:00
Thomas Steiner
5e50840986 Translation works, undo still doesn't 2025-06-22 12:54:42 +02:00
24 changed files with 212 additions and 39 deletions

View File

@ -10,6 +10,8 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
import { translateStatusSuccess } from 'mastodon/actions/statuses';
import { undoStatusTranslation } from 'mastodon/actions/statuses';
import { Icon } from 'mastodon/components/icon';
import { Poll } from 'mastodon/components/poll';
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
@ -19,6 +21,8 @@ import { isModernEmojiEnabled } from '../utils/environment';
const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top)
const supportsTranslator = 'Translator' in globalThis;
/**
*
* @param {any} status
@ -69,10 +73,18 @@ class TranslateButton extends PureComponent {
}
const mapStateToProps = state => ({
languages: state.getIn(['server', 'translationLanguages', 'items']),
languages: supportsTranslator ? new Map() : state.getIn(['server', 'translationLanguages', 'items']),
});
class StatusContent extends PureComponent {
constructor(props) {
super(props);
this.state = {
showTranslateButton: false,
};
}
static propTypes = {
identity: identityContextPropShape,
status: ImmutablePropTypes.map.isRequired,
@ -176,8 +188,36 @@ class StatusContent extends PureComponent {
}
};
componentDidMount () {
async componentDidMount () {
this._updateStatusLinks();
const { status, intl, languages } = this.props;
const contentLocale = intl.locale.replace(/[_-].*/, '');
const targetLanguages = languages?.get(status.get('language') || 'und');
// The Translator API translates all locally on the client, so private and direct toots are fine to translate.
const allowedVisibilities = supportsTranslator ? ['public', 'unlisted', 'private', 'direct'] : ['public', 'unlisted'];
const shouldAttemptTranslate =
this.props.onTranslate &&
this.props.identity.signedIn &&
allowedVisibilities.includes(status.get('visibility')) &&
status.get('search_index').trim().length > 0;
if (!shouldAttemptTranslate) return;
let available = false;
if (supportsTranslator) {
available = (await Translator.availability({
sourceLanguage: status.get('language'),
targetLanguage: contentLocale,
})) !== 'unavailable';
} else {
available = targetLanguages?.includes(contentLocale);
}
if (available) {
this.setState({ showTranslateButton: true });
}
}
componentDidUpdate () {
@ -227,8 +267,37 @@ class StatusContent extends PureComponent {
this.startXY = null;
};
handleTranslate = () => {
this.props.onTranslate();
handleTranslate = async () => {
if (!supportsTranslator) {
this.props.onTranslate();
return;
}
const { intl, status, statusContent } = this.props;
if (status.get('translation')) {
this.props.dispatch(undoStatusTranslation(status.get('id'), status.get('poll')));
return;
}
const sourceLanguage = status.get('language');
const targetLanguage = intl.locale.replace(/[_-].*/, '');
try {
const translator = await Translator.create({
sourceLanguage,
targetLanguage,
});
const translatedText = await translator.translate(statusContent);
const translation = {
content: translatedText,
provider: 'Translator API',
detected_source_language: sourceLanguage,
language: targetLanguage,
};
this.props.dispatch(translateStatusSuccess(status.get('id'), translation));
} catch (error) {
console.error(error);
}
};
setRef = (c) => {
@ -236,12 +305,9 @@ class StatusContent extends PureComponent {
};
render () {
const { status, intl, statusContent } = this.props;
const { status, statusContent } = this.props;
const renderReadMore = this.props.onClick && status.get('collapsed');
const contentLocale = intl.locale.replace(/[_-].*/, '');
const targetLanguages = this.props.languages?.get(status.get('language') || 'und');
const renderTranslate = this.props.onTranslate && this.props.identity.signedIn && ['public', 'unlisted'].includes(status.get('visibility')) && status.get('search_index').trim().length > 0 && targetLanguages?.includes(contentLocale);
const content = statusContent ?? getStatusContent(status);
const language = status.getIn(['translation', 'language']) || status.get('language');
@ -256,7 +322,7 @@ class StatusContent extends PureComponent {
</button>
);
const translateButton = renderTranslate && (
const translateButton = this.state.showTranslateButton && (
<TranslateButton onClick={this.handleTranslate} translation={status.get('translation')} />
);
@ -297,8 +363,7 @@ class StatusContent extends PureComponent {
</div>
);
}
}
};
}
export default withRouter(withIdentity(connect(mapStateToProps)(injectIntl(StatusContent))));

View File

@ -92,8 +92,7 @@ const messages = defineMessages({
const mapStateToProps = state => ({
layout: state.getIn(['meta', 'layout']),
isComposing: state.getIn(['compose', 'is_composing']),
hasComposingText: state.getIn(['compose', 'text']).trim().length !== 0,
hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0,
hasComposingContents: state.getIn(['compose', 'text']).trim().length !== 0 || state.getIn(['compose', 'media_attachments']).size > 0 || state.getIn(['compose', 'poll']) !== null || state.getIn(['compose', 'quoted_status_id']) !== null,
canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < state.getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments']),
firstLaunch: state.getIn(['settings', 'introductionVersion'], 0) < INTRODUCTION_VERSION,
newAccount: !state.getIn(['accounts', me, 'note']) && !state.getIn(['accounts', me, 'bot']) && state.getIn(['accounts', me, 'following_count'], 0) === 0 && state.getIn(['accounts', me, 'statuses_count'], 0) === 0,
@ -241,8 +240,7 @@ class UI extends PureComponent {
dispatch: PropTypes.func.isRequired,
children: PropTypes.node,
isComposing: PropTypes.bool,
hasComposingText: PropTypes.bool,
hasMediaAttachments: PropTypes.bool,
hasComposingContents: PropTypes.bool,
canUploadMore: PropTypes.bool,
intl: PropTypes.object.isRequired,
layout: PropTypes.string.isRequired,
@ -257,11 +255,11 @@ class UI extends PureComponent {
};
handleBeforeUnload = e => {
const { intl, dispatch, isComposing, hasComposingText, hasMediaAttachments } = this.props;
const { intl, dispatch, isComposing, hasComposingContents } = this.props;
dispatch(synchronouslySubmitMarkers());
if (isComposing && (hasComposingText || hasMediaAttachments)) {
if (isComposing && hasComposingContents) {
e.preventDefault();
// Setting returnValue to any string causes confirmation dialog.
// Many browsers no longer display this text to users,

View File

@ -29,6 +29,8 @@
"account.endorse": "Lakaat war-wel war ar profil",
"account.familiar_followers_one": "Heuilhet gant {name1}",
"account.familiar_followers_two": "Heuilhet gant {name1} ha {name2}",
"account.featured.accounts": "Profiloù",
"account.featured.hashtags": "Gerioù-klik",
"account.featured_tags.last_status_at": "Toud diwezhañ : {date}",
"account.featured_tags.last_status_never": "Embannadur ebet",
"account.follow": "Heuliañ",
@ -39,6 +41,7 @@
"account.followers_you_know_counter": "{counter} a anavezit",
"account.following": "Koumanantoù",
"account.follows.empty": "An implijer·ez-mañ na heul den ebet.",
"account.follows_you": "Ho heuilh",
"account.go_to_profile": "Gwelet ar profil",
"account.hide_reblogs": "Kuzh skignadennoù gant @{name}",
"account.in_memoriam": "E koun.",
@ -89,7 +92,10 @@
"alt_text_modal.done": "Graet",
"announcement.announcement": "Kemennad",
"annual_report.summary.followers.followers": "heulier",
"annual_report.summary.followers.total": "{count} en holl",
"annual_report.summary.highlighted_post.possessive": "{name}",
"annual_report.summary.most_used_app.most_used_app": "arload muiañ implijet",
"annual_report.summary.most_used_hashtag.most_used_hashtag": "ar gerioù-klik implijet ar muiañ",
"annual_report.summary.most_used_hashtag.none": "Hini ebet",
"annual_report.summary.new_posts.new_posts": "toudoù nevez",
"attachments_list.unprocessed": "(ket meret)",
@ -149,7 +155,7 @@
"compose.saved.body": "Enrollet.",
"compose_form.direct_message_warning_learn_more": "Gouzout hiroc'h",
"compose_form.encryption_warning": "Toudoù war Mastodon na vezont ket sifret penn-da-benn. Na rannit ket titouroù kizidik dre Mastodon.",
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.hashtag_warning": "Ne vo ket listennet an toud-mañ dindan gerioù-klik ebet dre m'eo anlistennet. N'eus nemet an toudoù foran a c'hall bezañ klasket dre c'her-klik.",
"compose_form.lock_disclaimer": "N'eo ket {locked} ho kont. An holl a c'hal ho heuliañ evit gwelet ho toudoù prevez.",
"compose_form.lock_disclaimer.lock": "prennet",
"compose_form.placeholder": "Petra emaoc'h o soñjal e-barzh ?",
@ -168,6 +174,7 @@
"confirmations.block.confirm": "Stankañ",
"confirmations.delete.confirm": "Dilemel",
"confirmations.delete.message": "Ha sur oc'h e fell deoc'h dilemel an toud-mañ ?",
"confirmations.delete.title": "Dilemel an toud?",
"confirmations.delete_list.confirm": "Dilemel",
"confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?",
"confirmations.delete_list.title": "Dilemel al listenn?",
@ -176,10 +183,14 @@
"confirmations.follow_to_list.title": "Heuliañ an implijer·ez?",
"confirmations.logout.confirm": "Digevreañ",
"confirmations.logout.message": "Ha sur oc'h e fell deoc'h digevreañ ?",
"confirmations.logout.title": "Digevreañ?",
"confirmations.mute.confirm": "Kuzhat",
"confirmations.redraft.confirm": "Diverkañ ha skrivañ en-dro",
"confirmations.unfollow.confirm": "Diheuliañ",
"confirmations.unfollow.message": "Ha sur oc'h e fell deoc'h paouez da heuliañ {name} ?",
"confirmations.unfollow.title": "Paouez da heuliañ an implijer·ez?",
"content_warning.hide": "Kuzhat an embannadur",
"content_warning.show": "Diskwel memes tra",
"content_warning.show_more": "Diskouez muioc'h",
"conversation.delete": "Dilemel ar gaozeadenn",
"conversation.mark_as_read": "Merkañ evel lennet",
@ -224,8 +235,8 @@
"empty_column.domain_blocks": "N'eus domani kuzh ebet c'hoazh.",
"empty_column.explore_statuses": "N'eus tuadur ebet evit c'hoazh. Distroit diwezhatoc'h !",
"empty_column.follow_requests": "N'ho peus reked heuliañ ebet c'hoazh. Pa vo resevet unan e teuio war wel amañ.",
"empty_column.followed_tags": "N'emaoc'h oc'h heuliañ hashtag ebet evit poent. Pa vioc'h e vo d'o gwelet amañ.",
"empty_column.hashtag": "N'eus netra en hashtag-mañ c'hoazh.",
"empty_column.followed_tags": "N'emaoc'h oc'h heuliañ ger-klik ebet evit poent. Pa vioc'h e vo d'o gwelet amañ.",
"empty_column.hashtag": "N'eus netra er ger-klik-mañ c'hoazh.",
"empty_column.home": "Goullo eo ho red-amzer degemer! Kit da weladenniñ {public} pe implijit ar c'hlask evit kregiñ ganti ha kejañ gant implijer·ien·ezed all.",
"empty_column.list": "Goullo eo al listenn-mañ evit c'hoazh. Pa vo embannet toudoù nevez gant e izili e teuint war wel amañ.",
"empty_column.mutes": "N'ho peus kuzhet implijer ebet c'hoazh.",
@ -241,7 +252,7 @@
"explore.title": "Diouzh ar c'hiz",
"explore.trending_links": "Keleier",
"explore.trending_statuses": "Embannadurioù",
"explore.trending_tags": "Hashtagoù",
"explore.trending_tags": "Gerioù-klik",
"featured_carousel.next": "War-raok",
"featured_carousel.post": "Embannadenn",
"featured_carousel.previous": "War-gil",
@ -269,7 +280,8 @@
"follow_suggestions.friends_of_friends_longer": "Diouzh ar c'hiz e-touez an dud heuliet ganeoc'h",
"follow_suggestions.popular_suggestion_longer": "Diouzh ar c'hiz war {domain}",
"follow_suggestions.view_all": "Gwelet pep tra",
"followed_tags": "Hashtagoù o heuliañ",
"follow_suggestions.who_to_follow": "Piv heuliañ",
"followed_tags": "Gerioù-klik o heuliañ",
"footer.about": "Diwar-benn",
"footer.directory": "Kavlec'h ar profiloù",
"footer.get_app": "Pellgargañ an arload",
@ -281,19 +293,23 @@
"generic.saved": "Enrollet",
"getting_started.heading": "Loc'hañ",
"hashtag.admin_moderation": "Digeriñ an etrefas evezhiañ evit #{name}",
"hashtag.browse": "Furchal dre an toudoù gant #{hashtag}",
"hashtag.browse_from_account": "Furchal dre an toudoù gant @{name} gant #{hashtag}",
"hashtag.column_header.tag_mode.all": "ha(g) {additional}",
"hashtag.column_header.tag_mode.any": "pe {additional}",
"hashtag.column_header.tag_mode.none": "hep {additional}",
"hashtag.column_settings.select.no_options_message": "N'eus bet kavet ali ebet",
"hashtag.column_settings.select.placeholder": "Ouzhpennañ hashtagoù…",
"hashtag.column_settings.select.placeholder": "Ouzhpennañ geri-klik…",
"hashtag.column_settings.tag_mode.all": "An holl anezho",
"hashtag.column_settings.tag_mode.any": "Unan e mesk anezho",
"hashtag.column_settings.tag_mode.none": "Hini ebet anezho",
"hashtag.column_settings.tag_toggle": "Endelc'her gerioù-alc'hwez ouzhpenn evit ar bannad-mañ",
"hashtag.counter_by_uses": "{count, plural, one {{counter} embannadur} other {{counter} embannadur}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} embannadur} other {{counter} embannadur}} hiziv",
"hashtag.feature": "Lakaat war-wel war ar profil",
"hashtag.follow": "Heuliañ ar ger-klik",
"hashtag.unfollow": "Paouez heuliañ an hashtag",
"hashtag.mute": "Kuzhat #{hashtag}",
"hashtag.unfollow": "Diheuliañ ar ger-klik",
"hashtags.and_other": "…{count, plural, one {hag # all} other {ha # all}}",
"home.column_settings.show_quotes": "Diskouez an arroudennoù",
"home.column_settings.show_reblogs": "Diskouez ar skignadennoù",
@ -302,12 +318,14 @@
"home.pending_critical_update.body": "Hizivait ho servijer Mastodon kerkent ha ma c'hallit mar plij!",
"home.pending_critical_update.link": "Gwelet an hizivadennoù",
"home.show_announcements": "Diskouez ar c'hemennoù",
"interaction_modal.go": "Mont di",
"interaction_modal.on_another_server": "War ur servijer all",
"interaction_modal.on_this_server": "War ar servijer-mañ",
"interaction_modal.title.favourite": "Ouzhpennañ embannadur {name} d'ar re vuiañ-karet",
"interaction_modal.title.follow": "Heuliañ {name}",
"interaction_modal.title.reblog": "Skignañ toud {name}",
"interaction_modal.title.reply": "Respont da doud {name}",
"interaction_modal.username_prompt": "D.s. {example}",
"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ù}}",
@ -345,12 +363,14 @@
"keyboard_shortcuts.toot": "Kregiñ gant un toud nevez",
"keyboard_shortcuts.unfocus": "Difokus an dachenn testenn/klask",
"keyboard_shortcuts.up": "Pignat er roll",
"learn_more_link.got_it": "Mat eo",
"lightbox.close": "Serriñ",
"lightbox.next": "Da-heul",
"lightbox.previous": "A-raok",
"limited_account_hint.action": "Diskouez an aelad memes tra",
"limited_account_hint.action": "Diskouez ar profil memes tra",
"limited_account_hint.title": "Kuzhet eo bet ar profil-mañ gant an evezhierien eus {domain}.",
"link_preview.author": "Gant {name}",
"link_preview.more_from_author": "Muioc'h gant {name}",
"lists.add_member": "Ouzhpennañ",
"lists.add_to_list": "Ouzhpennañ d'al listenn",
"lists.create": "Krouiñ",
@ -359,13 +379,19 @@
"lists.done": "Graet",
"lists.edit": "Kemmañ al listenn",
"lists.list_name": "Anv al listenn",
"lists.new_list_name": "Anv nevez al listenn",
"lists.no_lists_yet": "Listenn ebet c'hoazh.",
"lists.replies_policy.followed": "Pep implijer.ez heuliet",
"lists.replies_policy.list": "Izili ar roll",
"lists.replies_policy.none": "Den ebet",
"lists.save": "Enrollañ",
"lists.search": "Klask",
"load_pending": "{count, plural, one {# dra nevez} other {# dra nevez}}",
"loading_indicator.label": "O kargañ…",
"media_gallery.hide": "Kuzhat",
"navigation_bar.about": "Diwar-benn",
"navigation_bar.account_settings": "Ger-tremen ha surentez",
"navigation_bar.administration": "Merañ",
"navigation_bar.automated_deletion": "Dilemel an embannadenn ent-emgefreek",
"navigation_bar.blocks": "Implijer·ezed·ien berzet",
"navigation_bar.bookmarks": "Sinedoù",
@ -374,11 +400,12 @@
"navigation_bar.favourites": "Muiañ-karet",
"navigation_bar.filters": "Gerioù kuzhet",
"navigation_bar.follow_requests": "Pedadoù heuliañ",
"navigation_bar.followed_tags": "Hashtagoù o heuliañ",
"navigation_bar.followed_tags": "Gerioù-klik o heuliañ",
"navigation_bar.follows_and_followers": "Heuliadennoù ha heulier·ezed·ien",
"navigation_bar.import_export": "Enporzhiañ hag ezporzhiañ",
"navigation_bar.lists": "Listennoù",
"navigation_bar.logout": "Digennaskañ",
"navigation_bar.moderation": "Habaskadur",
"navigation_bar.more": "Muioc'h",
"navigation_bar.mutes": "Implijer·ion·ezed kuzhet",
"navigation_bar.preferences": "Gwellvezioù",
@ -391,6 +418,8 @@
"notification.follow.name_and_others": "{name} <a>{count, plural, one {hag # den all} two {ha # zen all} few {ha # den all} many {ha # den all} other {ha # den all}}</a> zo o heuliañ ac'hanoc'h",
"notification.follow_request": "Gant {name} eo bet goulennet ho heuliañ",
"notification.label.reply": "Respont",
"notification.mention": "Meneg",
"notification.mentioned_you": "Gant {name} oc'h bet meneget",
"notification.moderation-warning.learn_more": "Gouzout hiroc'h",
"notification.own_poll": "Echu eo ho sontadeg",
"notification.reblog": "Gant {name} eo bet skignet ho toud",
@ -447,7 +476,7 @@
"onboarding.profile.display_name": "Anv diskouezet",
"onboarding.profile.display_name_hint": "Hoc'h anv klok pe hoc'h anv fentus…",
"onboarding.profile.note": "Berr-ha-berr",
"onboarding.profile.note_hint": "Gallout a rit @menegiñ tud all pe #hashtagoù…",
"onboarding.profile.note_hint": "Gallout a rit @menegiñ tud all pe #geri-klik…",
"onboarding.profile.save_and_continue": "Enrollañ ha kenderc'hel",
"onboarding.profile.upload_avatar": "Enporzhiañ ur skeudenn profil",
"password_confirmation.mismatching": "Disheñvel eo an daou c'her-termen-se",
@ -480,6 +509,7 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}eil",
"relative_time.today": "hiziv",
"remove_quote_hint.button_label": "Mat eo",
"reply_indicator.cancel": "Nullañ",
"reply_indicator.poll": "Sontadeg",
"report.block": "Stankañ",
@ -528,7 +558,7 @@
"search.placeholder": "Klask",
"search.quick_action.account_search": "Profiloù a glot gant {x}",
"search.quick_action.go_to_account": "Mont d'ar profil {x}",
"search.quick_action.go_to_hashtag": "Mont d'an hashtag {x}",
"search.quick_action.go_to_hashtag": "Mont d'ar ger-klik {x}",
"search.quick_action.open_url": "Digeriñ an URL e-barzh Mastodon",
"search.quick_action.status_search": "Embannadurioù a glot gant {x}",
"search.search_or_paste": "Klask pe pegañ un URL",
@ -541,7 +571,7 @@
"search_popout.user": "implijer·ez",
"search_results.accounts": "Profiloù",
"search_results.all": "Pep tra",
"search_results.hashtags": "Hashtagoù",
"search_results.hashtags": "Gerioù-klik",
"search_results.no_results": "Disoc'h ebet.",
"search_results.see_all": "Gwelet pep tra",
"search_results.statuses": "Toudoù",
@ -607,6 +637,7 @@
"subscribed_languages.save": "Enrollañ ar cheñchamantoù",
"subscribed_languages.target": "Cheñch ar yezhoù koumanantet evit {target}",
"tabs_bar.home": "Degemer",
"tabs_bar.menu": "Lañser",
"tabs_bar.notifications": "Kemennoù",
"tabs_bar.publish": "Embannadenn nevez",
"tabs_bar.search": "Klask",
@ -638,6 +669,8 @@
"video.hide": "Kuzhat ar video",
"video.pause": "Paouez",
"video.play": "Lenn",
"visibility_modal.privacy_label": "Gwelusted",
"visibility_modal.quote_followers": "Tud koumanantet hepken",
"visibility_modal.quote_public": "Pep den"
"visibility_modal.quote_public": "Pep den",
"visibility_modal.save": "Enrollañ"
}

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "dnes",
"remove_quote_hint.button_label": "Chápu",
"remove_quote_hint.message": "Můžete to udělat z {icon} nabídky možností.",
"remove_quote_hint.title": "Chcete odstranit citovaný příspěvek?",
"reply_indicator.attachments": "{count, plural, one {{counter} příloha} few {{counter} přílohy} other {{counter} příloh}}",
"reply_indicator.cancel": "Zrušit",
"reply_indicator.poll": "Anketa",
@ -863,6 +866,7 @@
"status.block": "Blokovat @{name}",
"status.bookmark": "Přidat do záložek",
"status.cancel_reblog_private": "Zrušit boostnutí",
"status.cannot_quote": "Citování je na tomo příspěvku zakázáno",
"status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
"status.context.load_new_replies": "K dispozici jsou nové odpovědi",
"status.context.loading": "Hledání dalších odpovědí",
@ -988,6 +992,7 @@
"visibility_modal.header": "Viditelnost a interakce",
"visibility_modal.helper.direct_quoting": "Soukromé zmínky, které jsou vytvořeny na Mastodonu, nemohou být citovány ostatními.",
"visibility_modal.helper.privacy_editing": "Publikované příspěvky nemohou změnit svou viditelnost.",
"visibility_modal.helper.privacy_private_self_quote": "Citace vlastních soukromých příspěvků nelze zveřejnit.",
"visibility_modal.helper.private_quoting": "Příspěvky pouze pro sledující, které jsou vytvořeny na Mastodonu, nemohou být citovány ostatními.",
"visibility_modal.helper.unlisted_quoting": "Když vás lidé citují, jejich příspěvek bude v časové ose populárních příspěvků také skryt.",
"visibility_modal.instructions": "Nastavte, kdo bude moci interagovat s tímto příspěvkem. Tyto nastavení též můžete změnit pro všechny budoucí příspěvky v <link>Nastavení > Výchozí nastavení příspěvků</link>.",

View File

@ -768,6 +768,7 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "i dag",
"remove_quote_hint.button_label": "Forstået",
"reply_indicator.attachments": "{count, plural, one {# vedhæftning} other {# vedhæftninger}}",
"reply_indicator.cancel": "Afbryd",
"reply_indicator.poll": "Afstemning",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} Min.",
"relative_time.seconds": "{number} Sek.",
"relative_time.today": "heute",
"remove_quote_hint.button_label": "Verstanden",
"remove_quote_hint.message": "Klicke dafür im Beitrag auf „{icon} Mehr“.",
"remove_quote_hint.title": "Möchtest du aus dem zitierten Beitrag entfernt werden?",
"reply_indicator.attachments": "{count, plural, one {# Anhang} other {# Anhänge}}",
"reply_indicator.cancel": "Abbrechen",
"reply_indicator.poll": "Umfrage",

View File

@ -991,7 +991,7 @@
"visibility_modal.button_title": "Set visibility",
"visibility_modal.header": "Visibility and interaction",
"visibility_modal.helper.direct_quoting": "Private mentions authored on Mastodon can't be quoted by others.",
"visibility_modal.helper.privacy_editing": "Published posts cannot change their visibility.",
"visibility_modal.helper.privacy_editing": "Visibility can't be changed after a post is published.",
"visibility_modal.helper.privacy_private_self_quote": "Self-quotes of private posts cannot be made public.",
"visibility_modal.helper.private_quoting": "Follower-only posts authored on Mastodon can't be quoted by others.",
"visibility_modal.helper.unlisted_quoting": "When people quote you, their post will also be hidden from trending timelines.",

View File

@ -30,6 +30,8 @@
"account.edit_profile": "Redakti la profilon",
"account.enable_notifications": "Sciigu min kiam @{name} afiŝos",
"account.endorse": "Montri en profilo",
"account.familiar_followers_one": "Sekvita de {name1}",
"account.familiar_followers_two": "Sekvita de {name1} kaj {name2}",
"account.featured": "Montrita",
"account.featured.accounts": "Profiloj",
"account.featured.hashtags": "Kradvortoj",
@ -305,6 +307,7 @@
"emoji_button.search_results": "Serĉaj rezultoj",
"emoji_button.symbols": "Simboloj",
"emoji_button.travel": "Vojaĝoj kaj lokoj",
"empty_column.account_featured.me": "Vi ankoraŭ nenion prezentis. Ĉu vi sciis, ke vi povas prezenti viajn plej ofte uzatajn kradvortojn, kaj eĉ la kontojn de viaj amikoj sur via profilo?",
"empty_column.account_featured_other.unknown": "Ĉi tiu konto ankoraŭ ne montris ion ajn.",
"empty_column.account_hides_collections": "Ĉi tiu uzanto elektis ne disponebligi ĉi tiu informon",
"empty_column.account_suspended": "Konto suspendita",
@ -338,6 +341,7 @@
"explore.trending_links": "Novaĵoj",
"explore.trending_statuses": "Afiŝoj",
"explore.trending_tags": "Kradvortoj",
"featured_carousel.header": "{count, plural, one {Alpinglita afiŝo} other {Alpinglitaj afiŝoj}}",
"featured_carousel.next": "Antaŭen",
"featured_carousel.post": "Afiŝi",
"featured_carousel.previous": "Malantaŭen",
@ -751,6 +755,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hodiaŭ",
"remove_quote_hint.button_label": "Komprenite",
"remove_quote_hint.message": "Vi povas fari tion el la menuo de opcioj {icon}.",
"remove_quote_hint.title": "Ĉu vi volas forigi vian cititan afiŝon?",
"reply_indicator.attachments": "{count, plural, one {# aldonaĵo} other {# aldonaĵoj}}",
"reply_indicator.cancel": "Nuligi",
"reply_indicator.poll": "Balotenketo",
@ -846,6 +853,7 @@
"status.block": "Bloki @{name}",
"status.bookmark": "Aldoni al la legosignoj",
"status.cancel_reblog_private": "Ne plu diskonigi",
"status.cannot_quote": "Citaĵoj estas malebligitaj en ĉi tiu afiŝo",
"status.cannot_reblog": "Ĉi tiun afiŝon ne eblas diskonigi",
"status.context.load_new_replies": "Disponeblaj novaj respondoj",
"status.context.loading": "Serĉante pliajn respondojn",
@ -971,6 +979,7 @@
"visibility_modal.helper.privacy_editing": "Publikigitaj afiŝoj ne povas ŝanĝi sian videblon.",
"visibility_modal.helper.private_quoting": "Afiŝoj nur por sekvantoj verkitaj ĉe Mastodon ne povas esti cititaj de aliaj.",
"visibility_modal.helper.unlisted_quoting": "Kiam homoj citas vin, ilia afiŝo ankaŭ estos kaŝita de tendencaj templinioj.",
"visibility_modal.privacy_label": "Videbleco",
"visibility_modal.quote_followers": "Nur sekvantoj",
"visibility_modal.quote_label": "Kiu povas citi",
"visibility_modal.quote_nobody": "Nur mi",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hoy",
"remove_quote_hint.button_label": "Entendido",
"remove_quote_hint.message": "Podés hacerlo desde el menú de opciones {icon}.",
"remove_quote_hint.title": "¿Querés eliminar tu mensaje citado?",
"reply_indicator.attachments": "{count, plural,one {# adjunto} other {# adjuntos}}",
"reply_indicator.cancel": "Cancelar",
"reply_indicator.poll": "Encuesta",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "hoy",
"remove_quote_hint.button_label": "Entendido",
"remove_quote_hint.message": "Puedes hacerlo desde el menú de opciones {icon}.",
"remove_quote_hint.title": "¿Quieres eliminar tu publicación citada?",
"reply_indicator.attachments": "{count, plural, one {# adjunto} other {# adjuntos}}",
"reply_indicator.cancel": "Cancelar",
"reply_indicator.poll": "Encuesta",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "hoy",
"remove_quote_hint.button_label": "Entendido",
"remove_quote_hint.message": "Puedes hacerlo desde el menú de opciones {icon}.",
"remove_quote_hint.title": "¿Quieres eliminar tu publicación citada?",
"reply_indicator.attachments": "{count, plural, one {# adjunto} other {# adjuntos}}",
"reply_indicator.cancel": "Cancelar",
"reply_indicator.poll": "Encuesta",

View File

@ -863,6 +863,7 @@
"status.block": "Blokeeri @{name}",
"status.bookmark": "Järjehoidja",
"status.cancel_reblog_private": "Lõpeta jagamine",
"status.cannot_quote": "Selle postituse tsiteerimine pole lubatud",
"status.cannot_reblog": "Seda postitust ei saa jagada",
"status.context.load_new_replies": "Leidub uusi vastuseid",
"status.context.loading": "Kontrollin täiendavate vastuste olemasolu",
@ -988,9 +989,13 @@
"visibility_modal.header": "Nähtavus ja kasutus",
"visibility_modal.helper.direct_quoting": "Ainult mainituile mõeldud Mastodoni postitusi ei saa teiste poolt tsiteerida.",
"visibility_modal.helper.privacy_editing": "Avaldatud postitused ei saa muuta oma nähtavust.",
"visibility_modal.helper.privacy_private_self_quote": "Privaatsete postituste tsiteerimist oma enda poolt pole võimalik teha avalikuks.",
"visibility_modal.helper.private_quoting": "Ainult jälgijatele mõeldud Mastodoni postitusi ei saa teiste poolt tsiteerida.",
"visibility_modal.helper.unlisted_quoting": "Kui teised kasutajad sind tsiteerivad, siis nende postitused peidetakse ajajoonelt, mis näitavad populaarsust koguvaid postitusi.",
"visibility_modal.instructions": "Halda seda, kes võivad antud postitusega suhestuda. Lisaks võid kõikide tulevaste postituste seadistusi muuta valikust <link>Eelistused > Postituse vaikeseadistused</link>.",
"visibility_modal.privacy_label": "Nähtavus",
"visibility_modal.quote_followers": "Ainult jälgijad",
"visibility_modal.quote_label": "Kes võivad tsiteerida",
"visibility_modal.quote_nobody": "Ainult mina",
"visibility_modal.quote_public": "Kõik",
"visibility_modal.save": "Salvesta"

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} min",
"relative_time.seconds": "{number} s",
"relative_time.today": "tänään",
"remove_quote_hint.button_label": "Selvä",
"remove_quote_hint.message": "Voit tehdä sen {icon}-valikosta.",
"remove_quote_hint.title": "Haluatko poistaa lainatun julkaisusi?",
"reply_indicator.attachments": "{count, plural, one {# liite} other {# liitettä}}",
"reply_indicator.cancel": "Peruuta",
"reply_indicator.poll": "Äänestys",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hoxe",
"remove_quote_hint.button_label": "Entendido",
"remove_quote_hint.message": "Pódelo facer desde o {icon} menú de opcións.",
"remove_quote_hint.title": "Queres eliminar a publicación citada?",
"reply_indicator.attachments": "{count, plural, one {# adxunto} other {# adxuntos}}",
"reply_indicator.cancel": "Desbotar",
"reply_indicator.poll": "Enquisa",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} דקות",
"relative_time.seconds": "{number} שניות",
"relative_time.today": "היום",
"remove_quote_hint.button_label": "הבנתי",
"remove_quote_hint.message": "ניתן לעשות זאת מתפריט האפשרויות {icon}",
"remove_quote_hint.title": "להסיר את ההודעה המצוטטת?",
"reply_indicator.attachments": "{count, plural,one {# קובץ מצורף}other {# קבצים מצורפים}}",
"reply_indicator.cancel": "ביטול",
"reply_indicator.poll": "משאל",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number}mín",
"relative_time.seconds": "{number}sek",
"relative_time.today": "í dag",
"remove_quote_hint.button_label": "Náði því",
"remove_quote_hint.message": "Þú getur gert það úr {icon} valmyndinni.",
"remove_quote_hint.title": "Viltu fjarlægja tilvitnuðu færsluna þína?",
"reply_indicator.attachments": "{count, plural, one {# viðhengi} other {# viðhengi}}",
"reply_indicator.cancel": "Hætta við",
"reply_indicator.poll": "Könnun",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "vandaag",
"remove_quote_hint.button_label": "Begrepen",
"remove_quote_hint.message": "Je kunt dit doen vanuit het {icon} optiesmenu.",
"remove_quote_hint.title": "Wil je jouw geciteerd bericht verwijderen?",
"reply_indicator.attachments": "{count, plural, one {# bijlage} other {# bijlagen}}",
"reply_indicator.cancel": "Annuleren",
"reply_indicator.poll": "Peiling",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} phút",
"relative_time.seconds": "{number}s",
"relative_time.today": "hôm nay",
"remove_quote_hint.button_label": "Đã hiểu",
"remove_quote_hint.message": "Bạn cũng có thể làm trong menu tùy chọn {icon}",
"remove_quote_hint.title": "Gỡ tút mà bạn đã trích dẫn?",
"reply_indicator.attachments": "{count, plural, other {# tập tin đính kèm}}",
"reply_indicator.cancel": "Hủy bỏ",
"reply_indicator.poll": "Vốt",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} 分钟前",
"relative_time.seconds": "{number} 秒前",
"relative_time.today": "今天",
"remove_quote_hint.button_label": "明白了",
"remove_quote_hint.message": "你可以通过 {icon} 选项菜单进行此操作。",
"remove_quote_hint.title": "是否需要删除你的引用嘟文?",
"reply_indicator.attachments": "{count, plural, other {# 个附件}}",
"reply_indicator.cancel": "取消",
"reply_indicator.poll": "投票",

View File

@ -768,6 +768,9 @@
"relative_time.minutes": "{number} 分鐘前",
"relative_time.seconds": "{number} 秒",
"relative_time.today": "今天",
"remove_quote_hint.button_label": "了解",
"remove_quote_hint.message": "您能自 {icon} 選單完成此操作。",
"remove_quote_hint.title": "是否想要移除您的引用嘟文?",
"reply_indicator.attachments": "{count, plural, other {# 個附加檔案}}",
"reply_indicator.cancel": "取消",
"reply_indicator.poll": "投票",

View File

@ -63,6 +63,7 @@ br:
all: Pep tra
local: Lec'hel
remote: A-bell
title: Lec'hiadur
media_attachments: Restroù media stag
moderation:
active: Oberiant
@ -180,6 +181,7 @@ br:
name: Anv
registrations:
confirm: Kadarnaat
save: Enrollañ
status: Statud
follow_recommendations:
status: Statud
@ -260,6 +262,7 @@ br:
title: Disklêriadennoù
unresolved: Andiskoulmet
updated_at: Nevesaet
view_profile: Gwelet ar profil
roles:
categories:
devops: DevOps
@ -287,6 +290,7 @@ br:
danger_zone: Takad dañjer
discovery:
privacy: Buhez prevez
profile_directory: Kavlec'h ar profiloù
title: Dizoloadur
trends: Luskadoù
domain_blocks:
@ -310,6 +314,10 @@ br:
strikes:
actions:
delete_statuses: Dilamet eo bet toudoù %{target} gant %{name}
tags:
title: Gerioù-klik
terms_of_service:
save_draft: Enrollañ ar brouilhed
trends:
allow: Aotren
approved: Aprouet
@ -324,7 +332,7 @@ br:
dashboard:
tag_uses_measure: implijoù hollek
not_usable: N'haller ket en implijout
title: Hashtagoù diouzh ar c'hiz
title: Gerioù-klik diouzh ar c'hiz
warning_presets:
add_new: Ouzhpenniñ unan nevez
delete: Dilemel
@ -342,7 +350,7 @@ br:
none: ur c'hemenn diwall
new_trends:
new_trending_tags:
title: Hashtagoù diouzh ar c'hiz
title: Gerioù-klik diouzh ar c'hiz
appearance:
discovery: Dizoloadur
localization:
@ -350,6 +358,7 @@ br:
guide_link: https://crowdin.com/project/mastodon
application_mailer:
view: 'Sellet :'
view_profile: Gwelet ar profil
view_status: Gwelet ar c'hannad
auth:
delete_account: Dilemel ar gont
@ -396,6 +405,8 @@ br:
created_at: Deiziad
title_actions:
none: Diwall
edit_profile:
other: All
emoji_styles:
auto: Emgefreek
twemoji: Twemoji
@ -422,6 +433,8 @@ br:
other: "%{count} a gannadoù"
two: "%{count} gannad"
title: Siloù
new:
save: Enrollañ ar sil nevez
statuses:
index:
title: Toudoù silet
@ -547,7 +560,7 @@ br:
back: Distreiñ da vMastodon
development: Diorren
edit_profile: Kemmañ ar profil
featured_tags: Hashtagoù pennañ
featured_tags: Gerioù-klik pennañ
import: Enporzhiañ
import_and_export: Enporzhiañ hag ezporzhiañ
preferences: Gwellvezioù
@ -609,6 +622,9 @@ br:
edit_profile_title: Personelaat ho profil
feature_action: Gouzout hiroc'h
follow_action: Heuliañ
hashtags_title: Gerioù-klik diouzh ar c'hiz
hashtags_view_more: Gwelet muioc'h a c'herioù-klik diouzh ar c'hiz
share_title: Rannit ho kont Mastodon
sign_in_action: Kevreañ
subject: Donemat e Mastodon
title: Degemer mat e bourzh, %{name}!

View File

@ -1894,6 +1894,9 @@ cy:
self_vote: Nid oes modd i chi bleidleisio yn eich polau eich hun
too_few_options: rhaid cael mwy nag un eitem
too_many_options: ni all gynnwys mwy na %{max} eitem
vote: Pleidleisio
posting_defaults:
explanation: Bydd y gosodiadau hyn yn cael eu defnyddio fel rhagosodiadau pan fyddwch chi'n creu postiadau newydd, ond gallwch chi eu golygu fesul postiad o fewn y cyfansoddwr.
preferences:
other: Arall
posting_defaults: Rhagosodiadau postio

View File

@ -367,7 +367,7 @@ en:
title: Custom emojis
uncategorized: Uncategorized
unlist: Unlist
unlisted: Quiet public
unlisted: Unlisted
update_failed_msg: Could not update that emoji
updated_msg: Emoji successfully updated!
upload: Upload
@ -1923,7 +1923,7 @@ en:
private_long: Only show to followers
public: Public
public_long: Anyone on and off Mastodon
unlisted: Unlisted
unlisted: Quiet public
unlisted_long: Hidden from Mastodon search results, trending, and public timelines
statuses_cleanup:
enabled: Automatically delete old posts

View File

@ -2,6 +2,8 @@
br:
simple_form:
hints:
account:
note: 'Gallout a rit @menegiñ tud all pe #gerioù-klik.'
defaults:
avatar: WEBP, PNG, GIF pe JPG. Bihanoc'h eget %{size}. A vo izelaet betek %{dimensions}px
header: WEBP, PNG, GIF pe JPG. Bihanoc'h eget %{size}. A vo izelaet betek %{dimensions}px
@ -56,7 +58,7 @@ br:
username: Anv
whole_word: Ger a-bezh
featured_tag:
name: Hashtag
name: Ger-klik
invite:
comment: Evezhiadenn
invite_request:
@ -71,8 +73,8 @@ br:
hint: Titouroù ouzhpenn
text: Reolenn
tag:
name: Hashtag
trendable: Aotren an hashtag-mañ da zont war wel dindan tuadurioù
name: Ger-klik
trendable: Aotren ar ger-klik-mañ da zont war wel dindan tuadurioù
user:
role: Roll
time_zone: Gwerzhid eur