-
-
Notifications
You must be signed in to change notification settings - Fork 17
Translation
SharedMoments includes a built-in Translation Manager - Languages can be added and edited directly from the web interface.
Currently included languages: German and English.
Open the sidebar and select Manage Translations (requires the "Manage Translations" permission).

- Click Create new translation in the Translation Manager
- Enter the language code (e.g.
fr-FR,es-ES,pt-BR) - SharedMoments automatically generates all required translation entries for the new language
All entries start empty and can be filled in using the editor.

- Select a language from the list
- Edit the translated text for each entry
- Changes are saved and applied immediately
Each entry shows the original text and an optional help text for context.
Use the focus mode to translate entries at a time, making it easier to work through large translation sets.

Some strings contain placeholders in curly braces (e.g. {name}) that get replaced with real values at runtime. These must be kept exactly as-is — only the surrounding text should be translated. The order of variables can be changed to fit the grammar of your language.
These strings are displayed in the banner on the home screen.
| String | Available variables |
|---|---|
banner_text_anniversary |
{relationship_status}, {years_count}, {months_count}, {days_count}, {diffInMonthsTotal}, {diffInWeeksTotal}, {diffInDays}
|
banner_text_engaged |
same as above + {anniversary_date}
|
banner_text_wedding |
{relationship_status}, {years_count}, {months_count}, {days_count}, {diffInMonthsTotal}, {diffInWeeksTotal}, {diffInDays}
|
banner_text_family |
{years_count}, {months_count}, {days_count}, {diffInMonthsTotal}, {diffInWeeksTotal}, {diffInDays}
|
banner_text_friends |
{years_count}, {months_count}, {days_count}, {diffInMonthsTotal}, {diffInWeeksTotal}, {diffInDays}
|
| Variable | Description | Example |
|---|---|---|
{relationship_status} |
The relationship status label | together, married, engaged |
{years_count} |
Full years as a phrase | 3 years |
{months_count} |
Remaining months as a phrase | 2 months |
{days_count} |
Remaining days as a phrase | 14 days |
{diffInMonthsTotal} |
Total months (number only) | 38 |
{diffInWeeksTotal} |
Total weeks (number only) | 167 |
{diffInDays} |
Total days (number only) | 1169 |
{anniversary_date} |
The anniversary date (formatted) | 01.06.2022 |
Example:
English source:
We have been {relationship_status} for {years_count}, {months_count}, and {days_count}.
German translation:
Wir sind seit {years_count}, {months_count} und {days_count} {relationship_status}.
These strings are used in reminder notifications and the reminder list.
| String | Available variables | Description |
|---|---|---|
Birthday of {name} |
{name} |
Name of the person whose birthday it is |
{n}-Year Milestone |
{n} |
Number of years for the milestone |
{n}-Day Milestone |
{n} |
Number of days for the milestone |
Countdown: {title} |
{title} |
Title of the countdown |
Countdown "{title}" reached! |
{title} |
Title of the countdown that was reached |
Today is {title}! |
{title} |
Title of the reminder |
{title} in 1 day |
{title} |
Title of the reminder |
{title} in {days} days |
{title}, {days}
|
Title and number of days until the reminder |
{title} is on {date} |
{title}, {date}
|
Title and date of the reminder |
Once you've finished translating, you can test your work and contribute it back to the project:
- Go to User Settings and change your language to the one you just translated
- Browse the app to verify everything looks correct
- When you're happy with the result, go back to the Translation Manager and click Export to download your translation as a JSON file
- Head over to the SharedMoments GitHub repository and create a Pull Request with your translation file
Your contribution will be reviewed and included in a future release for everyone to use.
Scans the codebase for all translatable texts (marked with _()) and loads them into the English language as base entries.
Takes all newly added English base entries and distributes them to every other language. This creates empty translation entries so translators can fill them in.
Resets a language back to its default state by reloading from the built-in JSON files. This overwrites all manual edits for that language.
Getting Started
Features
Upgrading