diff --git a/app/controllers/api/v1/statuses/translations_controller.rb b/app/controllers/api/v1/statuses/translations_controller.rb
index 8cf495f78a..26aed5c7f6 100644
--- a/app/controllers/api/v1/statuses/translations_controller.rb
+++ b/app/controllers/api/v1/statuses/translations_controller.rb
@@ -23,6 +23,6 @@ class Api::V1::Statuses::TranslationsController < Api::V1::Statuses::BaseControl
private
def set_translation
- @translation = TranslateStatusService.new.call(@status, content_locale)
+ @translation = TranslateStatusService.new.call(@status, params[:source_language], content_locale)
end
end
diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js
index c09a3f442c..4b29c15d4d 100644
--- a/app/javascript/mastodon/actions/importer/normalizer.js
+++ b/app/javascript/mastodon/actions/importer/normalizer.js
@@ -101,6 +101,7 @@ export function normalizeStatusTranslation(translation, status) {
const emojiMap = makeEmojiMap(status.get('emojis').toJS());
const normalTranslation = {
+ source_language: translation.source_language,
detected_source_language: translation.detected_source_language,
language: translation.language,
provider: translation.provider,
diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js
index 340cee8024..86f90d8aba 100644
--- a/app/javascript/mastodon/actions/statuses.js
+++ b/app/javascript/mastodon/actions/statuses.js
@@ -333,10 +333,10 @@ export function toggleStatusCollapse(id, isCollapsed) {
};
}
-export const translateStatus = id => (dispatch) => {
+export const translateStatus = (id, source_language) => (dispatch) => {
dispatch(translateStatusRequest(id));
- api().post(`/api/v1/statuses/${id}/translate`).then(response => {
+ api().post(`/api/v1/statuses/${id}/translate`, { source_language }).then(response => {
dispatch(translateStatusSuccess(id, response.data));
}).catch(error => {
dispatch(translateStatusFail(id, error));
diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx
index 7236c9633d..9f5a6dd3a4 100644
--- a/app/javascript/mastodon/components/status.jsx
+++ b/app/javascript/mastodon/components/status.jsx
@@ -106,6 +106,7 @@ class Status extends ImmutablePureComponent {
onToggleHidden: PropTypes.func,
onToggleCollapsed: PropTypes.func,
onTranslate: PropTypes.func,
+ onUndoStatusTranslation: PropTypes.func,
onInteractionModal: PropTypes.func,
muted: PropTypes.bool,
hidden: PropTypes.bool,
@@ -200,8 +201,12 @@ class Status extends ImmutablePureComponent {
this.props.onToggleCollapsed(this._properStatus(), isCollapsed);
};
- handleTranslate = () => {
- this.props.onTranslate(this._properStatus());
+ handleTranslate = (sourceLanguage) => {
+ this.props.onTranslate(this._properStatus(), sourceLanguage);
+ };
+
+ handleUndoStatusTranslation = () => {
+ this.props.onUndoStatusTranslation(this._properStatus());
};
getAttachmentAspectRatio () {
@@ -579,6 +584,7 @@ class Status extends ImmutablePureComponent {
status={status}
onClick={this.handleClick}
onTranslate={this.handleTranslate}
+ onUndoStatusTranslation={this.handleUndoStatusTranslation}
collapsible
onCollapsedToggle={this.handleCollapsedToggle}
{...statusContentProps}
diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx
index 3316be8350..f388a85fe9 100644
--- a/app/javascript/mastodon/components/status_content.jsx
+++ b/app/javascript/mastodon/components/status_content.jsx
@@ -30,32 +30,47 @@ class TranslateButton extends PureComponent {
static propTypes = {
translation: ImmutablePropTypes.map,
- onClick: PropTypes.func,
+ onTranslate: PropTypes.func,
+ onDetectLanguage: PropTypes.func,
+ onUndoStatusTranslation: PropTypes.func,
};
render () {
- const { translation, onClick } = this.props;
+ const { translation, onTranslate, onDetectLanguage, onUndoStatusTranslation } = this.props;
if (translation) {
const language = preloadedLanguages.find(lang => lang[0] === translation.get('detected_source_language'));
const languageName = language ? language[2] : translation.get('detected_source_language');
const provider = translation.get('provider');
+ const languageDetectionButton = onDetectLanguage && (
+ <>
+
+ ยท
+ >
+ );
+
return (
-
+
+ {languageDetectionButton}
+
+
+
);
}
return (
-