diff --git a/hypha/apply/funds/forms.py b/hypha/apply/funds/forms.py index 5ddeeb000e..2fc2c4601c 100644 --- a/hypha/apply/funds/forms.py +++ b/hypha/apply/funds/forms.py @@ -377,6 +377,20 @@ def submissions_cant_have_external_reviewers(self, submissions): return False +class TranslateSubmissionForm(forms.Form): + from_lang = forms.ChoiceField(choices=[]) + to_lang = forms.ChoiceField(choices=[]) + + def is_valid(self) -> bool: + self.cleaned_data = self.data + # TODO: WA fix logic to actually validate the form + return True + + def clean(self): + self.cleaned_data = self.data + return self.cleaned_data + + def make_role_reviewer_fields(): role_fields = [] staff_reviewers = User.objects.staff().only("full_name", "pk") diff --git a/hypha/apply/funds/services.py b/hypha/apply/funds/services.py index 8d372e28b2..e3138d4624 100644 --- a/hypha/apply/funds/services.py +++ b/hypha/apply/funds/services.py @@ -1,3 +1,6 @@ +import re + +from bs4 import BeautifulSoup from django.apps import apps from django.conf import settings from django.core.exceptions import PermissionDenied @@ -20,6 +23,7 @@ from hypha.apply.funds.models.assigned_reviewers import AssignedReviewers from hypha.apply.funds.workflow import INITIAL_STATE from hypha.apply.review.options import DISAGREE, MAYBE +from hypha.apply.translate.translate import translate def bulk_archive_submissions( @@ -260,3 +264,55 @@ def annotate_review_recommendation_and_count(submissions: QuerySet) -> QuerySet: ), ) return submissions + + +def translate_submission_form_data( + submission, from_code: str, to_code: str +) -> dict | None: + """Translate the content of an application's `form_data` + + Args: + submission: the submission to translate + from_code: the ISO 639 code of the original language + to_code: the ISO 639 code of the language to translate to + + Returns: + The `form_data` with values translated if succcessful, otherwise `None` + + Raises: + ValueError if an invalid `from_code` or `to_code` is requested + + """ + + translated_form_data = {} + + form_data = submission.live_revision.form_data + + for key in form_data: + # Only translate content fields or the title - don't with name, email, etc. + if key == "title": + translated_form_data[key] = translate(form_data[key], from_code, to_code) + elif key == "title" or re.match( + r"([a-z]|\d){8}(-([a-z]|\d){4}){3}-([a-z]|\d){12}", key + ): + field_html = BeautifulSoup(form_data[key], "html.parser") + if field_html.find(): + text_fields = [ + field + for field in field_html.findAll(["span", "p", "strong", "td"]) + if field.find(string=True, recursive=False) + ] + for field in text_fields: + if field.string: + field["lang"] = to_code + field.string = translate(field.string, from_code, to_code) + + translated_form_data[key] = str(field_html) + else: + translated_form_data[key] = translate( + form_data[key], from_code, to_code + ) + else: + translated_form_data[key] = form_data[key] + + return translated_form_data diff --git a/hypha/apply/funds/templates/funds/applicationsubmission_admin_detail.html b/hypha/apply/funds/templates/funds/applicationsubmission_admin_detail.html index 9716487011..651e42eca2 100644 --- a/hypha/apply/funds/templates/funds/applicationsubmission_admin_detail.html +++ b/hypha/apply/funds/templates/funds/applicationsubmission_admin_detail.html @@ -98,4 +98,5 @@