diff --git a/RunMeToUpdateLocales.cmd b/RunMeToUpdateLocales.cmd deleted file mode 100644 index 61d639c..0000000 --- a/RunMeToUpdateLocales.cmd +++ /dev/null @@ -1,18 +0,0 @@ -@echo off -rem https://github.com/settings/personal-access-tokens - -rem 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 - -rem this can store the github token in the environment variable GITHUB_TOKEN, which is used by the sync-locales.ps1 script -rem setx GITHUB_TOKEN "%(gh auth token)%" - -rem this is for github copilot, but it's blocked -rem pwsh ./sync-locales.ps1 -GitHubToken "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" -rem powershell -ExecutionPolicy Bypass -File sync-locales.ps1 -GitHubToken "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" -rem powershell -NoProfile -ExecutionPolicy Bypass -File "sync-locales.ps1" -GitHubToken "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" - -cd /d "%~dp0" - -echo Running Azure OpenAI locale sync... - -pwsh -NoProfile -ExecutionPolicy Bypass -File "%~dp0sync-locales-azure.ps1" -AzureOpenAIEndpoint "https://cjdopenai.openai.azure.com/" -AzureOpenAIApiKey "9atLPrU05kMV2sFXCduLFfRJHnneF1KFZgmJqO42UuH0PxptagW3JQQJ99CBACmepeSXJ3w3AAABACOGvB4E" -AzureOpenAIDeployment "gpt-4o-mini" \ No newline at end of file diff --git a/Translate-Locale.ps1 b/Translate-Locale.ps1 deleted file mode 100644 index 1740d90..0000000 --- a/Translate-Locale.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -#You will need Microsoft Copilot CLI installed to run this script use this to install the command line tool: -# winget install Microsoft.Copilot - -# pwsh ./Translate-Locale.ps1 ` -# -SourceFile "./public/locales/en-GB/common.json" ` -# -TargetLocale "fr-FR" ` -# -OutputFile "./public/locales/fr-FR/common.json" - -# pwsh ./Translate-Locale.ps1 ` -# -SourceFile "./public/locales/en-GB/common.json" ` -# -TargetLocale "en-US" ` -# -OutputFile "./public/locales/en-US/common.json" - -# pwsh ./Translate-Locale.ps1 ` -# -SourceFile "./public/locales/en-GB/common.json" ` -# -TargetLocale "fr-CA" ` -# -OutputFile "./public/locales/fr-CA/common.json" - - -param( - [Parameter(Mandatory=$true)] - [string]$SourceFile, # en-GB.json - [Parameter(Mandatory=$true)] - [string]$TargetLocale, # fr-FR, fr-CA, en-US, etc. - [Parameter(Mandatory=$true)] - [string]$OutputFile # output JSON file -) - -# Load the source JSON -$sourceJson = Get-Content $SourceFile -Raw - -# Build the translation prompt -$prompt = @" -Translate the following JSON values into $TargetLocale. -Keep the keys exactly the same. -Return valid JSON only. - -$sourceJson -"@ - -# Call Copilot CLI -$translated = copilot $prompt - -# Save the result -$translated | Out-File $OutputFile -Encoding UTF8 - -Write-Host "Generated $TargetLocale translation: $OutputFile" \ No newline at end of file diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index 3f1da4d..ba5ff6a 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -1,12 +1,14 @@ { - "SaveChangesToLinkSSOAccount": "Запазете промените, за да стартирате процеса за свързване на вашия SSO акаунт.", "Account": "Акаунт", "Activate": "Активиране", "Active": "Активен", + "ActivityNameTemplate": "Шаблон за назив активности", "Add": "Добавяне", "AddDomain": "Добавяне на домейн", - "Address": "Адрес", + "AddTask": "Додай задатак", "AddUser": "Добавяне на потребител", + "AddWorkflowTemplate": "Додајте шаблон радног процеса.", + "Address": "Адрес", "Admin": "Администратор", "Allowed": "Разрешено", "AnEmailWithPasswordResetLinkHasBeenSent": "Изпратен е имейл с връзка за нулиране на паролата.", @@ -50,15 +52,13 @@ "DisplayName": "Показвано име", "Domain": "Домейн", "DomainEdited": "Домейнът е редактиран", - "e-print": "e-print", - "e-suite": "e-suite", - "e-suiteLogo": "Лого на e-suite", - "Edit": "Редактиране", - "EditDomain": "Редактиране на домейн", - "EditUser": "Редактиране на потребител", "EFlowAppId": "e-flow AppId", "EFlowCategoryId": "e-flow CategoryId", "EFlowHostname": "e-flow hostname", + "Edit": "Редактиране", + "EditDomain": "Редактиране на домейн", + "EditUser": "Редактиране на потребител", + "EditWorkflowTemplate": "Измена шаблона радног процеса", "Email": "Имейл", "EmailTemplateSaved": "Имейл шаблонът е запазен", "Enabled": "Активиран", @@ -73,10 +73,10 @@ "FirstName": "Име", "ForgottenPassword": "Забравена парола", "Form": "Формуляр", - "Forms": "Формуляри", "FormTemplate": "Шаблон на формуляр", "FormTemplateEdited": "Шаблонът на формуляра е редактиран", "FormTemplateManager": "Мениджър на шаблони за формуляри", + "Forms": "Формуляри", "General": "Общи", "Glossaries": "Речници", "Glossary": "Речник", @@ -85,17 +85,17 @@ "GlossaryManager": "Мениджър на речници", "Group": "Група", "Home": "Начало", - "Id": "Id", - "Increment": "Стъпка", "IPAddress": "IP адрес", "IPAddressUnblocked": "IP адрес '{{ip}}' е деблокиран.", + "Id": "Id", + "Increment": "Стъпка", "IsPublic": "Публичен", "Items": "Елементи", "LastName": "Фамилия", "LastUpdated": "Последна актуализация", "Loading": "Зареждане", - "LoginMethod": "Метод на вход", "LoggingOut": "Излизане", + "LoginMethod": "Метод на вход", "Logout": "Изход", "Mail": "Поща", "MailTemplates": "Имейл шаблони", @@ -131,10 +131,10 @@ "Password": "Парола", "PasswordIsRequired": "Паролата е задължителна", "PasswordMinLength": "Паролата трябва да е поне {{minPasswordLength}} символа", - "PasswordMinSymbols": "Паролата трябва да съдържа поне {{minSymbols}} символ(а)", - "PasswordMinNumbers": "Паролата трябва да съдържа поне {{minNumbers}} цифра(и)", - "PasswordMinUppercase": "Паролата трябва да съдържа поне {{minUppercase}} главна буква", "PasswordMinLowercase": "Паролата трябва да съдържа поне {{minLowercase}} малка буква", + "PasswordMinNumbers": "Паролата трябва да съдържа поне {{minNumbers}} цифра(и)", + "PasswordMinSymbols": "Паролата трябва да съдържа поне {{minSymbols}} символ(а)", + "PasswordMinUppercase": "Паролата трябва да съдържа поне {{minUppercase}} главна буква", "PasswordsMustMatch": "Трябва да въведете същата нова парола за потвърждение", "Pattern": "Шаблон", "Pending": "Изчаква", @@ -146,6 +146,7 @@ "Required": "Задължително", "ResendConfirm": "Изпрати повторно потвърждение", "ResetPassword": "Нулиране на парола", + "ResolveAllValidation": "Решите све грешке при верификацији.", "Role": "Роля", "RoleAccess": "Достъп на роля", "RoleAccessUpdated": "Достъпът на ролята е актуализиран успешно.", @@ -153,6 +154,7 @@ "RolloverType": "Тип прехвърляне", "Save": "Запази", "SaveAndClose": "Запази и затвори", + "SaveChangesToLinkSSOAccount": "Запазете промените, за да стартирате процеса за свързване на вашия SSO акаунт.", "SecurityRoles": "Роли за сигурност", "Seed": "Seed", "Sequence": "Последователност", @@ -177,6 +179,7 @@ "Subject": "Тема", "Support": "Поддръжка", "SupportingData": "Допълнителни данни", + "TasksValidationError": "Конфигурација задатака је неважећа.", "TemplateIdCannotBeNull": "Template Id не може да бъде null", "TemplateUnknown": "Неизвестен шаблон", "Text": "Текст", @@ -201,7 +204,11 @@ "ValidIssuer": "Valid Issuer", "Version": "Версия", "VersionCannotBeNull": "Версията не може да бъде null", + "WorkflowTemplateName": "Име шаблона радног процеса", "WorkflowTemplates": "Шаблони за работни процеси", "Year": "Година", - "YourProfileSettingsHaveBeenSaved": "Настройките на профила ви са запазени" -} + "YourProfileSettingsHaveBeenSaved": "Настройките на профила ви са запазени", + "e-print": "e-print", + "e-suite": "e-suite", + "e-suiteLogo": "Лого на e-suite" +} \ No newline at end of file diff --git a/public/locales/bg/htmlIsland.json b/public/locales/bg/htmlIsland.json index b15ba94..0cab237 100644 --- a/public/locales/bg/htmlIsland.json +++ b/public/locales/bg/htmlIsland.json @@ -2,7 +2,7 @@ "island": { "loadError": "Неуспешно зареждане на този раздел.", "networkError": "Мрежова грешка при запазване.", - "serverError": "Сървърна грешка при запазване.", - "saveSuccess": "Успешно запазено." + "saveSuccess": "Успешно запазено.", + "serverError": "Сървърна грешка при запазване." } -} +} \ No newline at end of file diff --git a/public/locales/bg/mailTypes.json b/public/locales/bg/mailTypes.json index cffc2e9..6599378 100644 --- a/public/locales/bg/mailTypes.json +++ b/public/locales/bg/mailTypes.json @@ -3,4 +3,4 @@ "DisableAuthenticator": "Деактивиране на двуфакторното удостоверяване", "PasswordReset": "Нулиране на парола", "PasswordResetCompleted": "Потвърждение за нулиране на паролата" -} +} \ No newline at end of file diff --git a/public/locales/bg/raci.json b/public/locales/bg/raci.json new file mode 100644 index 0000000..d5228ea --- /dev/null +++ b/public/locales/bg/raci.json @@ -0,0 +1,6 @@ +{ + "Accountable": "Отговоран", + "Consulted": "Порадили се", + "Informed": "Информисани", + "Responsible": "Одговоран" +} \ No newline at end of file diff --git a/public/locales/bg/taskTypes.json b/public/locales/bg/taskTypes.json new file mode 100644 index 0000000..3655516 --- /dev/null +++ b/public/locales/bg/taskTypes.json @@ -0,0 +1,14 @@ +{ + "AdhocApprovalTask": "Импровизовано одобрење", + "ApprovalTask": "Одобрење", + "AssetUploadTask": "Учитавање датотека", + "BasicTask": "Базично", + "ContentCollationTask": "Колекционирање садржаја", + "FileReleaseTask": "Оприлачење датотеке", + "FormDataInputTask": "Унос података у формулар", + "LinkActivityTask": "Активност преко линка", + "MilestoneTask": "Милинјум", + "StageTask": "Позориште", + "VisualBriefReviewTask": "Визуелни преглед", + "VisualBriefUploadTask": "Уплођивање визуелног сажетка" +} \ No newline at end of file diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 566a718..07b5643 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -1,12 +1,14 @@ { - "SaveChangesToLinkSSOAccount": "Speichern Sie die Änderungen, um den Prozess zum Verknüpfen Ihres SSO-Kontos zu starten.", "Account": "Konto", "Activate": "Aktivieren", "Active": "Aktiv", + "ActivityNameTemplate": "Vorlage für den Namen der Aktivität", "Add": "Hinzufügen", "AddDomain": "Domain hinzufügen", - "Address": "Adresse", + "AddTask": "Zuweisung einer Aufgabe", "AddUser": "Benutzer hinzufügen", + "AddWorkflowTemplate": "Hinzufügen von Workflow-Vorlage", + "Address": "Adresse", "Admin": "Administrator", "Allowed": "Erlaubt", "AnEmailWithPasswordResetLinkHasBeenSent": "Eine E-Mail mit einem Link zum Zurücksetzen des Passworts wurde gesendet.", @@ -50,15 +52,13 @@ "DisplayName": "Anzeigename", "Domain": "Domain", "DomainEdited": "Domain bearbeitet", - "e-print": "e-print", - "e-suite": "e-suite", - "e-suiteLogo": "e-suite Logo", - "Edit": "Bearbeiten", - "EditDomain": "Domain bearbeiten", - "EditUser": "Benutzer bearbeiten", "EFlowAppId": "e-flow AppId", "EFlowCategoryId": "e-flow CategoryId", "EFlowHostname": "e-flow Hostname", + "Edit": "Bearbeiten", + "EditDomain": "Domain bearbeiten", + "EditUser": "Benutzer bearbeiten", + "EditWorkflowTemplate": "Bearbeiten Sie ein Arbeitsabflussvorlage.", "Email": "E-Mail", "EmailTemplateSaved": "E-Mail-Vorlage gespeichert", "Enabled": "Aktiviert", @@ -73,10 +73,10 @@ "FirstName": "Vorname", "ForgottenPassword": "Passwort vergessen", "Form": "Formular", - "Forms": "Formulare", "FormTemplate": "Formularvorlage", "FormTemplateEdited": "Formularvorlage bearbeitet", "FormTemplateManager": "Formularvorlagen-Manager", + "Forms": "Formulare", "General": "Allgemein", "Glossaries": "Glossare", "Glossary": "Glossar", @@ -85,17 +85,17 @@ "GlossaryManager": "Glossar-Manager", "Group": "Gruppe", "Home": "Startseite", - "Id": "ID", - "Increment": "Schrittweite", "IPAddress": "IP-Adresse", "IPAddressUnblocked": "IP-Adresse '{{ip}}' wurde entsperrt.", + "Id": "ID", + "Increment": "Schrittweite", "IsPublic": "Öffentlich", "Items": "Einträge", "LastName": "Nachname", "LastUpdated": "Zuletzt aktualisiert", "Loading": "Laden", - "LoginMethod": "Login-Methode", "LoggingOut": "Abmelden", + "LoginMethod": "Login-Methode", "Logout": "Abmelden", "Mail": "Mail", "MailTemplates": "Mail-Vorlagen", @@ -131,10 +131,10 @@ "Password": "Passwort", "PasswordIsRequired": "Passwort ist erforderlich", "PasswordMinLength": "Das Passwort muss mindestens {{minPasswordLength}} Zeichen lang sein", - "PasswordMinSymbols": "Das Passwort muss mindestens {{minSymbols}} Symbol(e) enthalten", - "PasswordMinNumbers": "Das Passwort muss mindestens {{minNumbers}} Zahl(en) enthalten", - "PasswordMinUppercase": "Das Passwort muss mindestens {{minUppercase}} Großbuchstabe(n) enthalten", "PasswordMinLowercase": "Das Passwort muss mindestens {{minLowercase}} Kleinbuchstabe(n) enthalten", + "PasswordMinNumbers": "Das Passwort muss mindestens {{minNumbers}} Zahl(en) enthalten", + "PasswordMinSymbols": "Das Passwort muss mindestens {{minSymbols}} Symbol(e) enthalten", + "PasswordMinUppercase": "Das Passwort muss mindestens {{minUppercase}} Großbuchstabe(n) enthalten", "PasswordsMustMatch": "Sie müssen das neue Passwort zur Bestätigung erneut identisch eingeben", "Pattern": "Muster", "Pending": "Ausstehend", @@ -146,6 +146,7 @@ "Required": "Erforderlich", "ResendConfirm": "Bestätigung erneut senden", "ResetPassword": "Passwort zurücksetzen", + "ResolveAllValidation": "Beseitigen Sie bitte alle Validierungsfehler.", "Role": "Rolle", "RoleAccess": "Rollenberechtigungen", "RoleAccessUpdated": "Rollenberechtigungen erfolgreich aktualisiert.", @@ -153,6 +154,7 @@ "RolloverType": "Übertragstyp", "Save": "Speichern", "SaveAndClose": "Speichern und schließen", + "SaveChangesToLinkSSOAccount": "Speichern Sie die Änderungen, um den Prozess zum Verknüpfen Ihres SSO-Kontos zu starten.", "SecurityRoles": "Sicherheitsrollen", "Seed": "Seed", "Sequence": "Sequenz", @@ -177,6 +179,7 @@ "Subject": "Betreff", "Support": "Support", "SupportingData": "Unterstützende Daten", + "TasksValidationError": "Die Konfiguration der Aufgaben ist ungültig.", "TemplateIdCannotBeNull": "Template-ID darf nicht null sein", "TemplateUnknown": "Unbekannte Vorlage", "Text": "Text", @@ -201,7 +204,11 @@ "ValidIssuer": "Gültiger Aussteller", "Version": "Version", "VersionCannotBeNull": "Version darf nicht null sein", + "WorkflowTemplateName": "Name des Workflow-Vorlagen-Templates", "WorkflowTemplates": "Workflow-Vorlagen", "Year": "Jahr", - "YourProfileSettingsHaveBeenSaved": "Ihre Profileinstellungen wurden gespeichert" -} + "YourProfileSettingsHaveBeenSaved": "Ihre Profileinstellungen wurden gespeichert", + "e-print": "e-print", + "e-suite": "e-suite", + "e-suiteLogo": "e-suite Logo" +} \ No newline at end of file diff --git a/public/locales/de/htmlIsland.json b/public/locales/de/htmlIsland.json index dfbf8d1..4545b9a 100644 --- a/public/locales/de/htmlIsland.json +++ b/public/locales/de/htmlIsland.json @@ -2,7 +2,7 @@ "island": { "loadError": "Dieser Abschnitt konnte nicht geladen werden.", "networkError": "Netzwerkfehler beim Speichern.", - "serverError": "Serverfehler beim Speichern.", - "saveSuccess": "Erfolgreich gespeichert." + "saveSuccess": "Erfolgreich gespeichert.", + "serverError": "Serverfehler beim Speichern." } -} +} \ No newline at end of file diff --git a/public/locales/de/mailTypes.json b/public/locales/de/mailTypes.json index 6aa73bd..fe71823 100644 --- a/public/locales/de/mailTypes.json +++ b/public/locales/de/mailTypes.json @@ -3,4 +3,4 @@ "DisableAuthenticator": "Zwei-Faktor-Authentifizierung deaktivieren", "PasswordReset": "Passwort zurücksetzen", "PasswordResetCompleted": "Bestätigung der Passwortzurücksetzung" -} +} \ No newline at end of file diff --git a/public/locales/de/raci.json b/public/locales/de/raci.json new file mode 100644 index 0000000..52724ba --- /dev/null +++ b/public/locales/de/raci.json @@ -0,0 +1,6 @@ +{ + "Accountable": "Verantwortlich", + "Consulted": "Beraten worden.", + "Informed": "Beflügelt durch Informationen", + "Responsible": "Verantwortungsbewusst" +} \ No newline at end of file diff --git a/public/locales/de/taskTypes.json b/public/locales/de/taskTypes.json new file mode 100644 index 0000000..ca848ae --- /dev/null +++ b/public/locales/de/taskTypes.json @@ -0,0 +1,14 @@ +{ + "AdhocApprovalTask": "Ad hoc Genehmigung", + "ApprovalTask": "Genehmigung", + "AssetUploadTask": "Laden von Vermögenswerten", + "BasicTask": "Grundlagen", + "ContentCollationTask": "Inhaltsauswahl", + "FileReleaseTask": "Veröffentlichung von Dateien", + "FormDataInputTask": "Eingabe von Formulardaten", + "LinkActivityTask": "Link Activity", + "MilestoneTask": "Meilenstein", + "StageTask": "Bühne", + "VisualBriefReviewTask": "Visualer Überblick", + "VisualBriefUploadTask": "Hochladen des visuellen Überblicks" +} \ No newline at end of file diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 55bc9d9..c2b246f 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -1,15 +1,14 @@ { - "ActivityNameTemplate": "Activity Name Template", - "SaveChangesToLinkSSOAccount": "Save changes to trigger the process that will link your SSO Account.", "Account": "Account", "Activate": "Activate", "Active": "Active", + "ActivityNameTemplate": "Activity Name Template", "Add": "Add", "AddDomain": "Add Domain", "AddTask": "Add Task", - "Address": "Address", "AddUser": "Add User", "AddWorkflowTemplate": "Add Workflow Template", + "Address": "Address", "Admin": "Admin", "Allowed": "Allowed", "AnEmailWithPasswordResetLinkHasBeenSent": "An email with a password reset link has been sent.", @@ -53,15 +52,12 @@ "DisplayName": "Display Name", "Domain": "Domain", "DomainEdited": "Domain edited", - "e-print": "e-print", - "e-suite": "e-suite", - "e-suiteLogo": "e-suite logo", - "Edit": "Edit", - "EditDomain": "Edit Domain", - "EditWorkflowTemplate": "Edit Workflow Template", "EFlowAppId": "e-flow AppId", "EFlowCategoryId": "e-flow CategoryId", "EFlowHostname": "e-flow hostname", + "Edit": "Edit", + "EditDomain": "Edit Domain", + "EditWorkflowTemplate": "Edit Workflow Template", "Email": "Email", "EmailTemplateSaved": "Email Template saved", "Enabled": "Enabled", @@ -76,10 +72,10 @@ "FirstName": "First name", "ForgottenPassword": "Forgotten Password", "Form": "Form", - "Forms": "Forms", "FormTemplate": "Form Template", "FormTemplateEdited": "Form template edited", "FormTemplateManager": "Form Template Manager", + "Forms": "Forms", "General": "General", "Glossaries": "Glossaries", "Glossary": "Glossary", @@ -88,17 +84,17 @@ "GlossaryManager": "Glossary Manager", "Group": "Group", "Home": "Home", - "Id": "Id", - "Increment": "Increment", "IPAddress": "IP Address", "IPAddressUnblocked": "IP Address '{{ip}}' unblocked.", + "Id": "Id", + "Increment": "Increment", "IsPublic": "Is Public", "Items": "Items", "LastName": "Last name", "LastUpdated": "Last Updated", "Loading": "Loading", - "LoginMethod": "Login Method", "LoggingOut": "Logging out", + "LoginMethod": "Login Method", "Logout": "Logout", "Mail": "Mail", "MailTemplates": "Mail Templates", @@ -134,10 +130,10 @@ "Password": "Password", "PasswordIsRequired": "Password is required", "PasswordMinLength": "Password must be at least {{minPasswordLength}} characters", - "PasswordMinSymbols": "Password must contain at least {{minSymbols}} symbol(s)", - "PasswordMinNumbers": "Password must contain at least {{minNumbers}} number(s)", - "PasswordMinUppercase": "Password must contain at least {{minUppercase}} uppercase letter(s)", "PasswordMinLowercase": "Password must contain at least {{minLowercase}} lowercase letter(s)", + "PasswordMinNumbers": "Password must contain at least {{minNumbers}} number(s)", + "PasswordMinSymbols": "Password must contain at least {{minSymbols}} symbol(s)", + "PasswordMinUppercase": "Password must contain at least {{minUppercase}} uppercase letter(s)", "PasswordsMustMatch": "You need to confirm by typing exactly the same as the new password", "Pattern": "Pattern", "Pending": "Pending", @@ -157,6 +153,7 @@ "RolloverType": "Rollover Type", "Save": "Save", "SaveAndClose": "Save and close", + "SaveChangesToLinkSSOAccount": "Save changes to trigger the process that will link your SSO Account.", "SecurityRoles": "Security Roles", "Seed": "Seed", "Sequence": "Sequence", @@ -209,5 +206,8 @@ "WorkflowTemplateName": "Workflow Template Name", "WorkflowTemplates": "Workflow Templates", "Year": "Year", - "YourProfileSettingsHaveBeenSaved": "Your profile settings have been saved" -} + "YourProfileSettingsHaveBeenSaved": "Your profile settings have been saved", + "e-print": "e-print", + "e-suite": "e-suite", + "e-suiteLogo": "e-suite logo" +} \ No newline at end of file diff --git a/public/locales/en/htmlIsland.json b/public/locales/en/htmlIsland.json index 9164421..3398484 100644 --- a/public/locales/en/htmlIsland.json +++ b/public/locales/en/htmlIsland.json @@ -2,7 +2,7 @@ "island": { "loadError": "Failed to load this section.", "networkError": "Network error while saving.", - "serverError": "Server error while saving.", - "saveSuccess": "Saved successfully." + "saveSuccess": "Saved successfully.", + "serverError": "Server error while saving." } -} +} \ No newline at end of file diff --git a/public/locales/en/mailTypes.json b/public/locales/en/mailTypes.json index 2cd2b8f..6417184 100644 --- a/public/locales/en/mailTypes.json +++ b/public/locales/en/mailTypes.json @@ -3,4 +3,4 @@ "DisableAuthenticator": "Disable Two Factor Authentication", "PasswordReset": "Password Reset", "PasswordResetCompleted": "Confirmation password reset" -} +} \ No newline at end of file diff --git a/public/locales/en/raci.json b/public/locales/en/raci.json index 14a4aa5..d19bcf6 100644 --- a/public/locales/en/raci.json +++ b/public/locales/en/raci.json @@ -1,6 +1,6 @@ { - "Responsible": "Responsible", "Accountable": "Accountable", "Consulted": "Consulted", - "Informed": "Informed" -} + "Informed": "Informed", + "Responsible": "Responsible" +} \ No newline at end of file diff --git a/public/locales/en/taskTypes.json b/public/locales/en/taskTypes.json index 8498a4f..111dfd5 100644 --- a/public/locales/en/taskTypes.json +++ b/public/locales/en/taskTypes.json @@ -11,4 +11,4 @@ "StageTask": "Stage", "VisualBriefReviewTask": "Visual Brief Review", "VisualBriefUploadTask": "Visual Brief Upload" -} +} \ No newline at end of file diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 5a499a8..39600e0 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -1,12 +1,14 @@ { - "SaveChangesToLinkSSOAccount": "Guarda los cambios para iniciar el proceso que vinculará tu cuenta SSO.", "Account": "Cuenta", "Activate": "Activar", "Active": "Activo", + "ActivityNameTemplate": "Plantilla de Nombre de Actividad", "Add": "Añadir", "AddDomain": "Añadir dominio", - "Address": "Dirección", + "AddTask": "Añadir tarea", "AddUser": "Añadir usuario", + "AddWorkflowTemplate": "Añadir Plantilla de Flujo de Trabajo", + "Address": "Dirección", "Admin": "Administrador", "Allowed": "Permitido", "AnEmailWithPasswordResetLinkHasBeenSent": "Se ha enviado un correo electrónico con un enlace para restablecer la contraseña.", @@ -50,15 +52,13 @@ "DisplayName": "Nombre visible", "Domain": "Dominio", "DomainEdited": "Dominio editado", - "e-print": "e-print", - "e-suite": "e-suite", - "e-suiteLogo": "Logo de e-suite", - "Edit": "Editar", - "EditDomain": "Editar dominio", - "EditUser": "Editar usuario", "EFlowAppId": "e-flow AppId", "EFlowCategoryId": "e-flow CategoryId", "EFlowHostname": "Nombre de host de e-flow", + "Edit": "Editar", + "EditDomain": "Editar dominio", + "EditUser": "Editar usuario", + "EditWorkflowTemplate": "Editar Plantilla de Flujo de Trabajo", "Email": "Correo electrónico", "EmailTemplateSaved": "Plantilla de correo guardada", "Enabled": "Habilitado", @@ -73,10 +73,10 @@ "FirstName": "Nombre", "ForgottenPassword": "Contraseña olvidada", "Form": "Formulario", - "Forms": "Formularios", "FormTemplate": "Plantilla de formulario", "FormTemplateEdited": "Plantilla de formulario editada", "FormTemplateManager": "Gestor de plantillas de formulario", + "Forms": "Formularios", "General": "General", "Glossaries": "Glosarios", "Glossary": "Glosario", @@ -85,17 +85,17 @@ "GlossaryManager": "Gestor de glosarios", "Group": "Grupo", "Home": "Inicio", - "Id": "Id", - "Increment": "Incremento", "IPAddress": "Dirección IP", "IPAddressUnblocked": "Dirección IP '{{ip}}' desbloqueada.", + "Id": "Id", + "Increment": "Incremento", "IsPublic": "Es público", "Items": "Elementos", "LastName": "Apellidos", "LastUpdated": "Última actualización", "Loading": "Cargando", - "LoginMethod": "Método de inicio de sesión", "LoggingOut": "Cerrando sesión", + "LoginMethod": "Método de inicio de sesión", "Logout": "Cerrar sesión", "Mail": "Correo", "MailTemplates": "Plantillas de correo", @@ -131,10 +131,10 @@ "Password": "Contraseña", "PasswordIsRequired": "La contraseña es obligatoria", "PasswordMinLength": "La contraseña debe tener al menos {{minPasswordLength}} caracteres", - "PasswordMinSymbols": "La contraseña debe contener al menos {{minSymbols}} símbolo(s)", - "PasswordMinNumbers": "La contraseña debe contener al menos {{minNumbers}} número(s)", - "PasswordMinUppercase": "La contraseña debe contener al menos {{minUppercase}} letra(s) mayúscula(s)", "PasswordMinLowercase": "La contraseña debe contener al menos {{minLowercase}} letra(s) minúscula(s)", + "PasswordMinNumbers": "La contraseña debe contener al menos {{minNumbers}} número(s)", + "PasswordMinSymbols": "La contraseña debe contener al menos {{minSymbols}} símbolo(s)", + "PasswordMinUppercase": "La contraseña debe contener al menos {{minUppercase}} letra(s) mayúscula(s)", "PasswordsMustMatch": "Debes confirmar escribiendo exactamente la misma contraseña nueva", "Pattern": "Patrón", "Pending": "Pendiente", @@ -146,6 +146,7 @@ "Required": "Obligatorio", "ResendConfirm": "Reenviar confirmación", "ResetPassword": "Restablecer contraseña", + "ResolveAllValidation": "Resuelva todos los errores de validación.", "Role": "Rol", "RoleAccess": "Acceso del rol", "RoleAccessUpdated": "Acceso del rol actualizado correctamente.", @@ -153,6 +154,7 @@ "RolloverType": "Tipo de traspaso", "Save": "Guardar", "SaveAndClose": "Guardar y cerrar", + "SaveChangesToLinkSSOAccount": "Guarda los cambios para iniciar el proceso que vinculará tu cuenta SSO.", "SecurityRoles": "Roles de seguridad", "Seed": "Semilla", "Sequence": "Secuencia", @@ -177,6 +179,7 @@ "Subject": "Asunto", "Support": "Soporte", "SupportingData": "Datos de soporte", + "TasksValidationError": "La configuración de las tareas es inválida.", "TemplateIdCannotBeNull": "El ID de plantilla no puede ser nulo", "TemplateUnknown": "Plantilla desconocida", "Text": "Texto", @@ -201,6 +204,11 @@ "ValidIssuer": "Emisor válido", "Version": "Versión", "VersionCannotBeNull": "La versión no puede ser nula", + "WorkflowTemplateName": "Nombre del Plantilla de Flujo de Trabajo", + "WorkflowTemplates": "Plantillas de flujos de trabajo", "Year": "Año", - "YourProfileSettingsHaveBeenSaved": "La configuración de tu perfil ha sido guardada" -} + "YourProfileSettingsHaveBeenSaved": "La configuración de tu perfil ha sido guardada", + "e-print": "e-print", + "e-suite": "e-suite", + "e-suiteLogo": "Logo de e-suite" +} \ No newline at end of file diff --git a/public/locales/es/htmlIsland.json b/public/locales/es/htmlIsland.json index bfd5e79..97e2570 100644 --- a/public/locales/es/htmlIsland.json +++ b/public/locales/es/htmlIsland.json @@ -2,7 +2,7 @@ "island": { "loadError": "No se pudo cargar esta sección.", "networkError": "Error de red al guardar.", - "serverError": "Error del servidor al guardar.", - "saveSuccess": "Guardado correctamente." + "saveSuccess": "Guardado correctamente.", + "serverError": "Error del servidor al guardar." } -} +} \ No newline at end of file diff --git a/public/locales/es/mailTypes.json b/public/locales/es/mailTypes.json index 1573adf..0f2c57e 100644 --- a/public/locales/es/mailTypes.json +++ b/public/locales/es/mailTypes.json @@ -3,4 +3,4 @@ "DisableAuthenticator": "Desactivar la autenticación en dos pasos", "PasswordReset": "Restablecer contraseña", "PasswordResetCompleted": "Confirmación de restablecimiento de contraseña" -} +} \ No newline at end of file diff --git a/public/locales/es/raci.json b/public/locales/es/raci.json new file mode 100644 index 0000000..dbfdcb0 --- /dev/null +++ b/public/locales/es/raci.json @@ -0,0 +1,6 @@ +{ + "Accountable": "Responsable", + "Consulted": "Consultado", + "Informed": "Informado", + "Responsible": "Responsable" +} \ No newline at end of file diff --git a/public/locales/es/taskTypes.json b/public/locales/es/taskTypes.json new file mode 100644 index 0000000..a9ae9ef --- /dev/null +++ b/public/locales/es/taskTypes.json @@ -0,0 +1,14 @@ +{ + "AdhocApprovalTask": "Aprobación Ad Hoc", + "ApprovalTask": "Aprobación", + "AssetUploadTask": "Carga de Activos", + "BasicTask": "Básico", + "ContentCollationTask": "Colección de contenido", + "FileReleaseTask": "Publicación del archivo", + "FormDataInputTask": "Introducción de datos en formularios", + "LinkActivityTask": "Actividad de Enlace", + "MilestoneTask": "Hito de camino", + "StageTask": "Escenario", + "VisualBriefReviewTask": "Revisión breve y visual", + "VisualBriefUploadTask": "Carga de resumen visual" +} \ No newline at end of file diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index a7852a0..f17c38f 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -2,10 +2,13 @@ "Account": "Compte", "Activate": "Activer", "Active": "Actif", + "ActivityNameTemplate": "Modèle de nom d'activité", "Add": "Ajouter", "AddDomain": "Ajouter un domaine", - "Address": "Adresse", + "AddTask": "Ajouter une tâche", "AddUser": "Ajouter un utilisateur", + "AddWorkflowTemplate": "Ajouter un modèle de flux de travail", + "Address": "Adresse", "Admin": "Administrateur", "Allowed": "Autorisé", "AnEmailWithPasswordResetLinkHasBeenSent": "Un e-mail contenant un lien de réinitialisation du mot de passe a été envoyé.", @@ -49,15 +52,13 @@ "DisplayName": "Nom d’affichage", "Domain": "Domaine", "DomainEdited": "Domaine modifié", - "e-print": "e-print", - "e-suite": "e-suite", - "e-suiteLogo": "Logo e-suite", - "Edit": "Modifier", - "EditDomain": "Modifier le domaine", - "EditUser": "Modifier l’utilisateur", "EFlowAppId": "e-flow AppId", "EFlowCategoryId": "e-flow CategoryId", "EFlowHostname": "Nom d’hôte e-flow", + "Edit": "Modifier", + "EditDomain": "Modifier le domaine", + "EditUser": "Modifier l’utilisateur", + "EditWorkflowTemplate": "Modifier le modèle de flux de travail", "Email": "E-mail", "EmailTemplateSaved": "Modèle d’e-mail enregistré", "Enabled": "Activé", @@ -72,10 +73,10 @@ "FirstName": "Prénom", "ForgottenPassword": "Mot de passe oublié", "Form": "Formulaire", - "Forms": "Formulaires", "FormTemplate": "Modèle de formulaire", "FormTemplateEdited": "Modèle de formulaire modifié", "FormTemplateManager": "Gestionnaire de modèles de formulaire", + "Forms": "Formulaires", "General": "Général", "Glossaries": "Glossaires", "Glossary": "Glossaire", @@ -84,16 +85,17 @@ "GlossaryManager": "Gestionnaire de glossaire", "Group": "Groupe", "Home": "Accueil", - "Id": "Id", - "Increment": "Incrément", "IPAddress": "Adresse IP", "IPAddressUnblocked": "Adresse IP '{{ip}}' débloquée.", + "Id": "Id", + "Increment": "Incrément", "IsPublic": "Public", "Items": "Éléments", "LastName": "Nom de famille", "LastUpdated": "Dernière mise à jour", "Loading": "Chargement", "LoggingOut": "Déconnexion", + "LoginMethod": "Méthode de connexion", "Logout": "Se déconnecter", "Mail": "Courrier", "MailTemplates": "Modèles d’e-mail", @@ -129,6 +131,10 @@ "Password": "Mot de passe", "PasswordIsRequired": "Le mot de passe est requis", "PasswordMinLength": "Le mot de passe doit contenir au moins {{minPasswordLength}} caractères", + "PasswordMinLowercase": "Le mot de passe doit contenir au moins {{minLowercase}} lettres minuscules.", + "PasswordMinNumbers": "Le mot de passe doit contenir au moins {{minNumbers}} chiffres.", + "PasswordMinSymbols": "Le mot de passe doit contenir au moins {{minSymbols}} symboles.", + "PasswordMinUppercase": "Le mot de passe doit contenir au moins {{minUppercase}} lettres majuscules.", "PasswordsMustMatch": "Vous devez confirmer en saisissant exactement le même nouveau mot de passe", "Pattern": "Motif", "Pending": "En attente", @@ -137,16 +143,18 @@ "PrintSpecification": "Imprimer la spécification", "Profile": "Profil", "ProfileSaved": "Profil mis à jour.", - "ResendConfirm": "Renvoyer la confirmation", "Required": "Requis", + "ResendConfirm": "Renvoyer la confirmation", "ResetPassword": "Réinitialiser le mot de passe", - "RolloverType": "Type de report", + "ResolveAllValidation": "Résolvez tous les erreurs de validation.", "Role": "Rôle", "RoleAccess": "Accès par rôle", "RoleAccessUpdated": "Accès par rôle mis à jour avec succès.", "RoleEdited": "Rôle modifié", + "RolloverType": "Type de report", "Save": "Enregistrer", "SaveAndClose": "Enregistrer et fermer", + "SaveChangesToLinkSSOAccount": "Sauver les modifications permettra de déclencher le processus qui liera votre compte SSO.", "SecurityRoles": "Rôles de sécurité", "Seed": "Graine", "Sequence": "Séquence", @@ -171,6 +179,7 @@ "Subject": "Sujet", "Support": "Support", "SupportingData": "Données de support", + "TasksValidationError": "La configuration des tâches est invalide.", "TemplateIdCannotBeNull": "L’ID du modèle ne peut pas être nul", "TemplateUnknown": "Modèle inconnu", "Text": "Texte", @@ -185,15 +194,21 @@ "Up": "Haut", "User": "Utilisateur", "UserAddedToRole": "Utilisateur ajouté au rôle", + "UserEdited": "Utilisateur modifié", "UserManager": "Gestionnaire d’utilisateurs", "UserName": "Nom d’utilisateur", "UsernameIsRequired": "Le nom d’utilisateur est requis", "UsernameMustBeValidEmail": "Le nom d’utilisateur doit être une adresse e-mail valide", "Users": "Utilisateurs", - "UserEdited": "Utilisateur modifié", + "UsingTwoFactorAuthentication": "Utiliser l’authentification à deux facteurs", "ValidIssuer": "Émetteur valide", "Version": "Version", "VersionCannotBeNull": "La version ne peut pas être nulle", + "WorkflowTemplateName": "Nom du modèle de flux de travail", + "WorkflowTemplates": "Modèles de processus de travail", "Year": "Année", - "YourProfileSettingsHaveBeenSaved": "Vos paramètres de profil ont été enregistrés" -} + "YourProfileSettingsHaveBeenSaved": "Vos paramètres de profil ont été enregistrés", + "e-print": "e-print", + "e-suite": "e-suite", + "e-suiteLogo": "Logo e-suite" +} \ No newline at end of file diff --git a/public/locales/fr/htmlIsland.json b/public/locales/fr/htmlIsland.json index 1a7258f..03f2bcd 100644 --- a/public/locales/fr/htmlIsland.json +++ b/public/locales/fr/htmlIsland.json @@ -2,7 +2,7 @@ "island": { "loadError": "Échec du chargement de cette section.", "networkError": "Erreur réseau lors de l’enregistrement.", - "serverError": "Erreur du serveur lors de l’enregistrement.", - "saveSuccess": "Enregistré avec succès." + "saveSuccess": "Enregistré avec succès.", + "serverError": "Erreur du serveur lors de l’enregistrement." } -} +} \ No newline at end of file diff --git a/public/locales/fr/mailTypes.json b/public/locales/fr/mailTypes.json index a1625ca..fcf2c43 100644 --- a/public/locales/fr/mailTypes.json +++ b/public/locales/fr/mailTypes.json @@ -3,4 +3,4 @@ "DisableAuthenticator": "Désactiver l’authentification à deux facteurs", "PasswordReset": "Réinitialisation du mot de passe", "PasswordResetCompleted": "Confirmation de la réinitialisation du mot de passe" -} +} \ No newline at end of file diff --git a/public/locales/fr/raci.json b/public/locales/fr/raci.json new file mode 100644 index 0000000..f19fb5c --- /dev/null +++ b/public/locales/fr/raci.json @@ -0,0 +1,6 @@ +{ + "Accountable": "Responsable", + "Consulted": "Consulté", + "Informed": "Bien informé", + "Responsible": "Responsable" +} \ No newline at end of file diff --git a/public/locales/fr/taskTypes.json b/public/locales/fr/taskTypes.json new file mode 100644 index 0000000..68ed934 --- /dev/null +++ b/public/locales/fr/taskTypes.json @@ -0,0 +1,14 @@ +{ + "AdhocApprovalTask": "Approbation Ad Hoc", + "ApprovalTask": "Approbation", + "AssetUploadTask": "Téléchargement d'actifs", + "BasicTask": "De base", + "ContentCollationTask": "Collation du contenu", + "FileReleaseTask": "Lancement du fichier", + "FormDataInputTask": "Saisie de données dans un formulaire", + "LinkActivityTask": "Activité de lien", + "MilestoneTask": "Jalon majeur", + "StageTask": "Scène", + "VisualBriefReviewTask": "Aperçu visuel sommaire", + "VisualBriefUploadTask": "Téléchargement du document visuel succinct" +} \ No newline at end of file diff --git a/public/locales/ur/htmlIsland.json b/public/locales/ur/htmlIsland.json index 0cb134e..4e567e2 100644 --- a/public/locales/ur/htmlIsland.json +++ b/public/locales/ur/htmlIsland.json @@ -2,7 +2,7 @@ "island": { "loadError": "اس حصے کو لوڈ کرنے میں ناکامی ہوئی۔", "networkError": "محفوظ کرتے وقت نیٹ ورک کی خرابی۔", - "serverError": "محفوظ کرتے وقت سرور کی خرابی۔", - "saveSuccess": "کامیابی کے ساتھ محفوظ کر لیا گیا۔" + "saveSuccess": "کامیابی کے ساتھ محفوظ کر لیا گیا۔", + "serverError": "محفوظ کرتے وقت سرور کی خرابی۔" } -} +} \ No newline at end of file diff --git a/public/locales/ur/mailTypes.json b/public/locales/ur/mailTypes.json index 08fe763..b9b49fd 100644 --- a/public/locales/ur/mailTypes.json +++ b/public/locales/ur/mailTypes.json @@ -3,4 +3,4 @@ "DisableAuthenticator": "ٹو فیکٹر تصدیق غیر فعال کریں", "PasswordReset": "پاس ورڈ ری سیٹ", "PasswordResetCompleted": "پاس ورڈ ری سیٹ کی تصدیق" -} +} \ No newline at end of file diff --git a/sync-locales-azure.ps1 b/sync-locales-azure.ps1 deleted file mode 100644 index 84bfe65..0000000 --- a/sync-locales-azure.ps1 +++ /dev/null @@ -1,214 +0,0 @@ -param( - [string]$LocalesRoot = "./public/locales", - [string]$MasterLocale = "en", - - # Azure OpenAI settings - [string]$AzureOpenAIEndpoint = "", - [string]$AzureOpenAIApiKey = "", - [string]$AzureOpenAIDeployment = "" # e.g. "gpt-4o-mini" -) - -if (-not $AzureOpenAIEndpoint -or -not $AzureOpenAIApiKey -or -not $AzureOpenAIDeployment) { - Write-Host "You must provide -AzureOpenAIEndpoint, -AzureOpenAIApiKey, and -AzureOpenAIDeployment." -ForegroundColor Yellow - exit 1 -} - -Write-Host "Current working directory: $(Get-Location)" -Write-Host "Locales root: $LocalesRoot" -Write-Host "Master locale: $MasterLocale" - -# Simple in-memory cache to avoid re-translating identical strings -$TranslationCache = @{} - -function Get-FromCache { - param( - [string]$text, - [string]$targetLocale - ) - - $key = "$targetLocale|$text" - if ($TranslationCache.ContainsKey($key)) { - return $TranslationCache[$key] - } - return $null -} - -function Add-ToCache { - param( - [string]$text, - [string]$targetLocale, - [string]$translated - ) - - $key = "$targetLocale|$text" - $TranslationCache[$key] = $translated -} - -function Translate-Text { - param( - [string]$text, - [string]$targetLocale - ) - - # Check cache first - $cached = Get-FromCache -text $text -targetLocale $targetLocale - if ($cached) { - return $cached - } - - $headers = @{ - "api-key" = $AzureOpenAIApiKey - "Content-Type" = "application/json" - } - - $systemPrompt = "You are a translation engine. Translate the user text into $targetLocale. " + - "Return ONLY the translated text with no commentary, quotes, or extra formatting." - - $body = @{ - messages = @( - @{ - role = "system" - content = $systemPrompt - }, - @{ - role = "user" - content = $text - } - ) - temperature = 0 - } | ConvertTo-Json -Depth 10 - - $url = "$AzureOpenAIEndpoint/openai/deployments/$AzureOpenAIDeployment/chat/completions?api-version=2024-02-15-preview" - - $maxRetries = 3 - $delaySeconds = 2 - - for ($attempt = 1; $attempt -le $maxRetries; $attempt++) { - try { - $response = Invoke-RestMethod ` - -Uri $url ` - -Method Post ` - -Headers $headers ` - -Body $body - - $translated = $response.choices[0].message.content.Trim() - Add-ToCache -text $text -targetLocale $targetLocale -translated $translated - return $translated - } - catch { - Write-Host " Translation error (attempt $attempt): $($_.Exception.Message)" -ForegroundColor Red - if ($attempt -lt $maxRetries) { - Start-Sleep -Seconds $delaySeconds - } else { - Write-Host " Failed to translate after $maxRetries attempts. Falling back to source text." -ForegroundColor Yellow - Add-ToCache -text $text -targetLocale $targetLocale -translated $text - return $text - } - } - } -} - -function Merge-TranslationObjects { - param( - [hashtable]$master, - [hashtable]$target, - [string]$locale, - [string]$path = "" - ) - - foreach ($key in $master.Keys) { - $currentPath = if ($path) { "$path.$key" } else { $key } - - if (-not $target.ContainsKey($key)) { - if ($master[$key] -is [string]) { - Write-Host " Missing key: $currentPath → translating to $locale" - $translated = Translate-Text -text $master[$key] -targetLocale $locale - $target[$key] = $translated - } - elseif ($master[$key] -is [hashtable]) { - $target[$key] = @{} - Merge-TranslationObjects -master $master[$key] -target $target[$key] -locale $locale -path $currentPath - } - else { - # Non-string leaf (number, bool, etc.) – just copy - $target[$key] = $master[$key] - } - } - else { - # Key exists – preserve existing value, but recurse into nested objects - if ($master[$key] -is [hashtable] -and $target[$key] -is [hashtable]) { - Merge-TranslationObjects -master $master[$key] -target $target[$key] -locale $locale -path $currentPath - } - } - } -} - -$masterPath = Join-Path $LocalesRoot $MasterLocale - -if (-not (Test-Path $masterPath)) { - Write-Host "Master locale folder not found at: $masterPath" -ForegroundColor Red - exit 1 -} - -$masterFiles = Get-ChildItem $masterPath -Filter *.json - -if ($masterFiles.Count -eq 0) { - Write-Host "No JSON files found in master locale folder: $masterPath" -ForegroundColor Yellow - exit 0 -} - -$localeFolders = Get-ChildItem $LocalesRoot -Directory | Where-Object { $_.Name -ne $MasterLocale } - -foreach ($localeFolder in $localeFolders) { - $localeName = $localeFolder.Name - Write-Host "" - Write-Host "Syncing locale: $localeName" -ForegroundColor Cyan - - foreach ($file in $masterFiles) { - $masterFilePath = $file.FullName - $targetFilePath = Join-Path $localeFolder.FullName $file.Name - - Write-Host " File: $($file.Name)" - Write-Host " Reading master file: $masterFilePath" - Write-Host " File exists: $(Test-Path $masterFilePath)" - Write-Host " File size: $((Get-Item $masterFilePath).Length) bytes" - - $masterJsonRaw = Get-Content $masterFilePath -Raw -Encoding UTF8 - - try { - $masterJson = $masterJsonRaw | ConvertFrom-Json -AsHashtable - } - catch { - Write-Host " Error parsing master JSON: $masterFilePath" -ForegroundColor Red - continue - } - - if (Test-Path $targetFilePath) { - $targetJsonRaw = Get-Content $targetFilePath -Raw -Encoding UTF8 - try { - $targetJson = $targetJsonRaw | ConvertFrom-Json -AsHashtable - } - catch { - Write-Host " Error parsing target JSON, starting from empty: $targetFilePath" -ForegroundColor Yellow - $targetJson = @{} - } - } else { - Write-Host " Creating missing file: $($file.Name)" - $targetJson = @{} - } - - Merge-TranslationObjects -master $masterJson -target $targetJson -locale $localeName - - try { - $jsonOut = $targetJson | ConvertTo-Json -Depth 50 - $jsonOut | Set-Content $targetFilePath -Encoding UTF8 - Write-Host " Updated: $($file.Name)" - } - catch { - Write-Host " Error writing JSON to: $targetFilePath" -ForegroundColor Red - } - } -} - -Write-Host "" -Write-Host "All locales synced and translated (where needed)." -ForegroundColor Green \ No newline at end of file diff --git a/sync-locales-github.ps1 b/sync-locales-github.ps1 deleted file mode 100644 index fd93340..0000000 --- a/sync-locales-github.ps1 +++ /dev/null @@ -1,185 +0,0 @@ -param( - [string]$LocalesRoot = "./public/locales", - [string]$MasterLocale = "en", - [string]$GitHubToken = "" -) - -Write-Host "Current working directory: $(Get-Location)" - -if (-not $GitHubToken) { - Write-Host "GitHubToken not provided. Please pass -GitHubToken 'YOUR_PAT' when running the script." -ForegroundColor Yellow - exit 1 -} - -# Simple in-memory cache to avoid re-translating identical strings -$TranslationCache = @{} - -function Get-FromCache { - param( - [string]$text, - [string]$targetLocale - ) - - $key = "$targetLocale|$text" - if ($TranslationCache.ContainsKey($key)) { - return $TranslationCache[$key] - } - return $null -} - -function Add-ToCache { - param( - [string]$text, - [string]$targetLocale, - [string]$translated - ) - - $key = "$targetLocale|$text" - $TranslationCache[$key] = $translated -} - -function Translate-Text { - param( - [string]$text, - [string]$targetLocale, - [string]$githubToken - ) - - $headers = @{ - "Authorization" = "Bearer $githubToken" - "X-GitHub-Api-Version" = "2023-07-07" - "Content-Type" = "application/json" - } - - $body = @{ - messages = @( - @{ - role = "system" - content = "You are a translation engine. Translate the user text into $targetLocale. Return ONLY the translated text with no commentary." - }, - @{ - role = "user" - content = $text - } - ) - } | ConvertTo-Json -Depth 10 - - $response = Invoke-RestMethod ` - -Uri "https://api.githubcopilot.com/chat/completions" ` - -Method Post ` - -Headers $headers ` - -Body $body - - return $response.choices[0].message.content.Trim() -} - -function Merge-TranslationObjects { - param( - [hashtable]$master, - [hashtable]$target, - [string]$locale, - [string]$path = "" - ) - - foreach ($key in $master.Keys) { - $currentPath = if ($path) { "$path.$key" } else { $key } - - if (-not $target.ContainsKey($key)) { - if ($master[$key] -is [string]) { - Write-Host " Missing key: $currentPath → translating to $locale" - $translated = Translate-Text -text $master[$key] -targetLocale $locale -githubToken $GitHubToken - $target[$key] = $translated - } - elseif ($master[$key] -is [hashtable]) { - $target[$key] = @{} - Merge-TranslationObjects -master $master[$key] -target $target[$key] -locale $locale -path $currentPath - } - else { - # Non-string leaf (number, bool, etc.) – just copy - $target[$key] = $master[$key] - } - } - else { - # Key exists – preserve existing value, but recurse into nested objects - if ($master[$key] -is [hashtable] -and $target[$key] -is [hashtable]) { - Merge-TranslationObjects -master $master[$key] -target $target[$key] -locale $locale -path $currentPath - } - } - } -} - -Write-Host "Locales root: $LocalesRoot" -Write-Host "Master locale: $MasterLocale" - -$masterPath = Join-Path $LocalesRoot $MasterLocale - -if (-not (Test-Path $masterPath)) { - Write-Host "Master locale folder not found at: $masterPath" -ForegroundColor Red - exit 1 -} - -$masterFiles = Get-ChildItem $masterPath -Filter *.json - -if ($masterFiles.Count -eq 0) { - Write-Host "No JSON files found in master locale folder: $masterPath" -ForegroundColor Yellow - exit 0 -} - -$localeFolders = Get-ChildItem $LocalesRoot -Directory | Where-Object { $_.Name -ne $MasterLocale } - -foreach ($localeFolder in $localeFolders) { - $localeName = $localeFolder.Name - Write-Host "" - Write-Host "Syncing locale: $localeName" -ForegroundColor Cyan - - foreach ($file in $masterFiles) { - $masterFilePath = $file.FullName - $targetFilePath = Join-Path $localeFolder.FullName $file.Name - - Write-Host " File: $($file.Name)" - - Write-Host " Reading master file: $masterFilePath" - Write-Host " File exists: $(Test-Path $masterFilePath)" - Write-Host " File size: $((Get-Item $masterFilePath).Length) bytes" - - $masterJsonRaw = Get-Content $masterFilePath -Raw -Encoding UTF8 - - try { - $masterJson = $masterJsonRaw | ConvertFrom-Json -AsHashtable - } - catch { - Write-Host " Error parsing master JSON: $masterFilePath" -ForegroundColor Red - continue - } - - if (Test-Path $targetFilePath) { - $targetJsonRaw = Get-Content $targetFilePath -Raw -Encoding UTF8 - - try { - $targetJson = $targetJsonRaw | ConvertFrom-Json -AsHashtable - } - catch { - Write-Host " Error parsing target JSON, starting from empty: $targetFilePath" -ForegroundColor Yellow - $targetJson = @{} - } - } - else { - Write-Host " Creating missing file: $($file.Name)" - $targetJson = @{} - } - - Merge-TranslationObjects -master $masterJson -target $targetJson -locale $localeName - - try { - $jsonOut = $targetJson | ConvertTo-Json -Depth 50 - $jsonOut | Set-Content $targetFilePath -Encoding UTF8 - Write-Host " Updated: $($file.Name)" - } - catch { - Write-Host " Error writing JSON to: $targetFilePath" -ForegroundColor Red - } - } -} - -Write-Host "" -Write-Host "All locales synced and translated (where needed)." -ForegroundColor Green \ No newline at end of file