From 915c956a708039f6ee979017ab796211ecc04718 Mon Sep 17 00:00:00 2001 From: Daniel Cruz Date: Thu, 17 Oct 2024 21:38:59 -0500 Subject: [PATCH 1/5] Adds translation for the loading label inside the LoadingProject component --- frontend/src/components/modals/LoadingProject.tsx | 6 +++++- frontend/src/i18n/translation.json | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/modals/LoadingProject.tsx b/frontend/src/components/modals/LoadingProject.tsx index 7814a6fe33e1..59c85342d8fc 100644 --- a/frontend/src/components/modals/LoadingProject.tsx +++ b/frontend/src/components/modals/LoadingProject.tsx @@ -1,6 +1,8 @@ +import { useTranslation } from "react-i18next"; import LoadingSpinnerOuter from "#/assets/loading-outer.svg?react"; import { cn } from "#/utils/utils"; import ModalBody from "./ModalBody"; +import { I18nKey } from "#/i18n/declaration"; interface LoadingSpinnerProps { size: "small" | "large"; @@ -28,10 +30,12 @@ interface LoadingProjectModalProps { } function LoadingProjectModal({ message }: LoadingProjectModalProps) { + const { t } = useTranslation(); + return ( - {message || "Loading..."} + {message || "Loading..." || t(I18nKey.LOADING_PROJECT$LOADING)} diff --git a/frontend/src/i18n/translation.json b/frontend/src/i18n/translation.json index 795c60e051f2..d1ff8792e21d 100644 --- a/frontend/src/i18n/translation.json +++ b/frontend/src/i18n/translation.json @@ -1510,5 +1510,9 @@ "ar": "في انتظار جاهزية العميل...", "fr": "En attente que le client soit prêt...", "tr": "İstemcinin hazır olması bekleniyor..." + }, + "LOADING_PROJECT$LOADING": { + "en": "Loading...", + "es": "Cargando..." } } From f269b958c28fc78f95fa9e1a22fcde76cb14a004 Mon Sep 17 00:00:00 2001 From: Daniel Cruz Date: Mon, 4 Nov 2024 20:39:44 -0500 Subject: [PATCH 2/5] Adds translations for the modal folder --- .../modals/AccountSettingsModal.tsx | 11 +- .../modals/ConnectToGitHubByTokenModal.tsx | 15 ++- .../src/components/modals/LoadingProject.tsx | 2 +- .../modals/connect-to-github-modal.tsx | 11 +- .../modals/feedback/FeedbackModal.tsx | 19 +-- .../components/modals/security/Security.tsx | 6 +- .../modals/security/invariant/Invariant.tsx | 31 ++--- frontend/src/i18n/translation.json | 127 +++++++++++++++++- 8 files changed, 184 insertions(+), 38 deletions(-) diff --git a/frontend/src/components/modals/AccountSettingsModal.tsx b/frontend/src/components/modals/AccountSettingsModal.tsx index 1acdacc0319d..339f158557af 100644 --- a/frontend/src/components/modals/AccountSettingsModal.tsx +++ b/frontend/src/components/modals/AccountSettingsModal.tsx @@ -1,5 +1,6 @@ import { useFetcher, useRouteLoaderData } from "@remix-run/react"; import React from "react"; +import { useTranslation } from "react-i18next"; import { BaseModalTitle } from "./confirmation-modals/BaseModal"; import ModalBody from "./ModalBody"; import ModalButton from "../buttons/ModalButton"; @@ -9,6 +10,7 @@ import { clientLoader } from "#/routes/_oh"; import { clientAction as settingsClientAction } from "#/routes/settings"; import { clientAction as loginClientAction } from "#/routes/login"; import { AvailableLanguages } from "#/i18n"; +import { I18nKey } from "#/i18n/declaration"; interface AccountSettingsModalProps { onClose: () => void; @@ -21,6 +23,7 @@ function AccountSettingsModal({ selectedLanguage, gitHubError, }: AccountSettingsModalProps) { + const { t } = useTranslation(); const data = useRouteLoaderData("routes/_oh"); const settingsFetcher = useFetcher({ key: "settings", @@ -82,13 +85,13 @@ function AccountSettingsModal({ /> {gitHubError && (

- GitHub token is invalid. Please try again. + {t(I18nKey.ACCOUNT_SETTINGS_MODAL$GITHUB_TOKEN_INVALID)}

)} {data?.ghToken && !gitHubError && ( { settingsFetcher.submit( {}, @@ -109,11 +112,11 @@ function AccountSettingsModal({ } type="submit" intent="account" - text="Save" + text={t(I18nKey.ACCOUNT_SETTINGS_MODAL$SAVE)} className="bg-[#4465DB]" /> diff --git a/frontend/src/components/modals/ConnectToGitHubByTokenModal.tsx b/frontend/src/components/modals/ConnectToGitHubByTokenModal.tsx index f9ec5ca673d9..f56b0f707ca0 100644 --- a/frontend/src/components/modals/ConnectToGitHubByTokenModal.tsx +++ b/frontend/src/components/modals/ConnectToGitHubByTokenModal.tsx @@ -1,4 +1,5 @@ import { Form, useNavigation } from "@remix-run/react"; +import { useTranslation } from "react-i18next"; import { BaseModalDescription, BaseModalTitle, @@ -7,10 +8,11 @@ import ModalButton from "../buttons/ModalButton"; import AllHandsLogo from "#/assets/branding/all-hands-logo-spark.svg?react"; import ModalBody from "./ModalBody"; import { CustomInput } from "../form/custom-input"; +import { I18nKey } from "#/i18n/declaration"; function ConnectToGitHubByTokenModal() { const navigation = useNavigation(); - + const { t } = useTranslation(); return (
@@ -29,13 +31,18 @@ function ConnectToGitHubByTokenModal() { required />

- By connecting you agree to our{" "} - terms of service. + {t( + I18nKey.CONNECT_TO_GITHUB_BY_TOKEN_MODAL$BY_CONNECTING_YOU_AGREE, + )}{" "} + + {t(I18nKey.CONNECT_TO_GITHUB_BY_TOKEN_MODAL$TERMS_OF_SERVICE)} + + .

diff --git a/frontend/src/components/modals/LoadingProject.tsx b/frontend/src/components/modals/LoadingProject.tsx index 59c85342d8fc..5e65f2a77e5f 100644 --- a/frontend/src/components/modals/LoadingProject.tsx +++ b/frontend/src/components/modals/LoadingProject.tsx @@ -35,7 +35,7 @@ function LoadingProjectModal({ message }: LoadingProjectModalProps) { return ( - {message || "Loading..." || t(I18nKey.LOADING_PROJECT$LOADING)} + {message || t(I18nKey.LOADING_PROJECT$LOADING)} diff --git a/frontend/src/components/modals/connect-to-github-modal.tsx b/frontend/src/components/modals/connect-to-github-modal.tsx index 708dbc21c964..62fb9dedbc20 100644 --- a/frontend/src/components/modals/connect-to-github-modal.tsx +++ b/frontend/src/components/modals/connect-to-github-modal.tsx @@ -1,4 +1,5 @@ import { useFetcher, useRouteLoaderData } from "@remix-run/react"; +import { useTranslation } from "react-i18next"; import ModalBody from "./ModalBody"; import { CustomInput } from "../form/custom-input"; import ModalButton from "../buttons/ModalButton"; @@ -8,6 +9,7 @@ import { } from "./confirmation-modals/BaseModal"; import { clientLoader } from "#/routes/_oh"; import { clientAction } from "#/routes/login"; +import { I18nKey } from "#/i18n/declaration"; interface ConnectToGitHubModalProps { onClose: () => void; @@ -16,6 +18,7 @@ interface ConnectToGitHubModalProps { export function ConnectToGitHubModal({ onClose }: ConnectToGitHubModalProps) { const data = useRouteLoaderData("routes/_oh"); const fetcher = useFetcher({ key: "login" }); + const { t } = useTranslation(); return ( @@ -24,14 +27,14 @@ export function ConnectToGitHubModal({ onClose }: ConnectToGitHubModalProps) { - Get your token{" "} + {t(I18nKey.CONNECT_TO_GITHUB_MODAL$GET_YOUR_TOKEN)}{" "} - here + {t(I18nKey.CONNECT_TO_GITHUB_MODAL$HERE)} } @@ -54,13 +57,13 @@ export function ConnectToGitHubModal({ onClose }: ConnectToGitHubModalProps) {
diff --git a/frontend/src/components/modals/feedback/FeedbackModal.tsx b/frontend/src/components/modals/feedback/FeedbackModal.tsx index e7051da69475..05045e25f08d 100644 --- a/frontend/src/components/modals/feedback/FeedbackModal.tsx +++ b/frontend/src/components/modals/feedback/FeedbackModal.tsx @@ -52,7 +52,7 @@ function FeedbackModal({ }; const copiedToClipboardToast = () => { - hotToast("Password copied to clipboard", { + hotToast(t(I18nKey.FEEDBACK$PASSWORD_COPIED_MESSAGE), { icon: "📋", position: "bottom-right", }); @@ -79,10 +79,13 @@ function FeedbackModal({ target="_blank" rel="noreferrer" > - Go to shared feedback + {t(I18nKey.FEEDBACK$GO_TO_FEEDBACK)} onPressToast(password)} className="cursor-pointer"> - Password: {password} (copy) + {t(I18nKey.FEEDBACK$PASSWORD)} {password} + + ({t(I18nKey.FEEDBACK$COPY_LABEL)}) +
, { duration: 5000 }, @@ -113,14 +116,14 @@ function FeedbackModal({ } else { toast.error( "share-error", - `Failed to share, please contact the developers: ${response.body.message}`, + `${t(I18nKey.FEEDBACK$FAILED_TO_SHARE)} ${response.body.message}`, ); } } } catch (error) { toast.error( "share-error", - `Failed to share, please contact the developers: ${error}`, + `${t(I18nKey.FEEDBACK$FAILED_TO_SHARE)} ${error}`, ); } }; @@ -151,7 +154,7 @@ function FeedbackModal({

{t(I18nKey.FEEDBACK$MODAL_CONTENT)}

{!isEmailValid(email) && (

- Invalid email format + {t(I18nKey.FEEDBACK$INVALID_EMAIL_FORMAT)}

)} setPermissions(value as "public" | "private")} diff --git a/frontend/src/components/modals/security/Security.tsx b/frontend/src/components/modals/security/Security.tsx index 6d5d5305948a..6346ba1ffaf4 100644 --- a/frontend/src/components/modals/security/Security.tsx +++ b/frontend/src/components/modals/security/Security.tsx @@ -1,6 +1,8 @@ import React from "react"; +import { useTranslation } from "react-i18next"; import SecurityInvariant from "./invariant/Invariant"; import BaseModal from "../base-modal/BaseModal"; +import { I18nKey } from "#/i18n/declaration"; interface SecurityProps { isOpen: boolean; @@ -17,11 +19,13 @@ const SecurityAnalyzers: Record = { }; function Security({ isOpen, onOpenChange, securityAnalyzer }: SecurityProps) { + const { t } = useTranslation(); + const AnalyzerComponent = securityAnalyzer && SecurityAnalyzers[securityAnalyzer as SecurityAnalyzerOption] ? SecurityAnalyzers[securityAnalyzer as SecurityAnalyzerOption] - : () =>
Unknown security analyzer chosen
; + : () =>
{t(I18nKey.SECURITY$UNKNOWN_ANALYZER_LABEL)}
; return (
-

Logs

+

{t(I18nKey.INVARIANT$LOG_LABEL)}

@@ -195,9 +195,9 @@ function SecurityInvariant(): JSX.Element { policy: ( <>
-

Policy

+

{t(I18nKey.INVARIANT$POLICY_LABEL)}

@@ -214,14 +214,16 @@ function SecurityInvariant(): JSX.Element { settings: ( <>
-

Settings

+

{t(I18nKey.INVARIANT$SETTINGS_LABEL)}

-

Ask for user confirmation on risk severity:

+

+ {t(I18nKey.INVARIANT$ASK_CONFIRMATION_RISK_SEVERITY_LABEL)} +

@@ -278,18 +280,17 @@ function SecurityInvariant(): JSX.Element {
- Invariant Analyzer + {t(I18nKey.INVARIANT$INVARIANT_ANALYZER_LABEL)}

- Invariant Analyzer continuously monitors your OpenHands agent for - security issues.{" "} + {t(I18nKey.INVARIANT$INVARIANT_ANALYZER_MESSAGE)}{" "} - Click to learn more + {t(I18nKey.INVARIANT$CLICK_TO_LEARN_MORE_LABEL)}


@@ -298,19 +299,19 @@ function SecurityInvariant(): JSX.Element { className={`cursor-pointer p-2 rounded ${activeSection === "logs" && "bg-neutral-600"}`} onClick={() => setActiveSection("logs")} > - Logs + {t(I18nKey.INVARIANT$LOG_LABEL)}
setActiveSection("policy")} > - Policy + {t(I18nKey.INVARIANT$POLICY_LABEL)}
setActiveSection("settings")} > - Settings + {t(I18nKey.INVARIANT$SETTINGS_LABEL)}
diff --git a/frontend/src/i18n/translation.json b/frontend/src/i18n/translation.json index d1ff8792e21d..69b625151f64 100644 --- a/frontend/src/i18n/translation.json +++ b/frontend/src/i18n/translation.json @@ -798,7 +798,84 @@ "tr": "İptal" }, "FEEDBACK$EMAIL_PLACEHOLDER": { - "en": "Enter your email address." + "en": "Enter your email address", + "es": "Ingresa tu correo electrónico" + }, + "FEEDBACK$PASSWORD_COPIED_MESSAGE": { + "en": "Password copied to clipboard.", + "es": "Contraseña copiada al portapapeles." + }, + "FEEDBACK$GO_TO_FEEDBACK": { + "en": "Go to shared feedback", + "es": "Ir a feedback compartido" + }, + "FEEDBACK$PASSWORD": { + "en": "Password:", + "es": "Contraseña:" + }, + "FEEDBACK$INVALID_EMAIL_FORMAT": { + "en": "Invalid email format", + "es": "Formato de correo inválido" + }, + "FEEDBACK$FAILED_TO_SHARE": { + "en": "Failed to share, please contact the developers:", + "es": "Error al compartir, por favor contacta con los desarrolladores:" + }, + "FEEDBACK$COPY_LABEL": { + "en": "Copy", + "es": "Copiar" + }, + "FEEDBACK$SHARING_SETTINGS_LABEL": { + "en": "Sharing settings", + "es": "Configuración de compartir" + }, + "SECURITY$UNKNOWN_ANALYZER_LABEL":{ + "en": "Unknown security analyzer chosen", + "es": "Analizador de seguridad desconocido" + }, + "INVARIANT$UPDATE_POLICY_LABEL": { + "en": "Update Policy", + "es": "Actualizar política" + }, + "INVARIANT$UPDATE_SETTINGS_LABEL": { + "en": "Update Settings", + "es": "Actualizar configuración" + }, + "INVARIANT$SETTINGS_LABEL": { + "en": "Settings", + "es": "Configuración" + }, + "INVARIANT$ASK_CONFIRMATION_RISK_SEVERITY_LABEL": { + "en": "Ask for user confirmation on risk severity:", + "es": "Preguntar por confirmación del usuario sobre severidad del riesgo:" + }, + "INVARIANT$DONT_ASK_FOR_CONFIRMATION_LABEL": { + "en": "Don't ask for confirmation", + "es": "No solicitar confirmación" + }, + "INVARIANT$INVARIANT_ANALYZER_LABEL": { + "en": "Invariant Analyzer", + "es": "Analizador de invariantes" + }, + "INVARIANT$INVARIANT_ANALYZER_MESSAGE": { + "en": "Invariant Analyzer continuously monitors your OpenHands agent for security issues.", + "es": "Analizador de invariantes continuamente monitorea tu agente de OpenHands por problemas de seguridad." + }, + "INVARIANT$CLICK_TO_LEARN_MORE_LABEL": { + "en": "Click to learn more", + "es": "Clic para aprender más" + }, + "INVARIANT$POLICY_LABEL": { + "en": "Policy", + "es": "Política" + }, + "INVARIANT$LOG_LABEL": { + "en": "Logs", + "es": "Logs" + }, + "INVARIANT$EXPORT_TRACE_LABEL": { + "en": "Export Trace", + "es": "Exportar traza" }, "CHAT_INTERFACE$INITIALIZING_AGENT_LOADING_MESSAGE": { "en": "Starting up!", @@ -1511,8 +1588,56 @@ "fr": "En attente que le client soit prêt...", "tr": "İstemcinin hazır olması bekleniyor..." }, + "ACCOUNT_SETTINGS_MODAL$DISCONNECT":{ + "en": "Disconnect", + "es": "Desconectar" + }, + "ACCOUNT_SETTINGS_MODAL$SAVE":{ + "en": "Save", + "es": "Guardar" + }, + "ACCOUNT_SETTINGS_MODAL$CLOSE":{ + "en": "Close", + "es": "" + }, + "ACCOUNT_SETTINGS_MODAL$GITHUB_TOKEN_INVALID":{ + "en": "GitHub token is invalid. Please try again.", + "es": "" + }, + "CONNECT_TO_GITHUB_MODAL$GET_YOUR_TOKEN": { + "en": "Get your token", + "es": "Obten tu token" + }, + "CONNECT_TO_GITHUB_MODAL$HERE": { + "en": "here", + "es": "aquí" + }, + "CONNECT_TO_GITHUB_MODAL$CONNECT": { + "en": "Connect", + "es": "Conectar" + }, + "CONNECT_TO_GITHUB_MODAL$CLOSE": { + "en": "Close", + "es": "Cerrar" + }, + "CONNECT_TO_GITHUB_BY_TOKEN_MODAL$BY_CONNECTING_YOU_AGREE": { + "en": "By connecting you agree to our", + "es": "Al conectarte tu aceptas nuestros" + }, + "CONNECT_TO_GITHUB_BY_TOKEN_MODAL$TERMS_OF_SERVICE": { + "en": "terms of service", + "es": "términos de servicio" + }, + "CONNECT_TO_GITHUB_BY_TOKEN_MODAL$CONTINUE": { + "en": "Continue", + "es": "Continuar" + }, "LOADING_PROJECT$LOADING": { "en": "Loading...", "es": "Cargando..." } + + + + } From 95f845bee035c6818a6b5e0a26afdc83e632b497 Mon Sep 17 00:00:00 2001 From: adrianamorenogt Date: Mon, 4 Nov 2024 21:15:49 -0500 Subject: [PATCH 3/5] Adds translations for toasts --- .../modals/security/invariant/Invariant.tsx | 6 +++--- frontend/src/i18n/translation.json | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/modals/security/invariant/Invariant.tsx b/frontend/src/components/modals/security/invariant/Invariant.tsx index 2a45c471f52d..0e1a6bd1b33f 100644 --- a/frontend/src/components/modals/security/invariant/Invariant.tsx +++ b/frontend/src/components/modals/security/invariant/Invariant.tsx @@ -123,7 +123,7 @@ function SecurityInvariant(): JSX.Element { async function exportTraces(): Promise { const data = await request(`/api/security/export-trace`); - toast.info("Trace exported"); + toast.info(t(I18nKey.INVARIANT$TRACE_EXPORTED_MESSAGE)); const filename = `openhands-trace-${getFormattedDateTime()}.json`; downloadJSON(data, filename); @@ -134,7 +134,7 @@ function SecurityInvariant(): JSX.Element { method: "POST", body: JSON.stringify({ policy }), }); - toast.info("Policy updated"); + toast.info(t(I18nKey.INVARIANT$POLICY_UPDATED_MESSAGE)); } async function updateSettings(): Promise { @@ -143,7 +143,7 @@ function SecurityInvariant(): JSX.Element { method: "POST", body: JSON.stringify(payload), }); - toast.info("Settings updated"); + toast.info(t(I18nKey.INVARIANT$SETTINGS_UPDATED_MESSAGE)); } const handleExportTraces = useCallback(() => { diff --git a/frontend/src/i18n/translation.json b/frontend/src/i18n/translation.json index 69b625151f64..bbae93427df0 100644 --- a/frontend/src/i18n/translation.json +++ b/frontend/src/i18n/translation.json @@ -877,6 +877,18 @@ "en": "Export Trace", "es": "Exportar traza" }, + "INVARIANT$TRACE_EXPORTED_MESSAGE": { + "en": "Trace exported", + "es": "Traza exportada" + }, + "INVARIANT$POLICY_UPDATED_MESSAGE": { + "en": "Policy updated", + "es": "Política actualizada" + }, + "INVARIANT$SETTINGS_UPDATED_MESSAGE": { + "en": "Settings updated", + "es": "Configuración actualizada" + }, "CHAT_INTERFACE$INITIALIZING_AGENT_LOADING_MESSAGE": { "en": "Starting up!", "de": "Wird gestartet!", From 651f8b2f90979661cd94766d240c64887ea3e6f5 Mon Sep 17 00:00:00 2001 From: Daniel Cruz Date: Tue, 5 Nov 2024 20:57:59 -0500 Subject: [PATCH 4/5] Adds translations for the project menu folder and the missing translatins from the modals folder --- frontend/src/components/form/custom-input.tsx | 12 ++- .../src/components/form/settings-form.tsx | 50 ++++++----- .../project-menu-details-placeholder.tsx | 8 +- .../project-menu/project-menu-details.tsx | 6 +- frontend/src/i18n/translation.json | 84 ++++++++++++++++++- 5 files changed, 133 insertions(+), 27 deletions(-) diff --git a/frontend/src/components/form/custom-input.tsx b/frontend/src/components/form/custom-input.tsx index b5f7b360370d..5fff6b7a55fa 100644 --- a/frontend/src/components/form/custom-input.tsx +++ b/frontend/src/components/form/custom-input.tsx @@ -1,3 +1,6 @@ +import { useTranslation } from "react-i18next"; +import { I18nKey } from "#/i18n/declaration"; + interface CustomInputProps { name: string; label: string; @@ -13,12 +16,19 @@ export function CustomInput({ defaultValue, type = "text", }: CustomInputProps) { + const { t } = useTranslation(); + return ( - Base URL + {t(I18nKey.SETTINGS_FORM$BASE_URL_LABEL)} - API Key + {t(I18nKey.SETTINGS_FORM$API_KEY_LABEL)}

- Don't know your API key?{" "} + {t(I18nKey.SETTINGS_FORM$DONT_KNOW_API_KEY_LABEL)}{" "} - Click here for instructions + {t(I18nKey.SETTINGS_FORM$CLICK_HERE_FOR_INSTRUCTIONS_LABEL)}

@@ -229,7 +232,7 @@ export function SettingsForm({ htmlFor="agent" className="font-[500] text-[#A3A3A3] text-xs" > - Agent + {t(I18nKey.SETTINGS_FORM$AGENT_LABEL)} - Security Analyzer (Optional) + {t(I18nKey.SETTINGS_FORM$SECURITY_ANALYZER_LABEL)} - Enable Confirmation Mode + {t(I18nKey.SETTINGS_FORM$ENABLE_CONFIRMATION_MODE_LABEL)} )} @@ -319,18 +322,18 @@ export function SettingsForm({
{ @@ -343,15 +346,17 @@ export function SettingsForm({ {confirmResetDefaultsModalOpen && ( setConfirmResetDefaultsModalOpen(false), }, }} @@ -361,12 +366,17 @@ export function SettingsForm({ {confirmEndSessionModalOpen && ( setConfirmEndSessionModalOpen(false), }, }} diff --git a/frontend/src/components/project-menu/project-menu-details-placeholder.tsx b/frontend/src/components/project-menu/project-menu-details-placeholder.tsx index ea0aa7f80e50..153f4e8093c9 100644 --- a/frontend/src/components/project-menu/project-menu-details-placeholder.tsx +++ b/frontend/src/components/project-menu/project-menu-details-placeholder.tsx @@ -1,5 +1,7 @@ +import { useTranslation } from "react-i18next"; import { cn } from "#/utils/utils"; import CloudConnection from "#/assets/cloud-connection.svg?react"; +import { I18nKey } from "#/i18n/declaration"; interface ProjectMenuDetailsPlaceholderProps { isConnectedToGitHub: boolean; @@ -10,9 +12,13 @@ export function ProjectMenuDetailsPlaceholder({ isConnectedToGitHub, onConnectToGitHub, }: ProjectMenuDetailsPlaceholderProps) { + const { t } = useTranslation(); + return ( diff --git a/frontend/src/i18n/translation.json b/frontend/src/i18n/translation.json index bbae93427df0..7fff8aa37a16 100644 --- a/frontend/src/i18n/translation.json +++ b/frontend/src/i18n/translation.json @@ -1647,9 +1647,85 @@ "LOADING_PROJECT$LOADING": { "en": "Loading...", "es": "Cargando..." + }, + "CUSTOM_INPUT$OPTIONAL_LABEL": { + "en": "(Optional)", + "es": "(Opcional)" + }, + "SETTINGS_FORM$ADVANCED_OPTIONS_LABEL": { + "en": "Advanced Options", + "es": "Opciones avanzadas" + }, + "SETTINGS_FORM$CUSTOM_MODEL_LABEL": { + "en": "Custom Model", + "es": "Modelo personalizado" + }, + "SETTINGS_FORM$BASE_URL_LABEL": { + "en": "Base URL", + "es": "URL base" + }, + "SETTINGS_FORM$API_KEY_LABEL": { + "en": "API Key", + "es": "API Key" + }, + "SETTINGS_FORM$DONT_KNOW_API_KEY_LABEL": { + "en": "Don't know your API key?", + "es": "¿No sabes tu API key?" + }, + "SETTINGS_FORM$CLICK_HERE_FOR_INSTRUCTIONS_LABEL": { + "en": "Click here for instructions", + "es": "Clic aquí para instrucciones" + }, + "SETTINGS_FORM$AGENT_LABEL": { + "en": "Agent", + "es": "Agente" + }, + "SETTINGS_FORM$SECURITY_ANALYZER_LABEL": { + "en": "Security Analyzer (Optional)", + "es": "Analizador de seguridad (opcional)" + }, + "SETTINGS_FORM$ENABLE_CONFIRMATION_MODE_LABEL": { + "en": "Enable Confirmation Mode", + "es": "Habilitar modo de confirmación" + }, + "SETTINGS_FORM$SAVE_LABEL": { + "en": "Save", + "es": "Guardar" + }, + "SETTINGS_FORM$CLOSE_LABEL": { + "en": "Close", + "es": "Cerrar" + }, + "SETTINGS_FORM$RESET_TO_DEFAULTS_LABEL": { + "en": "Reset to defaults", + "es": "Reiniciar valores por defect" + }, + "SETTINGS_FORM$CANCEL_LABEL": { + "en": "Cancel", + "es": "Cancelar" + }, + "SETTINGS_FORM$END_SESSION_LABEL": { + "en": "End Session", + "es": "Terminar sesión" + }, + "SETTINGS_FORM$CHANGING_WORKSPACE_WARNING_MESSAGE": { + "en": "Changing your settings will clear your workspace and start a new session. Are you sure you want to continue?", + "es": "Cambiar tu configuración limpiará tu espacio de trabajo e iniciará una nueva sesión. ¿Estás seguro de continuar?" + }, + "SETTINGS_FORM$ARE_YOU_SURE_LABEL": { + "en": "Are you sure?", + "es": "¿Estás seguro?" + }, + "SETTINGS_FORM$ALL_INFORMATION_WILL_BE_DELETED_MESSAGE": { + "en": "All saved information in your AI settings will be deleted, including any API keys.", + "es": "Toda la información guardada en tu configuración de IA será eliminada, incluyendo tus API Keys" + }, + "PROJECT_MENU_DETAILS_PLACEHOLDER$NEW_PROJECT_LABEL": { + "en":"New Project", + "es":"Nuevo proyecto" + }, + "PROJECT_MENU_DETAILS$AGO_LABEL": { + "en":"ago", + "es":"atrás" } - - - - } From 7efbc3fde2a9abbe82bd942eb5892479d53c451e Mon Sep 17 00:00:00 2001 From: "sp.wack" <83104063+amanape@users.noreply.github.com> Date: Thu, 7 Nov 2024 10:11:26 +0200 Subject: [PATCH 5/5] Update frontend/src/components/project-menu/project-menu-details.tsx --- frontend/src/components/project-menu/project-menu-details.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/project-menu/project-menu-details.tsx b/frontend/src/components/project-menu/project-menu-details.tsx index bcf9dbbd8290..536f04d71d3b 100644 --- a/frontend/src/components/project-menu/project-menu-details.tsx +++ b/frontend/src/components/project-menu/project-menu-details.tsx @@ -35,7 +35,7 @@ export function ProjectMenuDetails({ > {lastCommit.sha.slice(-7)} ·{" "} - {formatTimeDelta(new Date(lastCommit.commit.author.date))} + {formatTimeDelta(new Date(lastCommit.commit.author.date))}{" "} {t(I18nKey.PROJECT_MENU_DETAILS$AGO_LABEL)}