Skip to content

Internationalization #193

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Jul 21, 2025
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
30 changes: 30 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,36 @@ $ npm install
GitHub tokens allow the extension to make authenticated requests, increasing your API rate limit and enabling access to private repositories if you grant those permissions.


## Adding a New Language

You can add a new language to Scrum Helper for your own use, or contribute it to the project.

### Using a New Language Locally

1. **Create a Locale Folder**
- Go to `src/_locales`.
- Create a new folder named with the [ISO language code](https://developer.chrome.com/docs/extensions/reference/i18n/#localeTable) (e.g., `it` for Italian, `fr` for French).

2. **Add a `messages.json` File**
- Copy the `messages.json` from `src/_locales/en/messages.json` or any other language as a template.
- Translate only the `"message"` values into your language.
**Do not translate the extension name ("Scrum Helper") or the footer ("Made with ❤️ by ...").**

3. **Test the Extension**
- Reload the extension in your browser.
- Change your browser or system language to your new locale (see your browser’s language settings).
- The extension will use your translation automatically if your language is set.

> **You do not need to make a pull request to use your language locally.**

### Contributing Your Translation

If you want to share your translation with others:
- Make a pull request with your new locale folder and `messages.json` file.
- We recommend double-checking your translations for accuracy and clarity.

For more details, see the [Chrome i18n documentation](https://developer.chrome.com/docs/extensions/reference/i18n/).

## About contributing

- Follow the Issues and PRs templates as far as possible.
Expand Down
66 changes: 66 additions & 0 deletions src/_locales/de/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
{
"appName": { "message": "Scrum Helper" },
"appDescription": { "message": "Berichten Sie über Ihren Entwicklungsfortschritt, indem Sie Ihre Git-Aktivität für einen ausgewählten Zeitraum automatisch abrufen" },
"disableLabel": { "message": "Deaktivieren" },
"enableLabel": { "message": "Aktivieren" },
"homeButtonTitle": { "message": "Zum Bericht" },
"projectNameLabel": { "message": "Ihr Projektname" },
"projectNamePlaceholder": { "message": "Geben Sie Ihren Projektnamen ein" },
"githubUsernameLabel": { "message": "Ihr GitHub-Benutzername" },
"githubUsernamePlaceholder": { "message": "Erforderlich, um Ihre Beiträge abzurufen" },
"contributionsLabel": { "message": "Ihre Beiträge abrufen für:" },
"last7DaysLabel": { "message": "Letzte 7 Tage" },
"last1DayLabel": { "message": "Gestern" },
"startDateLabel": { "message": "Startdatum:" },
"endDateLabel": { "message": "Enddatum:" },
"showOpenClosedLabel": { "message": "Offen/Geschlossen-Status anzeigen" },
"blockersLabel": { "message": "Was hindert Sie am Fortschritt?" },
"blockersPlaceholder": { "message": "Geben Sie hier den Grund ein" },
"scrumReportLabel": { "message": "Scrum-Bericht" },
"generateReportButton": { "message": "Bericht erstellen" },
"copyReportButton": { "message": "Bericht kopieren" },
"settingsOrgNameLabel": { "message": "Name der Organisation" },
"settingsOrgNamePlaceholder": { "message": "Namen der Organisation eingeben" },
"setButton": { "message": "Festlegen" },
"githubTokenLabel": { "message": "Ihr GitHub-Token" },
"githubTokenPlaceholder": { "message": "Für authentifizierte Anfragen erforderlich" },
"showCommitsLabel": { "message": "Commits in offenen PRs innerhalb des Zeitraums anzeigen" },
"cacheTTLLabel": { "message": "Cache-TTL eingeben" },
"cacheTTLUnit": { "message": "(in Minuten)" },
"cacheTTLPlaceholder": { "message": "Cache-TTL in Minuten (Standard: 10)" },
"refreshDataButton": { "message": "Daten aktualisieren (Cache umgehen)" },
"refreshDataInfo": { "message": "Verwenden Sie diese Schaltfläche, um neue Daten sofort abzurufen." },
"noteTitle": { "message": "Hinweis:" },
"viewCodeButton": { "message": "Code ansehen" },
"reportIssueButton": { "message": "Problem melden" },
"repoFilterLabel": { "message": "Nach Repositories filtern" },
"enableFilteringLabel": { "message": "Filterung aktivieren" },
"tokenRequiredWarning": { "message": "Für die Repository-Filterung ist ein GitHub-Token erforderlich. Bitte fügen Sie einen in den Einstellungen hinzu." },
"repoSearchPlaceholder": { "message": "Repository zum Hinzufügen suchen..." },
"repoPlaceholder": { "message": "Keine Repositories ausgewählt (alle werden einbezogen)" },
"repoCountNone": { "message": "0 Repositories ausgewählt" },
"repoCount": { "message": "$1 Repositories ausgewählt" },
"repoLoading": { "message": "Lade Repositories..." },
"repoLoaded": { "message": "$1 Repositories geladen." },
"repoNotFound": { "message": "Keine Repositories gefunden" },
"repoRefetching": { "message": "Lade Repositories neu..." },
"repoLoadFailed": { "message": "Laden der Repositories fehlgeschlagen." },
"repoTokenPrivate": { "message": "Token ist ungültig oder hat keine Rechte für private Repos." },
"repoRefetchFailed": { "message": "Neuladen der Repositories fehlgeschlagen." },
"orgSetMessage": { "message": "Organisation erfolgreich festgelegt." },
"orgClearedMessage": { "message": "Organisation gelöscht. Klicken Sie auf 'Bericht erstellen', um alle Aktivitäten abzurufen." },
"orgNotFoundMessage": { "message": "Organisation auf GitHub nicht gefunden." },
"orgValidationErrorMessage": { "message": "Fehler bei der Validierung der Organisation." },
"refreshingButton": { "message": "Wird aktualisiert..." },
"cacheClearFailed": { "message": "Cache-Löschung fehlgeschlagen." },
"madeWithLoveBy": { "message": "Made with ❤️ by" },
"generatingButton": { "message": "Wird generiert..." },
"copiedButton": { "message": "Kopiert!" },
"orgChangedMessage": { "message": "Organisation geändert. Klicken Sie auf 'Bericht erstellen', um die GitHub-Aktivitäten abzurufen." },
"cacheClearedMessage": { "message": "Cache erfolgreich geleert. Klicken Sie auf 'Bericht erstellen', um neue Daten abzurufen." },
"cacheClearedButton": { "message": "Cache geleert!" },
"extensionDisabledMessage": { "message": "Erweiterung ist deaktiviert. Aktivieren Sie sie in den Einstellungen, um Scrum-Berichte zu erstellen." },
"notePoint1": { "message": "Die abgerufenen PRs basieren auf der letzten Überprüfung durch einen beliebigen Beitragenden. Wenn Sie einen PR vor 10 Tagen überprüft haben und jemand anderes ihn vor 2 Tagen, wird er trotzdem in Ihrer Aktivität der letzten Woche angezeigt." },
"notePoint2": { "message": "Bitte beachten Sie, dass es im generierten Scrum zu Abweichungen kommen kann. Wir empfehlen, den Bericht vor dem Teilen manuell zu überprüfen, um die Genauigkeit sicherzustellen." },
"noteSeeIssue": { "message": "Siehe dieses Issue" }
}
258 changes: 258 additions & 0 deletions src/_locales/en/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
{
"appName": {
"message": "Scrum Helper",
"description": "The name of the extension."
},
"appDescription": {
"message": "Report your development progress by auto-fetching your Git activity for a selected period",
"description": "A brief description of what the extension does."
},
"disableLabel": {
"message": "Disable",
"description": "Label for the toggle switch to disable the extension."
},
"enableLabel": {
"message": "Enable",
"description": "Label for the toggle switch to enable the extension."
},
"homeButtonTitle": {
"message": "Go to Report",
"description": "Tooltip for the home button."
},
"projectNameLabel": {
"message": "Your Project Name",
"description": "Label for the project name input field."
},
"projectNamePlaceholder": {
"message": "Enter your project name",
"description": "Placeholder text for the project name input."
},
"githubUsernameLabel": {
"message": "Your Github Username",
"description": "Label for the GitHub username input field."
},
"githubUsernamePlaceholder": {
"message": "Required for fetching your contributions",
"description": "Placeholder text for the GitHub username input."
},
"contributionsLabel": {
"message": "Fetch your contributions between:",
"description": "Label for the date range selection."
},
"last7DaysLabel": {
"message": "Last 7 days",
"description": "Radio button option for the last 7 days."
},
"last1DayLabel": {
"message": "Last 1 day",
"description": "Radio button option for the last 1 day."
},
"startDateLabel": {
"message": "Start Date:",
"description": "Label for the start date picker."
},
"endDateLabel": {
"message": "End Date:",
"description": "Label for the end date picker."
},
"showOpenClosedLabel": {
"message": "Show Open/Closed Label",
"description": "Label for the checkbox to show open/closed status on PRs/issues."
},
"blockersLabel": {
"message": "What is blocking you from making progress?",
"description": "Label for the input field for blockers."
},
"blockersPlaceholder": {
"message": "Enter your reason",
"description": "Placeholder text for the blockers input field."
},
"scrumReportLabel": {
"message": "Scrum Report",
"description": "Heading for the generated scrum report."
},
"generateReportButton": {
"message": "Generate Report",
"description": "Text for the 'Generate Report' button."
},
"copyReportButton": {
"message": "Copy Report",
"description": "Text for the 'Copy Report' button."
},
"settingsOrgNameLabel": {
"message": "Organization Name",
"description": "Label for the organization name input in settings."
},
"settingsOrgNamePlaceholder": {
"message": "Enter organization name",
"description": "Placeholder for the organization name input."
},
"setButton": {
"message": "Set",
"description": "Text for the 'Set' button for the organization."
},
"githubTokenLabel": {
"message": "Your Github Token",
"description": "Label for the GitHub token input."
},
"githubTokenPlaceholder": {
"message": "Required for making authenticated requests",
"description": "Placeholder for the GitHub token input."
},
"showCommitsLabel": {
"message": "Show commits made within date range in Open PRs",
"description": "Label for the checkbox to show commits in open PRs."
},
"cacheTTLLabel": {
"message": "Enter cache TTL",
"description": "Label for the cache time-to-live input."
},
"cacheTTLUnit": {
"message": "(in minutes)",
"description": "Unit for the cache TTL."
},
"cacheTTLPlaceholder": {
"message": "Write Cache TTL in minutes (Default 10 minutes)",
"description": "Placeholder for the cache TTL input."
},
"refreshDataButton": {
"message": "Refresh Data (bypass cache)",
"description": "Text for the button to refresh data, ignoring the cache."
},
"refreshDataInfo": {
"message": "Use this button to fetch fresh data immediately.",
"description": "Informational text below the refresh button."
},
"noteTitle": {
"message": "Note:",
"description": "Title for the notes section."
},
"viewCodeButton": {
"message": "View Code",
"description": "Text for the button to view the source code on GitHub."
},
"reportIssueButton": {
"message": "Report Issue",
"description": "Text for the button to report an issue on GitHub."
},
"repoFilterLabel": {
"message": "Filter by repositories",
"description": "Label for the repository filter section."
},
"enableFilteringLabel": {
"message": "Enable filtering",
"description": "Label for the checkbox to enable repository filtering."
},
"tokenRequiredWarning": {
"message": "A GitHub token is required for repository filtering. Please add one in the settings.",
"description": "Warning message shown when repo filtering is enabled without a token."
},
"repoSearchPlaceholder": {
"message": "Search for a repository to add...",
"description": "Placeholder for the repository search input."
},
"repoPlaceholder": {
"message": "No repositories selected (all will be included)",
"description": "Placeholder text when no repositories are selected for filtering."
},
"repoCountNone": {
"message": "0 repositories selected",
"description": "Text showing the count of selected repositories when it's zero."
},
"repoCount": {
"message": "$1 repositories selected",
"description": "Text showing the count of selected repositories. $1 is a placeholder for the number."
},
"repoLoading": {
"message": "Loading repositories...",
"description": "Status message when repositories are being loaded."
},
"repoLoaded": {
"message": "Loaded $1 repositories.",
"description": "Status message after repositories have been successfully loaded. $1 is a placeholder for the number."
},
"repoNotFound": {
"message": "No repositories found",
"description": "Message shown in the dropdown when a search yields no results."
},
"repoRefetching": {
"message": "Refetching repositories...",
"description": "Status message when repositories are being refetched."
},
"repoLoadFailed": {
"message": "Failed to load repositories.",
"description": "Error message when repository loading fails."
},
"repoTokenPrivate": {
"message": "Token is invalid or does not have rights for private repos.",
"description": "Error message when the token is invalid or lacks permissions."
},
"repoRefetchFailed": {
"message": "Failed to refetch repositories.",
"description": "Error message when refetching repositories fails."
},
"orgSetMessage": {
"message": "Organization set successfully.",
"description": "Success toast message when an organization is set."
},
"orgClearedMessage": {
"message": "Organization cleared. Click 'Generate Report' to fetch all activities.",
"description": "Message shown when the organization is cleared."
},
"orgNotFoundMessage": {
"message": "Organization not found on GitHub.",
"description": "Error toast message when an organization is not found."
},
"orgValidationErrorMessage": {
"message": "Error validating organization.",
"description": "Error toast message for general organization validation errors."
},
"refreshingButton": {
"message": "Refreshing...",
"description": "Text on the refresh button while it's in a loading state."
},
"cacheClearFailed": {
"message": "Cache clear failed.",
"description": "Error message when clearing the cache fails."
},
"madeWithLoveBy": {
"message": "Made with ❤️ by",
"description": "Footer credit text."
},
"generatingButton": {
"message": "Generating...",
"description": "Text shown on the generate button when the report is being created."
},
"copiedButton": {
"message": "Copied!",
"description": "Text shown on the copy button after a successful copy."
},
"orgChangedMessage": {
"message": "Organization changed. Click Generate button to fetch the GitHub activities.",
"description": "Message shown in the report area after the organization is changed."
},
"cacheClearedMessage": {
"message": "Cache cleared successfully. Click \"Generate Report\" to fetch fresh data.",
"description": "Message shown in the report area after the cache is cleared."
},
"cacheClearedButton": {
"message": "Cache Cleared!",
"description": "Text on the refresh button after the cache is cleared."
},
"extensionDisabledMessage": {
"message": "Extension is disabled. Enable it from the options to generate scrum reports.",
"description": "Message shown when the extension is disabled."
},
"notePoint1": {
"message": "The PRs fetched are based on the most recent review by any contributor. If you reviewed a PR 10 days ago and someone else reviewed it 2 days ago, it will still appear in your activity for the past week.",
"description": "First point in the notes section."
},
"notePoint2": {
"message": "Please note that some discrepancies may occur in the generated SCRUM. We recommend manually reviewing and editing the report to ensure accuracy before sharing.",
"description": "Second point in the notes section."
},
"noteSeeIssue": {
"message": "See this issue",
"description": "Link text for the GitHub issue in the notes."
}
}
Loading