diff --git a/app/controllers/api/v1/statuses/translations_controller.rb b/app/controllers/api/v1/statuses/translations_controller.rb
index bd5cd9bb07..3822620061 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, I18n.locale.to_s)
+ @translation = TranslateStatusService.new.call(@status, params[:source_language], I18n.locale.to_s)
end
end
diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js
index 2c583f86d4..bf9cfa5e7b 100644
--- a/app/javascript/mastodon/actions/importer/normalizer.js
+++ b/app/javascript/mastodon/actions/importer/normalizer.js
@@ -109,6 +109,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 42d0c1c0f1..4ae2ac43a6 100644
--- a/app/javascript/mastodon/actions/statuses.js
+++ b/app/javascript/mastodon/actions/statuses.js
@@ -290,10 +290,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 21d596a58c..ca4f04ece1 100644
--- a/app/javascript/mastodon/components/status.jsx
+++ b/app/javascript/mastodon/components/status.jsx
@@ -108,6 +108,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,
@@ -193,8 +194,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 () {
@@ -572,6 +577,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 275fea5f0e..f04e45d866 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[1] : translation.get('detected_source_language');
const provider = translation.get('provider');
+ const languageDetectionButton = onDetectLanguage && (
+ <>
+
+ ยท
+ >
+ );
+
return (
-
+
+ {languageDetectionButton}
+
+
+
);
}
return (
-