juliuscc / speak.exchange

An online bilingual dictionary, which also offer a flashcard app geared towards learning new words in a foreign language.
https://speak.exchange/
MIT License
2 stars 0 forks source link

Speak.exchange

speak.exchange is an online bilingual dictionary, which offers the accompanying app speak.repeat, which is a flashcard app geared towards learning new words in a foreign language.

Screenshot of page showing the french translation for exchange

Table of contents - [Features](#features) - [How to setup page](#how-to-setup-page) - [How is our project structured?](#how-is-our-project-structured) - [/components](#components) - [/pages](#pages) - [/utils](#utils) - [Miscellaneous](#miscellaneous) - [Web App Link and Repository Link](#web-app-link-and-repository-link)

Features

Bilingual dictionaries, translators and a plethora of other resources are critical for language learners around the world to improve their linguistic capabilities. These learners often face several obstacles when learning languages; in particular, their tools are often separated from one another, requiring language learners to have open multiple websites, devices or even books available and open at any given time. One essential part of the language learning process is learning vocabulary—these are often learned by language learners through the use of bilingual dictionaries and memorised using flashcards. Bilingual dictionaries like WordReference are a crucial tool that is often the first step towards understanding new words. Flashcards are a popular language learning tool whose utility has proven the success of websites like Quizlet and Memrise, as they empower language learners to retain new words that they learn.

Our application serves to facilitate a language learner's journey in studying a new language by combining these two tools into one website, separated into two apps: speak.exchange and speak.repeat.

speak.exchange

speak.exchange enables users to easily and intuitively find translations of words from English to French and vice versa. If a word exists in both languages, a user can switch between the language direction of their search. Also, if a user cannot easily access special characters that they may need for their search, buttons to input special characters are made available to them to add to their search query.

speak.repeat

speak.repeat provides users a way to retain the new words they have discovered on speak.exchange by saving these words into flashcards, which are collected into decks. A user is able to log in to our app using their Google account, giving them the option to add words that they find on speak.exchange into their own personal decks on speak.repeat. This allows users to save translations that they've already looked up to learn later using flashcards. A user can also peruse decks made by the speak.repeat community; from these decks, they are able to clone these decks to their own personal deck collection as well as practice them as flashcards, which saves users time and effort from creating similar decks that others have already made. If a user makes any mistakes, they can delete cards or even delete entire decks. All decks, whether community or personal, can be searched for through our deck search functionality, and can be sorted by creation date and alphabetical order.

When a user practices a flashcard deck, they are able to flip cards, move back and forth between cards, restart their practice and even switch the direction in which they would like the flashcard faces presented, i.e. from term to definition and vice versa.

This project is a Next.js project bootstrapped with create-next-app.

How to setup page

You can visit speak.exchange for the most current version of the page, or setup the page locally. To setup the page locally you have to have Node.js installed.

Begin by installing all dependencies by running the following command:

npm install

Then build and serve the page by running the following command:

npm run ci-build && npx serve out

The page is now available on localhost:5000, or on the IP-address in the terminal. If your mobile device is connected to the same network you can use the IP-address to visit the page using your mobile device.

User evaluations

We have conducted two user evaluations. One for a prototyped version of the application, and one for a live version of the application. Additionally the application has been peer reviewed. For the results of these three evaluations, and what changes we implemented because of them, see Evaluations.

How is our project structured?

.
├── .github
│   └── workflows
│       └── push.yml
├── components
│   ├── browse-decks
│   │   ├── model
│   │   |   ├── DeckList.js
│   │   |   └── useDeckList.js
│   │   ├── BrowseDecks.js
│   │   ├── DeckBox.js
│   │   ├── DeckSearch.js
│   │   ├── ViewBar.js
│   │   ├── WelcomeRepeat.js
│   │   └── withBrowseDecks.js
│   ├── deck
│   │   ├── model
│   │   |   ├── deck-manager.js
│   │   |   ├── Deck.js
|   |   |   └── useDeckManager.js
│   │   ├── EditDeck.js
│   │   ├── RunDeck.js
│   │   ├── ViewDeck.js
│   │   ├── withDeck.js
│   │   ├── WordCard.js
│   │   └── WordCardEdit.js
│   ├── exchange
│   │   ├── AddToDeckModal.js
│   │   ├── SearchBar.js
│   │   ├── SearchExchange.js
│   │   ├── Translation.js
│   │   ├── useSearchTranslation.js
│   │   └── Welcome.js
│   ├── ui-fragments
│   │   ├── Button.js
│   │   ├── Container.js
│   │   ├── ErrorBox.js
│   │   ├── Input.js
│   │   ├── LoggedInView.js
│   │   ├── LogInButton.js
│   │   ├── Modal.js
│   │   ├── Navbar.js
│   │   ├── Spinner.js
│   │   └── StyledLink.js
│   ├── DeckContextProvider.js
│   ├── DeckListContextProvider.js
│   ├── FireBaseAuthProvider.js
│   ├── Meta.js
│   └── Page.js
├── evaluations
│   ├── Peer Reviews
│   │   ├── Camilla Björn.pdf
│   │   ├── Caroline Larsen.txt
│   │   └── Daniel Levy Trochez.pdf
│   ├── User Evaluations
│   │   ├── Protoype User Evaluation.pdf
│   │   └── Website User Evaluation.pdf
│   └── README.md
├── pages
│   ├── _app.js
│   ├── _document.js
│   ├── all-decks.js
│   ├── edit-deck.js
│   ├── index.js
│   ├── repeat.js
│   ├── run-deck.js
│   └── view-deck.js
├── public
│   ├── android-chrome-192x192.png
│   ├── android-chrome-512x512.png
│   ├── apple-touch-icon.png
│   ├── browserconfig.xml
│   ├── favicon-16x16.png
│   ├── favicon-32x32.png
│   ├── favicon.ico
│   ├── mstile-150x150.png
│   ├── nprogress.css
│   ├── safari-pinned-tab.svg
│   ├── site.webmanifest
│   └── wordcloud.png
├── utils
│   ├── api-config.js
│   ├── debounce.js
│   ├── firebase-config.js
│   ├── screen-sizes.js
│   ├── theme.js
│   └── useToggle.js
├── LICENSE
├── README.md
├── demo-screenshot.png
├── package-lock.json
└── package.json

Components are divided into directories based on functionality. The (components) sub-directories contain both stateless presentational components and their equivalent container components that maintain state and business logic. They also contain custom hooks. In the sub-directory /ui-fragments we place presentational components that are highly reusable. Additionally, there is one directory for our pages (pages), reusable utility functions (utility), and any public assets (public). All other files are non-essential and exist for documentation, package management, ci-configuration, or similar (see Miscellaneous).

/components

This directory is for presentational and container components, as well as hooks.

browse-decks

This directory provides components for browsing decks. Either all decks or only your decks.

browse-decks/model

deck

This directory provides components for viewing and editing specific decks.

deck/model

exchange

This directory provides components for the translation page.

ui-fragments

This directory provides reusable components that are used in many places.

/evaluations

This directory includes both of the user evaluation reports as well as the peer reviews from the mid-project review. The README of the directory summarizes the reports and the reviews as well as clearly explains the changes impelemented based on the feedback from the peer reviews and the user evaluations.

/pages

This directory is where we keep all pages. Next handles routing between them, so that is why you won't find anywhere where they are composed into one. Every file corresponds to a page, and the file name decides what route they are served at.

When a visitor visits /repeat, they will be served repeat.js

_app.js and _document.js contain wrapper components that are used to compose the different pages into one app. Usually, you don't have to add these files as Next handles this, but we want to overwrite them to maintain state between pages, and to server-side render stylesheets.

/utils

Miscellaneous

Web App Link and Repository Link