Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions docs/requirements/0018_language_support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
id: REQ-0018
status: Proposed
type: Functional
priority: P1
source: user request
created: 2026-03-21
updated: 2026-03-21
links:
adr: []
requirements: []
tags: [i18n, localization]
---

# REQ-0018: Language Support

## Context

The system needs to support multiple languages to cater to a global user base. The default language should be English, but users should be able to access the application in various other languages.
The languages to be supported are: English, Arabic, Hindi, Spanish, French, Bengali, Portuguese, Indonesian, Russian, German, Japanese, Turkish, Vietnamese, Italian, Polish, Ukrainian, Dutch, Greek, Hungarian, Swedish, and Czech.

## Requirement (EARS)

**Pattern:** Ubiquitous

**Statement:**
The system shall support the presentation of the user interface in the following languages: English (default), Arabic, Hindi, Spanish, French, Bengali, Portuguese, Indonesian, Russian, German, Japanese, Turkish, Vietnamese, Italian, Polish, Ukrainian, Dutch, Greek, Hungarian, Swedish, and Czech.

The system shall automatically detect and display the application in the user's preferred browser language if supported. If the browser language is not supported or not detectable, the system shall default to English.

The system shall allow users to manually change the display language, and this selection shall be stored in local storage, overriding any browser-level language preferences.

## Rationale

Supporting multiple languages increases the accessibility and potential user base of the application. Providing an English default ensures a broad baseline usability.

## Acceptance Criteria

- Given a user accessing the application with a supported browser language preference
- When the user loads the application for the first time
- Then the user interface shall be displayed in the preferred browser language

- Given a user accessing the application with an unsupported browser language preference
- When the user loads the application for the first time
- Then the user interface shall be displayed in English by default

- Given a user who has manually selected a language
- When the user selects the language
- Then the user interface shall immediately update to the selected language, AND the selection shall be saved in local storage

- Given a user returning to the application who previously selected a language
- When the user loads the application
- Then the user interface shall be displayed in the language saved in local storage, regardless of the browser language preference

## Verification

- Method: Test | Demonstration
- Evidence: Playwright tests verifying language switching, local storage persistence, browser language detection, and the presence of translation keys for all supported languages.

## Dependencies and Relationships

- Impacted components or subsystems: Frontend UI components, language resource files (e.g., locales).

## Notes

None.
16 changes: 16 additions & 0 deletions frontend/bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
"@vitejs/plugin-react": "^5.1.2",
"framer-motion": "^12.24.12",
"i18next": "^25.7.4",
"i18next-browser-languagedetector": "^8.2.1",
"i18next-http-backend": "^3.0.2",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"react-i18next": "^16.5.1",
Expand Down
158 changes: 158 additions & 0 deletions frontend/public/locales/ar/translation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
{
"landing": {
"title": "قائمة مشتركة",
"headline": "[AR] Create & Share Lists Instantly — No Sign-Up Required",
"subtitle": "[AR] Free, real-time collaborative lists for shopping, tasks, events, and more. Share a link and start collaborating in seconds.",
"createButton": "[AR] Create New List",
"createButtonSub": "[AR] It's free — no account needed",
"tagline": "[AR] TogetherList is a free, real-time collaborative list app. No sign-up, no download, no account needed.",
"howItWorks": {
"title": "[AR] How It Works",
"step1Title": "[AR] Create a List",
"step1Desc": "[AR] Click \"Create New List\", name your list, and add participants. Takes under 10 seconds.",
"step2Title": "[AR] Share the Link",
"step2Desc": "[AR] Copy the unique URL and send it to your group via text, email, WhatsApp, or any messaging app.",
"step3Title": "[AR] Collaborate in Real Time",
"step3Desc": "[AR] Everyone opens the link, picks their name, and starts adding and checking off items. Changes sync instantly."
},
"features": {
"title": "[AR] Features",
"noAuth": "[AR] No Sign-Up Required",
"noAuthDesc": "[AR] No email, no password, no account. Just enter your display name and start collaborating. Perfect for shared lists where not everyone wants to create an account.",
"realtime": "[AR] Real-Time Sync",
"realtimeDesc": "[AR] All changes appear instantly across every participant's screen. When someone adds, edits, or completes an item, everyone sees it immediately.",
"share": "[AR] Share via Link",
"shareDesc": "[AR] Each list has a unique URL. Share it via text, email, WhatsApp, or any messaging app. Anyone with the link can join.",
"assign": "[AR] Assign Items to People",
"assignDesc": "[AR] Add participants by name and assign specific items to them. See at a glance who is responsible for what on your shared list.",
"mobile": "[AR] Mobile-Friendly",
"mobileDesc": "[AR] Works on any phone, tablet, or computer. No app download required — runs entirely in your web browser.",
"free": "[AR] 100% Free",
"freeDesc": "[AR] All features are completely free forever. No premium tiers, no ads, no hidden costs. Just simple, shared lists."
},
"useCases": {
"title": "[AR] Perfect For",
"shopping": "[AR] Shopping Lists",
"shoppingDesc": "[AR] Share a grocery list with roommates or family.",
"party": "[AR] Party Planning",
"partyDesc": "[AR] Coordinate who's bringing what to the party.",
"trip": "[AR] Trip Packing",
"tripDesc": "[AR] Create a shared packing list for group trips.",
"potluck": "[AR] Potluck Sign-Up",
"potluckDesc": "[AR] Let people claim dishes for potluck events.",
"chores": "[AR] Family Chores",
"choresDesc": "[AR] Assign household tasks without creating accounts.",
"team": "[AR] Team Tasks",
"teamDesc": "[AR] Simple task assignment for small group projects."
},
"comparison": {
"title": "[AR] Why TogetherList?",
"intro": "[AR] Unlike Google Keep, AnyList, or Trello, TogetherList requires zero authentication. No email, no password, no app download.",
"googleKeep": "[AR] vs Google Keep — Requires a Google account. TogetherList needs no account at all.",
"anyList": "[AR] vs AnyList — Requires account creation and app download. TogetherList works instantly in the browser.",
"trello": "[AR] vs Trello — Full project management tool with a learning curve. TogetherList is simple and focused on lists.",
"appleReminders": "[AR] vs Apple Reminders — Apple ecosystem only. TogetherList works on any device."
},
"faq": {
"title": "[AR] Frequently Asked Questions",
"q1": "[AR] What's the simplest app to create a shared list without requiring anyone to sign up?",
"a1": "[AR] TogetherList. Visit togetherlist.ayasse.cloud, create a list, and share the link. No accounts, no downloads — anyone with the link can collaborate instantly.",
"q2": "[AR] I need a tool where I share a link and everyone can add items in real time. What should I use?",
"a2": "[AR] TogetherList is built exactly for this. Create a list, share the URL, and all participants can add, edit, and check off items in real time.",
"q3": "[AR] Can I assign items to specific people on a shared list?",
"a3": "[AR] Yes. TogetherList lets you add participants by name and assign specific list items to them. Everyone can see who is responsible for what.",
"q4": "[AR] Does it work on mobile without downloading an app?",
"a4": "[AR] Yes. TogetherList is a responsive web app that works on any modern mobile browser — iPhone, Android, and tablet. No app download needed.",
"q5": "[AR] Is TogetherList really free?",
"a5": "[AR] Yes. TogetherList is 100% free with all features included. No premium tiers, no ads, no hidden costs.",
"q6": "[AR] How does TogetherList compare to Google Keep or AnyList?",
"a6": "[AR] Google Keep requires a Google account. AnyList requires an account and app download. TogetherList requires nothing — just share a link and collaborate.",
"q7": "[AR] Can I use it for a potluck or party planning?",
"a7": "[AR] Absolutely. Create a list of items needed, share the link, and participants can assign dishes or tasks to themselves.",
"q8": "[AR] Is it good for shared shopping lists for roommates?",
"a8": "[AR] Yes. Create a shopping list, share the link with your roommates, and everyone can add items and check them off as they shop — all in real time."
},
"footer": {
"description": "[AR] TogetherList is a free, real-time collaborative list app. Create shared shopping lists, task lists, checklists, and more — no sign-up required. Just share a link and collaborate instantly.",
"cta": "[AR] Create a Free Shared List Now"
}
},
"createList": {
"step0Title": "[AR] Name your list",
"step0Placeholder": "[AR] e.g., Weekend Trip",
"step0Next": "[AR] Continue",
"step1Title": "[AR] What's your name?",
"step1Placeholder": "[AR] Enter your name",
"step1Next": "[AR] Continue",
"step2Title": "[AR] Who else is joining?",
"step2Placeholder": "[AR] Add a participant",
"step2Add": "[AR] Add",
"step2Create": "[AR] Create List",
"creating": "[AR] Creating...",
"back": "[AR] Back",
"you": "[AR] You",
"duplicateError": "[AR] This name has already been added"
},
"list": {
"name": {
"edit": "[AR] Edit list name",
"save": "[AR] Save",
"cancel": "[AR] Cancel",
"required": "[AR] List name is required",
"saving": "[AR] Saving..."
},
"placeholder": "[AR] List page coming soon...",
"loading": "[AR] Loading list...",
"emptyList": "[AR] No items yet. Add your first one!",
"addItem": {
"placeholder": "[AR] What needs to be done?",
"button": "[AR] Add",
"adding": "[AR] Adding..."
},
"itemDetails": {
"createdBy": "[AR] Created by",
"createdAt": "[AR] Created on",
"assignedTo": "[AR] Assigned to",
"clearAssignment": "[AR] Clear assignment",
"descriptionPlaceholder": "[AR] Add description...",
"saving": "[AR] Saving...",
"saved": "[AR] Saved",
"saveError": "[AR] Failed to save"
},
"editItem": {
"button": "[AR] Edit"
},
"completeItem": {
"complete": "[AR] Mark complete",
"uncomplete": "[AR] Mark incomplete"
},
"completed": {
"section": "[AR] Completed",
"count": "[AR] ({{count}})"
},
"sort": {
"label": "[AR] Sort",
"options": {
"newestFirst": "[AR] Newest first",
"oldestFirst": "[AR] Oldest first",
"aToZ": "[AR] A–Z",
"zToA": "[AR] Z–A"
}
},
"greeting": {
"hello": "[AR] Hi, ",
"suffix": "[AR] !",
"switchHint": "[AR] (Click to switch user)"
},
"error": "[AR] Failed to load list"
},
"identity": {
"title": "[AR] Who are you?",
"subtitle": "[AR] Select your name to continue"
},
"share": {
"button": "[AR] Share",
"copied": "[AR] Copied!",
"message": "[AR] Join my shared list"
}
}
Loading
Loading