diff --git a/README.md b/README.md index a91c33e..ba76659 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json new file mode 100644 index 0000000..ecde6ac --- /dev/null +++ b/src/_locales/de/messages.json @@ -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" } +} diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json new file mode 100644 index 0000000..148e822 --- /dev/null +++ b/src/_locales/en/messages.json @@ -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." + } +} \ No newline at end of file diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json new file mode 100644 index 0000000..eb52d6b --- /dev/null +++ b/src/_locales/es/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "Informe sobre su progreso de desarrollo obteniendo automáticamente su actividad de Git para un período seleccionado." }, + "disableLabel": { "message": "Desactivar" }, + "enableLabel": { "message": "Activar" }, + "homeButtonTitle": { "message": "Ir al informe" }, + "projectNameLabel": { "message": "Nombre de su proyecto" }, + "projectNamePlaceholder": { "message": "Ingrese el nombre de su proyecto" }, + "githubUsernameLabel": { "message": "Su nombre de usuario de GitHub" }, + "githubUsernamePlaceholder": { "message": "Requerido para obtener sus contribuciones" }, + "contributionsLabel": { "message": "Obtener sus contribuciones de:" }, + "last7DaysLabel": { "message": "Últimos 7 días" }, + "last1DayLabel": { "message": "Ayer" }, + "startDateLabel": { "message": "Fecha de inicio:" }, + "endDateLabel": { "message": "Fecha de fin:" }, + "showOpenClosedLabel": { "message": "Mostrar estado Abierto/Cerrado" }, + "blockersLabel": { "message": "¿Qué le impide progresar?" }, + "blockersPlaceholder": { "message": "Ingrese su motivo" }, + "scrumReportLabel": { "message": "Informe de Scrum" }, + "generateReportButton": { "message": "Generar informe" }, + "copyReportButton": { "message": "Copiar informe" }, + "settingsOrgNameLabel": { "message": "Nombre de la organización" }, + "settingsOrgNamePlaceholder": { "message": "Ingrese el nombre de la organización" }, + "setButton": { "message": "Establecer" }, + "githubTokenLabel": { "message": "Su token de GitHub" }, + "githubTokenPlaceholder": { "message": "Requerido para realizar solicitudes autenticadas" }, + "showCommitsLabel": { "message": "Mostrar commits en PRs abiertos dentro del rango de fechas" }, + "cacheTTLLabel": { "message": "Ingresar TTL del caché" }, + "cacheTTLUnit": { "message": "(en minutos)" }, + "cacheTTLPlaceholder": { "message": "Escriba el TTL del caché en minutos (Predeterminado: 10)" }, + "refreshDataButton": { "message": "Actualizar datos (omitir caché)" }, + "refreshDataInfo": { "message": "Use este botón para obtener datos nuevos inmediatamente." }, + "noteTitle": { "message": "Nota:" }, + "viewCodeButton": { "message": "Ver código" }, + "reportIssueButton": { "message": "Reportar un problema" }, + "repoFilterLabel": { "message": "Filtrar por repositorios" }, + "enableFilteringLabel": { "message": "Activar filtrado" }, + "tokenRequiredWarning": { "message": "Se requiere un token de GitHub para filtrar repositorios. Por favor, agregue uno en la configuración." }, + "repoSearchPlaceholder": { "message": "Buscar un repositorio para agregar..." }, + "repoPlaceholder": { "message": "No hay repositorios seleccionados (se incluirán todos)" }, + "repoCountNone": { "message": "0 repositorios seleccionados" }, + "repoCount": { "message": "$1 repositorios seleccionados" }, + "repoLoading": { "message": "Cargando repositorios..." }, + "repoLoaded": { "message": "$1 repositorios cargados." }, + "repoNotFound": { "message": "No se encontraron repositorios" }, + "repoRefetching": { "message": "Recargando repositorios..." }, + "repoLoadFailed": { "message": "Error al cargar los repositorios." }, + "repoTokenPrivate": { "message": "El token no es válido o no tiene derechos para repositorios privados." }, + "repoRefetchFailed": { "message": "Error al recargar los repositorios." }, + "orgSetMessage": { "message": "Organización establecida correctamente." }, + "orgClearedMessage": { "message": "Organización eliminada. Haga clic en 'Generar informe' para obtener todas las actividades." }, + "orgNotFoundMessage": { "message": "Organización no encontrada en GitHub." }, + "orgValidationErrorMessage": { "message": "Error al validar la organización." }, + "refreshingButton": { "message": "Actualizando..." }, + "cacheClearFailed": { "message": "Error al borrar el caché." }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "Generando..." }, + "copiedButton": { "message": "¡Copiado!" }, + "orgChangedMessage": { "message": "Organización cambiada. Haga clic en 'Generar informe' para obtener las actividades de GitHub." }, + "cacheClearedMessage": { "message": "Caché borrado con éxito. Haga clic en 'Generar informe' para obtener datos nuevos." }, + "cacheClearedButton": { "message": "¡Caché borrado!" }, + "extensionDisabledMessage": { "message": "La extensión está desactivada. Actívela desde los ajustes para generar informes de scrum." }, + "notePoint1": { "message": "Los PRs se obtienen según la revisión más reciente de cualquier contribuyente. Si revisó un PR hace 10 días y otra persona lo hizo hace 2 días, seguirá apareciendo en su actividad de la última semana." }, + "notePoint2": { "message": "Tenga en cuenta que pueden ocurrir algunas discrepancias en el Scrum generado. Recomendamos revisar y editar manualmente el informe para garantizar la precisión antes de compartirlo." }, + "noteSeeIssue": { "message": "Ver este issue" } +} diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json new file mode 100644 index 0000000..4e0e680 --- /dev/null +++ b/src/_locales/fr/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "Rendez compte de votre progression en récupérant automatiquement votre activité Git pour une période sélectionnée." }, + "disableLabel": { "message": "Désactiver" }, + "enableLabel": { "message": "Activer" }, + "homeButtonTitle": { "message": "Aller au rapport" }, + "projectNameLabel": { "message": "Nom de votre projet" }, + "projectNamePlaceholder": { "message": "Entrez le nom de votre projet" }, + "githubUsernameLabel": { "message": "Votre nom d'utilisateur GitHub" }, + "githubUsernamePlaceholder": { "message": "Requis pour récupérer vos contributions" }, + "contributionsLabel": { "message": "Récupérer vos contributions de :" }, + "last7DaysLabel": { "message": "7 derniers jours" }, + "last1DayLabel": { "message": "Hier" }, + "startDateLabel": { "message": "Date de début :" }, + "endDateLabel": { "message": "Date de fin :" }, + "showOpenClosedLabel": { "message": "Afficher le statut Ouvert/Fermé" }, + "blockersLabel": { "message": "Qu'est-ce qui vous empêche de progresser ?" }, + "blockersPlaceholder": { "message": "Entrez votre raison" }, + "scrumReportLabel": { "message": "Rapport Scrum" }, + "generateReportButton": { "message": "Générer le rapport" }, + "copyReportButton": { "message": "Copier le rapport" }, + "settingsOrgNameLabel": { "message": "Nom de l'organisation" }, + "settingsOrgNamePlaceholder": { "message": "Entrez le nom de l'organisation" }, + "setButton": { "message": "Définir" }, + "githubTokenLabel": { "message": "Votre jeton GitHub" }, + "githubTokenPlaceholder": { "message": "Requis pour les requêtes authentifiées" }, + "showCommitsLabel": { "message": "Afficher les commits dans les PR ouverts pour la période sélectionnée" }, + "cacheTTLLabel": { "message": "Entrer le TTL du cache" }, + "cacheTTLUnit": { "message": "(en minutes)" }, + "cacheTTLPlaceholder": { "message": "Entrez le TTL du cache en minutes (Défaut : 10)" }, + "refreshDataButton": { "message": "Actualiser les données (ignorer le cache)" }, + "refreshDataInfo": { "message": "Utilisez ce bouton pour récupérer des données fraîches immédiatement." }, + "noteTitle": { "message": "Note :" }, + "viewCodeButton": { "message": "Voir le code" }, + "reportIssueButton": { "message": "Signaler un problème" }, + "repoFilterLabel": { "message": "Filtrer par dépôts" }, + "enableFilteringLabel": { "message": "Activer le filtrage" }, + "tokenRequiredWarning": { "message": "Un jeton GitHub est requis pour filtrer les dépôts. Veuillez en ajouter un dans les paramètres." }, + "repoSearchPlaceholder": { "message": "Rechercher un dépôt à ajouter..." }, + "repoPlaceholder": { "message": "Aucun dépôt sélectionné (tous seront inclus)" }, + "repoCountNone": { "message": "0 dépôts sélectionnés" }, + "repoCount": { "message": "$1 dépôts sélectionnés" }, + "repoLoading": { "message": "Chargement des dépôts..." }, + "repoLoaded": { "message": "$1 dépôts chargés." }, + "repoNotFound": { "message": "Aucun dépôt trouvé" }, + "repoRefetching": { "message": "Rechargement des dépôts..." }, + "repoLoadFailed": { "message": "Échec du chargement des dépôts." }, + "repoTokenPrivate": { "message": "Le jeton est invalide ou n'a pas les droits pour les dépôts privés." }, + "repoRefetchFailed": { "message": "Échec du rechargement des dépôts." }, + "orgSetMessage": { "message": "Organisation définie avec succès." }, + "orgClearedMessage": { "message": "Organisation effacée. Cliquez sur 'Générer le rapport' pour récupérer toutes les activités." }, + "orgNotFoundMessage": { "message": "Organisation non trouvée sur GitHub." }, + "orgValidationErrorMessage": { "message": "Erreur lors de la validation de l'organisation." }, + "refreshingButton": { "message": "Actualisation..." }, + "cacheClearFailed": { "message": "Échec de la suppression du cache." }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "Génération..." }, + "copiedButton": { "message": "Copié !" }, + "orgChangedMessage": { "message": "Organisation modifiée. Cliquez sur 'Générer le rapport' pour récupérer les activités GitHub." }, + "cacheClearedMessage": { "message": "Cache vidé avec succès. Cliquez sur 'Générer le rapport' pour récupérer des données fraîches." }, + "cacheClearedButton": { "message": "Cache vidé !" }, + "extensionDisabledMessage": { "message": "L'extension est désactivée. Activez-la depuis les paramètres pour générer des rapports Scrum." }, + "notePoint1": { "message": "Les PR récupérés sont basés sur la révision la plus récente de n'importe quel contributeur. Si vous avez révisé un PR il y a 10 jours et qu'un autre l'a fait il y a 2 jours, il apparaîtra toujours dans votre activité de la semaine passée." }, + "notePoint2": { "message": "Veuillez noter que des divergences peuvent survenir dans le Scrum généré. Nous recommandons de réviser et de modifier manuellement le rapport pour garantir son exactitude avant de le partager." }, + "noteSeeIssue": { "message": "Voir ce ticket" } +} diff --git a/src/_locales/hi/messages.json b/src/_locales/hi/messages.json new file mode 100644 index 0000000..cace02e --- /dev/null +++ b/src/_locales/hi/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "एक चयनित अवधि के लिए अपनी Git गतिविधि को स्वतः प्राप्त करके अपनी विकास प्रगति की रिपोर्ट करें।" }, + "disableLabel": { "message": "अक्षम करें" }, + "enableLabel": { "message": "सक्षम करें" }, + "homeButtonTitle": { "message": "रिपोर्ट पर जाएं" }, + "projectNameLabel": { "message": "आपकी परियोजना का नाम" }, + "projectNamePlaceholder": { "message": "अपनी परियोजना का नाम दर्ज करें" }, + "githubUsernameLabel": { "message": "आपका GitHub उपयोगकर्ता नाम" }, + "githubUsernamePlaceholder": { "message": "आपके योगदान प्राप्त करने के लिए आवश्यक" }, + "contributionsLabel": { "message": "इस अवधि के योगदान प्राप्त करें:" }, + "last7DaysLabel": { "message": "पिछले 7 दिन" }, + "last1DayLabel": { "message": "कल" }, + "startDateLabel": { "message": "प्रारंभ तिथि:" }, + "endDateLabel": { "message": "अंतिम तिथि:" }, + "showOpenClosedLabel": { "message": "खुला/बंद स्थिति दिखाएं" }, + "blockersLabel": { "message": "आपको प्रगति करने से क्या रोक रहा है?" }, + "blockersPlaceholder": { "message": "अपना कारण दर्ज करें" }, + "scrumReportLabel": { "message": "स्क्रम रिपोर्ट" }, + "generateReportButton": { "message": "रिपोर्ट बनाएं" }, + "copyReportButton": { "message": "रिपोर्ट कॉपी करें" }, + "settingsOrgNameLabel": { "message": "संगठन का नाम" }, + "settingsOrgNamePlaceholder": { "message": "संगठन का नाम दर्ज करें" }, + "setButton": { "message": "सेट करें" }, + "githubTokenLabel": { "message": "आपका GitHub टोकन" }, + "githubTokenPlaceholder": { "message": "प्रमाणित अनुरोधों के लिए आवश्यक" }, + "showCommitsLabel": { "message": "चयनित अवधि में खुले PRs में किए गए कमिट दिखाएं" }, + "cacheTTLLabel": { "message": "कैश TTL दर्ज करें" }, + "cacheTTLUnit": { "message": "(मिनटों में)" }, + "cacheTTLPlaceholder": { "message": "कैश TTL मिनटों में लिखें (डिफ़ॉल्ट: 10)" }, + "refreshDataButton": { "message": "डेटा रीफ्रेश करें (कैश को बायपास करें)" }, + "refreshDataInfo": { "message": "ताज़ा डेटा तुरंत प्राप्त करने के लिए इस बटन का उपयोग करें।" }, + "noteTitle": { "message": "ध्यान दें:" }, + "viewCodeButton": { "message": "कोड देखें" }, + "reportIssueButton": { "message": "समस्या की रिपोर्ट करें" }, + "repoFilterLabel": { "message": "रिपॉजिटरी द्वारा फ़िल्टर करें" }, + "enableFilteringLabel": { "message": "फ़िल्टरिंग सक्षम करें" }, + "tokenRequiredWarning": { "message": "रिपॉजिटरी फ़िल्टरिंग के लिए एक GitHub टोकन आवश्यक है। कृपया सेटिंग्स में एक जोड़ें।" }, + "repoSearchPlaceholder": { "message": "जोड़ने के लिए एक रिपॉजिटरी खोजें..." }, + "repoPlaceholder": { "message": "कोई रिपॉजिटरी चयनित नहीं (सभी शामिल होंगी)" }, + "repoCountNone": { "message": "0 रिपॉजिटरी चयनित" }, + "repoCount": { "message": "$1 रिपॉजिटरी चयनित" }, + "repoLoading": { "message": "रिपॉजिटरी लोड हो रही हैं..." }, + "repoLoaded": { "message": "$1 रिपॉजिटरी लोड हो गईं।" }, + "repoNotFound": { "message": "कोई रिपॉजिटरी नहीं मिली" }, + "repoRefetching": { "message": "रिपॉजिटरी फिर से लोड हो रही हैं..." }, + "repoLoadFailed": { "message": "रिपॉजिटरी लोड करने में विफल।" }, + "repoTokenPrivate": { "message": "टोकन अमान्य है या निजी रिपॉजिटरी के लिए अधिकार नहीं हैं।" }, + "repoRefetchFailed": { "message": "रिपॉजिटरी फिर से लोड करने में विफल।" }, + "orgSetMessage": { "message": "संगठन सफलतापूर्वक सेट हो गया।" }, + "orgClearedMessage": { "message": "संगठन साफ़ हो गया। सभी गतिविधियाँ प्राप्त करने के लिए 'रिपोर्ट बनाएं' पर क्लिक करें।" }, + "orgNotFoundMessage": { "message": "GitHub पर संगठन नहीं मिला।" }, + "orgValidationErrorMessage": { "message": "संगठन को मान्य करने में त्रुटि।" }, + "refreshingButton": { "message": "रीफ्रेश हो रहा है..." }, + "cacheClearFailed": { "message": "कैश साफ़ करने में विफल।" }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "बनाया जा रहा है..." }, + "copiedButton": { "message": "कॉपी किया गया!" }, + "orgChangedMessage": { "message": "संगठन बदल गया है। GitHub गतिविधियाँ प्राप्त करने के लिए 'रिपोर्ट बनाएं' बटन पर क्लिक करें।" }, + "cacheClearedMessage": { "message": "कैश सफलतापूर्वक साफ़ हो गया। ताज़ा डेटा प्राप्त करने के लिए 'रिपोर्ट बनाएं' पर क्लिक करें।" }, + "cacheClearedButton": { "message": "कैश साफ़ हो गया!" }, + "extensionDisabledMessage": { "message": "एक्सटेंशन अक्षम है। स्क्रम रिपोर्ट बनाने के लिए इसे सेटिंग्स से सक्षम करें।" }, + "notePoint1": { "message": "प्राप्त PRs किसी भी योगदानकर्ता द्वारा सबसे हालिया समीक्षा पर आधारित हैं। यदि आपने 10 दिन पहले एक PR की समीक्षा की और किसी और ने 2 दिन पहले, तो यह पिछले सप्ताह की आपकी गतिविधि में फिर भी दिखाई देगा।" }, + "notePoint2": { "message": "कृपया ध्यान दें कि उत्पन्न स्क्रम में कुछ विसंगतियां हो सकती हैं। हम साझा करने से पहले सटीकता सुनिश्चित करने के लिए रिपोर्ट की मैन्युअल रूप से समीक्षा और संपादन करने की सलाह देते हैं।" }, + "noteSeeIssue": { "message": "यह समस्या देखें" } +} \ No newline at end of file diff --git a/src/_locales/id/messages.json b/src/_locales/id/messages.json new file mode 100644 index 0000000..e9f844b --- /dev/null +++ b/src/_locales/id/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "Laporkan kemajuan pengembangan Anda dengan mengambil aktivitas Git Anda secara otomatis untuk periode yang dipilih." }, + "disableLabel": { "message": "Nonaktifkan" }, + "enableLabel": { "message": "Aktifkan" }, + "homeButtonTitle": { "message": "Buka Laporan" }, + "projectNameLabel": { "message": "Nama Proyek Anda" }, + "projectNamePlaceholder": { "message": "Masukkan nama proyek Anda" }, + "githubUsernameLabel": { "message": "Nama Pengguna GitHub Anda" }, + "githubUsernamePlaceholder": { "message": "Diperlukan untuk mengambil kontribusi Anda" }, + "contributionsLabel": { "message": "Ambil kontribusi Anda untuk:" }, + "last7DaysLabel": { "message": "7 hari terakhir" }, + "last1DayLabel": { "message": "Kemarin" }, + "startDateLabel": { "message": "Tanggal Mulai:" }, + "endDateLabel": { "message": "Tanggal Selesai:" }, + "showOpenClosedLabel": { "message": "Tampilkan status Buka/Tutup" }, + "blockersLabel": { "message": "Apa yang menghalangi kemajuan Anda?" }, + "blockersPlaceholder": { "message": "Masukkan alasan Anda" }, + "scrumReportLabel": { "message": "Laporan Scrum" }, + "generateReportButton": { "message": "Buat Laporan" }, + "copyReportButton": { "message": "Salin Laporan" }, + "settingsOrgNameLabel": { "message": "Nama Organisasi" }, + "settingsOrgNamePlaceholder": { "message": "Masukkan nama organisasi" }, + "setButton": { "message": "Atur" }, + "githubTokenLabel": { "message": "Token GitHub Anda" }, + "githubTokenPlaceholder": { "message": "Diperlukan untuk permintaan terotentikasi" }, + "showCommitsLabel": { "message": "Tampilkan commit di PR terbuka dalam rentang tanggal" }, + "cacheTTLLabel": { "message": "Masukkan TTL cache" }, + "cacheTTLUnit": { "message": "(dalam menit)" }, + "cacheTTLPlaceholder": { "message": "Tulis TTL Cache dalam menit (Default: 10)" }, + "refreshDataButton": { "message": "Segarkan Data (abaikan cache)" }, + "refreshDataInfo": { "message": "Gunakan tombol ini untuk mengambil data baru segera." }, + "noteTitle": { "message": "Catatan:" }, + "viewCodeButton": { "message": "Lihat Kode" }, + "reportIssueButton": { "message": "Laporkan Masalah" }, + "repoFilterLabel": { "message": "Filter berdasarkan repositori" }, + "enableFilteringLabel": { "message": "Aktifkan pemfilteran" }, + "tokenRequiredWarning": { "message": "Token GitHub diperlukan untuk pemfilteran repositori. Harap tambahkan di pengaturan." }, + "repoSearchPlaceholder": { "message": "Cari repositori untuk ditambahkan..." }, + "repoPlaceholder": { "message": "Tidak ada repositori yang dipilih (semua akan disertakan)" }, + "repoCountNone": { "message": "0 repositori dipilih" }, + "repoCount": { "message": "$1 repositori dipilih" }, + "repoLoading": { "message": "Memuat repositori..." }, + "repoLoaded": { "message": "$1 repositori dimuat." }, + "repoNotFound": { "message": "Tidak ada repositori ditemukan" }, + "repoRefetching": { "message": "Memuat ulang repositori..." }, + "repoLoadFailed": { "message": "Gagal memuat repositori." }, + "repoTokenPrivate": { "message": "Token tidak valid atau tidak memiliki hak untuk repo pribadi." }, + "repoRefetchFailed": { "message": "Gagal memuat ulang repositori." }, + "orgSetMessage": { "message": "Organisasi berhasil diatur." }, + "orgClearedMessage": { "message": "Organisasi dihapus. Klik 'Buat Laporan' untuk mengambil semua aktivitas." }, + "orgNotFoundMessage": { "message": "Organisasi tidak ditemukan di GitHub." }, + "orgValidationErrorMessage": { "message": "Gagal memvalidasi organisasi." }, + "refreshingButton": { "message": "Menyegarkan..." }, + "cacheClearFailed": { "message": "Gagal membersihkan cache." }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "Membuat..." }, + "copiedButton": { "message": "Tersalin!" }, + "orgChangedMessage": { "message": "Organisasi diubah. Klik tombol 'Buat Laporan' untuk mengambil aktivitas GitHub." }, + "cacheClearedMessage": { "message": "Cache berhasil dihapus. Klik 'Buat Laporan' untuk mengambil data baru." }, + "cacheClearedButton": { "message": "Cache Dihapus!" }, + "extensionDisabledMessage": { "message": "Ekstensi dinonaktifkan. Aktifkan dari pengaturan untuk membuat laporan scrum." }, + "notePoint1": { "message": "PR yang diambil didasarkan pada ulasan terbaru oleh kontributor mana pun. Jika Anda meninjau PR 10 hari yang lalu dan orang lain meninjaunya 2 hari yang lalu, itu akan tetap muncul di aktivitas Anda selama seminggu terakhir." }, + "notePoint2": { "message": "Harap dicatat bahwa beberapa perbedaan mungkin terjadi pada Scrum yang dihasilkan. Kami menyarankan untuk meninjau dan mengedit laporan secara manual untuk memastikan akurasi sebelum membagikannya." }, + "noteSeeIssue": { "message": "Lihat masalah ini" } +} \ No newline at end of file diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json new file mode 100644 index 0000000..9f9b5cd --- /dev/null +++ b/src/_locales/ja/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "選択した期間のGitアクティビティを自動的に取得して、開発の進捗を報告します。" }, + "disableLabel": { "message": "無効にする" }, + "enableLabel": { "message": "有効にする" }, + "homeButtonTitle": { "message": "レポートに移動" }, + "projectNameLabel": { "message": "プロジェクト名" }, + "projectNamePlaceholder": { "message": "プロジェクト名を入力してください" }, + "githubUsernameLabel": { "message": "GitHubユーザー名" }, + "githubUsernamePlaceholder": { "message": "コントリビューションの取得に必要です" }, + "contributionsLabel": { "message": "取得するコントリビューションの期間:" }, + "last7DaysLabel": { "message": "過去7日間" }, + "last1DayLabel": { "message": "昨日" }, + "startDateLabel": { "message": "開始日:" }, + "endDateLabel": { "message": "終了日:" }, + "showOpenClosedLabel": { "message": "オープン/クローズ状態を表示" }, + "blockersLabel": { "message": "進捗の妨げになっているものは何ですか?" }, + "blockersPlaceholder": { "message": "理由を入力してください" }, + "scrumReportLabel": { "message": "スクラムレポート" }, + "generateReportButton": { "message": "レポートを生成" }, + "copyReportButton": { "message": "レポートをコピー" }, + "settingsOrgNameLabel": { "message": "組織名" }, + "settingsOrgNamePlaceholder": { "message": "組織名を入力してください" }, + "setButton": { "message": "設定" }, + "githubTokenLabel": { "message": "GitHubトークン" }, + "githubTokenPlaceholder": { "message": "認証済みリクエストに必要です" }, + "showCommitsLabel": { "message": "期間内のオープンなPRのコミットを表示" }, + "cacheTTLLabel": { "message": "キャッシュTTLを入力" }, + "cacheTTLUnit": { "message": "(分)" }, + "cacheTTLPlaceholder": { "message": "キャッシュTTLを分単位で入力 (デフォルト: 10)" }, + "refreshDataButton": { "message": "データを更新 (キャッシュを無視)" }, + "refreshDataInfo": { "message": "このボタンで最新のデータをすぐに取得します。" }, + "noteTitle": { "message": "注:" }, + "viewCodeButton": { "message": "コードを見る" }, + "reportIssueButton": { "message": "問題を報告" }, + "repoFilterLabel": { "message": "リポジトリでフィルタリング" }, + "enableFilteringLabel": { "message": "フィルタリングを有効にする" }, + "tokenRequiredWarning": { "message": "リポジトリのフィルタリングにはGitHubトークンが必要です。設定で追加してください。" }, + "repoSearchPlaceholder": { "message": "追加するリポジトリを検索..." }, + "repoPlaceholder": { "message": "リポジトリが選択されていません(すべて含まれます)" }, + "repoCountNone": { "message": "0件のリポジトリが選択されています" }, + "repoCount": { "message": "$1件のリポジトリが選択されています" }, + "repoLoading": { "message": "リポジトリを読み込み中..." }, + "repoLoaded": { "message": "$1件のリポジトリを読み込みました。" }, + "repoNotFound": { "message": "リポジトリが見つかりません" }, + "repoRefetching": { "message": "リポジトリを再読み込み中..." }, + "repoLoadFailed": { "message": "リポジトリの読み込みに失敗しました。" }, + "repoTokenPrivate": { "message": "トークンが無効か、プライベートリポジトリへの権限がありません。" }, + "repoRefetchFailed": { "message": "リポジトリの再読み込みに失敗しました。" }, + "orgSetMessage": { "message": "組織が正常に設定されました。" }, + "orgClearedMessage": { "message": "組織がクリアされました。「レポートを生成」をクリックしてすべてのアクティビティを取得してください。" }, + "orgNotFoundMessage": { "message": "GitHubで組織が見つかりません。" }, + "orgValidationErrorMessage": { "message": "組織の検証中にエラーが発生しました。" }, + "refreshingButton": { "message": "更新中..." }, + "cacheClearFailed": { "message": "キャッシュのクリアに失敗しました。" }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "生成中..." }, + "copiedButton": { "message": "コピーしました!" }, + "orgChangedMessage": { "message": "組織が変更されました。「レポートを生成」ボタンをクリックしてGitHubアクティビティを取得してください。" }, + "cacheClearedMessage": { "message": "キャッシュが正常にクリアされました。「レポートを生成」をクリックして新しいデータを取得してください。" }, + "cacheClearedButton": { "message": "キャッシュクリア!" }, + "extensionDisabledMessage": { "message": "拡張機能が無効です。スクラムレポートを生成するには、設定から有効にしてください。" }, + "notePoint1": { "message": "取得されるPRは、いずれかの貢献者による最新のレビューに基づきます。10日前にPRをレビューし、他の誰かが2日前にレビューした場合でも、過去1週間のアクティビティに表示されます。" }, + "notePoint2": { "message": "生成されたスクラムには不一致が生じる可能性があります。共有する前に、レポートを手動で確認・編集して正確性を確保することをお勧めします。" }, + "noteSeeIssue": { "message": "このIssueを参照" } +} \ No newline at end of file diff --git a/src/_locales/pt/messages.json b/src/_locales/pt/messages.json new file mode 100644 index 0000000..77eb9e4 --- /dev/null +++ b/src/_locales/pt/messages.json @@ -0,0 +1,46 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "Relate o seu progresso de desenvolvimento buscando automaticamente a sua atividade no Git para um período selecionado" }, + "disableLabel": { "message": "Desativar" }, + "enableLabel": { "message": "Ativar" }, + "homeButtonTitle": { "message": "Ir para o Relatório" }, + "projectNameLabel": { "message": "Nome do seu Projeto" }, + "projectNamePlaceholder": { "message": "Digite o nome do seu projeto" }, + "githubUsernameLabel": { "message": "Seu Nome de Usuário do Github" }, + "githubUsernamePlaceholder": { "message": "Necessário para buscar suas contribuições" }, + "contributionsLabel": { "message": "Buscar suas contribuições entre:" }, + "last7DaysLabel": { "message": "Últimos 7 dias" }, + "last1DayLabel": { "message": "Último dia" }, + "startDateLabel": { "message": "Data de Início:" }, + "endDateLabel": { "message": "Data de Fim:" }, + "showOpenClosedLabel": { "message": "Mostrar Rótulo Aberto/Fechado" }, + "blockersLabel": { "message": "O que está impedindo você de progredir?" }, + "blockersPlaceholder": { "message": "Digite o seu motivo" }, + "scrumReportLabel": { "message": "Relatório Scrum" }, + "generateReportButton": { "message": "Gerar Relatório" }, + "copyReportButton": { "message": "Copiar Relatório" }, + "settingsOrgNameLabel": { "message": "Nome da Organização" }, + "settingsOrgNamePlaceholder": { "message": "Digite o nome da organização" }, + "setButton": { "message": "Definir" }, + "githubTokenLabel": { "message": "Seu Token do Github" }, + "githubTokenPlaceholder": { "message": "Necessário para fazer solicitações autenticadas" }, + "showCommitsLabel": { "message": "Mostrar commits feitos dentro do intervalo de datas em PRs abertos" }, + "cacheTTLLabel": { "message": "Digite o TTL do cache" }, + "cacheTTLUnit": { "message": "(em minutos)" }, + "cacheTTLPlaceholder": { "message": "Escreva o TTL do cache em minutos (Padrão 10 minutos)" }, + "refreshDataButton": { "message": "Atualizar Dados (ignorar cache)" }, + "refreshDataInfo": { "message": "Use este botão para buscar dados novos imediatamente." }, + "noteTitle": { "message": "Nota:" }, + "viewCodeButton": { "message": "Ver Código" }, + "reportIssueButton": { "message": "Relatar Problema" }, + "madeWithLoveBy": { "message": "Feito com ❤️ por" }, + "generatingButton": { "message": "Gerando..." }, + "copiedButton": { "message": "Copiado!" }, + "orgChangedMessage": { "message": "Organização alterada. Clique no botão Gerar para buscar as atividades do GitHub." }, + "cacheClearedMessage": { "message": "Cache limpo com sucesso. Clique em \"Gerar Relatório\" para buscar dados novos." }, + "cacheClearedButton": { "message": "Cache Limpo!" }, + "extensionDisabledMessage": { "message": "A extensão está desativada. Ative-a nas opções para gerar relatórios scrum." }, + "notePoint1": { "message": "Os PRs buscados são baseados na revisão mais recente de qualquer contribuidor. Se você revisou um PR há 10 dias e outra pessoa o revisou há 2 dias, ele ainda aparecerá na sua atividade da última semana." }, + "notePoint2": { "message": "Observe que algumas discrepâncias podem ocorrer no SCRUM gerado. Recomendamos revisar e editar manualmente o relatório para garantir a precisão antes de compartilhar." }, + "noteSeeIssue": { "message": "Veja este problema" } +} \ No newline at end of file diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json new file mode 100644 index 0000000..dc2d634 --- /dev/null +++ b/src/_locales/pt_BR/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "Relate seu progresso de desenvolvimento buscando automaticamente sua atividade no Git para um período selecionado." }, + "disableLabel": { "message": "Desativar" }, + "enableLabel": { "message": "Ativar" }, + "homeButtonTitle": { "message": "Ir para o Relatório" }, + "projectNameLabel": { "message": "Nome do seu Projeto" }, + "projectNamePlaceholder": { "message": "Digite o nome do seu projeto" }, + "githubUsernameLabel": { "message": "Seu nome de usuário do GitHub" }, + "githubUsernamePlaceholder": { "message": "Necessário para buscar suas contribuições" }, + "contributionsLabel": { "message": "Buscar suas contribuições de:" }, + "last7DaysLabel": { "message": "Últimos 7 dias" }, + "last1DayLabel": { "message": "Ontem" }, + "startDateLabel": { "message": "Data de Início:" }, + "endDateLabel": { "message": "Data de Fim:" }, + "showOpenClosedLabel": { "message": "Mostrar status Aberto/Fechado" }, + "blockersLabel": { "message": "O que está impedindo seu progresso?" }, + "blockersPlaceholder": { "message": "Digite o motivo" }, + "scrumReportLabel": { "message": "Relatório Scrum" }, + "generateReportButton": { "message": "Gerar Relatório" }, + "copyReportButton": { "message": "Copiar Relatório" }, + "settingsOrgNameLabel": { "message": "Nome da Organização" }, + "settingsOrgNamePlaceholder": { "message": "Digite o nome da organização" }, + "setButton": { "message": "Definir" }, + "githubTokenLabel": { "message": "Seu Token do GitHub" }, + "githubTokenPlaceholder": { "message": "Necessário para solicitações autenticadas" }, + "showCommitsLabel": { "message": "Mostrar commits em PRs abertos no período" }, + "cacheTTLLabel": { "message": "Digite o TTL do cache" }, + "cacheTTLUnit": { "message": "(em minutos)" }, + "cacheTTLPlaceholder": { "message": "Digite o TTL do cache em minutos (Padrão: 10)" }, + "refreshDataButton": { "message": "Atualizar Dados (ignorar cache)" }, + "refreshDataInfo": { "message": "Use este botão para buscar dados novos imediatamente." }, + "noteTitle": { "message": "Nota:" }, + "viewCodeButton": { "message": "Ver código" }, + "reportIssueButton": { "message": "Relatar um problema" }, + "repoFilterLabel": { "message": "Filtrar por repositórios" }, + "enableFilteringLabel": { "message": "Ativar filtragem" }, + "tokenRequiredWarning": { "message": "Um token do GitHub é necessário para filtrar repositórios. Adicione um nas configurações." }, + "repoSearchPlaceholder": { "message": "Buscar um repositório para adicionar..." }, + "repoPlaceholder": { "message": "Nenhum repositório selecionado (todos serão incluídos)" }, + "repoCountNone": { "message": "0 repositórios selecionados" }, + "repoCount": { "message": "$1 repositórios selecionados" }, + "repoLoading": { "message": "Carregando repositórios..." }, + "repoLoaded": { "message": "$1 repositórios carregados." }, + "repoNotFound": { "message": "Nenhum repositório encontrado" }, + "repoRefetching": { "message": "Recarregando repositórios..." }, + "repoLoadFailed": { "message": "Falha ao carregar repositórios." }, + "repoTokenPrivate": { "message": "O token é inválido ou não tem permissão para repositórios privados." }, + "repoRefetchFailed": { "message": "Falha ao recarregar repositórios." }, + "orgSetMessage": { "message": "Organização definida com sucesso." }, + "orgClearedMessage": { "message": "Organização removida. Clique em 'Gerar Relatório' para buscar todas as atividades." }, + "orgNotFoundMessage": { "message": "Organização não encontrada no GitHub." }, + "orgValidationErrorMessage": { "message": "Erro ao validar a organização." }, + "refreshingButton": { "message": "Atualizando..." }, + "cacheClearFailed": { "message": "Falha ao limpar o cache." }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "Gerando..." }, + "copiedButton": { "message": "Copiado!" }, + "orgChangedMessage": { "message": "Organização alterada. Clique em 'Gerar Relatório' para buscar as atividades do GitHub." }, + "cacheClearedMessage": { "message": "Cache limpo com sucesso. Clique em 'Gerar Relatório' para buscar dados novos." }, + "cacheClearedButton": { "message": "Cache Limpo!" }, + "extensionDisabledMessage": { "message": "A extensão está desativada. Ative-a nos ajustes para gerar relatórios scrum." }, + "notePoint1": { "message": "Os PRs buscados são baseados na revisão mais recente de qualquer contribuidor. Se você revisou um PR há 10 dias e outra pessoa o revisou há 2 dias, ele ainda aparecerá na sua atividade da última semana." }, + "notePoint2": { "message": "Observe que algumas discrepâncias podem ocorrer no Scrum gerado. Recomendamos revisar e editar manualmente o relatório para garantir a precisão antes de compartilhar." }, + "noteSeeIssue": { "message": "Veja este issue" } +} \ No newline at end of file diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json new file mode 100644 index 0000000..c2bb752 --- /dev/null +++ b/src/_locales/ru/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "Сообщайте о своем прогрессе в разработке, автоматически получая данные о вашей активности в Git за выбранный период." }, + "disableLabel": { "message": "Отключить" }, + "enableLabel": { "message": "Включить" }, + "homeButtonTitle": { "message": "Перейти к отчету" }, + "projectNameLabel": { "message": "Название вашего проекта" }, + "projectNamePlaceholder": { "message": "Введите название вашего проекта" }, + "githubUsernameLabel": { "message": "Ваше имя пользователя GitHub" }, + "githubUsernamePlaceholder": { "message": "Требуется для получения ваших вкладов" }, + "contributionsLabel": { "message": "Получить ваши вклады за:" }, + "last7DaysLabel": { "message": "Последние 7 дней" }, + "last1DayLabel": { "message": "Вчера" }, + "startDateLabel": { "message": "Дата начала:" }, + "endDateLabel": { "message": "Дата окончания:" }, + "showOpenClosedLabel": { "message": "Показывать статус Открыто/Закрыто" }, + "blockersLabel": { "message": "Что мешает вашему прогрессу?" }, + "blockersPlaceholder": { "message": "Введите причину" }, + "scrumReportLabel": { "message": "Scrum-отчет" }, + "generateReportButton": { "message": "Создать отчет" }, + "copyReportButton": { "message": "Копировать отчет" }, + "settingsOrgNameLabel": { "message": "Название организации" }, + "settingsOrgNamePlaceholder": { "message": "Введите название организации" }, + "setButton": { "message": "Установить" }, + "githubTokenLabel": { "message": "Ваш токен GitHub" }, + "githubTokenPlaceholder": { "message": "Требуется для аутентифицированных запросов" }, + "showCommitsLabel": { "message": "Показывать коммиты в открытых PR за указанный период" }, + "cacheTTLLabel": { "message": "Введите TTL кэша" }, + "cacheTTLUnit": { "message": "(в минутах)" }, + "cacheTTLPlaceholder": { "message": "Укажите TTL кэша в минутах (по умолчанию: 10)" }, + "refreshDataButton": { "message": "Обновить данные (в обход кэша)" }, + "refreshDataInfo": { "message": "Используйте эту кнопку для немедленного получения свежих данных." }, + "noteTitle": { "message": "Примечание:" }, + "viewCodeButton": { "message": "Посмотреть код" }, + "reportIssueButton": { "message": "Сообщить о проблеме" }, + "repoFilterLabel": { "message": "Фильтровать по репозиториям" }, + "enableFilteringLabel": { "message": "Включить фильтрацию" }, + "tokenRequiredWarning": { "message": "Для фильтрации репозиториев требуется токен GitHub. Пожалуйста, добавьте его в настройках." }, + "repoSearchPlaceholder": { "message": "Найти репозиторий для добавления..." }, + "repoPlaceholder": { "message": "Репозитории не выбраны (будут включены все)" }, + "repoCountNone": { "message": "0 репозиториев выбрано" }, + "repoCount": { "message": "$1 репозиториев выбрано" }, + "repoLoading": { "message": "Загрузка репозиториев..." }, + "repoLoaded": { "message": "Загружено $1 репозиториев." }, + "repoNotFound": { "message": "Репозитории не найдены" }, + "repoRefetching": { "message": "Перезагрузка репозиториев..." }, + "repoLoadFailed": { "message": "Не удалось загрузить репозитории." }, + "repoTokenPrivate": { "message": "Токен недействителен или не имеет прав для частных репозиториев." }, + "repoRefetchFailed": { "message": "Не удалось перезагрузить репозитории." }, + "orgSetMessage": { "message": "Организация успешно установлена." }, + "orgClearedMessage": { "message": "Организация удалена. Нажмите 'Создать отчет', чтобы получить все действия." }, + "orgNotFoundMessage": { "message": "Организация не найдена на GitHub." }, + "orgValidationErrorMessage": { "message": "Ошибка при проверке организации." }, + "refreshingButton": { "message": "Обновление..." }, + "cacheClearFailed": { "message": "Не удалось очистить кэш." }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "Создание..." }, + "copiedButton": { "message": "Скопировано!" }, + "orgChangedMessage": { "message": "Организация изменена. Нажмите 'Создать отчет', чтобы получить данные о действиях в GitHub." }, + "cacheClearedMessage": { "message": "Кэш успешно очищен. Нажмите 'Создать отчет', чтобы получить свежие данные." }, + "cacheClearedButton": { "message": "Кэш очищен!" }, + "extensionDisabledMessage": { "message": "Расширение отключено. Включите его в настройках, чтобы создавать scrum-отчеты." }, + "notePoint1": { "message": "Полученные PR основаны на последнем ревью любого участника. Если вы сделали ревью PR 10 дней назад, а кто-то другой — 2 дня назад, он все равно появится в вашей активности за последнюю неделю." }, + "notePoint2": { "message": "Обратите внимание, что в сгенерированном Scrum могут быть неточности. Мы рекомендуем вручную проверять и редактировать отчет для обеспечения точности перед отправкой." }, + "noteSeeIssue": { "message": "Смотрите эту проблему" } +} \ No newline at end of file diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json new file mode 100644 index 0000000..e581808 --- /dev/null +++ b/src/_locales/vi/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "Báo cáo tiến độ phát triển của bạn bằng cách tự động lấy hoạt động Git trong một khoảng thời gian đã chọn." }, + "disableLabel": { "message": "Tắt" }, + "enableLabel": { "message": "Bật" }, + "homeButtonTitle": { "message": "Đi đến Báo cáo" }, + "projectNameLabel": { "message": "Tên dự án của bạn" }, + "projectNamePlaceholder": { "message": "Nhập tên dự án của bạn" }, + "githubUsernameLabel": { "message": "Tên người dùng GitHub của bạn" }, + "githubUsernamePlaceholder": { "message": "Bắt buộc để lấy đóng góp của bạn" }, + "contributionsLabel": { "message": "Lấy đóng góp của bạn trong:" }, + "last7DaysLabel": { "message": "7 ngày qua" }, + "last1DayLabel": { "message": "Hôm qua" }, + "startDateLabel": { "message": "Ngày bắt đầu:" }, + "endDateLabel": { "message": "Ngày kết thúc:" }, + "showOpenClosedLabel": { "message": "Hiển thị trạng thái Mở/Đóng" }, + "blockersLabel": { "message": "Điều gì đang cản trở bạn?" }, + "blockersPlaceholder": { "message": "Nhập lý do của bạn" }, + "scrumReportLabel": { "message": "Báo cáo Scrum" }, + "generateReportButton": { "message": "Tạo báo cáo" }, + "copyReportButton": { "message": "Sao chép báo cáo" }, + "settingsOrgNameLabel": { "message": "Tên tổ chức" }, + "settingsOrgNamePlaceholder": { "message": "Nhập tên tổ chức" }, + "setButton": { "message": "Đặt" }, + "githubTokenLabel": { "message": "Mã token GitHub của bạn" }, + "githubTokenPlaceholder": { "message": "Bắt buộc cho các yêu cầu đã xác thực" }, + "showCommitsLabel": { "message": "Hiển thị các commit trong PR đang mở theo khoảng ngày" }, + "cacheTTLLabel": { "message": "Nhập TTL bộ nhớ đệm" }, + "cacheTTLUnit": { "message": "(tính bằng phút)" }, + "cacheTTLPlaceholder": { "message": "Nhập TTL bộ nhớ đệm bằng phút (Mặc định: 10)" }, + "refreshDataButton": { "message": "Làm mới dữ liệu (bỏ qua bộ nhớ đệm)" }, + "refreshDataInfo": { "message": "Sử dụng nút này để lấy dữ liệu mới ngay lập tức." }, + "noteTitle": { "message": "Lưu ý:" }, + "viewCodeButton": { "message": "Xem mã" }, + "reportIssueButton": { "message": "Báo cáo sự cố" }, + "repoFilterLabel": { "message": "Lọc theo kho lưu trữ" }, + "enableFilteringLabel": { "message": "Bật bộ lọc" }, + "tokenRequiredWarning": { "message": "Cần có mã token GitHub để lọc kho lưu trữ. Vui lòng thêm một mã trong cài đặt." }, + "repoSearchPlaceholder": { "message": "Tìm kiếm kho lưu trữ để thêm..." }, + "repoPlaceholder": { "message": "Chưa chọn kho lưu trữ nào (tất cả sẽ được bao gồm)" }, + "repoCountNone": { "message": "0 kho lưu trữ đã chọn" }, + "repoCount": { "message": "$1 kho lưu trữ đã chọn" }, + "repoLoading": { "message": "Đang tải kho lưu trữ..." }, + "repoLoaded": { "message": "Đã tải $1 kho lưu trữ." }, + "repoNotFound": { "message": "Không tìm thấy kho lưu trữ nào" }, + "repoRefetching": { "message": "Đang tải lại kho lưu trữ..." }, + "repoLoadFailed": { "message": "Không thể tải kho lưu trữ." }, + "repoTokenPrivate": { "message": "Mã token không hợp lệ hoặc không có quyền đối với kho lưu trữ riêng tư." }, + "repoRefetchFailed": { "message": "Không thể tải lại kho lưu trữ." }, + "orgSetMessage": { "message": "Tổ chức đã được đặt thành công." }, + "orgClearedMessage": { "message": "Đã xóa tổ chức. Nhấp vào 'Tạo báo cáo' để lấy tất cả hoạt động." }, + "orgNotFoundMessage": { "message": "Không tìm thấy tổ chức trên GitHub." }, + "orgValidationErrorMessage": { "message": "Lỗi khi xác thực tổ chức." }, + "refreshingButton": { "message": "Đang làm mới..." }, + "cacheClearFailed": { "message": "Xóa bộ nhớ đệm thất bại." }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "Đang tạo..." }, + "copiedButton": { "message": "Đã sao chép!" }, + "orgChangedMessage": { "message": "Tổ chức đã thay đổi. Nhấp vào 'Tạo báo cáo' để lấy các hoạt động trên GitHub." }, + "cacheClearedMessage": { "message": "Bộ nhớ đệm đã được xóa thành công. Nhấp vào 'Tạo báo cáo' để lấy dữ liệu mới." }, + "cacheClearedButton": { "message": "Đã xóa bộ nhớ đệm!" }, + "extensionDisabledMessage": { "message": "Tiện ích mở rộng đã bị tắt. Bật nó từ cài đặt để tạo báo cáo scrum." }, + "notePoint1": { "message": "Các PR được lấy dựa trên lần review gần đây nhất của bất kỳ người đóng góp nào. Nếu bạn review một PR 10 ngày trước và người khác review nó 2 ngày trước, nó vẫn sẽ xuất hiện trong hoạt động của bạn trong tuần qua." }, + "notePoint2": { "message": "Xin lưu ý rằng có thể xảy ra một số khác biệt trong Scrum được tạo. Chúng tôi khuyên bạn nên xem xét và chỉnh sửa báo cáo thủ công để đảm bảo tính chính xác trước khi chia sẻ." }, + "noteSeeIssue": { "message": "Xem vấn đề này" } +} \ No newline at end of file diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json new file mode 100644 index 0000000..321d6b9 --- /dev/null +++ b/src/_locales/zh_CN/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "通过自动获取选定时间段内的 Git 活动来报告您的开发进度。" }, + "disableLabel": { "message": "禁用" }, + "enableLabel": { "message": "启用" }, + "homeButtonTitle": { "message": "前往报告" }, + "projectNameLabel": { "message": "您的项目名称" }, + "projectNamePlaceholder": { "message": "输入您的项目名称" }, + "githubUsernameLabel": { "message": "您的 GitHub 用户名" }, + "githubUsernamePlaceholder": { "message": "获取您的贡献所必需" }, + "contributionsLabel": { "message": "获取您在此期间的贡献:" }, + "last7DaysLabel": { "message": "过去 7 天" }, + "last1DayLabel": { "message": "昨天" }, + "startDateLabel": { "message": "开始日期:" }, + "endDateLabel": { "message": "结束日期:" }, + "showOpenClosedLabel": { "message": "显示“打开/关闭”状态" }, + "blockersLabel": { "message": "什么阻碍了您的进展?" }, + "blockersPlaceholder": { "message": "输入您的原因" }, + "scrumReportLabel": { "message": "Scrum 报告" }, + "generateReportButton": { "message": "生成报告" }, + "copyReportButton": { "message": "复制报告" }, + "settingsOrgNameLabel": { "message": "组织名称" }, + "settingsOrgNamePlaceholder": { "message": "输入组织名称" }, + "setButton": { "message": "设置" }, + "githubTokenLabel": { "message": "您的 GitHub 令牌" }, + "githubTokenPlaceholder": { "message": "进行身份验证请求所必需" }, + "showCommitsLabel": { "message": "显示日期范围内在进行中 PR 的提交" }, + "cacheTTLLabel": { "message": "输入缓存 TTL" }, + "cacheTTLUnit": { "message": "(分钟)" }, + "cacheTTLPlaceholder": { "message": "以分钟为单位输入缓存 TTL(默认为 10)" }, + "refreshDataButton": { "message": "刷新数据(绕过缓存)" }, + "refreshDataInfo": { "message": "使用此按钮立即获取新数据。" }, + "noteTitle": { "message": "注意:" }, + "viewCodeButton": { "message": "查看代码" }, + "reportIssueButton": { "message": "报告问题" }, + "repoFilterLabel": { "message": "按仓库筛选" }, + "enableFilteringLabel": { "message": "启用筛选" }, + "tokenRequiredWarning": { "message": "仓库筛选需要GitHub令牌。请在设置中添加一个。" }, + "repoSearchPlaceholder": { "message": "搜索要添加的仓库..." }, + "repoPlaceholder": { "message": "未选择任何仓库(将包含所有仓库)" }, + "repoCountNone": { "message": "已选择 0 个仓库" }, + "repoCount": { "message": "已选择 $1 个仓库" }, + "repoLoading": { "message": "正在加载仓库..." }, + "repoLoaded": { "message": "已加载 $1 个仓库。" }, + "repoNotFound": { "message": "未找到仓库" }, + "repoRefetching": { "message": "正在重新加载仓库..." }, + "repoLoadFailed": { "message": "加载仓库失败。" }, + "repoTokenPrivate": { "message": "令牌无效或没有私有仓库的权限。" }, + "repoRefetchFailed": { "message": "重新加载仓库失败。" }, + "orgSetMessage": { "message": "组织设置成功。" }, + "orgClearedMessage": { "message": "组织已清除。点击“生成报告”以获取所有活动。" }, + "orgNotFoundMessage": { "message": "在GitHub上找不到组织。" }, + "orgValidationErrorMessage": { "message": "验证组织时出错。" }, + "refreshingButton": { "message": "正在刷新..." }, + "cacheClearFailed": { "message": "清除缓存失败。" }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "正在生成..." }, + "copiedButton": { "message": "已复制!" }, + "orgChangedMessage": { "message": "组织已更改。单击“生成报告”按钮以获取 GitHub 活动。" }, + "cacheClearedMessage": { "message": "缓存已成功清除。单击“生成报告”以获取新数据。" }, + "cacheClearedButton": { "message": "缓存已清除!" }, + "extensionDisabledMessage": { "message": "扩展已禁用。请在设置中启用它以生成 Scrum 报告。" }, + "notePoint1": { "message": "获取的 PR 基于任何贡献者的最新审查。如果您在 10 天前审查了某个 PR,而其他人在 2 天前审查了它,它仍将出现在您上周的活动中。" }, + "notePoint2": { "message": "请注意,生成的 Scrum 报告中可能会出现一些差异。我们建议在分享前手动审查和编辑报告以确保准确性。" }, + "noteSeeIssue": { "message": "查看此 issue" } +} diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json new file mode 100644 index 0000000..1b5a9c5 --- /dev/null +++ b/src/_locales/zh_TW/messages.json @@ -0,0 +1,66 @@ +{ + "appName": { "message": "Scrum Helper" }, + "appDescription": { "message": "透過自動擷取選定時間段內的 Git 活動來報告您的開發進度。" }, + "disableLabel": { "message": "停用" }, + "enableLabel": { "message": "啟用" }, + "homeButtonTitle": { "message": "前往報告" }, + "projectNameLabel": { "message": "您的專案名稱" }, + "projectNamePlaceholder": { "message": "輸入您的專案名稱" }, + "githubUsernameLabel": { "message": "您的 GitHub 使用者名稱" }, + "githubUsernamePlaceholder": { "message": "擷取您的貢獻所必需" }, + "contributionsLabel": { "message": "擷取您在此期間的貢獻:" }, + "last7DaysLabel": { "message": "過去 7 天" }, + "last1DayLabel": { "message": "昨天" }, + "startDateLabel": { "message": "開始日期:" }, + "endDateLabel": { "message": "結束日期:" }, + "showOpenClosedLabel": { "message": "顯示「開啟/關閉」狀態" }, + "blockersLabel": { "message": "什麼阻礙了您的進度?" }, + "blockersPlaceholder": { "message": "輸入您的原因" }, + "scrumReportLabel": { "message": "Scrum 報告" }, + "generateReportButton": { "message": "產生報告" }, + "copyReportButton": { "message": "複製報告" }, + "settingsOrgNameLabel": { "message": "組織名稱" }, + "settingsOrgNamePlaceholder": { "message": "輸入組織名稱" }, + "setButton": { "message": "設定" }, + "githubTokenLabel": { "message": "您的 GitHub 權杖" }, + "githubTokenPlaceholder": { "message": "進行身分驗證請求所必需" }, + "showCommitsLabel": { "message": "顯示日期範圍內在進行中 PR 的提交" }, + "cacheTTLLabel": { "message": "輸入快取 TTL" }, + "cacheTTLUnit": { "message": "(分鐘)" }, + "cacheTTLPlaceholder": { "message": "以分鐘為單位輸入快取 TTL(預設為 10)" }, + "refreshDataButton": { "message": "重新整理資料(繞過快取)" }, + "refreshDataInfo": { "message": "使用此按鈕立即擷取新資料。" }, + "noteTitle": { "message": "注意:" }, + "viewCodeButton": { "message": "檢視程式碼" }, + "reportIssueButton": { "message": "回報問題" }, + "repoFilterLabel": { "message": "按儲存庫篩選" }, + "enableFilteringLabel": { "message": "啟用篩選" }, + "tokenRequiredWarning": { "message": "儲存庫篩選需要GitHub權杖。請在設定中新增一個。" }, + "repoSearchPlaceholder": { "message": "搜尋要新增的儲存庫..." }, + "repoPlaceholder": { "message": "未選擇任何儲存庫(將包含所有儲存庫)" }, + "repoCountNone": { "message": "已選擇 0 個儲存庫" }, + "repoCount": { "message": "已選擇 $1 個儲存庫" }, + "repoLoading": { "message": "正在載入儲存庫..." }, + "repoLoaded": { "message": "已載入 $1 個儲存庫。" }, + "repoNotFound": { "message": "找不到儲存庫" }, + "repoRefetching": { "message": "正在重新載入儲存庫..." }, + "repoLoadFailed": { "message": "載入儲存庫失敗。" }, + "repoTokenPrivate": { "message": "權杖無效或沒有私有儲存庫的權限。" }, + "repoRefetchFailed": { "message": "重新載入儲存庫失敗。" }, + "orgSetMessage": { "message": "組織設定成功。" }, + "orgClearedMessage": { "message": "組織已清除。點擊「產生報告」以擷取所有活動。" }, + "orgNotFoundMessage": { "message": "在GitHub上找不到組織。" }, + "orgValidationErrorMessage": { "message": "驗證組織時發生錯誤。" }, + "refreshingButton": { "message": "正在重新整理..." }, + "cacheClearFailed": { "message": "清除快取失敗。" }, + "madeWithLoveBy": { "message": "Made with ❤️ by" }, + "generatingButton": { "message": "正在產生..." }, + "copiedButton": { "message": "已複製!" }, + "orgChangedMessage": { "message": "組織已變更。點擊「產生報告」按鈕以擷取 GitHub 活動。" }, + "cacheClearedMessage": { "message": "快取已成功清除。點擊「產生報告」以擷取新資料。" }, + "cacheClearedButton": { "message": "快取已清除!" }, + "extensionDisabledMessage": { "message": "擴充功能已停用。請在設定中啟用它以產生 Scrum 報告。" }, + "notePoint1": { "message": "擷取的 PR 基於任何貢獻者的最新審查。如果您在 10 天前審查了某個 PR,而其他人在 2 天前審查了它,它仍將出現在您上週的活動中。" }, + "notePoint2": { "message": "請注意,產生的 Scrum 報告中可能會出現一些差異。我們建議在分享前手動審查和編輯報告以確保準確性。" }, + "noteSeeIssue": { "message": "查看此 issue" } +} \ No newline at end of file diff --git a/src/manifest.json b/src/manifest.json index 69eaa16..beb1b18 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -11,6 +11,7 @@ "96": "icons/icon.png", "48": "icons/icon.png" }, + "background": { "service_worker": "scripts/background.js" }, @@ -51,5 +52,6 @@ "*://*.office.com/*", "*://*.yahoo.com/*", "https://api.github.com/*" - ] + ], + "default_locale": "en" } \ No newline at end of file diff --git a/src/popup.html b/src/popup.html index 8cfc142..78211ba 100644 --- a/src/popup.html +++ b/src/popup.html @@ -25,25 +25,27 @@
Report your development progress by auto-fetching your Git activity for a selected period +
Report your development progress by auto-fetching your Git + activity for a selected period
Your Project Name
+ Your Project Name
-
+
This is the name that appears in the subject line of your email, followed by
timestamp.
Your GitHub Username
+Your GitHub Username
+ data-i18n-placeholder="githubUsernamePlaceholder">Fetch your contributions between:
+Fetch your contributions between: +
Your GitHub Token
+ Your GitHub Token
-
+
Why is it recommended to add a GitHub token?
Scrum Helper works without a GitHub token, but adding a personal access
token is recommended for a
@@ -189,14 +198,15 @@ Scrum Report
Your Organization Name
+Your Organization Name +
- + Which organization's GitHub activity?Filter by repositories
+
+ Filter by repositories
-
+
Github Token required.
To force a repo list update,
click the Refresh Data button.
-
Enter cache TTL (in
+ Enter cache TTL (in
minutes)
-
+
We are caching the data to avoid redundant calls. By default the cache expires after
10 minutes, you
can change it here to your desired time. We have given a refresh cache button in
@@ -286,18 +303,18 @@ Scrum Report
- Use this button to fetch fresh data immediately. + Use this button to fetch fresh data immediately.
Extension is disabled. Enable it from the options to generate scrum reports.
'; + scrumReport.innerHTML = `${chrome.i18n.getMessage('extensionDisabledMessage')}
`; } else { - const disabledMessage = 'Extension is disabled. Enable it from the options to generate scrum reports.
'; + const disabledMessage = `${chrome.i18n.getMessage('extensionDisabledMessage')}
`; if (scrumReport.innerHTML === disabledMessage) { scrumReport.innerHTML = ''; } @@ -265,7 +300,7 @@ document.addEventListener('DOMContentLoaded', function () { let org = orgInput.value.trim().toLowerCase(); // Allow empty org to fetch all GitHub activities chrome.storage.local.set({ orgName: org }, () => { - generateBtn.innerHTML = ' Generating...'; + generateBtn.innerHTML = ` ${chrome.i18n.getMessage('generatingButton')}`; generateBtn.disabled = true; window.generateScrumReport(); }); @@ -287,9 +322,9 @@ document.addEventListener('DOMContentLoaded', function () { try { document.execCommand('copy'); - this.innerHTML = ' Copied!'; + this.innerHTML = ` ${chrome.i18n.getMessage('copiedButton')}`; setTimeout(() => { - this.innerHTML = ' Copy Report'; + this.innerHTML = ` ${chrome.i18n.getMessage('copyReportButton')}`; }, 2000); } catch (err) { console.error('Failed to copy: ', err); @@ -455,7 +490,7 @@ document.addEventListener('DOMContentLoaded', function () { } if (repoStatus) { - repoStatus.textContent = 'Refetching repositories...'; + repoStatus.textContent = chrome.i18n.getMessage('repoRefetching'); } try { @@ -468,7 +503,7 @@ document.addEventListener('DOMContentLoaded', function () { if (!items.githubUsername) { if (repoStatus) { - repoStatus.textContent = 'GitHub username required'; + repoStatus.textContent = chrome.i18n.getMessage('githubUsernamePlaceholder'); } return; } @@ -483,7 +518,7 @@ document.addEventListener('DOMContentLoaded', function () { availableRepos = repos; if (repoStatus) { - repoStatus.textContent = `${repos.length} repositories loaded`; + repoStatus.textContent = chrome.i18n.getMessage('repoLoaded', [repos.length]); } const repoCacheKey = `repos-${items.githubUsername}-${items.orgName || ''}`; @@ -506,7 +541,7 @@ document.addEventListener('DOMContentLoaded', function () { } catch (err) { console.error('Auto refetch failed:', err); if (repoStatus) { - repoStatus.textContent = `Error: ${err.message || 'Failed to refetch repos'}`; + repoStatus.textContent = `${chrome.i18n.getMessage('errorLabel')}: ${err.message || chrome.i18n.getMessage('repoRefetchFailed')}`; } } } @@ -563,7 +598,7 @@ document.addEventListener('DOMContentLoaded', function () { }); if (!items.githubUsername) { - repoStatus.textContent = 'Github Username required'; + repoStatus.textContent = chrome.i18n.getMessage('githubUsernamePlaceholder'); return; } @@ -578,7 +613,7 @@ document.addEventListener('DOMContentLoaded', function () { console.log('Using cached repositories'); availableRepos = cacheData.repoCache.data; - repoStatus.textContent = `${availableRepos.length} repositories loaded`; + repoStatus.textContent = chrome.i18n.getMessage('repoLoaded', [availableRepos.length]); if (document.activeElement === repoSearch) { filterAndDisplayRepos(repoSearch.value.toLowerCase()); @@ -593,7 +628,7 @@ document.addEventListener('DOMContentLoaded', function () { items.orgName || '', ); availableRepos = repos; - repoStatus.textContent = `${repos.length} repositories loaded`; + repoStatus.textContent = chrome.i18n.getMessage('repoLoaded', [repos.length]); chrome.storage.local.set({ repoCache: { @@ -610,11 +645,11 @@ document.addEventListener('DOMContentLoaded', function () { } catch (err) { console.error('Auto load repos failed', err); if (err.message?.includes('401')) { - repoStatus.textContent = 'Github token required for private repos'; + repoStatus.textContent = chrome.i18n.getMessage('repoTokenPrivate'); } else if (err.message?.includes('username')) { - repoStatus.textContent = 'Please enter your Github username first'; + repoStatus.textContent = chrome.i18n.getMessage('githubUsernamePlaceholder'); } else { - repoStatus.textContent = `Error: ${err.message || 'Failed to load repos'}`; + repoStatus.textContent = `${chrome.i18n.getMessage('errorLabel')}: ${err.message || chrome.i18n.getMessage('repoLoadFailed')}`; } } } else { @@ -711,7 +746,7 @@ document.addEventListener('DOMContentLoaded', function () { async function performRepoFetch() { console.log('[POPUP-DEBUG] performRepoFetch called.'); - repoStatus.textContent = 'Loading repositories...'; + repoStatus.textContent = chrome.i18n.getMessage('repoLoading'); repoSearch.classList.add('repository-search-loading'); try { @@ -740,7 +775,7 @@ document.addEventListener('DOMContentLoaded', function () { console.log('[POPUP-DEBUG] Using cached repositories in manual fetch'); availableRepos = cacheData.repoCache.data; - repoStatus.textContent = `${availableRepos.length} repositories loaded`; + repoStatus.textContent = chrome.i18n.getMessage('repoLoaded', [availableRepos.length]); if (document.activeElement === repoSearch) { filterAndDisplayRepos(repoSearch.value.toLowerCase()); @@ -753,7 +788,7 @@ document.addEventListener('DOMContentLoaded', function () { storageItems.githubToken, storageItems.orgName || '' ); - repoStatus.textContent = `${availableRepos.length} repositories loaded`; + repoStatus.textContent = chrome.i18n.getMessage('repoLoaded', [availableRepos.length]); console.log(`[POPUP-DEBUG] Fetched and loaded ${availableRepos.length} repos.`); chrome.storage.local.set({ @@ -771,11 +806,11 @@ document.addEventListener('DOMContentLoaded', function () { console.error(`Failed to load repos:`, err); if (err.message && err.message.includes('401')) { - repoStatus.textContent = 'GitHub token required for private repos'; + repoStatus.textContent = chrome.i18n.getMessage('repoTokenPrivate'); } else if (err.message && err.message.includes('username')) { - repoStatus.textContent = 'Please enter your GitHub username first'; + repoStatus.textContent = chrome.i18n.getMessage('githubUsernamePlaceholder'); } else { - repoStatus.textContent = `Error: ${err.message || 'Failed to load repositories'}`; + repoStatus.textContent = `${chrome.i18n.getMessage('errorLabel')}: ${err.message || chrome.i18n.getMessage('repoLoadFailed')}`; } } finally { repoSearch.classList.remove('repository-search-loading'); @@ -784,7 +819,7 @@ document.addEventListener('DOMContentLoaded', function () { function filterAndDisplayRepos(query) { if (availableRepos.length === 0) { - repoDropdown.innerHTML = 'Organization cleared. Click Generate button to fetch all your GitHub activities.
`; + scrumReport.innerHTML = `${chrome.i18n.getMessage('orgClearedMessage')}
`; } chrome.storage.local.remove(['githubCache', 'repoCache']); triggerRepoFetchIfEnabled(); @@ -960,7 +995,7 @@ setOrgBtn.addEventListener('click', function () { toastDiv.style.left = '50%'; toastDiv.style.transform = 'translateX(-50%)'; toastDiv.style.zIndex = '9999'; - toastDiv.innerText = 'Organization not found on GitHub.'; + toastDiv.innerText = chrome.i18n.getMessage('orgNotFoundMessage'); document.body.appendChild(toastDiv); setTimeout(() => { if (toastDiv.parentNode) toastDiv.parentNode.removeChild(toastDiv); @@ -971,10 +1006,10 @@ setOrgBtn.addEventListener('click', function () { if (oldToast) oldToast.parentNode.removeChild(oldToast); chrome.storage.local.set({ orgName: org }, function () { - // Always clear the scrum report and show org changed message + // always clear the scrum report and show org changed message const scrumReport = document.getElementById('scrumReport'); if (scrumReport) { - scrumReport.innerHTML = 'Organization changed. Click Generate button to fetch the GitHub activities.
'; + scrumReport.innerHTML = `${chrome.i18n.getMessage('orgChangedMessage')}
`; } // Clear the githubCache for previous org chrome.storage.local.remove('githubCache'); @@ -994,7 +1029,7 @@ setOrgBtn.addEventListener('click', function () { toastDiv.style.left = '50%'; toastDiv.style.transform = 'translateX(-50%)'; toastDiv.style.zIndex = '9999'; - toastDiv.innerText = 'Organization is set.'; + toastDiv.innerText = chrome.i18n.getMessage('orgSetMessage'); document.body.appendChild(toastDiv); setTimeout(() => { if (toastDiv.parentNode) toastDiv.parentNode.removeChild(toastDiv); @@ -1020,7 +1055,7 @@ setOrgBtn.addEventListener('click', function () { toastDiv.style.left = '50%'; toastDiv.style.transform = 'translateX(-50%)'; toastDiv.style.zIndex = '9999'; - toastDiv.innerText = 'Error validating organization.'; + toastDiv.innerText = chrome.i18n.getMessage('orgValidationErrorMessage'); document.body.appendChild(toastDiv); setTimeout(() => { if (toastDiv.parentNode) toastDiv.parentNode.removeChild(toastDiv); @@ -1132,7 +1167,7 @@ document.getElementById('refreshCache').addEventListener('click', async function const originalText = button.innerHTML; button.classList.add('loading'); - button.innerHTML = 'Refreshing...'; + button.innerHTML = `${chrome.i18n.getMessage('refreshingButton')}`; button.disabled = true; try { @@ -1144,7 +1179,7 @@ document.getElementById('refreshCache').addEventListener('click', async function // Clear the scrum report const scrumReport = document.getElementById('scrumReport'); if (scrumReport) { - scrumReport.innerHTML = 'Cache cleared successfully. Click "Generate Report" to fetch fresh data.
'; + scrumReport.innerHTML = `${chrome.i18n.getMessage('cacheClearedMessage')}
`; } if (typeof availableRepos !== 'undefined') { @@ -1156,7 +1191,7 @@ document.getElementById('refreshCache').addEventListener('click', async function repoStatus.textContent = ''; } - button.innerHTML = 'Cache Cleared!'; + button.innerHTML = `${chrome.i18n.getMessage('cacheClearedButton')}`; button.classList.remove('loading'); setTimeout(() => triggerRepoFetchIfEnabled(), 500); @@ -1168,7 +1203,7 @@ document.getElementById('refreshCache').addEventListener('click', async function } catch (error) { console.error('Cache clear failed:', error); - button.innerHTML = 'Failed to clear cache'; + button.innerHTML = `${chrome.i18n.getMessage('cacheClearFailed')}`; button.classList.remove('loading'); setTimeout(() => { @@ -1209,7 +1244,7 @@ const handleOrgInput = debounce(function () { toastDiv.style.left = '50%'; toastDiv.style.transform = 'translateX(-50%)'; toastDiv.style.zIndex = '9999'; - toastDiv.innerText = 'Organization not found on GitHub.'; + toastDiv.innerText = chrome.i18n.getMessage('orgNotFoundMessage'); document.body.appendChild(toastDiv); setTimeout(() => { if (toastDiv.parentNode) toastDiv.parentNode.removeChild(toastDiv); @@ -1241,7 +1276,7 @@ const handleOrgInput = debounce(function () { toastDiv.style.left = '50%'; toastDiv.style.transform = 'translateX(-50%)'; toastDiv.style.zIndex = '9999'; - toastDiv.innerText = 'Error validating organization.'; + toastDiv.innerText = chrome.i18n.getMessage('orgValidationErrorMessage'); document.body.appendChild(toastDiv); setTimeout(() => { if (toastDiv.parentNode) toastDiv.parentNode.removeChild(toastDiv);