Introduction
Maven is a platform that crowdsources translations for educational and academic materials using a Genius-style annotation interface. A user can upload a document which gets partitioned into sections for other users to help translate. Each section can have multiple translations which users may upvote or downvote. In the end, users can choose which translation for each section they want, and export a translation for an entire document.
Motivation
We were particularly moved towards this idea because 2 of the students within our team are international students who volunteer to translate documents and educational materials for students back in their home country.We identified a problem where existing volunteer translation efforts face problems with collaboration and recruiting volunteers for larger projects. We wanted to create an application that would help democratize access to online educational content for non-English speakers. We designed the following solution:
Solution
- A platform for crowdsouring translations for educational and research materials
- The platform would include a Genius-style annotation interface for easy collaboration
- We would rank the accuracy of translations via upvoting and allow users to export compiled translations
Inspiration
The design of our application was inspired by the following:- Genius.com: An interface like this could be used in our app to divide content into annotatable sections, and allow independent translations for each section which can be critiqued or approved by others
- ScienceDirect: We imagined a similar digital catalogue that allows users to filter by different criteria
- Stack Overflow: For quality assurance, we wanted users to be able to rate the quality of translations and sort translations by rating in our app
Implementation
Tech stack: Vue, MongoDB, Express, Mapbox, PiniaWe followed a functional design, as taught in our class, for our software. We outlined our app in terms of core concepts, each with its own operational principle and set of actions and states. Concepts are then synchronized.
Document [User, Tag]
Purpose: Represent an article or a similar document uploaded onto the appOP: A user uploads any online document that they need translated. Then, they can make requests to translate it into a different language.
States
documents: set Document
title: one Document → one string
author: one Document → one string
content: one Document → one string
originalLanguage: one Document → one Tag
uploader: one Document → one User
Action
create(title: string, author: string, content: string, originalLanguage: Tag, uploader: User) → creates a new document, and sets its fields to the appropriate values
delete(document: Document) → deletes the given document
Translation Request [Document, Section, Tag, User]
Purpose : Allows users to take documents published and have them translated.
OP: Users can take documents published and make requests to have them translated. The document then gets divided into sections and each section gets translated separately. After the translation is complete, you can download the finished translation.
States
document: one TranslationRequest → one Document
sections: one TranslationRequest → list Section
languageTo: one TranslationRequest → Tag
requester: one TranslationRequest → one User
Actions
create(document: document, languageTo: Tag, sections: list Section curUser: User) → creates a new request for the given document, language, and sections.
Must be logged in, and sets the requester to be the currently logged-in user.
Section
Purpose: Represents a short but meaningful (3-4 sentences) section of content that can be translated independentlyOP: Uploaded untranslated content is grouped into sections. Then, users can provide translations to each section separately, which allows for easy collaboration.
States:
sections: set Section
sectionText: one Section → one string
Actions
createSingleSection(text: string) → creates a single section from the given text and returns it
splitIntoMultipleSections(text: string) → automatically splits a large text into multiple different sections (each 3-4 sentences long) and returns the sections as a list
SectionTranslation [User, Section]
Purpose: Represents a possible translation of a section in a textOP: Each section in the app can be translated in different ways by different users. Each of these possible translations are then displayed as alternatives.
States
sectionTranslations: set SectionTranslation
translator: one SectionTranslation → one User
translation: one SectionTranslation → one String
translationOf: sectionTranslations → one Section
Actions
createSectionTranslation(section: Section, translator: User, translation: string) → creates a sectionTranslation for a given section
Upvote [Content, User]
Purpose: Allow users to rank contentOP: Signed-in users can upvote content to show they think it is of high quality
States:
upvotes: set Upvote
upvotedContent: one Upvote → one Content
upvotingUser: one Upvote → one User
Actions
upvote (c: Content, u: User)
removeUpvote (c: Content, u: User)
countUpvotes (c: Content)
Our dependency diagram showing which concepts rely on which. We ended up dropping the access control because no other concepts depended on it.
More
What I wish we did
If given more time, my group and I would have liked to explore the possibility of incorporating a LLM to conduct preliminary translations which users can help annotate. We also would have liked to add functionalities of uploading and exporting pdf files to and from the web application as well as allowing for users to comment on translations to further discussions, like on Genius.com.We also wanted to include the "Project Access" concept where access to certain documents are restricted to whoever the person uploading it adds as a translator or viewer.