Updated translations using new AI Engine!

This commit is contained in:
Colin Dawson 2026-02-19 10:01:54 +00:00
parent 88d21c2101
commit 85bf314bc4
31 changed files with 229 additions and 576 deletions

View File

@ -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"

View File

@ -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"

View File

@ -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"
}

View File

@ -2,7 +2,7 @@
"island": {
"loadError": "Неуспешно зареждане на този раздел.",
"networkError": "Мрежова грешка при запазване.",
"serverError": "Сървърна грешка при запазване.",
"saveSuccess": "Успешно запазено."
"saveSuccess": "Успешно запазено.",
"serverError": "Сървърна грешка при запазване."
}
}
}

View File

@ -3,4 +3,4 @@
"DisableAuthenticator": "Деактивиране на двуфакторното удостоверяване",
"PasswordReset": "Нулиране на парола",
"PasswordResetCompleted": "Потвърждение за нулиране на паролата"
}
}

View File

@ -0,0 +1,6 @@
{
"Accountable": "Отговоран",
"Consulted": "Порадили се",
"Informed": "Информисани",
"Responsible": "Одговоран"
}

View File

@ -0,0 +1,14 @@
{
"AdhocApprovalTask": "Импровизовано одобрење",
"ApprovalTask": "Одобрење",
"AssetUploadTask": "Учитавање датотека",
"BasicTask": "Базично",
"ContentCollationTask": "Колекционирање садржаја",
"FileReleaseTask": "Оприлачење датотеке",
"FormDataInputTask": "Унос података у формулар",
"LinkActivityTask": "Активност преко линка",
"MilestoneTask": "Милинјум",
"StageTask": "Позориште",
"VisualBriefReviewTask": "Визуелни преглед",
"VisualBriefUploadTask": "Уплођивање визуелног сажетка"
}

View File

@ -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"
}

View File

@ -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."
}
}
}

View File

@ -3,4 +3,4 @@
"DisableAuthenticator": "Zwei-Faktor-Authentifizierung deaktivieren",
"PasswordReset": "Passwort zurücksetzen",
"PasswordResetCompleted": "Bestätigung der Passwortzurücksetzung"
}
}

View File

@ -0,0 +1,6 @@
{
"Accountable": "Verantwortlich",
"Consulted": "Beraten worden.",
"Informed": "Beflügelt durch Informationen",
"Responsible": "Verantwortungsbewusst"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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."
}
}
}

View File

@ -3,4 +3,4 @@
"DisableAuthenticator": "Disable Two Factor Authentication",
"PasswordReset": "Password Reset",
"PasswordResetCompleted": "Confirmation password reset"
}
}

View File

@ -1,6 +1,6 @@
{
"Responsible": "Responsible",
"Accountable": "Accountable",
"Consulted": "Consulted",
"Informed": "Informed"
}
"Informed": "Informed",
"Responsible": "Responsible"
}

View File

@ -11,4 +11,4 @@
"StageTask": "Stage",
"VisualBriefReviewTask": "Visual Brief Review",
"VisualBriefUploadTask": "Visual Brief Upload"
}
}

View File

@ -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"
}

View File

@ -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."
}
}
}

View File

@ -3,4 +3,4 @@
"DisableAuthenticator": "Desactivar la autenticación en dos pasos",
"PasswordReset": "Restablecer contraseña",
"PasswordResetCompleted": "Confirmación de restablecimiento de contraseña"
}
}

View File

@ -0,0 +1,6 @@
{
"Accountable": "Responsable",
"Consulted": "Consultado",
"Informed": "Informado",
"Responsible": "Responsable"
}

View File

@ -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"
}

View File

@ -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 daffichage",
"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 lutilisateur",
"EFlowAppId": "e-flow AppId",
"EFlowCategoryId": "e-flow CategoryId",
"EFlowHostname": "Nom dhôte e-flow",
"Edit": "Modifier",
"EditDomain": "Modifier le domaine",
"EditUser": "Modifier lutilisateur",
"EditWorkflowTemplate": "Modifier le modèle de flux de travail",
"Email": "E-mail",
"EmailTemplateSaved": "Modèle de-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 de-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": "LID 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 dutilisateurs",
"UserName": "Nom dutilisateur",
"UsernameIsRequired": "Le nom dutilisateur est requis",
"UsernameMustBeValidEmail": "Le nom dutilisateur doit être une adresse e-mail valide",
"Users": "Utilisateurs",
"UserEdited": "Utilisateur modifié",
"UsingTwoFactorAuthentication": "Utiliser lauthentification à 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"
}

View File

@ -2,7 +2,7 @@
"island": {
"loadError": "Échec du chargement de cette section.",
"networkError": "Erreur réseau lors de lenregistrement.",
"serverError": "Erreur du serveur lors de lenregistrement.",
"saveSuccess": "Enregistré avec succès."
"saveSuccess": "Enregistré avec succès.",
"serverError": "Erreur du serveur lors de lenregistrement."
}
}
}

View File

@ -3,4 +3,4 @@
"DisableAuthenticator": "Désactiver lauthentification à deux facteurs",
"PasswordReset": "Réinitialisation du mot de passe",
"PasswordResetCompleted": "Confirmation de la réinitialisation du mot de passe"
}
}

View File

@ -0,0 +1,6 @@
{
"Accountable": "Responsable",
"Consulted": "Consulté",
"Informed": "Bien informé",
"Responsible": "Responsable"
}

View File

@ -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"
}

View File

@ -2,7 +2,7 @@
"island": {
"loadError": "اس حصے کو لوڈ کرنے میں ناکامی ہوئی۔",
"networkError": "محفوظ کرتے وقت نیٹ ورک کی خرابی۔",
"serverError": "محفوظ کرتے وقت سرور کی خرابی۔",
"saveSuccess": "کامیابی کے ساتھ محفوظ کر لیا گیا۔"
"saveSuccess": "کامیابی کے ساتھ محفوظ کر لیا گیا۔",
"serverError": "محفوظ کرتے وقت سرور کی خرابی۔"
}
}
}

View File

@ -3,4 +3,4 @@
"DisableAuthenticator": "ٹو فیکٹر تصدیق غیر فعال کریں",
"PasswordReset": "پاس ورڈ ری سیٹ",
"PasswordResetCompleted": "پاس ورڈ ری سیٹ کی تصدیق"
}
}

View File

@ -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

View File

@ -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