Repository: All-Hands-AI/OpenHands
Pull request: Improve i18n support and add missing translations
This PR improves the internationalization (i18n) support in the frontend by:

1. Adding missing translations for all supported languages (zh-CN, zh-TW, ko-KR, de, no, it, pt, es, ar, fr, tr) for:
   - Workspace labels and titles
   - Project and terminal status messages
   - Time-related messages

2. Adding i18n test utilities and translation tests:
   - Added test to verify all translation keys have translations for all supported languages
   - Added test to detect duplicate translation keys
   - Added test utilities for i18n testing

3. Updating UI components to use translations consistently

Fixes #6066
Fixes #4280

Here are examples of the localized screens. I have confirmed that all settings menus, etc. are localized.
<img width="633" alt="Screenshot 2025-01-07 at 9 40 02 PM" src="https://github.com/user-attachments/assets/6667d9f4-7e59-451b-bdcc-3394e7d8f9b2" />
<img width="629" alt="Screenshot 2025-01-07 at 9 39 23 PM" src="https://github.com/user-attachments/assets/26e2b418-9dc5-4c8f-8761-7da59c8e7288" />
<img width="659" alt="Screenshot 2025-01-07 at 9 38 57 PM" src="https://github.com/user-attachments/assets/0ddad0de-3c87-4f1f-bd46-82cb84cfd8a7" />
<img width="1282" alt="Screenshot 2025-01-07 at 9 37 25 PM" src="https://github.com/user-attachments/assets/c1c634f5-3273-48b2-8ad7-d20a4884cf15" />
<img width="637" alt="Screenshot 2025-01-07 at 9 37 07 PM" src="https://github.com/user-attachments/assets/292db8be-f914-439d-bc8a-3657ac3e63fd" />

---

To run this PR locally, use the following command:
```
docker run -it --rm   -p 3000:3000   -v /var/run/docker.sock:/var/run/docker.sock   --add-host host.docker.internal:host-gateway   -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:7049463-nikolaik   --name openhands-app-7049463   docker.all-hands.dev/all-hands-ai/openhands:7049463
```

Problem statement:
Update the frontend to use i18n keys
**What problem or use case are you trying to solve?**
The new UI hardcodes english text throughout the app. In order to support i18n, we should extend our i18n provider and replaced the hardcoded values with the new keys

**Describe the UX of the solution you'd like**

**Do you have thoughts on the technical implementation?**

**Describe alternatives you've considered**

**Additional context**


Add Japanese to localization settings
**What problem or use case are you trying to solve?**

A fair number of people in Japan are using OpenHands, but Japanese is not included in the localization settings. We should add Japanese as a localization option, and add Japanese translations to all localization configs.

Hints from issue discussion:
Went through the codebase and got a good understanding of the changes that I would need to make here. Can I work on this?

Also what are your thoughts on adding [eslint-plugin-i18n](https://www.npmjs.com/package/eslint-plugin-i18n) to give warnings so that we do not miss out on this in the future?
Thanks for taking this up @Vaishakh-SM, feel free to open a PR with the changes when you're ready.

As for `eslint-plugin-i18n`, I'm not familiar with this library and it looks to only support a small set of languages. Additionally, we are unlikely to be able to implement all required translations at once, so adding `eslint-plugin-i18n` may be a source of annoyance too.
**Checklist:**

- [x] **Audit**: Understand necessary code changes.
- [x] **Update one file**: Replace hardcoded values with i18n keys and get a review.
- [x] **Identification**:  Identify all places that need the change
- [ ] **Apply to all files**: Extend the changes across the remaining files.
- [ ] **Test**: Verify i18n works for different languages.
- [ ] **Address feedback**: Implement any review suggestions.
- [ ] **Final review and merge**: Ensure all tests pass and merge the PR.
Hey! I can assist with the i18n process if you want 💪
Hi @danicruz0415 !

Yea that'll be great. I've [raised a PR](https://github.com/All-Hands-AI/OpenHands/pull/4397) where I've made changes to a single file. If that seems good we could start making changes to the entire repo.
This issue is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.
This issue is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.
[OpenHands](https://github.com/All-Hands-AI/OpenHands) started fixing the issue! You can monitor the progress [here](https://github.com/All-Hands-AI/OpenHands/actions/runs/12627630341).
An attempt was made to automatically fix this issue, but it was unsuccessful. A branch named 'openhands-fix-issue-6066' has been created with the attempted changes. You can view the branch [here](https://github.com/All-Hands-AI/OpenHands/tree/openhands-fix-issue-6066). Manual intervention may be required.

Additional details about the failure:
While the AI has made significant progress by adding Japanese localization support to the documentation system, the original issue requested Japanese translations for "all localization configs." Based on the AI's last message, only a subset of files have been translated:
- navbar.json
- intro.mdx
- code.json
- options.json
- current.json

This appears to be just the basic framework and some core navigation elements, but not a complete translation of all localization configurations as requested in the original issue. To fully resolve this issue, we would need:

1. A complete inventory of all localizable content in the system
2. Confirmation that ALL localizable content has been translated to Japanese
3. Verification that the translations are accurate and natural-sounding Japanese

The current implementation provides the infrastructure for Japanese localization but appears to be incomplete in terms of full content coverage. The PR should either:
a) Be expanded to include all remaining translations
b) Be clearly marked as a partial implementation with follow-up issues created to track the remaining translation work
Bad fix, I'll try over in the OpenHands app.

Commit message: Fix linting issues: Fix import order and add newlines at end of files

Patch to review:
diff --git a/frontend/__tests__/components/chat/chat-input.test.tsx b/frontend/__tests__/components/chat/chat-input.test.tsx
index 3cf83a1e7b8f..f3248371e37b 100644
--- a/frontend/__tests__/components/chat/chat-input.test.tsx
+++ b/frontend/__tests__/components/chat/chat-input.test.tsx
@@ -84,12 +84,10 @@ describe("ChatInput", () => {
     expect(onSubmitMock).not.toHaveBeenCalled();
   });
 
-  it("should render a placeholder", () => {
-    render(
-      <ChatInput placeholder="Enter your message" onSubmit={onSubmitMock} />,
-    );
+  it("should render a placeholder with translation key", () => {
+    render(<ChatInput onSubmit={onSubmitMock} />);
 
-    const textarea = screen.getByPlaceholderText("Enter your message");
+    const textarea = screen.getByPlaceholderText("SUGGESTIONS$WHAT_TO_BUILD");
     expect(textarea).toBeInTheDocument();
   });
 
diff --git a/frontend/__tests__/components/features/conversation-panel/conversation-panel.test.tsx b/frontend/__tests__/components/features/conversation-panel/conversation-panel.test.tsx
index 262b2bd28e38..0e35d4799c05 100644
--- a/frontend/__tests__/components/features/conversation-panel/conversation-panel.test.tsx
+++ b/frontend/__tests__/components/features/conversation-panel/conversation-panel.test.tsx
@@ -61,7 +61,7 @@ describe("ConversationPanel", () => {
 
     renderConversationPanel();
 
-    const emptyState = await screen.findByText("No conversations found");
+    const emptyState = await screen.findByText("CONVERSATION$NO_CONVERSATIONS");
     expect(emptyState).toBeInTheDocument();
   });
 
diff --git a/frontend/__tests__/components/features/github/github-repo-selector.test.tsx b/frontend/__tests__/components/features/github/github-repo-selector.test.tsx
index 8d507294d9c1..c646f406dca2 100644
--- a/frontend/__tests__/components/features/github/github-repo-selector.test.tsx
+++ b/frontend/__tests__/components/features/github/github-repo-selector.test.tsx
@@ -20,7 +20,7 @@ describe("GitHubRepositorySelector", () => {
     );
 
     expect(
-      screen.getByPlaceholderText("Select a GitHub project"),
+      screen.getByPlaceholderText("LANDING$SELECT_REPO"),
     ).toBeInTheDocument();
   });
 
diff --git a/frontend/__tests__/components/feedback-form.test.tsx b/frontend/__tests__/components/feedback-form.test.tsx
index c9234e737475..e3cad75d45c1 100644
--- a/frontend/__tests__/components/feedback-form.test.tsx
+++ b/frontend/__tests__/components/feedback-form.test.tsx
@@ -14,6 +14,7 @@ import { screen } from "@testing-library/react";
 import userEvent from "@testing-library/user-event";
 import { renderWithProviders } from "test-utils";
 import { FeedbackForm } from "#/components/features/feedback/feedback-form";
+import { I18nKey } from "#/i18n/declaration";
 
 describe("FeedbackForm", () => {
   const user = userEvent.setup();
@@ -28,20 +29,20 @@ describe("FeedbackForm", () => {
       <FeedbackForm polarity="positive" onClose={onCloseMock} />,
     );
 
-    screen.getByLabelText("Email");
-    screen.getByLabelText("Private");
-    screen.getByLabelText("Public");
+    screen.getByLabelText(I18nKey.FEEDBACK$EMAIL_LABEL);
+    screen.getByLabelText(I18nKey.FEEDBACK$PRIVATE_LABEL);
+    screen.getByLabelText(I18nKey.FEEDBACK$PUBLIC_LABEL);
 
-    screen.getByRole("button", { name: "Submit" });
-    screen.getByRole("button", { name: "Cancel" });
+    screen.getByRole("button", { name: I18nKey.FEEDBACK$CONTRIBUTE_LABEL });
+    screen.getByRole("button", { name: I18nKey.FEEDBACK$CANCEL_LABEL });
   });
 
   it("should switch between private and public permissions", async () => {
     renderWithProviders(
       <FeedbackForm polarity="positive" onClose={onCloseMock} />,
     );
-    const privateRadio = screen.getByLabelText("Private");
-    const publicRadio = screen.getByLabelText("Public");
+    const privateRadio = screen.getByLabelText(I18nKey.FEEDBACK$PRIVATE_LABEL);
+    const publicRadio = screen.getByLabelText(I18nKey.FEEDBACK$PUBLIC_LABEL);
 
     expect(privateRadio).toBeChecked(); // private is the default value
     expect(publicRadio).not.toBeChecked();
@@ -59,7 +60,7 @@ describe("FeedbackForm", () => {
     renderWithProviders(
       <FeedbackForm polarity="positive" onClose={onCloseMock} />,
     );
-    await user.click(screen.getByRole("button", { name: "Cancel" }));
+    await user.click(screen.getByRole("button", { name: I18nKey.FEEDBACK$CANCEL_LABEL }));
 
     expect(onCloseMock).toHaveBeenCalled();
   });
diff --git a/frontend/__tests__/components/interactive-chat-box.test.tsx b/frontend/__tests__/components/interactive-chat-box.test.tsx
index fe6ba329763b..6ec74ddc88a6 100644
--- a/frontend/__tests__/components/interactive-chat-box.test.tsx
+++ b/frontend/__tests__/components/interactive-chat-box.test.tsx
@@ -157,7 +157,7 @@ describe("InteractiveChatBox", () => {
     expect(onChange).not.toHaveBeenCalledWith("");
 
     // Submit the message with image
-    const submitButton = screen.getByRole("button", { name: "Send" });
+    const submitButton = screen.getByRole("button", { name: "BUTTON$SEND" });
     await user.click(submitButton);
 
     // Verify onSubmit was called with the message and image
diff --git a/frontend/__tests__/components/landing-translations.test.tsx b/frontend/__tests__/components/landing-translations.test.tsx
new file mode 100644
index 000000000000..9cfb9a07f160
--- /dev/null
+++ b/frontend/__tests__/components/landing-translations.test.tsx
@@ -0,0 +1,190 @@
+import { render, screen } from "@testing-library/react";
+import { test, expect, describe, vi } from "vitest";
+import { useTranslation } from "react-i18next";
+import translations from "../../src/i18n/translation.json";
+import { UserAvatar } from "../../src/components/features/sidebar/user-avatar";
+
+vi.mock("@nextui-org/react", () => ({
+  Tooltip: ({ content, children }: { content: string; children: React.ReactNode }) => (
+    <div>
+      {children}
+      <div>{content}</div>
+    </div>
+  ),
+}));
+
+const supportedLanguages = ['en', 'ja', 'zh-CN', 'zh-TW', 'ko-KR', 'de', 'no', 'it', 'pt', 'es', 'ar', 'fr', 'tr'];
+
+// Helper function to check if a translation exists for all supported languages
+function checkTranslationExists(key: string) {
+  const missingTranslations: string[] = [];
+
+  const translationEntry = (translations as Record<string, Record<string, string>>)[key];
+  if (!translationEntry) {
+    throw new Error(`Translation key "${key}" does not exist in translation.json`);
+  }
+
+  for (const lang of supportedLanguages) {
+    if (!translationEntry[lang]) {
+      missingTranslations.push(lang);
+    }
+  }
+
+  return missingTranslations;
+}
+
+// Helper function to find duplicate translation keys
+function findDuplicateKeys(obj: Record<string, any>) {
+  const seen = new Set<string>();
+  const duplicates = new Set<string>();
+
+  // Only check top-level keys as these are our translation keys
+  for (const key in obj) {
+    if (seen.has(key)) {
+      duplicates.add(key);
+    } else {
+      seen.add(key);
+    }
+  }
+
+  return Array.from(duplicates);
+}
+
+vi.mock("react-i18next", () => ({
+  useTranslation: () => ({
+    t: (key: string) => {
+      const translationEntry = (translations as Record<string, Record<string, string>>)[key];
+      return translationEntry?.ja || key;
+    },
+  }),
+}));
+
+describe("Landing page translations", () => {
+  test("should render Japanese translations correctly", () => {
+    // Mock a simple component that uses the translations
+    const TestComponent = () => {
+      const { t } = useTranslation();
+      return (
+        <div>
+          <UserAvatar onClick={() => {}} />
+          <div data-testid="main-content">
+            <h1>{t("LANDING$TITLE")}</h1>
+            <button>{t("VSCODE$OPEN")}</button>
+            <button>{t("SUGGESTIONS$INCREASE_TEST_COVERAGE")}</button>
+            <button>{t("SUGGESTIONS$AUTO_MERGE_PRS")}</button>
+            <button>{t("SUGGESTIONS$FIX_README")}</button>
+            <button>{t("SUGGESTIONS$CLEAN_DEPENDENCIES")}</button>
+          </div>
+          <div data-testid="tabs">
+            <span>{t("WORKSPACE$TERMINAL_TAB_LABEL")}</span>
+            <span>{t("WORKSPACE$BROWSER_TAB_LABEL")}</span>
+            <span>{t("WORKSPACE$JUPYTER_TAB_LABEL")}</span>
+            <span>{t("WORKSPACE$CODE_EDITOR_TAB_LABEL")}</span>
+          </div>
+          <div data-testid="workspace-label">{t("WORKSPACE$TITLE")}</div>
+          <button data-testid="new-project">{t("PROJECT$NEW_PROJECT")}</button>
+          <div data-testid="status">
+            <span>{t("TERMINAL$WAITING_FOR_CLIENT")}</span>
+            <span>{t("STATUS$CONNECTED")}</span>
+            <span>{t("STATUS$CONNECTED_TO_SERVER")}</span>
+          </div>
+          <div data-testid="time">
+            <span>{`5 ${t("TIME$MINUTES_AGO")}`}</span>
+            <span>{`2 ${t("TIME$HOURS_AGO")}`}</span>
+            <span>{`3 ${t("TIME$DAYS_AGO")}`}</span>
+          </div>
+        </div>
+      );
+    };
+
+    render(<TestComponent />);
+
+    // Check main content translations
+    expect(screen.getByText("開発を始めましょう！")).toBeInTheDocument();
+    expect(screen.getByText("VS Codeで開く")).toBeInTheDocument();
+    expect(screen.getByText("テストカバレッジを向上させる")).toBeInTheDocument();
+    expect(screen.getByText("Dependabot PRを自動マージ")).toBeInTheDocument();
+    expect(screen.getByText("READMEを改善")).toBeInTheDocument();
+    expect(screen.getByText("依存関係を整理")).toBeInTheDocument();
+
+    // Check user avatar tooltip
+    const userAvatar = screen.getByTestId("user-avatar");
+    userAvatar.focus();
+    expect(screen.getByText("アカウント設定")).toBeInTheDocument();
+
+    // Check tab labels
+    const tabs = screen.getByTestId("tabs");
+    expect(tabs).toHaveTextContent("ターミナル");
+    expect(tabs).toHaveTextContent("ブラウザ");
+    expect(tabs).toHaveTextContent("Jupyter");
+    expect(tabs).toHaveTextContent("コードエディタ");
+
+    // Check workspace label and new project button
+    expect(screen.getByTestId("workspace-label")).toHaveTextContent("ワークスペース");
+    expect(screen.getByTestId("new-project")).toHaveTextContent("新規プロジェクト");
+
+    // Check status messages
+    const status = screen.getByTestId("status");
+    expect(status).toHaveTextContent("クライアントの準備を待機中");
+    expect(status).toHaveTextContent("接続済み");
+    expect(status).toHaveTextContent("サーバーに接続済み");
+
+    // Check account settings menu
+    expect(screen.getByText("アカウント設定")).toBeInTheDocument();
+
+    // Check time-related translations
+    const time = screen.getByTestId("time");
+    expect(time).toHaveTextContent("5 分前");
+    expect(time).toHaveTextContent("2 時間前");
+    expect(time).toHaveTextContent("3 日前");
+  });
+
+  test("all translation keys should have translations for all supported languages", () => {
+    // Test all translation keys used in the component
+    const translationKeys = [
+      "LANDING$TITLE",
+      "VSCODE$OPEN",
+      "SUGGESTIONS$INCREASE_TEST_COVERAGE",
+      "SUGGESTIONS$AUTO_MERGE_PRS",
+      "SUGGESTIONS$FIX_README",
+      "SUGGESTIONS$CLEAN_DEPENDENCIES",
+      "WORKSPACE$TERMINAL_TAB_LABEL",
+      "WORKSPACE$BROWSER_TAB_LABEL",
+      "WORKSPACE$JUPYTER_TAB_LABEL",
+      "WORKSPACE$CODE_EDITOR_TAB_LABEL",
+      "WORKSPACE$TITLE",
+      "PROJECT$NEW_PROJECT",
+      "TERMINAL$WAITING_FOR_CLIENT",
+      "STATUS$CONNECTED",
+      "STATUS$CONNECTED_TO_SERVER",
+      "TIME$MINUTES_AGO",
+      "TIME$HOURS_AGO",
+      "TIME$DAYS_AGO"
+    ];
+
+    // Check all keys and collect missing translations
+    const missingTranslationsMap = new Map<string, string[]>();
+    translationKeys.forEach(key => {
+      const missing = checkTranslationExists(key);
+      if (missing.length > 0) {
+        missingTranslationsMap.set(key, missing);
+      }
+    });
+
+    // If any translations are missing, throw an error with all missing translations
+    if (missingTranslationsMap.size > 0) {
+      const errorMessage = Array.from(missingTranslationsMap.entries())
+        .map(([key, langs]) => `\n- "${key}" is missing translations for: ${langs.join(', ')}`)
+        .join('');
+      throw new Error(`Missing translations:${errorMessage}`);
+    }
+  });
+
+  test("translation file should not have duplicate keys", () => {
+    const duplicates = findDuplicateKeys(translations);
+
+    if (duplicates.length > 0) {
+      throw new Error(`Found duplicate translation keys: ${duplicates.join(', ')}`);
+    }
+  });
+});
diff --git a/frontend/__tests__/components/modals/settings/model-selector.test.tsx b/frontend/__tests__/components/modals/settings/model-selector.test.tsx
index d2f951050945..757f5dcd45ce 100644
--- a/frontend/__tests__/components/modals/settings/model-selector.test.tsx
+++ b/frontend/__tests__/components/modals/settings/model-selector.test.tsx
@@ -1,7 +1,23 @@
-import { describe, it, expect } from "vitest";
+import { describe, it, expect, vi } from "vitest";
 import { render, screen } from "@testing-library/react";
 import userEvent from "@testing-library/user-event";
 import { ModelSelector } from "#/components/shared/modals/settings/model-selector";
+import { I18nKey } from "#/i18n/declaration";
+
+// Mock react-i18next
+vi.mock("react-i18next", () => ({
+  useTranslation: () => ({
+    t: (key: string) => {
+      const translations: { [key: string]: string } = {
+        LLM$PROVIDER: "LLM Provider",
+        LLM$MODEL: "LLM Model",
+        LLM$SELECT_PROVIDER_PLACEHOLDER: "Select a provider",
+        LLM$SELECT_MODEL_PLACEHOLDER: "Select a model",
+      };
+      return translations[key] || key;
+    },
+  }),
+}));
 
 describe("ModelSelector", () => {
   const models = {
diff --git a/frontend/__tests__/components/suggestion-item.test.tsx b/frontend/__tests__/components/suggestion-item.test.tsx
index 23d2aaa41e5b..dcdd532e7f6d 100644
--- a/frontend/__tests__/components/suggestion-item.test.tsx
+++ b/frontend/__tests__/components/suggestion-item.test.tsx
@@ -2,6 +2,20 @@ import { render, screen } from "@testing-library/react";
 import userEvent from "@testing-library/user-event";
 import { afterEach, describe, expect, it, vi } from "vitest";
 import { SuggestionItem } from "#/components/features/suggestions/suggestion-item";
+import { I18nKey } from "#/i18n/declaration";
+
+vi.mock("react-i18next", () => ({
+  useTranslation: () => ({
+    t: (key: string) => {
+      const translations: Record<string, string> = {
+        "SUGGESTIONS$TODO_APP": "ToDoリストアプリを開発する",
+        "LANDING$BUILD_APP_BUTTON": "プルリクエストを表示するアプリを開発する",
+        "SUGGESTIONS$HACKER_NEWS": "Hacker Newsのトップ記事を表示するbashスクリプトを作成する",
+      };
+      return translations[key] || key;
+    },
+  }),
+}));
 
 describe("SuggestionItem", () => {
   const suggestionItem = { label: "suggestion1", value: "a long text value" };
@@ -18,6 +32,19 @@ describe("SuggestionItem", () => {
     expect(screen.getByText(/suggestion1/i)).toBeInTheDocument();
   });
 
+  it("should render a translated suggestion when using I18nKey", async () => {
+    const translatedSuggestion = {
+      label: I18nKey.SUGGESTIONS$TODO_APP,
+      value: "todo app value",
+    };
+
+    const { container } = render(<SuggestionItem suggestion={translatedSuggestion} onClick={onClick} />);
+    console.log('Rendered HTML:', container.innerHTML);
+
+
+    expect(screen.getByText("ToDoリストアプリを開発する")).toBeInTheDocument();
+  });
+
   it("should call onClick when clicking a suggestion", async () => {
     const user = userEvent.setup();
     render(<SuggestionItem suggestion={suggestionItem} onClick={onClick} />);
diff --git a/frontend/__tests__/components/user-avatar.test.tsx b/frontend/__tests__/components/user-avatar.test.tsx
index 076eb75b49bf..59bc90cecce3 100644
--- a/frontend/__tests__/components/user-avatar.test.tsx
+++ b/frontend/__tests__/components/user-avatar.test.tsx
@@ -14,7 +14,7 @@ describe("UserAvatar", () => {
     render(<UserAvatar onClick={onClickMock} />);
     expect(screen.getByTestId("user-avatar")).toBeInTheDocument();
     expect(
-      screen.getByLabelText("user avatar placeholder"),
+      screen.getByLabelText("USER$AVATAR_PLACEHOLDER"),
     ).toBeInTheDocument();
   });
 
@@ -38,7 +38,7 @@ describe("UserAvatar", () => {
 
     expect(screen.getByAltText("user avatar")).toBeInTheDocument();
     expect(
-      screen.queryByLabelText("user avatar placeholder"),
+      screen.queryByLabelText("USER$AVATAR_PLACEHOLDER"),
     ).not.toBeInTheDocument();
   });
 
@@ -46,13 +46,13 @@ describe("UserAvatar", () => {
     const { rerender } = render(<UserAvatar onClick={onClickMock} />);
     expect(screen.queryByTestId("loading-spinner")).not.toBeInTheDocument();
     expect(
-      screen.getByLabelText("user avatar placeholder"),
+      screen.getByLabelText("USER$AVATAR_PLACEHOLDER"),
     ).toBeInTheDocument();
 
     rerender(<UserAvatar onClick={onClickMock} isLoading />);
     expect(screen.getByTestId("loading-spinner")).toBeInTheDocument();
     expect(
-      screen.queryByLabelText("user avatar placeholder"),
+      screen.queryByLabelText("USER$AVATAR_PLACEHOLDER"),
     ).not.toBeInTheDocument();
 
     rerender(
diff --git a/frontend/__tests__/i18n/duplicate-keys.test.ts b/frontend/__tests__/i18n/duplicate-keys.test.ts
new file mode 100644
index 000000000000..35ab9b89c971
--- /dev/null
+++ b/frontend/__tests__/i18n/duplicate-keys.test.ts
@@ -0,0 +1,76 @@
+import { describe, expect, it } from 'vitest';
+import fs from 'fs';
+import path from 'path';
+
+describe('translation.json', () => {
+  it('should not have duplicate translation keys', () => {
+    // Read the translation.json file
+    const translationPath = path.join(__dirname, '../../src/i18n/translation.json');
+    const translationContent = fs.readFileSync(translationPath, 'utf-8');
+
+    // First, let's check for exact string matches of key definitions
+    const keyRegex = /"([^"]+)": {/g;
+    const matches = translationContent.matchAll(keyRegex);
+    const keyOccurrences = new Map<string, number>();
+    const duplicateKeys: string[] = [];
+
+    for (const match of matches) {
+      const key = match[1];
+      const count = (keyOccurrences.get(key) || 0) + 1;
+      keyOccurrences.set(key, count);
+      if (count > 1) {
+        duplicateKeys.push(key);
+      }
+    }
+
+    // Remove duplicates from duplicateKeys array
+    const uniqueDuplicates = [...new Set(duplicateKeys)];
+
+    // If there are duplicates, create a helpful error message
+    if (uniqueDuplicates.length > 0) {
+      const errorMessage = `Found duplicate translation keys:\n${uniqueDuplicates
+        .map((key) => `  - "${key}" appears ${keyOccurrences.get(key)} times`)
+        .join('\n')}`;
+      throw new Error(errorMessage);
+    }
+
+    // Expect no duplicates (this will pass if we reach here)
+    expect(uniqueDuplicates).toHaveLength(0);
+  });
+
+  it('should have consistent translations for each key', () => {
+    // Read the translation.json file
+    const translationPath = path.join(__dirname, '../../src/i18n/translation.json');
+    const translationContent = fs.readFileSync(translationPath, 'utf-8');
+    const translations = JSON.parse(translationContent);
+
+    // Create a map to store English translations for each key
+    const englishTranslations = new Map<string, string>();
+    const inconsistentKeys: string[] = [];
+
+    // Check each key's English translation
+    Object.entries(translations).forEach(([key, value]: [string, any]) => {
+      if (typeof value === 'object' && value.en !== undefined) {
+        const currentEn = value.en.toLowerCase();
+        const existingEn = englishTranslations.get(key)?.toLowerCase();
+
+        if (existingEn !== undefined && existingEn !== currentEn) {
+          inconsistentKeys.push(key);
+        } else {
+          englishTranslations.set(key, value.en);
+        }
+      }
+    });
+
+    // If there are inconsistencies, create a helpful error message
+    if (inconsistentKeys.length > 0) {
+      const errorMessage = `Found inconsistent translations for keys:\n${inconsistentKeys
+        .map((key) => `  - "${key}" has multiple different English translations`)
+        .join('\n')}`;
+      throw new Error(errorMessage);
+    }
+
+    // Expect no inconsistencies
+    expect(inconsistentKeys).toHaveLength(0);
+  });
+});
diff --git a/frontend/__tests__/i18n/translations.test.tsx b/frontend/__tests__/i18n/translations.test.tsx
new file mode 100644
index 000000000000..c91a2721b70e
--- /dev/null
+++ b/frontend/__tests__/i18n/translations.test.tsx
@@ -0,0 +1,61 @@
+import { render, screen } from '@testing-library/react';
+import { describe, expect, it } from 'vitest';
+import { I18nextProvider } from 'react-i18next';
+import i18n, { AvailableLanguages } from '../../src/i18n';
+import { AccountSettingsContextMenu } from '../../src/components/features/context-menu/account-settings-context-menu';
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import translations from '../../src/i18n/translation.json';
+
+const queryClient = new QueryClient();
+
+const renderWithI18n = (component: React.ReactNode, language: string = 'en') => {
+  i18n.changeLanguage(language);
+  return render(
+    <QueryClientProvider client={queryClient}>
+      <I18nextProvider i18n={i18n}>
+        {component}
+      </I18nextProvider>
+    </QueryClientProvider>
+  );
+};
+
+describe('Translations', () => {
+  describe('Translation Coverage', () => {
+    it('should have translations for all supported languages', () => {
+      // Get all language codes from AvailableLanguages
+      const languageCodes = AvailableLanguages.map(lang => lang.value);
+
+      // Keep track of missing translations
+      const missingTranslations: { key: string; languages: string[] }[] = [];
+
+      // Check each translation key
+      Object.entries(translations).forEach(([key, value]: [string, any]) => {
+        if (typeof value === 'object') {
+          const missingLangs = languageCodes.filter(lang => {
+            // Handle special case for language codes with hyphens
+            const langKey = lang.includes('-') ? `${lang}` : lang;
+            return value[langKey] === undefined;
+          });
+
+          if (missingLangs.length > 0) {
+            missingTranslations.push({
+              key,
+              languages: missingLangs
+            });
+          }
+        }
+      });
+
+      // If there are missing translations, create a helpful error message
+      if (missingTranslations.length > 0) {
+        const errorMessage = `Found missing translations:\n${missingTranslations
+          .map(({ key, languages }) => `  - "${key}" is missing translations for: ${languages.join(', ')}`)
+          .join('\n')}`;
+        throw new Error(errorMessage);
+      }
+
+      // Expect no missing translations
+      expect(missingTranslations).toHaveLength(0);
+    });
+  });
+});
diff --git a/frontend/__tests__/utils/check-hardcoded-strings.test.tsx b/frontend/__tests__/utils/check-hardcoded-strings.test.tsx
new file mode 100644
index 000000000000..f0a07cb2f15b
--- /dev/null
+++ b/frontend/__tests__/utils/check-hardcoded-strings.test.tsx
@@ -0,0 +1,47 @@
+import { render } from "@testing-library/react";
+import { test, expect, describe, vi } from "vitest";
+import { InteractiveChatBox } from "#/components/features/chat/interactive-chat-box";
+import { ChatInput } from "#/components/features/chat/chat-input";
+
+// Mock react-i18next
+vi.mock("react-i18next", () => ({
+  useTranslation: () => ({
+    t: (key: string) => key,
+  }),
+}));
+
+describe("Check for hardcoded English strings", () => {
+  test("InteractiveChatBox should not have hardcoded English strings", () => {
+    const { container } = render(
+      <InteractiveChatBox
+        onSubmit={() => {}}
+        onStop={() => {}}
+      />
+    );
+
+    // Get all text content
+    const text = container.textContent;
+
+    // List of English strings that should be translated
+    const hardcodedStrings = [
+      "What do you want to build?",
+    ];
+
+    // Check each string
+    hardcodedStrings.forEach(str => {
+      expect(text).not.toContain(str);
+    });
+  });
+
+  test("ChatInput should use translation key for placeholder", () => {
+    const { container } = render(
+      <ChatInput
+        onSubmit={() => {}}
+      />
+    );
+
+    // The placeholder should be a translation key, not English text
+    const textarea = container.querySelector("textarea");
+    expect(textarea?.placeholder).toBe("SUGGESTIONS$WHAT_TO_BUILD");
+  });
+});
diff --git a/frontend/__tests__/utils/i18n-test-utils.tsx b/frontend/__tests__/utils/i18n-test-utils.tsx
new file mode 100644
index 000000000000..7153540a1953
--- /dev/null
+++ b/frontend/__tests__/utils/i18n-test-utils.tsx
@@ -0,0 +1,29 @@
+import { ReactNode } from "react";
+import { I18nextProvider } from "react-i18next";
+
+const mockI18n = {
+  language: "ja",
+  t: (key: string) => {
+    const translations: Record<string, string> = {
+      "SUGGESTIONS$TODO_APP": "ToDoリストアプリを開発する",
+      "LANDING$BUILD_APP_BUTTON": "プルリクエストを表示するアプリを開発する",
+      "SUGGESTIONS$HACKER_NEWS": "Hacker Newsのトップ記事を表示するbashスクリプトを作成する",
+      "LANDING$TITLE": "一緒に開発を始めましょう！",
+      "OPEN_IN_VSCODE": "VS Codeで開く",
+      "INCREASE_TEST_COVERAGE": "テストカバレッジを向上",
+      "AUTO_MERGE_PRS": "PRを自動マージ",
+      "FIX_README": "READMEを修正",
+      "CLEAN_DEPENDENCIES": "依存関係を整理"
+    };
+    return translations[key] || key;
+  },
+  exists: () => true,
+  changeLanguage: () => new Promise(() => {}),
+  use: () => mockI18n,
+};
+
+export function I18nTestProvider({ children }: { children: ReactNode }) {
+  return (
+    <I18nextProvider i18n={mockI18n as any}>{children}</I18nextProvider>
+  );
+}
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index aab2269cf542..56c17008e97f 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -53,7 +53,7 @@
         "@react-router/dev": "^7.1.1",
         "@tailwindcss/typography": "^0.5.15",
         "@tanstack/eslint-plugin-query": "^5.62.15",
-        "@testing-library/jest-dom": "^6.6.1",
+        "@testing-library/jest-dom": "^6.6.3",
         "@testing-library/react": "^16.1.0",
         "@testing-library/user-event": "^14.5.2",
         "@types/node": "^22.10.5",
@@ -76,7 +76,7 @@
         "eslint-plugin-prettier": "^5.2.1",
         "eslint-plugin-react": "^7.37.3",
         "eslint-plugin-react-hooks": "^4.6.2",
-        "husky": "^9.1.6",
+        "husky": "^9.1.7",
         "jsdom": "^25.0.1",
         "lint-staged": "^15.3.0",
         "msw": "^2.6.6",
diff --git a/frontend/package.json b/frontend/package.json
index 9f519fa3524e..3ec394b82fc8 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -80,7 +80,7 @@
     "@react-router/dev": "^7.1.1",
     "@tailwindcss/typography": "^0.5.15",
     "@tanstack/eslint-plugin-query": "^5.62.15",
-    "@testing-library/jest-dom": "^6.6.1",
+    "@testing-library/jest-dom": "^6.6.3",
     "@testing-library/react": "^16.1.0",
     "@testing-library/user-event": "^14.5.2",
     "@types/node": "^22.10.5",
@@ -103,7 +103,7 @@
     "eslint-plugin-prettier": "^5.2.1",
     "eslint-plugin-react": "^7.37.3",
     "eslint-plugin-react-hooks": "^4.6.2",
-    "husky": "^9.1.6",
+    "husky": "^9.1.7",
     "jsdom": "^25.0.1",
     "lint-staged": "^15.3.0",
     "msw": "^2.6.6",
diff --git a/frontend/src/components/features/chat/chat-input.tsx b/frontend/src/components/features/chat/chat-input.tsx
index 02e346ca27a8..fbf3aff7aa1e 100644
--- a/frontend/src/components/features/chat/chat-input.tsx
+++ b/frontend/src/components/features/chat/chat-input.tsx
@@ -1,5 +1,7 @@
 import React from "react";
 import TextareaAutosize from "react-textarea-autosize";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { cn } from "#/utils/utils";
 import { SubmitButton } from "#/components/shared/buttons/submit-button";
 import { StopButton } from "#/components/shared/buttons/stop-button";
@@ -8,7 +10,6 @@ interface ChatInputProps {
   name?: string;
   button?: "submit" | "stop";
   disabled?: boolean;
-  placeholder?: string;
   showButton?: boolean;
   value?: string;
   maxRows?: number;
@@ -26,7 +27,6 @@ export function ChatInput({
   name,
   button = "submit",
   disabled,
-  placeholder,
   showButton = true,
   value,
   maxRows = 4,
@@ -39,6 +39,7 @@ export function ChatInput({
   className,
   buttonClassName,
 }: ChatInputProps) {
+  const { t } = useTranslation();
   const textareaRef = React.useRef<HTMLTextAreaElement>(null);
   const [isDraggingOver, setIsDraggingOver] = React.useState(false);
 
@@ -117,7 +118,7 @@ export function ChatInput({
       <TextareaAutosize
         ref={textareaRef}
         name={name}
-        placeholder={placeholder}
+        placeholder={t(I18nKey.SUGGESTIONS$WHAT_TO_BUILD)}
         onKeyDown={handleKeyPress}
         onChange={handleChange}
         onFocus={onFocus}
diff --git a/frontend/src/components/features/chat/chat-suggestions.tsx b/frontend/src/components/features/chat/chat-suggestions.tsx
index 794602aa2e3d..90d2797f99f0 100644
--- a/frontend/src/components/features/chat/chat-suggestions.tsx
+++ b/frontend/src/components/features/chat/chat-suggestions.tsx
@@ -1,4 +1,6 @@
+import { useTranslation } from "react-i18next";
 import { Suggestions } from "#/components/features/suggestions/suggestions";
+import { I18nKey } from "#/i18n/declaration";
 import BuildIt from "#/icons/build-it.svg?react";
 import { SUGGESTIONS } from "#/utils/suggestions";
 
@@ -7,12 +9,14 @@ interface ChatSuggestionsProps {
 }
 
 export function ChatSuggestions({ onSuggestionsClick }: ChatSuggestionsProps) {
+  const { t } = useTranslation();
+
   return (
     <div className="flex flex-col gap-6 h-full px-4 items-center justify-center">
       <div className="flex flex-col items-center p-4 bg-neutral-700 rounded-xl w-full">
         <BuildIt width={45} height={54} />
         <span className="font-semibold text-[20px] leading-6 -tracking-[0.01em] gap-1">
-          Let&apos;s start building!
+          {t(I18nKey.LANDING$TITLE)}
         </span>
       </div>
       <Suggestions
diff --git a/frontend/src/components/features/chat/interactive-chat-box.tsx b/frontend/src/components/features/chat/interactive-chat-box.tsx
index 09dcf84b32d6..e17d9ba8e33f 100644
--- a/frontend/src/components/features/chat/interactive-chat-box.tsx
+++ b/frontend/src/components/features/chat/interactive-chat-box.tsx
@@ -68,7 +68,6 @@ export function InteractiveChatBox({
         <ChatInput
           disabled={isDisabled}
           button={mode}
-          placeholder="What do you want to build?"
           onChange={onChange}
           onSubmit={handleSubmit}
           onStop={onStop}
diff --git a/frontend/src/components/features/controls/agent-control-bar.tsx b/frontend/src/components/features/controls/agent-control-bar.tsx
index c69d16e0bfcf..97749c667b1a 100644
--- a/frontend/src/components/features/controls/agent-control-bar.tsx
+++ b/frontend/src/components/features/controls/agent-control-bar.tsx
@@ -1,4 +1,6 @@
 import { useSelector } from "react-redux";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import PauseIcon from "#/assets/pause";
 import PlayIcon from "#/assets/play";
 import { generateAgentStateChangeEvent } from "#/services/agent-state-service";
@@ -9,6 +11,7 @@ import { IGNORE_TASK_STATE_MAP } from "#/ignore-task-state-map.constant";
 import { ActionButton } from "#/components/shared/buttons/action-button";
 
 export function AgentControlBar() {
+  const { t } = useTranslation();
   const { send } = useWsClient();
   const { curAgentState } = useSelector((state: RootState) => state.agent);
 
@@ -27,8 +30,8 @@ export function AgentControlBar() {
         }
         content={
           curAgentState === AgentState.PAUSED
-            ? "Resume the agent task"
-            : "Pause the current task"
+            ? t(I18nKey.AGENT$RESUME_TASK)
+            : t(I18nKey.AGENT$PAUSE_TASK)
         }
         action={
           curAgentState === AgentState.PAUSED
diff --git a/frontend/src/components/features/conversation-panel/conversation-panel.tsx b/frontend/src/components/features/conversation-panel/conversation-panel.tsx
index fd22cb74399b..a7c9ebd54d12 100644
--- a/frontend/src/components/features/conversation-panel/conversation-panel.tsx
+++ b/frontend/src/components/features/conversation-panel/conversation-panel.tsx
@@ -1,5 +1,7 @@
 import React from "react";
 import { useLocation, useNavigate, useParams } from "react-router";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { ConversationCard } from "./conversation-card";
 import { useUserConversations } from "#/hooks/query/use-user-conversations";
 import { useDeleteConversation } from "#/hooks/mutation/use-delete-conversation";
@@ -15,6 +17,7 @@ interface ConversationPanelProps {
 }
 
 export function ConversationPanel({ onClose }: ConversationPanelProps) {
+  const { t } = useTranslation();
   const { conversationId: cid } = useParams();
   const navigate = useNavigate();
   const location = useLocation();
@@ -89,7 +92,9 @@ export function ConversationPanel({ onClose }: ConversationPanelProps) {
       )}
       {conversations?.length === 0 && (
         <div className="flex flex-col items-center justify-center h-full">
-          <p className="text-neutral-400">No conversations found</p>
+          <p className="text-neutral-400">
+            {t(I18nKey.CONVERSATION$NO_CONVERSATIONS)}
+          </p>
         </div>
       )}
       {conversations?.map((project) => (
diff --git a/frontend/src/components/features/conversation-panel/new-conversation-button.tsx b/frontend/src/components/features/conversation-panel/new-conversation-button.tsx
index b7563952cfce..6b391cca906a 100644
--- a/frontend/src/components/features/conversation-panel/new-conversation-button.tsx
+++ b/frontend/src/components/features/conversation-panel/new-conversation-button.tsx
@@ -1,8 +1,12 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
+
 interface NewConversationButtonProps {
   onClick: () => void;
 }
 
 export function NewConversationButton({ onClick }: NewConversationButtonProps) {
+  const { t } = useTranslation();
   return (
     <button
       data-testid="new-conversation-button"
@@ -10,7 +14,7 @@ export function NewConversationButton({ onClick }: NewConversationButtonProps) {
       onClick={onClick}
       className="font-bold bg-[#4465DB] px-2 py-1 rounded"
     >
-      + New Project
+      + {t(I18nKey.PROJECT$NEW)}
     </button>
   );
 }
diff --git a/frontend/src/components/features/feedback/feedback-form.tsx b/frontend/src/components/features/feedback/feedback-form.tsx
index 31705a101493..9c6099024915 100644
--- a/frontend/src/components/features/feedback/feedback-form.tsx
+++ b/frontend/src/components/features/feedback/feedback-form.tsx
@@ -1,5 +1,7 @@
 import React from "react";
 import hotToast from "react-hot-toast";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { Feedback } from "#/api/open-hands.types";
 import { useSubmitFeedback } from "#/hooks/mutation/use-submit-feedback";
 import { ModalButton } from "#/components/shared/buttons/modal-button";
@@ -13,8 +15,9 @@ interface FeedbackFormProps {
 }
 
 export function FeedbackForm({ onClose, polarity }: FeedbackFormProps) {
+  const { t } = useTranslation();
   const copiedToClipboardToast = () => {
-    hotToast("Password copied to clipboard", {
+    hotToast(t(I18nKey.FEEDBACK$PASSWORD_COPIED_MESSAGE), {
       icon: "📋",
       position: "bottom-right",
     });
@@ -41,10 +44,13 @@ export function FeedbackForm({ onClose, polarity }: FeedbackFormProps) {
           target="_blank"
           rel="noreferrer"
         >
-          Go to shared feedback
+          {t(I18nKey.FEEDBACK$GO_TO_FEEDBACK)}
         </a>
         <span onClick={() => onPressToast(password)} className="cursor-pointer">
-          Password: {password} <span className="text-gray-500">(copy)</span>
+          {t(I18nKey.FEEDBACK$PASSWORD)}: {password}{" "}
+          <span className="text-gray-500">
+            ({t(I18nKey.FEEDBACK$COPY_LABEL)})
+          </span>
         </span>
       </div>,
       { duration: 10000 },
@@ -86,12 +92,14 @@ export function FeedbackForm({ onClose, polarity }: FeedbackFormProps) {
   return (
     <form onSubmit={handleSubmit} className="flex flex-col gap-6 w-full">
       <label className="flex flex-col gap-2">
-        <span className="text-xs text-neutral-400">Email</span>
+        <span className="text-xs text-neutral-400">
+          {t(I18nKey.FEEDBACK$EMAIL_LABEL)}
+        </span>
         <input
           required
           name="email"
           type="email"
-          placeholder="Please enter your email"
+          placeholder={t(I18nKey.FEEDBACK$EMAIL_PLACEHOLDER)}
           className="bg-[#27272A] px-3 py-[10px] rounded"
         />
       </label>
@@ -104,11 +112,11 @@ export function FeedbackForm({ onClose, polarity }: FeedbackFormProps) {
             type="radio"
             defaultChecked
           />
-          Private
+          {t(I18nKey.FEEDBACK$PRIVATE_LABEL)}
         </label>
         <label className="flex gap-2 cursor-pointer">
           <input name="permissions" value="public" type="radio" />
-          Public
+          {t(I18nKey.FEEDBACK$PUBLIC_LABEL)}
         </label>
       </div>
 
@@ -116,12 +124,12 @@ export function FeedbackForm({ onClose, polarity }: FeedbackFormProps) {
         <ModalButton
           disabled={isPending}
           type="submit"
-          text="Submit"
+          text={t(I18nKey.FEEDBACK$CONTRIBUTE_LABEL)}
           className="bg-[#4465DB] grow"
         />
         <ModalButton
           disabled={isPending}
-          text="Cancel"
+          text={t(I18nKey.FEEDBACK$CANCEL_LABEL)}
           onClick={onClose}
           className="bg-[#737373] grow"
         />
diff --git a/frontend/src/components/features/github/github-repo-selector.tsx b/frontend/src/components/features/github/github-repo-selector.tsx
index b9f070f213e0..22ef9972ce75 100644
--- a/frontend/src/components/features/github/github-repo-selector.tsx
+++ b/frontend/src/components/features/github/github-repo-selector.tsx
@@ -1,4 +1,5 @@
 import React from "react";
+import { useTranslation } from "react-i18next";
 import {
   Autocomplete,
   AutocompleteItem,
@@ -6,6 +7,7 @@ import {
 } from "@nextui-org/react";
 import { useDispatch } from "react-redux";
 import posthog from "posthog-js";
+import { I18nKey } from "#/i18n/declaration";
 import { setSelectedRepository } from "#/state/initial-query-slice";
 import { useConfig } from "#/hooks/query/use-config";
 import { sanitizeQuery } from "#/utils/sanitize-query";
@@ -23,6 +25,7 @@ export function GitHubRepositorySelector({
   userRepositories,
   publicRepositories,
 }: GitHubRepositorySelectorProps) {
+  const { t } = useTranslation();
   const { data: config } = useConfig();
   const [selectedKey, setSelectedKey] = React.useState<string | null>(null);
 
@@ -49,14 +52,14 @@ export function GitHubRepositorySelector({
     dispatch(setSelectedRepository(null));
   };
 
-  const emptyContent = "No results found.";
+  const emptyContent = t(I18nKey.GITHUB$NO_RESULTS);
 
   return (
     <Autocomplete
       data-testid="github-repo-selector"
       name="repo"
       aria-label="GitHub Repository"
-      placeholder="Select a GitHub project"
+      placeholder={t(I18nKey.LANDING$SELECT_REPO)}
       isVirtualized={false}
       selectedKey={selectedKey}
       inputProps={{
@@ -86,12 +89,12 @@ export function GitHubRepositorySelector({
               rel="noreferrer noopener"
               onClick={(e) => e.stopPropagation()}
             >
-              Add more repositories...
+              {t(I18nKey.GITHUB$ADD_MORE_REPOS)}
             </a>
           </AutocompleteItem> // eslint-disable-next-line @typescript-eslint/no-explicit-any
         ) as any)}
       {userRepositories.length > 0 && (
-        <AutocompleteSection showDivider title="Your Repos">
+        <AutocompleteSection showDivider title={t(I18nKey.GITHUB$YOUR_REPOS)}>
           {userRepositories.map((repo) => (
             <AutocompleteItem
               data-testid="github-repo-item"
@@ -106,7 +109,7 @@ export function GitHubRepositorySelector({
         </AutocompleteSection>
       )}
       {publicRepositories.length > 0 && (
-        <AutocompleteSection showDivider title="Public Repos">
+        <AutocompleteSection showDivider title={t(I18nKey.GITHUB$PUBLIC_REPOS)}>
           {publicRepositories.map((repo) => (
             <AutocompleteItem
               data-testid="github-repo-item"
diff --git a/frontend/src/components/features/github/github-repositories-suggestion-box.tsx b/frontend/src/components/features/github/github-repositories-suggestion-box.tsx
index 3ad3f65a2196..bc8cfd936794 100644
--- a/frontend/src/components/features/github/github-repositories-suggestion-box.tsx
+++ b/frontend/src/components/features/github/github-repositories-suggestion-box.tsx
@@ -1,4 +1,6 @@
 import React from "react";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { SuggestionBox } from "#/components/features/suggestions/suggestion-box";
 import GitHubLogo from "#/assets/branding/github-logo.svg?react";
 import { GitHubRepositorySelector } from "./github-repo-selector";
@@ -23,6 +25,7 @@ export function GitHubRepositoriesSuggestionBox({
   gitHubAuthUrl,
   user,
 }: GitHubRepositoriesSuggestionBoxProps) {
+  const { t } = useTranslation();
   const [connectToGitHubModalOpen, setConnectToGitHubModalOpen] =
     React.useState(false);
   const [searchQuery, setSearchQuery] = React.useState<string>("");
@@ -53,7 +56,7 @@ export function GitHubRepositoriesSuggestionBox({
   return (
     <>
       <SuggestionBox
-        title="Open a Repo"
+        title={t(I18nKey.LANDING$OPEN_REPO)}
         content={
           isLoggedIn ? (
             <GitHubRepositorySelector
@@ -64,7 +67,7 @@ export function GitHubRepositoriesSuggestionBox({
             />
           ) : (
             <ModalButton
-              text="Connect to GitHub"
+              text={t(I18nKey.GITHUB$CONNECT)}
               icon={<GitHubLogo width={20} height={20} />}
               className="bg-[#791B80] w-full"
               onClick={handleConnectToGitHub}
diff --git a/frontend/src/components/features/images/attach-image-label.tsx b/frontend/src/components/features/images/attach-image-label.tsx
index 9b3f1f413cf1..e43f14d9dfdb 100644
--- a/frontend/src/components/features/images/attach-image-label.tsx
+++ b/frontend/src/components/features/images/attach-image-label.tsx
@@ -1,10 +1,13 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import Clip from "#/icons/clip.svg?react";
 
 export function AttachImageLabel() {
+  const { t } = useTranslation();
   return (
     <div className="flex self-start items-center text-[#A3A3A3] text-xs leading-[18px] -tracking-[0.08px] cursor-pointer">
       <Clip width={16} height={16} />
-      Attach images
+      {t(I18nKey.LANDING$ATTACH_IMAGES)}
     </div>
   );
 }
diff --git a/frontend/src/components/features/jupyter/jupyter-cell-output.tsx b/frontend/src/components/features/jupyter/jupyter-cell-output.tsx
index e1d80e68e94b..359c519588bc 100644
--- a/frontend/src/components/features/jupyter/jupyter-cell-output.tsx
+++ b/frontend/src/components/features/jupyter/jupyter-cell-output.tsx
@@ -1,6 +1,8 @@
 import Markdown from "react-markdown";
 import SyntaxHighlighter from "react-syntax-highlighter";
 import { atomOneDark } from "react-syntax-highlighter/dist/esm/styles/hljs";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { JupyterLine } from "#/utils/parse-cell-content";
 
 interface JupyterCellOutputProps {
@@ -8,9 +10,12 @@ interface JupyterCellOutputProps {
 }
 
 export function JupyterCellOutput({ lines }: JupyterCellOutputProps) {
+  const { t } = useTranslation();
   return (
     <div className="rounded-lg bg-gray-800 dark:bg-gray-900 p-2 text-xs">
-      <div className="mb-1 text-gray-400">STDOUT/STDERR</div>
+      <div className="mb-1 text-gray-400">
+        {t(I18nKey.JUPYTER$OUTPUT_LABEL)}
+      </div>
       <pre
         className="scrollbar-custom scrollbar-thumb-gray-500 hover:scrollbar-thumb-gray-400 dark:scrollbar-thumb-white/10 dark:hover:scrollbar-thumb-white/20 overflow-auto px-5 max-h-[60vh] bg-gray-800"
         style={{ padding: 0, marginBottom: 0, fontSize: "0.75rem" }}
diff --git a/frontend/src/components/features/sidebar/user-avatar.tsx b/frontend/src/components/features/sidebar/user-avatar.tsx
index 12a18847d01c..58d89a8a389b 100644
--- a/frontend/src/components/features/sidebar/user-avatar.tsx
+++ b/frontend/src/components/features/sidebar/user-avatar.tsx
@@ -1,4 +1,6 @@
 import { Tooltip } from "@nextui-org/react";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { LoadingSpinner } from "#/components/shared/loading-spinner";
 import DefaultUserAvatar from "#/icons/default-user.svg?react";
 import { cn } from "#/utils/utils";
@@ -11,6 +13,7 @@ interface UserAvatarProps {
 }
 
 export function UserAvatar({ onClick, avatarUrl, isLoading }: UserAvatarProps) {
+  const { t } = useTranslation();
   const buttonContent = (
     <button
       data-testid="user-avatar"
@@ -24,7 +27,7 @@ export function UserAvatar({ onClick, avatarUrl, isLoading }: UserAvatarProps) {
       {!isLoading && avatarUrl && <Avatar src={avatarUrl} />}
       {!isLoading && !avatarUrl && (
         <DefaultUserAvatar
-          aria-label="user avatar placeholder"
+          aria-label={t(I18nKey.USER$AVATAR_PLACEHOLDER)}
           width={20}
           height={20}
         />
@@ -34,7 +37,7 @@ export function UserAvatar({ onClick, avatarUrl, isLoading }: UserAvatarProps) {
   );
 
   return (
-    <Tooltip content="Account settings" closeDelay={100}>
+    <Tooltip content={t(I18nKey.USER$ACCOUNT_SETTINGS)} closeDelay={100}>
       {buttonContent}
     </Tooltip>
   );
diff --git a/frontend/src/components/features/suggestions/import-project-suggestion-box.tsx b/frontend/src/components/features/suggestions/import-project-suggestion-box.tsx
index e76317001a01..5953e0fc620e 100644
--- a/frontend/src/components/features/suggestions/import-project-suggestion-box.tsx
+++ b/frontend/src/components/features/suggestions/import-project-suggestion-box.tsx
@@ -1,3 +1,5 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { SuggestionBox } from "./suggestion-box";
 
 interface ImportProjectSuggestionBoxProps {
@@ -7,13 +9,14 @@ interface ImportProjectSuggestionBoxProps {
 export function ImportProjectSuggestionBox({
   onChange,
 }: ImportProjectSuggestionBoxProps) {
+  const { t } = useTranslation();
   return (
     <SuggestionBox
-      title="+ Import Project"
+      title={t(I18nKey.LANDING$IMPORT_PROJECT)}
       content={
         <label htmlFor="import-project" className="w-full flex justify-center">
           <span className="border-2 border-dashed border-neutral-600 rounded px-2 py-1 cursor-pointer">
-            Upload a .zip
+            {t(I18nKey.LANDING$UPLOAD_ZIP)}
           </span>
           <input
             hidden
diff --git a/frontend/src/components/features/suggestions/suggestion-bubble.tsx b/frontend/src/components/features/suggestions/suggestion-bubble.tsx
index 5679799c6ed1..3802642b7114 100644
--- a/frontend/src/components/features/suggestions/suggestion-bubble.tsx
+++ b/frontend/src/components/features/suggestions/suggestion-bubble.tsx
@@ -1,8 +1,10 @@
+import { useTranslation } from "react-i18next";
 import { RefreshButton } from "#/components/shared/buttons/refresh-button";
 import Lightbulb from "#/icons/lightbulb.svg?react";
+import { I18nKey } from "#/i18n/declaration";
 
 interface SuggestionBubbleProps {
-  suggestion: string;
+  suggestion: { key: string; value: string };
   onClick: () => void;
   onRefresh: () => void;
 }
@@ -12,6 +14,7 @@ export function SuggestionBubble({
   onClick,
   onRefresh,
 }: SuggestionBubbleProps) {
+  const { t } = useTranslation();
   const handleRefresh = (e: React.MouseEvent<HTMLButtonElement>) => {
     e.stopPropagation();
     onRefresh();
@@ -24,7 +27,7 @@ export function SuggestionBubble({
     >
       <div className="flex items-center gap-2">
         <Lightbulb width={18} height={18} />
-        <span className="text-sm">{suggestion}</span>
+        <span className="text-sm">{t(suggestion.key as I18nKey)}</span>
       </div>
       <RefreshButton onClick={handleRefresh} />
     </div>
diff --git a/frontend/src/components/features/suggestions/suggestion-item.tsx b/frontend/src/components/features/suggestions/suggestion-item.tsx
index 1d685a069803..9b7705958bbb 100644
--- a/frontend/src/components/features/suggestions/suggestion-item.tsx
+++ b/frontend/src/components/features/suggestions/suggestion-item.tsx
@@ -1,4 +1,7 @@
-export type Suggestion = { label: string; value: string };
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
+
+export type Suggestion = { label: I18nKey | string; value: string };
 
 interface SuggestionItemProps {
   suggestion: Suggestion;
@@ -6,6 +9,7 @@ interface SuggestionItemProps {
 }
 
 export function SuggestionItem({ suggestion, onClick }: SuggestionItemProps) {
+  const { t } = useTranslation();
   return (
     <li className="list-none border border-neutral-600 rounded-xl hover:bg-neutral-700 flex-1">
       <button
@@ -14,7 +18,7 @@ export function SuggestionItem({ suggestion, onClick }: SuggestionItemProps) {
         onClick={() => onClick(suggestion.value)}
         className="text-[16px] leading-6 -tracking-[0.01em] text-center w-full p-3 font-semibold"
       >
-        {suggestion.label}
+        {t(suggestion.label)}
       </button>
     </li>
   );
diff --git a/frontend/src/components/features/terminal/terminal-status-label.tsx b/frontend/src/components/features/terminal/terminal-status-label.tsx
index 24b55960ee9e..cd7197f6d929 100644
--- a/frontend/src/components/features/terminal/terminal-status-label.tsx
+++ b/frontend/src/components/features/terminal/terminal-status-label.tsx
@@ -1,9 +1,12 @@
 import { useSelector } from "react-redux";
+import { useTranslation } from "react-i18next";
 import { cn } from "#/utils/utils";
 import { AgentState } from "#/types/agent-state";
 import { RootState } from "#/store";
+import { I18nKey } from "#/i18n/declaration";
 
 export function TerminalStatusLabel() {
+  const { t } = useTranslation();
   const { curAgentState } = useSelector((state: RootState) => state.agent);
 
   return (
@@ -17,7 +20,7 @@ export function TerminalStatusLabel() {
             : "bg-green-500",
         )}
       />
-      Terminal
+      {t(I18nKey.WORKSPACE$TERMINAL_TAB_LABEL)}
     </div>
   );
 }
diff --git a/frontend/src/components/features/waitlist/tos-checkbox.tsx b/frontend/src/components/features/waitlist/tos-checkbox.tsx
index 2a780776fb3d..b2fdafcbc725 100644
--- a/frontend/src/components/features/waitlist/tos-checkbox.tsx
+++ b/frontend/src/components/features/waitlist/tos-checkbox.tsx
@@ -1,20 +1,24 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
+
 interface TOSCheckboxProps {
   onChange: () => void;
 }
 
 export function TOSCheckbox({ onChange }: TOSCheckboxProps) {
+  const { t } = useTranslation();
   return (
     <label className="flex items-center gap-2">
       <input type="checkbox" onChange={onChange} />
       <span>
-        I accept the{" "}
+        {t(I18nKey.TOS$ACCEPT)}{" "}
         <a
           href="https://www.all-hands.dev/tos"
           target="_blank"
           rel="noopener noreferrer"
           className="underline underline-offset-2 text-blue-500 hover:text-blue-700"
         >
-          terms of service
+          {t(I18nKey.TOS$TERMS)}
         </a>
       </span>
     </label>
diff --git a/frontend/src/components/layout/beta-badge.tsx b/frontend/src/components/layout/beta-badge.tsx
index e31903d138aa..3a7155bb9be4 100644
--- a/frontend/src/components/layout/beta-badge.tsx
+++ b/frontend/src/components/layout/beta-badge.tsx
@@ -1,7 +1,11 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
+
 export function BetaBadge() {
+  const { t } = useTranslation();
   return (
     <span className="text-[11px] leading-5 text-root-primary bg-neutral-400 px-1 rounded-xl">
-      Beta
+      {t(I18nKey.BADGE$BETA)}
     </span>
   );
 }
diff --git a/frontend/src/components/shared/action-tooltip.tsx b/frontend/src/components/shared/action-tooltip.tsx
index eb2053a7bdf4..9111269067a4 100644
--- a/frontend/src/components/shared/action-tooltip.tsx
+++ b/frontend/src/components/shared/action-tooltip.tsx
@@ -22,7 +22,11 @@ export function ActionTooltip({ type, onClick }: ActionTooltipProps) {
       <button
         data-testid={`action-${type}-button`}
         type="button"
-        aria-label={type === "confirm" ? "Confirm action" : "Reject action"}
+        aria-label={
+          type === "confirm"
+            ? t(I18nKey.ACTION$CONFIRM)
+            : t(I18nKey.ACTION$REJECT)
+        }
         className="bg-neutral-700 rounded-full p-1 hover:bg-neutral-800"
         onClick={onClick}
       >
diff --git a/frontend/src/components/shared/buttons/docs-button.tsx b/frontend/src/components/shared/buttons/docs-button.tsx
index a06e543cda37..d2cafe2422cb 100644
--- a/frontend/src/components/shared/buttons/docs-button.tsx
+++ b/frontend/src/components/shared/buttons/docs-button.tsx
@@ -1,11 +1,14 @@
+import { useTranslation } from "react-i18next";
 import DocsIcon from "#/icons/docs.svg?react";
+import { I18nKey } from "#/i18n/declaration";
 import { TooltipButton } from "./tooltip-button";
 
 export function DocsButton() {
+  const { t } = useTranslation();
   return (
     <TooltipButton
-      tooltip="Documentation"
-      ariaLabel="Documentation"
+      tooltip={t(I18nKey.SIDEBAR$DOCS)}
+      ariaLabel={t(I18nKey.SIDEBAR$DOCS)}
       href="https://docs.all-hands.dev"
     >
       <DocsIcon width={28} height={28} />
diff --git a/frontend/src/components/shared/buttons/exit-project-button.tsx b/frontend/src/components/shared/buttons/exit-project-button.tsx
index 206d1660e2bb..e0f1efe78a0e 100644
--- a/frontend/src/components/shared/buttons/exit-project-button.tsx
+++ b/frontend/src/components/shared/buttons/exit-project-button.tsx
@@ -1,3 +1,5 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import NewProjectIcon from "#/icons/new-project.svg?react";
 import { TooltipButton } from "./tooltip-button";
 
@@ -6,10 +8,12 @@ interface ExitProjectButtonProps {
 }
 
 export function ExitProjectButton({ onClick }: ExitProjectButtonProps) {
+  const { t } = useTranslation();
+  const startNewProject = t(I18nKey.PROJECT$START_NEW);
   return (
     <TooltipButton
-      tooltip="Start new project"
-      ariaLabel="Start new project"
+      tooltip={startNewProject}
+      ariaLabel={startNewProject}
       onClick={onClick}
       testId="new-project-button"
     >
diff --git a/frontend/src/components/shared/buttons/open-vscode-button.tsx b/frontend/src/components/shared/buttons/open-vscode-button.tsx
index 0c8dfbc3f40c..d115de3e53ac 100644
--- a/frontend/src/components/shared/buttons/open-vscode-button.tsx
+++ b/frontend/src/components/shared/buttons/open-vscode-button.tsx
@@ -1,3 +1,5 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { cn } from "#/utils/utils";
 import VSCodeIcon from "#/assets/vscode-alt.svg?react";
 
@@ -10,6 +12,9 @@ export function OpenVSCodeButton({
   isDisabled,
   onClick,
 }: OpenVSCodeButtonProps) {
+  const { t } = useTranslation();
+  const buttonText = t(I18nKey.VSCODE$OPEN);
+
   return (
     <button
       type="button"
@@ -21,10 +26,10 @@ export function OpenVSCodeButton({
           ? "bg-neutral-600 cursor-not-allowed"
           : "bg-[#4465DB] hover:bg-[#3451C7]",
       )}
-      aria-label="Open in VS Code"
+      aria-label={buttonText}
     >
       <VSCodeIcon width={20} height={20} />
-      Open in VS Code
+      {buttonText}
     </button>
   );
 }
diff --git a/frontend/src/components/shared/buttons/settings-button.tsx b/frontend/src/components/shared/buttons/settings-button.tsx
index 59ed58ed27a2..827e2c6e677c 100644
--- a/frontend/src/components/shared/buttons/settings-button.tsx
+++ b/frontend/src/components/shared/buttons/settings-button.tsx
@@ -1,4 +1,6 @@
+import { useTranslation } from "react-i18next";
 import CogTooth from "#/assets/cog-tooth";
+import { I18nKey } from "#/i18n/declaration";
 import { TooltipButton } from "./tooltip-button";
 
 interface SettingsButtonProps {
@@ -6,11 +8,12 @@ interface SettingsButtonProps {
 }
 
 export function SettingsButton({ onClick }: SettingsButtonProps) {
+  const { t } = useTranslation();
   return (
     <TooltipButton
       testId="settings-button"
-      tooltip="Settings"
-      ariaLabel="Settings"
+      tooltip={t(I18nKey.SIDEBAR$SETTINGS)}
+      ariaLabel={t(I18nKey.SIDEBAR$SETTINGS)}
       onClick={onClick}
     >
       <CogTooth />
diff --git a/frontend/src/components/shared/buttons/stop-button.tsx b/frontend/src/components/shared/buttons/stop-button.tsx
index dbb99ebd100f..bf0ce7db79c0 100644
--- a/frontend/src/components/shared/buttons/stop-button.tsx
+++ b/frontend/src/components/shared/buttons/stop-button.tsx
@@ -1,13 +1,17 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
+
 interface StopButtonProps {
   isDisabled?: boolean;
   onClick?: () => void;
 }
 
 export function StopButton({ isDisabled, onClick }: StopButtonProps) {
+  const { t } = useTranslation();
   return (
     <button
       data-testid="stop-button"
-      aria-label="Stop"
+      aria-label={t(I18nKey.BUTTON$STOP)}
       disabled={isDisabled}
       onClick={onClick}
       type="button"
diff --git a/frontend/src/components/shared/buttons/submit-button.tsx b/frontend/src/components/shared/buttons/submit-button.tsx
index b65fa25775dd..48f04b7ad551 100644
--- a/frontend/src/components/shared/buttons/submit-button.tsx
+++ b/frontend/src/components/shared/buttons/submit-button.tsx
@@ -1,4 +1,6 @@
+import { useTranslation } from "react-i18next";
 import ArrowSendIcon from "#/icons/arrow-send.svg?react";
+import { I18nKey } from "#/i18n/declaration";
 
 interface SubmitButtonProps {
   isDisabled?: boolean;
@@ -6,9 +8,10 @@ interface SubmitButtonProps {
 }
 
 export function SubmitButton({ isDisabled, onClick }: SubmitButtonProps) {
+  const { t } = useTranslation();
   return (
     <button
-      aria-label="Send"
+      aria-label={t(I18nKey.BUTTON$SEND)}
       disabled={isDisabled}
       onClick={onClick}
       type="submit"
diff --git a/frontend/src/components/shared/download-progress.tsx b/frontend/src/components/shared/download-progress.tsx
index d5d79d0c6b43..9790ed46c736 100644
--- a/frontend/src/components/shared/download-progress.tsx
+++ b/frontend/src/components/shared/download-progress.tsx
@@ -1,3 +1,6 @@
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
+
 export interface DownloadProgressState {
   filesTotal: number;
   filesDownloaded: number;
@@ -16,6 +19,7 @@ export function DownloadProgress({
   progress,
   onCancel,
 }: DownloadProgressProps) {
+  const { t } = useTranslation();
   const formatBytes = (bytes: number) => {
     const units = ["B", "KB", "MB", "GB"];
     let size = bytes;
@@ -33,12 +37,12 @@ export function DownloadProgress({
         <div className="mb-4">
           <h3 className="text-lg font-semibold mb-2 text-white">
             {progress.isDiscoveringFiles
-              ? "Preparing Download..."
-              : "Downloading Files"}
+              ? t(I18nKey.DOWNLOAD$PREPARING)
+              : t(I18nKey.DOWNLOAD$DOWNLOADING)}
           </h3>
           <p className="text-sm text-gray-400 truncate">
             {progress.isDiscoveringFiles
-              ? `Found ${progress.filesTotal} files...`
+              ? t(I18nKey.DOWNLOAD$FOUND_FILES, { count: progress.filesTotal })
               : progress.currentFile}
           </p>
         </div>
@@ -64,8 +68,11 @@ export function DownloadProgress({
         <div className="flex justify-between text-sm text-gray-400">
           <span>
             {progress.isDiscoveringFiles
-              ? `Scanning workspace...`
-              : `${progress.filesDownloaded} of ${progress.filesTotal} files`}
+              ? t(I18nKey.DOWNLOAD$SCANNING)
+              : t(I18nKey.DOWNLOAD$FILES_PROGRESS, {
+                  downloaded: progress.filesDownloaded,
+                  total: progress.filesTotal,
+                })}
           </span>
           {!progress.isDiscoveringFiles && (
             <span>{formatBytes(progress.bytesDownloadedPerSecond)}/s</span>
@@ -78,7 +85,7 @@ export function DownloadProgress({
             onClick={onCancel}
             className="px-4 py-2 text-sm text-gray-400 hover:text-white transition-colors"
           >
-            Cancel
+            {t(I18nKey.DOWNLOAD$CANCEL)}
           </button>
         </div>
       </div>
diff --git a/frontend/src/components/shared/hero-heading.tsx b/frontend/src/components/shared/hero-heading.tsx
index f8dea1f89697..22dd254d865c 100644
--- a/frontend/src/components/shared/hero-heading.tsx
+++ b/frontend/src/components/shared/hero-heading.tsx
@@ -1,24 +1,26 @@
+import { useTranslation } from "react-i18next";
 import BuildIt from "#/icons/build-it.svg?react";
+import { I18nKey } from "#/i18n/declaration";
 
 export function HeroHeading() {
+  const { t } = useTranslation();
   return (
     <div className="w-[304px] text-center flex flex-col gap-4 items-center py-4">
       <BuildIt width={88} height={104} />
       <h1 className="text-[38px] leading-[32px] -tracking-[0.02em]">
-        Let&apos;s Start Building!
+        {t(I18nKey.LANDING$TITLE)}
       </h1>
       <p className="mx-4 text-sm flex flex-col gap-2">
-        OpenHands makes it easy to build and maintain software using a simple
-        prompt.{" "}
+        {t(I18nKey.LANDING$SUBTITLE)}{" "}
         <span className="">
-          Not sure how to start?{" "}
+          {t(I18nKey.LANDING$START_HELP)}{" "}
           <a
             rel="noopener noreferrer"
             target="_blank"
             href="https://docs.all-hands.dev/modules/usage/getting-started"
             className="text-hyperlink underline underline-offset-[3px]"
           >
-            Read this
+            {t(I18nKey.LANDING$START_HELP_LINK)}
           </a>
         </span>
       </p>
diff --git a/frontend/src/components/shared/inputs/api-key-input.tsx b/frontend/src/components/shared/inputs/api-key-input.tsx
index 7bdafb90bd1e..0b3ff3462ab3 100644
--- a/frontend/src/components/shared/inputs/api-key-input.tsx
+++ b/frontend/src/components/shared/inputs/api-key-input.tsx
@@ -22,14 +22,14 @@ export function APIKeyInput({ isDisabled, isSet }: APIKeyInputProps) {
           {!isSet && (
             <FaExclamationCircle className="text-[#FF3860] inline-block" />
           )}
-          {t(I18nKey.SETTINGS_FORM$API_KEY_LABEL)}
+          {t(I18nKey.API$KEY)}
         </label>
       </Tooltip>
       <Input
         isDisabled={isDisabled}
         id="api-key"
         name="api-key"
-        aria-label="API Key"
+        aria-label={t(I18nKey.API$KEY)}
         type="password"
         defaultValue=""
         classNames={{
@@ -37,14 +37,14 @@ export function APIKeyInput({ isDisabled, isSet }: APIKeyInputProps) {
         }}
       />
       <p className="text-sm text-[#A3A3A3]">
-        {t(I18nKey.SETTINGS_FORM$DONT_KNOW_API_KEY_LABEL)}{" "}
+        {t(I18nKey.API$DONT_KNOW_KEY)}{" "}
         <a
           href="https://docs.all-hands.dev/modules/usage/llms"
           rel="noreferrer noopener"
           target="_blank"
           className="underline underline-offset-2"
         >
-          {t(I18nKey.SETTINGS_FORM$CLICK_HERE_FOR_INSTRUCTIONS_LABEL)}
+          {t(I18nKey.COMMON$CLICK_FOR_INSTRUCTIONS)}
         </a>
       </p>
     </fieldset>
diff --git a/frontend/src/components/shared/modals/account-settings/account-settings-form.tsx b/frontend/src/components/shared/modals/account-settings/account-settings-form.tsx
index fb162103eb5f..796dd34aac29 100644
--- a/frontend/src/components/shared/modals/account-settings/account-settings-form.tsx
+++ b/frontend/src/components/shared/modals/account-settings/account-settings-form.tsx
@@ -64,7 +64,7 @@ export function AccountSettingsForm({
     <ModalBody>
       <form className="flex flex-col w-full gap-6" onSubmit={handleSubmit}>
         <div className="w-full flex flex-col gap-2">
-          <BaseModalTitle title="Account Settings" />
+          <BaseModalTitle title={t(I18nKey.ACCOUNT_SETTINGS$TITLE)} />
 
           {config?.APP_MODE === "saas" && config?.APP_SLUG && (
             <a
@@ -73,12 +73,12 @@ export function AccountSettingsForm({
               rel="noreferrer noopener"
               className="underline"
             >
-              Configure Github Repositories
+              {t(I18nKey.GITHUB$CONFIGURE_REPOS)}
             </a>
           )}
           <FormFieldset
             id="language"
-            label="Language"
+            label={t(I18nKey.LANGUAGE$LABEL)}
             defaultSelectedKey={selectedLanguage}
             isClearable={false}
             items={AvailableLanguages.map(({ label, value: key }) => ({
@@ -91,32 +91,32 @@ export function AccountSettingsForm({
             <>
               <CustomInput
                 name="ghToken"
-                label="GitHub Token"
+                label={t(I18nKey.GITHUB$TOKEN_OPTIONAL)}
                 type="password"
                 defaultValue={gitHubToken ?? ""}
               />
               <BaseModalDescription>
-                {t(I18nKey.CONNECT_TO_GITHUB_MODAL$GET_YOUR_TOKEN)}{" "}
+                {t(I18nKey.GITHUB$GET_TOKEN)}{" "}
                 <a
                   href="https://github.com/settings/tokens/new?description=openhands-app&scopes=repo,user,workflow"
                   target="_blank"
                   rel="noreferrer noopener"
                   className="text-[#791B80] underline"
                 >
-                  {t(I18nKey.CONNECT_TO_GITHUB_MODAL$HERE)}
+                  {t(I18nKey.COMMON$HERE)}
                 </a>
               </BaseModalDescription>
             </>
           )}
           {gitHubError && (
             <p className="text-danger text-xs">
-              {t(I18nKey.ACCOUNT_SETTINGS_MODAL$GITHUB_TOKEN_INVALID)}
+              {t(I18nKey.GITHUB$TOKEN_INVALID)}
             </p>
           )}
           {gitHubToken && !gitHubError && (
             <ModalButton
               variant="text-like"
-              text={t(I18nKey.ACCOUNT_SETTINGS_MODAL$DISCONNECT)}
+              text={t(I18nKey.BUTTON$DISCONNECT)}
               onClick={() => {
                 logout();
                 onClose();
@@ -132,18 +132,18 @@ export function AccountSettingsForm({
             type="checkbox"
             defaultChecked={analyticsConsent === "true"}
           />
-          Enable analytics
+          {t(I18nKey.ANALYTICS$ENABLE)}
         </label>
 
         <div className="flex flex-col gap-2 w-full">
           <ModalButton
             type="submit"
             intent="account"
-            text={t(I18nKey.ACCOUNT_SETTINGS_MODAL$SAVE)}
+            text={t(I18nKey.BUTTON$SAVE)}
             className="bg-[#4465DB]"
           />
           <ModalButton
-            text={t(I18nKey.ACCOUNT_SETTINGS_MODAL$CLOSE)}
+            text={t(I18nKey.BUTTON$CLOSE)}
             onClick={onClose}
             className="bg-[#737373]"
           />
diff --git a/frontend/src/components/shared/modals/settings/model-selector.tsx b/frontend/src/components/shared/modals/settings/model-selector.tsx
index baefbf349d17..811e3df66c6e 100644
--- a/frontend/src/components/shared/modals/settings/model-selector.tsx
+++ b/frontend/src/components/shared/modals/settings/model-selector.tsx
@@ -4,6 +4,8 @@ import {
   AutocompleteSection,
 } from "@nextui-org/react";
 import React from "react";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import { mapProvider } from "#/utils/map-provider";
 import { VERIFIED_MODELS, VERIFIED_PROVIDERS } from "#/utils/verified-models";
 import { extractModelAndProvider } from "#/utils/extract-model-and-provider";
@@ -60,12 +62,14 @@ export function ModelSelector({
     setLitellmId(null);
   };
 
+  const { t } = useTranslation();
+
   return (
     <div data-testid="model-selector" className="flex flex-col gap-2">
       <div className="flex flex-row gap-3">
         <fieldset className="flex flex-col gap-2">
           <label htmlFor="agent" className="font-[500] text-[#A3A3A3] text-xs">
-            LLM Provider
+            {t(I18nKey.LLM$PROVIDER)}
           </label>
           <Autocomplete
             data-testid="llm-provider"
@@ -73,8 +77,8 @@ export function ModelSelector({
             isVirtualized={false}
             name="llm-provider"
             isDisabled={isDisabled}
-            aria-label="LLM Provider"
-            placeholder="Select a provider"
+            aria-label={t(I18nKey.LLM$PROVIDER)}
+            placeholder={t(I18nKey.LLM$SELECT_PROVIDER_PLACEHOLDER)}
             isClearable={false}
             onSelectionChange={(e) => {
               if (e?.toString()) handleChangeProvider(e.toString());
@@ -115,15 +119,15 @@ export function ModelSelector({
 
         <fieldset className="flex flex-col gap-2">
           <label htmlFor="agent" className="font-[500] text-[#A3A3A3] text-xs">
-            LLM Model
+            {t(I18nKey.LLM$MODEL)}
           </label>
           <Autocomplete
             data-testid="llm-model"
             isRequired
             isVirtualized={false}
             name="llm-model"
-            aria-label="LLM Model"
-            placeholder="Select a model"
+            aria-label={t(I18nKey.LLM$MODEL)}
+            placeholder={t(I18nKey.LLM$SELECT_MODEL_PLACEHOLDER)}
             isClearable={false}
             onSelectionChange={(e) => {
               if (e?.toString()) handleChangeModel(e.toString());
diff --git a/frontend/src/components/shared/modals/settings/runtime-size-selector.tsx b/frontend/src/components/shared/modals/settings/runtime-size-selector.tsx
index eebfbcc3ceda..a1b6a18bd18f 100644
--- a/frontend/src/components/shared/modals/settings/runtime-size-selector.tsx
+++ b/frontend/src/components/shared/modals/settings/runtime-size-selector.tsx
@@ -1,5 +1,6 @@
 import { useTranslation } from "react-i18next";
 import { Select, SelectItem } from "@nextui-org/react";
+import { I18nKey } from "#/i18n/declaration";
 
 interface RuntimeSizeSelectorProps {
   isDisabled: boolean;
@@ -18,14 +19,14 @@ export function RuntimeSizeSelector({
         htmlFor="runtime-size"
         className="font-[500] text-[#A3A3A3] text-xs"
       >
-        {t("SETTINGS_FORM$RUNTIME_SIZE_LABEL")}
+        {t(I18nKey.SETTINGS_FORM$RUNTIME_SIZE_LABEL)}
       </label>
       <Select
         id="runtime-size"
         name="runtime-size"
         defaultSelectedKeys={[String(defaultValue || 1)]}
         isDisabled={isDisabled}
-        aria-label={t("SETTINGS_FORM$RUNTIME_SIZE_LABEL")}
+        aria-label={t(I18nKey.SETTINGS_FORM$RUNTIME_SIZE_LABEL)}
         classNames={{
           trigger: "bg-[#27272A] rounded-md text-sm px-3 py-[10px]",
         }}
diff --git a/frontend/src/components/shared/modals/settings/settings-form.tsx b/frontend/src/components/shared/modals/settings/settings-form.tsx
index 8390c237a66f..45c4e020386f 100644
--- a/frontend/src/components/shared/modals/settings/settings-form.tsx
+++ b/frontend/src/components/shared/modals/settings/settings-form.tsx
@@ -2,11 +2,11 @@ import { useLocation } from "react-router";
 import { useTranslation } from "react-i18next";
 import React from "react";
 import posthog from "posthog-js";
+import { I18nKey } from "#/i18n/declaration";
 import { organizeModelsAndProviders } from "#/utils/organize-models-and-providers";
 import { getDefaultSettings, Settings } from "#/services/settings";
 import { extractModelAndProvider } from "#/utils/extract-model-and-provider";
 import { DangerModal } from "../confirmation-modals/danger-modal";
-import { I18nKey } from "#/i18n/declaration";
 import { extractSettings, saveSettingsView } from "#/utils/settings-utils";
 import { useEndSession } from "#/hooks/use-end-session";
 import { ModalButton } from "../../buttons/modal-button";
@@ -206,18 +206,18 @@ export function SettingsForm({
             <ModalButton
               disabled={disabled}
               type="submit"
-              text={t(I18nKey.SETTINGS_FORM$SAVE_LABEL)}
+              text={t(I18nKey.BUTTON$SAVE)}
               className="bg-[#4465DB] w-full"
             />
             <ModalButton
-              text={t(I18nKey.SETTINGS_FORM$CLOSE_LABEL)}
+              text={t(I18nKey.BUTTON$CLOSE)}
               className="bg-[#737373] w-full"
               onClick={onClose}
             />
           </div>
           <ModalButton
             disabled={disabled}
-            text={t(I18nKey.SETTINGS_FORM$RESET_TO_DEFAULTS_LABEL)}
+            text={t(I18nKey.BUTTON$RESET_TO_DEFAULTS)}
             variant="text-like"
             className="text-danger self-start"
             onClick={() => {
@@ -231,17 +231,15 @@ export function SettingsForm({
         <ModalBackdrop>
           <DangerModal
             testId="reset-defaults-modal"
-            title={t(I18nKey.SETTINGS_FORM$ARE_YOU_SURE_LABEL)}
-            description={t(
-              I18nKey.SETTINGS_FORM$ALL_INFORMATION_WILL_BE_DELETED_MESSAGE,
-            )}
+            title={t(I18nKey.MODAL$CONFIRM_RESET_TITLE)}
+            description={t(I18nKey.MODAL$CONFIRM_RESET_MESSAGE)}
             buttons={{
               danger: {
-                text: t(I18nKey.SETTINGS_FORM$RESET_TO_DEFAULTS_LABEL),
+                text: t(I18nKey.BUTTON$RESET_TO_DEFAULTS),
                 onClick: handleConfirmResetSettings,
               },
               cancel: {
-                text: t(I18nKey.SETTINGS_FORM$CANCEL_LABEL),
+                text: t(I18nKey.BUTTON$CANCEL),
                 onClick: () => setConfirmResetDefaultsModalOpen(false),
               },
             }}
@@ -251,17 +249,15 @@ export function SettingsForm({
       {confirmEndSessionModalOpen && (
         <ModalBackdrop>
           <DangerModal
-            title={t(I18nKey.SETTINGS_FORM$END_SESSION_LABEL)}
-            description={t(
-              I18nKey.SETTINGS_FORM$CHANGING_WORKSPACE_WARNING_MESSAGE,
-            )}
+            title={t(I18nKey.MODAL$END_SESSION_TITLE)}
+            description={t(I18nKey.MODAL$END_SESSION_MESSAGE)}
             buttons={{
               danger: {
-                text: t(I18nKey.SETTINGS_FORM$END_SESSION_LABEL),
+                text: t(I18nKey.BUTTON$END_SESSION),
                 onClick: handleConfirmEndSession,
               },
               cancel: {
-                text: t(I18nKey.SETTINGS_FORM$CANCEL_LABEL),
+                text: t(I18nKey.BUTTON$CANCEL),
                 onClick: () => setConfirmEndSessionModalOpen(false),
               },
             }}
diff --git a/frontend/src/components/shared/modals/settings/settings-modal.tsx b/frontend/src/components/shared/modals/settings/settings-modal.tsx
index db8eb821d55c..842d8bcbd09d 100644
--- a/frontend/src/components/shared/modals/settings/settings-modal.tsx
+++ b/frontend/src/components/shared/modals/settings/settings-modal.tsx
@@ -1,5 +1,7 @@
+import { useTranslation } from "react-i18next";
 import { useAIConfigOptions } from "#/hooks/query/use-ai-config-options";
 import { Settings } from "#/services/settings";
+import { I18nKey } from "#/i18n/declaration";
 import { LoadingSpinner } from "../../loading-spinner";
 import { ModalBackdrop } from "../modal-backdrop";
 import { SettingsForm } from "./settings-form";
@@ -11,6 +13,7 @@ interface SettingsModalProps {
 
 export function SettingsModal({ onClose, settings }: SettingsModalProps) {
   const aiConfigOptions = useAIConfigOptions();
+  const { t } = useTranslation();
 
   return (
     <ModalBackdrop onClose={onClose}>
@@ -22,14 +25,12 @@ export function SettingsModal({ onClose, settings }: SettingsModalProps) {
           <p className="text-danger text-xs">{aiConfigOptions.error.message}</p>
         )}
         <span className="text-xl leading-6 font-semibold -tracking-[0.01em">
-          AI Provider Configuration
+          {t(I18nKey.SETTINGS$TITLE)}
         </span>
         <p className="text-xs text-[#A3A3A3]">
-          To continue, connect an OpenAI, Anthropic, or other LLM account
-        </p>
-        <p className="text-xs text-danger">
-          Changing settings during an active session will end the session
+          {t(I18nKey.SETTINGS$DESCRIPTION)}
         </p>
+        <p className="text-xs text-danger">{t(I18nKey.SETTINGS$WARNING)}</p>
         {aiConfigOptions.isLoading && (
           <div className="flex justify-center">
             <LoadingSpinner size="small" />
diff --git a/frontend/src/components/shared/task-form.tsx b/frontend/src/components/shared/task-form.tsx
index 030b0c61cdc4..2be82563793b 100644
--- a/frontend/src/components/shared/task-form.tsx
+++ b/frontend/src/components/shared/task-form.tsx
@@ -23,14 +23,13 @@ export function TaskForm({ ref }: TaskFormProps) {
   const dispatch = useDispatch();
   const navigation = useNavigation();
 
-  const { selectedRepository, files } = useSelector(
-    (state: RootState) => state.initialQuery,
-  );
+  const { files } = useSelector((state: RootState) => state.initialQuery);
 
   const [text, setText] = React.useState("");
-  const [suggestion, setSuggestion] = React.useState(
-    getRandomKey(SUGGESTIONS["non-repo"]),
-  );
+  const [suggestion, setSuggestion] = React.useState(() => {
+    const key = getRandomKey(SUGGESTIONS["non-repo"]);
+    return { key, value: SUGGESTIONS["non-repo"][key] };
+  });
   const [inputIsFocused, setInputIsFocused] = React.useState(false);
   const { mutate: createConversation, isPending } = useCreateConversation();
 
@@ -38,26 +37,16 @@ export function TaskForm({ ref }: TaskFormProps) {
     const suggestions = SUGGESTIONS["non-repo"];
     // remove current suggestion to avoid refreshing to the same suggestion
     const suggestionCopy = { ...suggestions };
-    delete suggestionCopy[suggestion];
+    delete suggestionCopy[suggestion.key];
 
     const key = getRandomKey(suggestionCopy);
-    setSuggestion(key);
+    setSuggestion({ key, value: suggestions[key] });
   };
 
   const onClickSuggestion = () => {
-    const suggestions = SUGGESTIONS["non-repo"];
-    const value = suggestions[suggestion];
-    setText(value);
+    setText(suggestion.value);
   };
 
-  const placeholder = React.useMemo(() => {
-    if (selectedRepository) {
-      return `What would you like to change in ${selectedRepository}?`;
-    }
-
-    return "What do you want to build?";
-  }, [selectedRepository]);
-
   const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
     event.preventDefault();
     const formData = new FormData(event.currentTarget);
@@ -105,7 +94,6 @@ export function TaskForm({ ref }: TaskFormProps) {
                   dispatch(addFile(base64));
                 });
               }}
-              placeholder={placeholder}
               value={text}
               maxRows={15}
               showButton={!!text}
diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts
index 5e3458ec8c94..3eb919766d81 100644
--- a/frontend/src/i18n/index.ts
+++ b/frontend/src/i18n/index.ts
@@ -2,12 +2,30 @@ import i18n from "i18next";
 import Backend from "i18next-http-backend";
 import LanguageDetector from "i18next-browser-languagedetector";
 import { initReactI18next } from "react-i18next";
+import translations from "./translation.json";
+
+type TranslationValue = {
+  en: string;
+  ja?: string;
+  "zh-CN"?: string;
+  "zh-TW"?: string;
+  "ko-KR"?: string;
+  no?: string;
+  ar?: string;
+  de?: string;
+  fr?: string;
+  it?: string;
+  pt?: string;
+  es?: string;
+  tr?: string;
+};
 
 export const AvailableLanguages = [
   { label: "English", value: "en" },
   { label: "简体中文", value: "zh-CN" },
   { label: "繁體中文", value: "zh-TW" },
   { label: "한국어", value: "ko-KR" },
+  { label: "日本語", value: "ja" },
   { label: "Norsk", value: "no" },
   { label: "Arabic", value: "ar" },
   { label: "Deutsch", value: "de" },
@@ -25,6 +43,119 @@ i18n
   .init({
     fallbackLng: "en",
     debug: import.meta.env.NODE_ENV === "development",
+    lng:
+      typeof window !== "undefined"
+        ? localStorage.getItem("LANGUAGE") || "en"
+        : "en",
+    resources: {
+      en: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      ja: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).ja || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      "zh-CN": {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue)["zh-CN"] ||
+              (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      "zh-TW": {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue)["zh-TW"] ||
+              (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      "ko-KR": {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue)["ko-KR"] ||
+              (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      no: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).no || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      ar: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).ar || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      de: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).de || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      fr: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).fr || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      it: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).it || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      pt: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).pt || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      es: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).es || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+      tr: {
+        translation: Object.fromEntries(
+          Object.entries(translations).map(([key, value]) => [
+            key,
+            (value as TranslationValue).tr || (value as TranslationValue).en,
+          ]),
+        ),
+      },
+    },
   });
 
 export default i18n;
diff --git a/frontend/src/i18n/translation.json b/frontend/src/i18n/translation.json
index 167909c995a2..b10f75530f2f 100644
--- a/frontend/src/i18n/translation.json
+++ b/frontend/src/i18n/translation.json
@@ -1,2117 +1,4427 @@
 {
-  "WORKSPACE$TITLE": {
-    "en": "OpenHands Workspace",
-    "zh-CN": "OpenHands 工作区",
-    "de": "OpenHands Arbeitsbereich",
-    "ko-KR": "OpenHands 워크스페이스",
-    "no": "OpenHands Arbeidsområde",
-    "zh-TW": "OpenHands 工作區",
-    "ar": "مساحة عمل أوبنديفين",
-    "fr": "OpenHands Espace de travail",
-    "it": "Area di lavoro OpenHands",
-    "pt": "Espaço de trabalho OpenHands",
-    "es": "Espacio de trabajo de OpenHands"
-  },
-  "WORKSPACE$TERMINAL_TAB_LABEL": {
-    "en": "Terminal",
-    "zh-CN": "终端",
-    "de": "Terminal",
-    "ko-KR": "터미널",
-    "no": "Terminal",
-    "zh-TW": "終端機",
-    "it": "Terminale",
-    "pt": "Terminal",
-    "es": "Terminal",
-    "ar": "الطرفية",
-    "fr": "Terminal",
-    "tr": "Terminal"
-  },
-  "CODE_EDITOR$FILE_SAVED_SUCCESSFULLY": {
-    "en": "File saved successfully",
-    "zh-CN": "文件保存成功",
-    "de": "Datei erfolgreich gespeichert",
-    "ko-KR": "파일이 성공적으로 저장되었습니다",
-    "no": "Fil lagret vellykket",
-    "zh-TW": "檔案儲存成功",
-    "it": "File salvato con successo",
-    "pt": "Arquivo salvo com sucesso",
-    "es": "Archivo guardado exitosamente",
-    "ar": "تم حفظ الملف بنجاح",
-    "fr": "Fichier enregistré avec succès",
-    "tr": "Dosya başarıyla kaydedildi"
-  },
-  "CODE_EDITOR$SAVING_LABEL": {
-    "en": "Saving...",
-    "zh-CN": "保存中...",
-    "de": "Speichern...",
-    "ko-KR": "저장 중...",
-    "no": "Lagrer...",
-    "zh-TW": "保存中...",
-    "it": "Salvataggio in corso...",
-    "pt": "Salvando...",
-    "es": "Guardando...",
-    "ar": "حفظ مؤقت",
-    "fr": "Enregistrement en cours...",
-    "tr": "Kayıt yapılıyor..."
-  },
-  "CODE_EDITOR$SAVE_LABEL": {
-    "en": "Save",
-    "zh-CN": "保存",
-    "de": "Speichern",
-    "ko-KR": "저장",
-    "no": "Lagrer",
-    "zh-TW": "保存",
-    "it": "Salva",
-    "pt": "Salvar",
-    "es": "Guardar",
-    "ar": "حفظ",
-    "fr": "Enregistrer",
-    "tr": "Kayıt"
-  },
-  "CODE_EDITOR$OPTIONS": {
-    "en": "Options",
-    "zh-CN": "选项",
-    "zh-TW": "選項",
-    "de": "Optionen",
-    "ko-KR": "옵션",
-    "no": "Alternativer",
-    "it": "Opzioni",
-    "pt": "Opções",
-    "es": "Opciones",
-    "ar": "خيارات",
-    "fr": "Options",
-    "tr": "Seçenekler"
-  },
-  "CODE_EDITOR$FILE_SAVE_ERROR": {
-    "en": "An unknown error occurred while saving the file",
-    "zh-CN": "文件保存时发生未知错误",
-    "zh-TW": "文件保存時發生未知錯誤",
-    "de": "Beim Speichern der Datei ist ein unbekannter Fehler aufgetreten",
-    "ko-KR": "파일 저장 중 알 수 없는 오류가 발생했습니다",
-    "no": "En ukjent feil oppstod under lagring av filen",
-    "it": "Si è verificato un errore sconosciuto durante il salvataggio del file",
-    "pt": "Ocorreu um erro desconhecido ao salvar o arquivo",
-    "es": "Ocurrió un error desconocido al guardar el archivo",
-    "ar": "حدث خطأ غير معروف أثناء حفظ الملف",
-    "fr": "Une erreur inconnue s'est produite lors de l'enregistrement du fichier",
-    "tr": "Dosya kaydedilirken bilinmeyen bir hata oluştu"
-  },
-  "CODE_EDITOR$EMPTY_MESSAGE": {
-    "en": "No file selected.",
-    "zh-CN": "文件未选中",
-    "zh-TW": "未選取任何文件。",
-    "de": "Keine Datei ausgewählt.",
-    "ko-KR": "선택된 파일이 없습니다.",
-    "no": "Ingen fil valgt.",
-    "it": "Nessun file selezionato.",
-    "pt": "Nenhum arquivo selecionado.",
-    "es": "Ningún archivo seleccionado.",
-    "ar": "لم يتم اختيار أي ملف.",
-    "fr": "Aucun fichier sélectionné.",
-    "tr": "Hiçbir dosya seçilmedi."
-  },
-  "FILE_SERVICE$SELECT_FILE_ERROR": {
-    "en": "Error selecting file. Please try again.",
-    "zh-CN": "选择文件时出错。请重试。",
-    "de": "Fehler beim Auswählen der Datei. Bitte versuchen Sie es erneut.",
-    "ko-KR": "파일 선택 중 오류가 발생했습니다. 다시 시도해 주세요.",
-    "no": "Feil ved valg av fil. Vennligst prøv igjen.",
-    "zh-TW": "選擇文件時出錯。請重試。",
-    "it": "Errore durante la selezione del file. Riprova.",
-    "pt": "Erro ao selecionar o arquivo. Por favor, tente novamente.",
-    "es": "Error al seleccionar el archivo. Por favor, inténtelo de nuevo.",
-    "ar": "خطأ في اختيار الملف. يرجى المحاولة مرة أخرى.",
-    "fr": "Erreur lors de la sélection du fichier. Veuillez réessayer.",
-    "tr": "Dosya seçiminde hata oluştu. Lütfen tekrar deneyin."
-  },
-  "FILE_SERVICE$UPLOAD_FILES_ERROR": {
-    "en": "Error uploading files. Please try again.",
-    "zh-CN": "上传文件时出错。请重试。",
-    "de": "Fehler beim Hochladen der Dateien. Bitte versuchen Sie es erneut.",
-    "ko-KR": "파일 업로드 중 오류가 발생했습니다. 다시 시도해 주세요.",
-    "no": "Feil ved opplasting av filer. Vennligst prøv igjen.",
-    "zh-TW": "上傳文件時出錯。請重試。",
-    "it": "Errore durante il caricamento dei file. Riprova.",
-    "pt": "Erro ao fazer upload dos arquivos. Por favor, tente novamente.",
-    "es": "Error al subir los archivos. Por favor, inténtelo de nuevo.",
-    "ar": "خطأ في تحميل الملفات. يرجى المحاولة مرة أخرى.",
-    "fr": "Erreur lors du téléchargement des fichiers. Veuillez réessayer.",
-    "tr": "Dosyalar yüklenirken hata oluştu. Lütfen tekrar deneyin."
-  },
-  "FILE_SERVICE$LIST_FILES_ERROR": {
-    "en": "Error listing files. Please try again.",
-    "zh-CN": "列出文件时出错。请重试。",
-    "de": "Fehler beim Auflisten der Dateien. Bitte versuchen Sie es erneut.",
-    "ko-KR": "파일 목록을 가져오는 중 오류가 발생했습니다. 다시 시도해 주세요.",
-    "no": "Feil ved listing av filer. Vennligst prøv igjen.",
-    "zh-TW": "列出文件時出錯。請重試。",
-    "it": "Errore durante l'elenco dei file. Riprova.",
-    "pt": "Erro ao listar arquivos. Por favor, tente novamente.",
-    "es": "Error al listar los archivos. Por favor, inténtelo de nuevo.",
-    "ar": "خطأ في سرد الملفات. يرجى المحاولة مرة أخرى.",
-    "fr": "Erreur lors de la liste des fichiers. Veuillez réessayer.",
-    "tr": "Dosyalar listelenirken hata oluştu. Lütfen tekrar deneyin."
-  },
-  "FILE_SERVICE$SAVE_FILE_ERROR": {
-    "en": "Error saving file. Please try again.",
-    "zh-CN": "保存文件时出错。请重试。",
-    "de": "Fehler beim Speichern der Datei. Bitte versuchen Sie es erneut.",
-    "ko-KR": "파일 저장 중 오류가 발생했습니다. 다시 시도해 주세요.",
-    "no": "Feil ved lagring av fil. Vennligst prøv igjen.",
-    "zh-TW": "保存文件時出錯。請重試。",
-    "it": "Errore durante il salvataggio del file. Riprova.",
-    "pt": "Erro ao salvar o arquivo. Por favor, tente novamente.",
-    "es": "Error al guardar el archivo. Por favor, inténtelo de nuevo.",
-    "ar": "خطأ في حفظ الملف. يرجى المحاولة مرة أخرى.",
-    "fr": "Erreur lors de l'enregistrement du fichier. Veuillez réessayer.",
-    "tr": "Dosya kaydedilirken hata oluştu. Lütfen tekrar deneyin."
-  },
-  "FILE_SERVICE$INVALID_FILE_PATH": {
-    "en": "Invalid file path. Please check the file name and try again.",
-    "zh-CN": "文件路径无效。请检查文件名并重试。",
-    "de": "Ungültiger Dateipfad. Bitte überprüfen Sie den Dateinamen und versuchen Sie es erneut.",
-    "ko-KR": "잘못된 파일 경로입니다. 파일 이름을 확인하고 다시 시도해 주세요.",
-    "no": "Ugyldig filbane. Vennligst sjekk filnavnet og prøv igjen.",
-    "zh-TW": "文件路徑無效。請檢查文件名並重試。",
-    "it": "Percorso del file non valido. Controlla il nome del file e riprova.",
-    "pt": "Caminho de arquivo inválido. Por favor, verifique o nome do arquivo e tente novamente.",
-    "es": "Ruta de archivo inválida. Por favor, verifique el nombre del archivo e inténtelo de nuevo.",
-    "ar": "مسار الملف غير صالح. يرجى التحقق من اسم الملف والمحاولة مرة أخرى.",
-    "fr": "Chemin de fichier invalide. Veuillez vérifier le nom du fichier et réessayer.",
-    "tr": "Geçersiz dosya yolu. Lütfen dosya adını kontrol edin ve tekrar deneyin."
-  },
-  "WORKSPACE$PLANNER_TAB_LABEL": {
-    "en": "Planner",
-    "zh-CN": "规划器",
-    "de": "Planer",
-    "ko-KR": "플래너",
-    "no": "Planlegger",
-    "zh-TW": "計畫器",
-    "ar": "المخطط",
-    "fr": "Planificateur",
-    "it": "Pianificatore",
-    "pt": "Planejador",
-    "es": "Planificador"
-  },
-  "WORKSPACE$JUPYTER_TAB_LABEL": {
-    "en": "Jupyter IPython",
-    "zh-CN": "Jupyter IPython",
-    "de": "Jupyter IPython",
-    "ko-KR": "Jupyter IPython",
-    "no": "Jupyter IPython",
-    "zh-TW": "Jupyter IPython",
-    "ar": "Jupyter IPython",
-    "fr": "Jupyter IPython",
-    "it": "Jupyter IPython",
-    "pt": "Jupyter IPython",
-    "es": "Jupyter IPython"
-  },
-  "WORKSPACE$CODE_EDITOR_TAB_LABEL": {
-    "en": "Code Editor",
-    "zh-CN": "代码编辑器",
-    "de": "Code-Editor",
-    "ko-KR": "코드 편집기",
-    "no": "Kode editor",
-    "zh-TW": "程式碼編輯器",
-    "ar": "محرر الكود",
-    "fr": "Éditeur de code",
-    "it": "Editor di codice",
-    "pt": "Editor de código",
-    "es": "Editor de código"
-  },
-  "WORKSPACE$BROWSER_TAB_LABEL": {
-    "en": "Browser (Experimental)",
-    "zh-CN": "浏览器（实验性）",
-    "de": "Browser (Experimentell)",
-    "ko-KR": "브라우저 (실험적)",
-    "no": "Nettleser (Eksperimentell)",
-    "zh-TW": "瀏覽器 (實驗性)",
-    "it": "Browser (Sperimentale)",
-    "pt": "Navegador (Experimental)",
-    "es": "Navegador (Experimental)",
-    "ar": "المتصفح (تجريبي)",
-    "fr": "Navigateur (Expérimental)",
-    "tr": "Tarayıcı (Deneysel)"
-  },
-  "CONFIGURATION$OPENHANDS_WORKSPACE_DIRECTORY_INPUT_LABEL": {
-    "en": "OpenHands Workspace directory",
-    "zh-CN": "OpenHands 工作区目录",
-    "de": "OpenHands Arbeitsverzeichnis",
-    "ko-KR": "OpenHands 워크스페이스 폴더",
-    "no": "OpenHands arbeidsmappe",
-    "zh-TW": "OpenHands 工作區目錄",
-    "it": "Directory dell'area di lavoro OpenHands",
-    "pt": "Diretório do espaço de trabalho OpenHands",
-    "es": "Directorio del espacio de trabajo de OpenHands",
-    "ar": "مجلد مساحة عمل أوبنديفين",
-    "fr": "Répertoire de l'espace de travail OpenHands",
-    "tr": "OpenHands çalışma alanı dizini"
-  },
-  "CONFIGURATION$OPENHANDS_WORKSPACE_DIRECTORY_INPUT_PLACEHOLDER": {
-    "en": "Default: ./workspace",
-    "zh-CN": "默认：./workspace",
-    "de": "Standard: ./workspace",
-    "ko-KR": "기본: ./workspace",
-    "no": "Standard: ./workspace",
-    "zh-TW": "默认：./workspace",
-    "ar": "الافتراضي: ./workspace",
-    "fr": "Par défaut: ./workspace",
-    "it": "Predefinito: ./workspace",
-    "pt": "Padrão: ./workspace",
-    "es": "Predeterminado: ./workspace"
-  },
-  "CONFIGURATION$MODAL_TITLE": {
-    "en": "Configuration",
-    "zh-CN": "配置",
-    "de": "Konfiguration",
-    "ko-KR": "설정",
-    "no": "Konfigurasjon",
-    "zh-TW": "設定",
-    "it": "Configurazione",
-    "pt": "Configuração",
-    "es": "Configuración",
-    "ar": "التكوين",
-    "fr": "Configuration",
-    "tr": "Konfigürasyon"
-  },
-  "CONFIGURATION$MODEL_SELECT_LABEL": {
-    "en": "Model",
-    "zh-CN": "模型",
-    "de": "Modell",
-    "ko-KR": "모델",
-    "no": "Modell",
-    "zh-TW": "模型",
-    "it": "Modello",
-    "pt": "Modelo",
-    "es": "Modelo",
-    "ar": "النموذج",
-    "fr": "Modèle",
-    "tr": "Model"
-  },
-  "CONFIGURATION$MODEL_SELECT_PLACEHOLDER": {
-    "en": "Select a model",
-    "zh-CN": "选择一个模型",
-    "de": "Wähle ein Modell",
-    "ko-KR": "모델 선택",
-    "no": "Velg en modell",
-    "zh-TW": "選擇模型",
-    "it": "Seleziona un modello",
-    "pt": "Selecione um modelo",
-    "es": "Seleccionar un modelo",
-    "ar": "حدد نموذج",
-    "fr": "Sélectionner un modèle",
-    "tr": "Model Seç"
-  },
-  "CONFIGURATION$AGENT_SELECT_LABEL": {
-    "en": "Agent",
-    "zh-CN": "智能体",
-    "de": "Agent",
-    "ko-KR": "에이전트",
-    "no": "Agent",
-    "zh-TW": "智能體",
-    "it": "Agente",
-    "pt": "Agente",
-    "es": "Agente",
-    "ar": "الوكيل",
-    "fr": "Agent",
-    "tr": "Ajan"
-  },
-  "CONFIGURATION$AGENT_SELECT_PLACEHOLDER": {
-    "en": "Select an agent",
-    "zh-CN": "选择一个智能体",
-    "de": "Wähle einen Agenten",
-    "ko-KR": "에이전트 선택",
-    "no": "Velg en agent",
-    "zh-TW": "選擇智能體",
-    "it": "Seleziona un agente",
-    "pt": "Selecione um agente",
-    "es": "Seleccionar un agente",
-    "ar": "حدد وكيلا",
-    "fr": "Sélectionner un agent",
-    "tr": "Ajan Seç"
-  },
-  "CONFIGURATION$LANGUAGE_SELECT_LABEL": {
-    "en": "Language",
-    "zh-CN": "语言",
-    "de": "Sprache",
-    "ko-KR": "언어",
-    "no": "Språk",
-    "zh-TW": "語言",
-    "ar": "اللغة",
-    "fr": "Langue",
-    "it": "Lingua",
-    "pt": "Idioma",
-    "es": "Idioma"
-  },
-  "CONFIGURATION$LANGUAGE_SELECT_PLACEHOLDER": {
-    "en": "Select a language",
-    "zh-CN": "选择一种语言",
-    "de": "Wähle eine Sprache",
-    "ko-KR": "언어 선택",
-    "no": "Velg et språk",
-    "zh-TW": "選擇一種語言",
-    "it": "Seleziona una lingua",
-    "pt": "Selecione um idioma",
-    "es": "Seleccionar un idioma",
-    "ar": "حدد لغة",
-    "fr": "Sélectionner une langue",
-    "tr": "Dil Seç"
-  },
-  "CONFIGURATION$SECURITY_SELECT_LABEL": {
-    "en": "Security analyzer",
-    "de": "Sicherheitsanalysator",
-    "zh-CN": "安全分析器",
-    "ko-KR": "보안 분석기",
-    "no": "Sikkerhetsanalysator",
-    "zh-TW": "安全分析器",
-    "it": "Analizzatore di sicurezza",
-    "pt": "Analisador de segurança",
-    "es": "Analizador de seguridad",
-    "ar": "محلل الأمان",
-    "fr": "Analyseur de sécurité",
-    "tr": "Güvenlik analizörü"
-  },
-  "CONFIGURATION$SECURITY_SELECT_PLACEHOLDER": {
-    "en": "Select a security analyzer (optional)",
-    "de": "Wählen Sie einen Sicherheitsanalysator (optional)",
-    "zh-CN": "选择一个安全分析器（可选）",
-    "ko-KR": "보안 분석기 선택 (선택사항)",
-    "no": "Velg en sikkerhetsanalysator (valgfritt)",
-    "zh-TW": "選擇安全分析器（可選）",
-    "it": "Seleziona un analizzatore di sicurezza (opzionale)",
-    "pt": "Selecione um analisador de segurança (opcional)",
-    "es": "Seleccione un analizador de seguridad (opcional)",
-    "ar": "اختر محلل أمان (اختياري)",
-    "fr": "Sélectionnez un analyseur de sécurité (facultatif)",
-    "tr": "Bir güvenlik analizörü seçin (isteğe bağlı)"
-  },
-  "CONFIGURATION$MODAL_CLOSE_BUTTON_LABEL": {
-    "en": "Close",
-    "zh-CN": "关闭",
-    "de": "Schließen",
-    "ko-KR": "닫기",
-    "no": "Lukk",
-    "zh-TW": "關閉",
-    "it": "Chiudi",
-    "pt": "Fechar",
-    "es": "Cerrar",
-    "ar": "إغلاق",
-    "fr": "Fermer",
-    "tr": "Kapat"
-  },
-  "CONFIGURATION$MODAL_SAVE_BUTTON_LABEL": {
-    "en": "Save",
-    "zh-CN": "保存",
-    "de": "Speichern",
-    "ko-KR": "저장",
-    "no": "Lagre",
-    "zh-TW": "儲存",
-    "ar": "حفظ",
-    "fr": "Enregistrer",
-    "it": "Salva",
-    "pt": "Salvar",
-    "es": "Guardar"
-  },
-  "CONFIGURATION$MODAL_RESET_BUTTON_LABEL": {
-    "en": "Reset to defaults",
-    "zh-CN": "重置为默认值",
-    "de": "Auf Standardwerte zurücksetzen",
-    "ko-KR": "기본값으로 재설정",
-    "no": "Tilbakestill til standardverdier",
-    "zh-TW": "重設為預設值",
-    "it": "Reimposta ai valori predefiniti",
-    "pt": "Redefinir para os padrões",
-    "es": "Restablecer valores predeterminados",
-    "ar": "إعادة التعيين إلى الإعدادات الافتراضية",
-    "fr": "Réinitialiser aux valeurs par défaut",
-    "tr": "Varsayılanlara Sıfırla"
-  },
-  "SETTINGS_FORM$RUNTIME_SIZE_LABEL": {
-    "en": "Runtime Settings",
-    "zh-CN": "运行时设置",
-    "de": "Laufzeiteinstellungen",
-    "ko-KR": "런타임 설정",
-    "no": "Kjøretidsinnstillinger",
-    "zh-TW": "運行時設定",
-    "it": "Impostazioni Runtime",
-    "pt": "Configurações de Runtime",
-    "es": "Configuración de Runtime",
-    "ar": "إعدادات وقت التشغيل",
-    "fr": "Paramètres d'exécution",
-    "tr": "Çalışma Zamanı Ayarları"
-  },
-  "CONFIGURATION$SETTINGS_NEED_UPDATE_MESSAGE": {
-    "en": "We've changed some settings in the latest update. Take a minute to review.",
-    "de": "Mit dem letzten Update haben wir ein paar Einstellungen geändert. Bitte kontrollieren Ihre Einstellungen.",
-    "zh-CN": "我们在最新更新中更改了一些设置。请花点时间检查一下。",
-    "ko-KR": "최신 업데이트에서 일부 설정을 변경했습니다. 잠시 시간을 내어 검토해 주세요.",
-    "no": "Vi har endret noen innstillinger i den siste oppdateringen. Ta deg tid til å se gjennom dem.",
-    "zh-TW": "我們在最新更新中更改了一些設定。請花點時間檢查一下。",
-    "it": "Abbiamo modificato alcune impostazioni nell'ultimo aggiornamento. Prenditi un momento per rivederle.",
-    "pt": "Alteramos algumas configurações na última atualização. Reserve um momento para revisar.",
-    "es": "Hemos cambiado algunas configuraciones en la última actualización. Tómate un momento para revisarlas.",
-    "ar": "لقد قمنا بتغيير بعض الإعدادات في التحديث الأخير. خذ دقيقة لمراجعتها.",
-    "fr": "Nous avons modifié certains paramètres dans la dernière mise à jour. Prenez un moment pour les examiner.",
-    "tr": "Son güncellemede bazı ayarları değiştirdik. Gözden geçirmek için bir dakikanızı ayırın."
-  },
-  "CONFIGURATION$AGENT_LOADING": {
-    "en": "Please wait while the agent loads. This may take a few minutes...",
-    "de": "Bitte warten Sie, während der Agent lädt. Das kann ein paar Minuten dauern...",
-    "zh-CN": "请稍候，代理正在加载中。这可能需要几分钟...",
-    "ko-KR": "에이전트가 로드되는 동안 기다려 주세요. 몇 분 정도 걸릴 수 있습니다...",
-    "no": "Vennligst vent mens agenten laster. Dette kan ta noen minutter...",
-    "zh-TW": "請稍候，代理正在載入中。這可能需要幾分鐘...",
-    "it": "Attendere mentre l'agente si carica. Potrebbe richiedere alcuni minuti...",
-    "pt": "Por favor, aguarde enquanto o agente carrega. Isso pode levar alguns minutos...",
-    "es": "Por favor, espere mientras el agente se carga. Esto puede tardar unos minutos...",
-    "ar": "يرجى الانتظار أثناء تحميل الوكيل. قد يستغرق هذا بضع دقائق...",
-    "fr": "Veuillez patienter pendant le chargement de l'agent. Cela peut prendre quelques minutes...",
-    "tr": "Lütfen ajan yüklenirken bekleyin. Bu birkaç dakika sürebilir..."
-  },
-  "CONFIGURATION$AGENT_RUNNING": {
-    "en": "Please stop the agent before editing these settings.",
-    "de": "Bitte beenden Sie den Agenten vor der Bearbeitung der Einstellungen.",
-    "zh-CN": "请在编辑这些设置之前停止代理。",
-    "ko-KR": "이 설정을 편집하기 전에 에이전트를 중지해 주세요.",
-    "no": "Vennligst stopp agenten før du redigerer disse innstillingene.",
-    "zh-TW": "請在編輯這些設定之前停止代理。",
-    "it": "Si prega di fermare l'agente prima di modificare queste impostazioni.",
-    "pt": "Por favor, pare o agente antes de editar estas configurações.",
-    "es": "Por favor, detenga el agente antes de editar estas configuraciones.",
-    "ar": "يرجى إيقاف الوكيل قبل تعديل هذه الإعدادات.",
-    "fr": "Veuillez arrêter l'agent avant de modifier ces paramètres.",
-    "tr": "Bu ayarları düzenlemeden önce lütfen ajanı durdurun."
-  },
-  "CONFIGURATION$ERROR_FETCH_MODELS": {
-    "en": "Failed to fetch models and agents",
-    "zh-CN": "获取模型和智能体失败",
-    "de": "Fehler beim Abrufen der Modelle und Agenten",
-    "zh-TW": "獲取模型和智能體失敗",
-    "es": "Error al obtener modelos y agentes",
-    "fr": "Échec de la récupération des modèles et des agents",
-    "it": "Impossibile recuperare modelli e agenti",
-    "pt": "Falha ao buscar modelos e agentes",
-    "ko-KR": "모델 및 에이전트 가져오기 실패",
-    "ar": "فشل في جلب النماذج والوكلاء",
-    "tr": "Modeller ve ajanlar getirilemedi",
-    "no": "Kunne ikke hente modeller og agenter"
-  },
-  "SESSION$SERVER_CONNECTED_MESSAGE": {
-    "en": "Connected to server",
-    "zh-CN": "已连接到服务器",
-    "de": "Verbindung zum Server hergestellt",
-    "zh-TW": "已連接到伺服器",
-    "es": "Conectado al servidor",
-    "fr": "Connecté au serveur",
-    "it": "Connesso al server",
-    "pt": "Conectado ao servidor",
-    "ko-KR": "서버에 연결됨",
-    "ar": "تم الاتصال بالخادم",
-    "tr": "Sunucuya bağlandı",
-    "no": "Koblet til server"
-  },
-  "SESSION$SESSION_HANDLING_ERROR_MESSAGE": {
-    "en": "Error handling message",
-    "zh-CN": "处理消息时发生错误",
-    "de": "Fehler beim Verarbeiten der Nachricht",
-    "zh-TW": "處理訊息時發生錯誤",
-    "es": "Error al procesar el mensaje",
-    "fr": "Erreur lors du traitement du message",
-    "it": "Errore durante l'elaborazione del messaggio",
-    "pt": "Erro ao processar a mensagem",
-    "ko-KR": "메시지 처리 중 오류 발생",
-    "ar": "خطأ في معالجة الرسالة",
-    "tr": "Mesaj işlenirken hata oluştu",
-    "no": "Feil ved behandling av melding"
-  },
-  "SESSION$SESSION_CONNECTION_ERROR_MESSAGE": {
-    "en": "Error connecting to session",
-    "zh-CN": "连接到会话时发生错误",
-    "de": "Verbindung zur Sitzung fehlgeschlagen",
-    "zh-TW": "連接到會話時發生錯誤",
-    "es": "Error al conectar con la sesión",
-    "fr": "Erreur de connexion à la session",
-    "it": "Errore durante la connessione alla sessione",
-    "pt": "Erro ao conectar à sessão",
-    "ko-KR": "세션 연결 오류",
-    "ar": "خطأ في الاتصال بالجلسة",
-    "tr": "Oturuma bağlanırken hata oluştu",
-    "no": "Feil ved tilkobling til økt"
-  },
-  "SESSION$SOCKET_NOT_INITIALIZED_ERROR_MESSAGE": {
-    "en": "Socket not initialized",
-    "zh-CN": "Socket 未初始化",
-    "de": "Socket nicht initialisiert",
-    "zh-TW": "Socket 未初始化",
-    "es": "Socket no inicializado",
-    "fr": "Socket non initialisé",
-    "it": "Socket non inizializzato",
-    "pt": "Socket não inicializado",
-    "ko-KR": "소켓이 초기화되지 않았습니다",
-    "ar": "لم يتم تهيئة Socket",
-    "tr": "Soket başlatılmadı",
-    "no": "Socket ikke initialisert"
-  },
-  "EXPLORER$UPLOAD_ERROR_MESSAGE": {
-    "en": "Error uploading file",
-    "zh-CN": "上传文件时发生错误",
-    "de": "Fehler beim Hochladen der Datei",
-    "zh-TW": "上傳檔案時發生錯誤",
-    "es": "Error al subir el archivo",
-    "fr": "Erreur lors du téléchargement du fichier",
-    "it": "Errore durante il caricamento del file",
-    "pt": "Erro ao fazer upload do arquivo",
-    "ko-KR": "파일 업로드 중 오류 발생",
-    "ar": "خطأ في تحميل الملف",
-    "tr": "Dosya yüklenirken hata oluştu",
-    "no": "Feil ved opplasting av fil"
-  },
-  "EXPLORER$LABEL_DROP_FILES": {
-    "en": "Drop files here",
-    "zh-CN": "将文件拖到这里",
-    "de": "Dateien hier ablegen",
-    "zh-TW": "將檔案拖曳至此",
-    "es": "Suelta los archivos aquí",
-    "fr": "Déposez les fichiers ici",
-    "no": "Slipp filer her",
-    "it": "Trascina i file qui",
-    "pt": "Solte os arquivos aqui",
-    "ko-KR": "파일을 여기에 놓으세요",
-    "ar": "أسقط الملفات هنا",
-    "tr": "Dosyaları buraya bırakın"
-  },
-  "EXPLORER$LABEL_WORKSPACE": {
-    "en": "Workspace",
-    "zh-CN": "工作区",
-    "de": "Arbeitsbereich",
-    "zh-TW": "工作區",
-    "es": "Espacio de trabajo",
-    "fr": "Espace de travail",
-    "it": "Area di lavoro",
-    "pt": "Espaço de trabalho",
-    "ko-KR": "작업 공간",
-    "ar": "مساحة العمل",
-    "tr": "Çalışma alanı",
-    "no": "Arbeidsområde"
-  },
-  "EXPLORER$EMPTY_WORKSPACE_MESSAGE": {
-    "en": "No files in workspace",
-    "zh-CN": "工作区没有文件",
-    "de": "Keine Dateien im Arbeitsbereich",
-    "zh-TW": "工作區沒有檔案",
-    "es": "No hay archivos en el espacio de trabajo",
-    "fr": "Aucun fichier dans l'espace de travail",
-    "it": "Nessun file nell'area di lavoro",
-    "pt": "Nenhum arquivo no espaço de trabalho",
-    "ko-KR": "작업 공간에 파일이 없습니다",
-    "ar": "لا توجد ملفات في مساحة العمل",
-    "tr": "Çalışma alanında dosya yok",
-    "no": "Ingen filer i arbeidsområdet"
-  },
-  "EXPLORER$LOADING_WORKSPACE_MESSAGE": {
-    "en": "Loading workspace...",
-    "zh-CN": "正在加载工作区...",
-    "de": "Arbeitsbereich wird geladen...",
-    "zh-TW": "正在載入工作區...",
-    "es": "Cargando espacio de trabajo...",
-    "fr": "Chargement de l'espace de travail...",
-    "it": "Caricamento dell'area di lavoro...",
-    "pt": "Carregando espaço de trabalho...",
-    "ko-KR": "작업 공간 로딩 중...",
-    "ar": "جارٍ تحميل مساحة العمل...",
-    "tr": "Çalışma alanı yükleniyor...",
-    "no": "Laster arbeidsområde..."
-  },
-  "EXPLORER$REFRESH_ERROR_MESSAGE": {
-    "en": "Error refreshing workspace",
-    "zh-CN": "工作区刷新错误",
-    "de": "Fehler beim Aktualisieren des Arbeitsbereichs",
-    "zh-TW": "工作區重新整理錯誤",
-    "es": "Error al actualizar el espacio de trabajo",
-    "fr": "Erreur lors de l'actualisation de l'espace de travail",
-    "it": "Errore durante l'aggiornamento dell'area di lavoro",
-    "pt": "Erro ao atualizar o espaço de trabalho",
-    "ko-KR": "작업 공간 새로 고침 오류",
-    "ar": "خطأ في تحديث مساحة العمل",
-    "tr": "Çalışma alanı yenilenirken hata oluştu",
-    "no": "Feil ved oppdatering av arbeidsområde"
-  },
-  "EXPLORER$UPLOAD_SUCCESS_MESSAGE": {
-    "en": "Successfully uploaded {{count}} file(s)",
-    "zh-CN": "成功上传 {{count}} 个文件",
-    "de": "Erfolgreich {{count}} Datei(en) hochgeladen",
-    "zh-TW": "成功上傳 {{count}} 個檔案",
-    "es": "Se subieron {{count}} archivo(s) con éxito",
-    "fr": "{{count}} fichier(s) téléchargé(s) avec succès",
-    "it": "Caricato con successo {{count}} file",
-    "pt": "{{count}} arquivo(s) carregado(s) com sucesso",
-    "ko-KR": "{{count}}개의 파일을 성공적으로 업로드했습니다",
-    "ar": "تم تحميل {{count}} ملف (ملفات) بنجاح",
-    "tr": "{{count}} dosya başarıyla yüklendi",
-    "no": "Lastet opp {{count}} fil(er) vellykket"
-  },
-  "EXPLORER$NO_FILES_UPLOADED_MESSAGE": {
-    "en": "No files were uploaded",
-    "zh-CN": "没有文件上传",
-    "de": "Keine Dateien wurden hochgeladen",
-    "zh-TW": "沒有檔案被上傳",
-    "es": "No se subieron archivos",
-    "fr": "Aucun fichier n'a été téléchargé",
-    "it": "Nessun file è stato caricato",
-    "pt": "Nenhum arquivo foi carregado",
-    "ko-KR": "업로드된 파일이 없습니다",
-    "ar": "لم يتم تحميل أي ملفات",
-    "tr": "Hiçbir dosya yüklenmedi",
-    "no": "Ingen filer ble lastet opp"
-  },
-  "EXPLORER$UPLOAD_PARTIAL_SUCCESS_MESSAGE": {
-    "en": "{{count}} file(s) were skipped during upload",
-    "de": "{{count}} Datei(en) wurden während des Hochladens übersprungen",
-    "zh-CN": "{{count}} 个文件在上传过程中被跳过",
-    "zh-TW": "{{count}} 個檔案在上傳過程中被跳過",
-    "es": "Se omitieron {{count}} archivo(s) durante la carga",
-    "fr": "{{count}} fichier(s) ont été ignorés pendant le téléchargement",
-    "it": "{{count}} file sono stati saltati durante il caricamento",
-    "pt": "{{count}} arquivo(s) foram ignorados durante o upload",
-    "ko-KR": "업로드 중 {{count}}개의 파일이 건너뛰어졌습니다",
-    "ar": "تم تخطي {{count}} ملف (ملفات) أثناء التحميل",
-    "tr": "Yükleme sırasında {{count}} dosya atlandı",
-    "no": "{{count}} fil(er) ble hoppet over under opplasting"
-  },
-  "EXPLORER$UPLOAD_UNEXPECTED_RESPONSE_MESSAGE": {
-    "en": "Unexpected response structure from server",
-    "zh-CN": "服务器响应结构不符合预期",
-    "de": "Unerwartetes Antwortformat vom Server",
-    "zh-TW": "伺服器回應結構不符合預期",
-    "es": "Estructura de respuesta inesperada del servidor",
-    "fr": "Structure de réponse inattendue du serveur",
-    "it": "Struttura di risposta inaspettata dal server",
-    "pt": "Estrutura de resposta inesperada do servidor",
-    "ko-KR": "서버로부터 예상치 못한 응답 구조",
-    "ar": "بنية استجابة غير متوقعة من الخادم",
-    "tr": "Sunucudan beklenmeyen yanıt yapısı",
-    "no": "Uventet responsstruktur fra serveren"
-  },
-  "EXPLORER$VSCODE_SWITCHING_MESSAGE": {
-    "en": "Switching to VS Code in 3 seconds...\nImportant: Please inform the agent of any changes you make in VS Code. To avoid conflicts, wait for the assistant to complete its work before making your own changes.",
-    "zh-CN": "3 秒后切换到 VS Code\n重要提示：请告知 OpenHands 您在 VS Code 中进行的任何更改。为了避免冲突，请在 OpenHands 完成工作后再进行自己的更改。",
-    "zh-TW": "3 秒後切換到 VS Code\n重要提示：請告知 OpenHands 您在 VS Code 中進行的任何更改。為避免衝突，請在 OpenHands 完成工作後再進行自己的更改。"
-  },
-  "EXPLORER$VSCODE_SWITCHING_ERROR_MESSAGE": {
-    "en": "Error switching to VS Code: {{error}}",
-    "zh-CN": "切换到 VS Code 时发生错误: {{error}}",
-    "zh-TW": "切換到 VS Code 時發生錯誤: {{error}}"
-  },
-  "LOAD_SESSION$MODAL_TITLE": {
-    "en": "Return to existing session?",
-    "de": "Zurück zu vorhandener Sitzung?",
-    "zh-CN": "是否继续未完成的会话?",
-    "zh-TW": "是否繼續未完成的會話?",
-    "es": "¿Volver a la sesión existente?",
-    "fr": "Revenir à la session existante ?",
-    "it": "Tornare alla sessione esistente?",
-    "pt": "Retornar à sessão existente?",
-    "ko-KR": "기존 세션으로 돌아가시겠습니까?",
-    "ar": "العودة إلى الجلسة الحالية؟",
-    "tr": "Mevcut oturuma dönmek ister misiniz?"
-  },
-  "LOAD_SESSION$MODAL_CONTENT": {
-    "en": "You seem to have an ongoing session. Would you like to pick up where you left off, or start fresh?",
-    "de": "Sie haben eine aktive Sitzung. Möchten Sie die Arbeit an der vorherigen Stelle fortsetzen oder von vorne anfangen?",
-    "es": "Parece que tienes una sesión en curso. ¿Te gustaría continuar donde lo dejaste o empezar de nuevo?",
-    "fr": "Il semble que vous ayez une session en cours. Souhaitez-vous reprendre là où vous vous êtes arrêté ou recommencer à zéro ?",
-    "it": "Sembra che tu abbia una sessione in corso. Vorresti riprendere da dove hai lasciato o ricominciare da capo?",
-    "pt": "Parece que você tem uma sessão em andamento. Gostaria de continuar de onde parou ou começar do zero?",
-    "ko-KR": "진행 중인 세션이 있는 것 같습니다. 중단한 곳에서 계속하시겠습니까, 아니면 새로 시작하시겠습니까?",
-    "ar": "يبدو أن لديك جلسة جارية. هل ترغب في استكمال ما توقفت عنده أم البدء من جديد؟",
-    "tr": "Devam eden bir oturumunuz var gibi görünüyor. Kaldığınız yerden devam etmek mi yoksa yeniden başlamak mı istersiniz?",
-    "zh-CN": "您似乎有一个未完成的任务。您想继续之前的工作还是重新开始？",
-    "zh-TW": "您似乎有一個未完成的任務。您想從上次離開的地方繼續還是重新開始？"
-  },
-  "LOAD_SESSION$RESUME_SESSION_MODAL_ACTION_LABEL": {
-    "en": "Resume Session",
-    "de": "Sitzung fortsetzen",
-    "zh-CN": "恢复会话",
-    "zh-TW": "恢復會話",
-    "es": "Reanudar sesión",
-    "fr": "Reprendre la session",
-    "it": "Riprendi sessione",
-    "pt": "Retomar sessão",
-    "ko-KR": "세션 재개",
-    "ar": "استئناف الجلسة",
-    "tr": "Oturumu Devam Ettir"
-  },
-  "LOAD_SESSION$START_NEW_SESSION_MODAL_ACTION_LABEL": {
-    "en": "Start New Session",
-    "de": "Neue Sitzung starten",
-    "zh-CN": "开始新会话",
-    "zh-TW": "開始新會話",
-    "es": "Iniciar nueva sesión",
-    "fr": "Démarrer une nouvelle session",
-    "it": "Avvia nuova sessione",
-    "pt": "Iniciar nova sessão",
-    "ko-KR": "새 세션 시작",
-    "ar": "بدء جلسة جديدة",
-    "tr": "Yeni Oturum Başlat"
-  },
-  "FEEDBACK$MODAL_TITLE": {
-    "en": "Share feedback",
-    "de": "Feedback teilen",
-    "zh-CN": "分享反馈",
-    "zh-TW": "分享反饋",
-    "es": "Compartir comentarios",
-    "fr": "Partager des commentaires",
-    "it": "Condividi feedback",
-    "pt": "Compartilhar feedback",
-    "ko-KR": "피드백 공유",
-    "ar": "مشاركة التعليقات",
-    "tr": "Geri bildirim paylaş"
-  },
-  "FEEDBACK$MODAL_CONTENT": {
-    "en": "To help us improve, we collect feedback from your interactions to improve our prompts. By submitting this form, you consent to us collecting this data.",
-    "de": "Um uns zu verbessern, sammeln wir Feedback aus Ihren Interaktionen, um unsere Prompts zu verbessern. Durch das Absenden dieses Formulars stimmen Sie der Erfassung dieser Daten zu.",
-    "zh-CN": "为了帮助我们改进，我们会收集您的互动反馈以改进我们的提示。提交此表单即表示您同意我们收集这些数据。",
-    "zh-TW": "為了幫助我們改進，我們會收集您的互動反饋以改進我們的提示。提交此表單即表示您同意我們收集這些數據。",
-    "es": "Para ayudarnos a mejorar, recopilamos comentarios de sus interacciones para mejorar nuestras indicaciones. Al enviar este formulario, usted consiente que recopilemos estos datos.",
-    "fr": "Pour nous aider à nous améliorer, nous recueillons des commentaires de vos interactions pour améliorer nos invites. En soumettant ce formulaire, vous consentez à ce que nous collections ces données.",
-    "it": "Per aiutarci a migliorare, raccogliamo feedback dalle tue interazioni per migliorare i nostri prompt. Inviando questo modulo, acconsenti alla raccolta di questi dati.",
-    "pt": "Para nos ajudar a melhorar, coletamos feedback de suas interações para aprimorar nossas sugestões. Ao enviar este formulário, você consente que coletemos esses dados.",
-    "ko-KR": "개선을 위해 귀하의 상호 작용에서 피드백을 수집하여 프롬프트를 개선합니다. 이 양식을 제출함으로써 귀하는 이 데이터 수집에 동의하게 됩니다.",
-    "ar": "لمساعدتنا على التحسين، نقوم بجمع التعليقات من تفاعلاتك لتحسين مطالباتنا. من خلال إرسال هذا النموذج، فإنك توافق على جمعنا لهذه البيانات.",
-    "tr": "Kendimizi geliştirmemize yardımcı olmak için, etkileşimlerinizden geri bildirim toplayarak ipuçlarımızı iyileştiriyoruz. Bu formu göndererek, bu verileri toplamamıza izin vermiş olursunuz."
-  },
-  "FEEDBACK$EMAIL_LABEL": {
-    "en": "Your email",
-    "de": "Ihre E-Mail-Adresse",
-    "zh-CN": "您的电子邮箱",
-    "zh-TW": "您的電子郵箱",
-    "es": "Su correo electrónico",
-    "fr": "Votre e-mail",
-    "it": "La tua email",
-    "pt": "Seu e-mail",
-    "ko-KR": "귀하의 이메일",
-    "ar": "بريدك الإلكتروني",
-    "tr": "E-posta adresiniz"
-  },
-  "FEEDBACK$CONTRIBUTE_LABEL": {
-    "en": "Contribute to public dataset",
-    "de": "Zum öffentlichen Datensatz beitragen",
-    "zh-CN": "贡献到公共数据集",
-    "zh-TW": "貢獻到公共數據集",
-    "es": "Contribuir al conjunto de datos público",
-    "fr": "Contribuer à l'ensemble de données public",
-    "it": "Contribuisci al dataset pubblico",
-    "pt": "Contribuir para o conjunto de dados público",
-    "ko-KR": "공개 데이터셋에 기여",
-    "ar": "المساهمة في مجموعة البيانات العامة",
-    "tr": "Genel veri setine katkıda bulun"
-  },
-  "FEEDBACK$SHARE_LABEL": {
-    "en": "Share",
-    "de": "Teilen",
-    "zh-CN": "分享",
-    "zh-TW": "分享",
-    "es": "Compartir",
-    "fr": "Partager",
-    "it": "Condividi",
-    "pt": "Compartilhar",
-    "ko-KR": "공유",
-    "ar": "مشاركة",
-    "tr": "Paylaş"
-  },
-  "FEEDBACK$CANCEL_LABEL": {
-    "en": "Cancel",
-    "de": "Abbruch",
-    "zh-CN": "取消",
-    "zh-TW": "取消",
-    "es": "Cancelar",
-    "fr": "Annuler",
-    "it": "Annulla",
-    "pt": "Cancelar",
-    "ko-KR": "취소",
-    "ar": "إلغاء",
-    "tr": "İptal"
-  },
-  "FEEDBACK$EMAIL_PLACEHOLDER": {
-    "en": "Enter your email address",
-    "es": "Ingresa tu correo electrónico",
-    "zh-CN": "输入您的电子邮件地址",
-    "zh-TW": "輸入您的電子郵件地址",
-    "ko-KR": "이메일 주소를 입력하세요",
-    "no": "Skriv inn din e-postadresse",
-    "ar": "أدخل عنوان بريدك الإلكتروني",
-    "de": "Geben Sie Ihre E-Mail-Adresse ein",
-    "fr": "Entrez votre adresse e-mail",
-    "it": "Inserisci il tuo indirizzo email",
-    "pt": "Digite seu endereço de e-mail",
-    "tr": "E-posta adresinizi girin"
-  },
-  "FEEDBACK$PASSWORD_COPIED_MESSAGE": {
-    "en": "Password copied to clipboard.",
-    "es": "Contraseña copiada al portapapeles.",
-    "zh-CN": "密码已复制到剪贴板。",
-    "zh-TW": "密碼已複製到剪貼板。",
-    "ko-KR": "비밀번호가 클립보드에 복사되었습니다.",
-    "no": "Passord kopiert til utklippstavlen.",
-    "ar": "تم نسخ كلمة المرور إلى الحافظة.",
-    "de": "Passwort in die Zwischenablage kopiert.",
-    "fr": "Mot de passe copié dans le presse-papiers.",
-    "it": "Password copiata negli appunti.",
-    "pt": "Senha copiada para a área de transferência.",
-    "tr": "Parola panoya kopyalandı."
-  },
-  "FEEDBACK$GO_TO_FEEDBACK": {
-    "en": "Go to shared feedback",
-    "es": "Ir a feedback compartido",
-    "zh-CN": "转到共享反馈",
-    "zh-TW": "前往共享反饋",
-    "ko-KR": "공유된 피드백으로 이동",
-    "no": "Gå til delt tilbakemelding",
-    "ar": "الذهاب إلى التعليقات المشتركة",
-    "de": "Zum geteilten Feedback gehen",
-    "fr": "Aller aux commentaires partagés",
-    "it": "Vai al feedback condiviso",
-    "pt": "Ir para feedback compartilhado",
-    "tr": "Paylaşılan geri bildirimlere git"
-  },
-  "FEEDBACK$PASSWORD": {
-    "en": "Password:",
-    "es": "Contraseña:",
-    "zh-CN": "密码：",
-    "zh-TW": "密碼：",
-    "ko-KR": "비밀번호:",
-    "no": "Passord:",
-    "ar": "كلمة المرور:",
-    "de": "Passwort:",
-    "fr": "Mot de passe :",
-    "it": "Password:",
-    "pt": "Senha:",
-    "tr": "Parola:"
-  },
-  "FEEDBACK$INVALID_EMAIL_FORMAT": {
-    "en": "Invalid email format",
-    "es": "Formato de correo inválido",
-    "zh-CN": "无效的电子邮件格式",
-    "zh-TW": "無效的電子郵件格式",
-    "ko-KR": "잘못된 이메일 형식",
-    "no": "Ugyldig e-postformat",
-    "ar": "تنسيق البريد الإلكتروني غير صالح",
-    "de": "Ungültiges E-Mail-Format",
-    "fr": "Format d'e-mail invalide",
-    "it": "Formato email non valido",
-    "pt": "Formato de e-mail inválido",
-    "tr": "Geçersiz e-posta biçimi"
-  },
-  "FEEDBACK$FAILED_TO_SHARE": {
-    "en": "Failed to share, please contact the developers:",
-    "es": "Error al compartir, por favor contacta con los desarrolladores:",
-    "zh-CN": "分享失败，请联系开发人员：",
-    "zh-TW": "分享失敗，請聯繫開發人員：",
-    "ko-KR": "공유 실패, 개발자에게 문의하세요:",
-    "no": "Deling mislyktes, vennligst kontakt utviklerne:",
-    "ar": "فشل المشاركة، يرجى الاتصال بالمطورين:",
-    "de": "Teilen fehlgeschlagen, bitte kontaktieren Sie die Entwickler:",
-    "fr": "Échec du partage, veuillez contacter les développeurs :",
-    "it": "Condivisione fallita, contattare gli sviluppatori:",
-    "pt": "Falha ao compartilhar, entre em contato com os desenvolvedores:",
-    "tr": "Paylaşım başarısız, lütfen geliştiricilerle iletişime geçin:"
-  },
-  "FEEDBACK$COPY_LABEL": {
-    "en": "Copy",
-    "es": "Copiar",
-    "zh-CN": "复制",
-    "zh-TW": "複製",
-    "ko-KR": "복사",
-    "no": "Kopier",
-    "ar": "نسخ",
-    "de": "Kopieren",
-    "fr": "Copier",
-    "it": "Copia",
-    "pt": "Copiar",
-    "tr": "Kopyala"
-  },
-  "FEEDBACK$SHARING_SETTINGS_LABEL": {
-    "en": "Sharing settings",
-    "es": "Configuración de compartir",
-    "zh-CN": "共享设置",
-    "zh-TW": "共享設定",
-    "ko-KR": "공유 설정",
-    "no": "Delingsinnstillinger",
-    "ar": "إعدادات المشاركة",
-    "de": "Freigabeeinstellungen",
-    "fr": "Paramètres de partage",
-    "it": "Impostazioni di condivisione",
-    "pt": "Configurações de compartilhamento",
-    "tr": "Paylaşım ayarları"
-  },
-  "SECURITY$UNKNOWN_ANALYZER_LABEL": {
-    "en": "Unknown security analyzer chosen",
-    "es": "Analizador de seguridad desconocido",
-    "zh-CN": "选择了未知的安全分析器",
-    "zh-TW": "選擇了未知的安全分析器",
-    "ko-KR": "알 수 없는 보안 분석기가 선택되었습니다",
-    "no": "Ukjent sikkerhetsanalysator valgt",
-    "ar": "تم اختيار محلل أمان غير معروف",
-    "de": "Unbekannter Sicherheitsanalysator ausgewählt",
-    "fr": "Analyseur de sécurité inconnu choisi",
-    "it": "Analizzatore di sicurezza sconosciuto selezionato",
-    "pt": "Analisador de segurança desconhecido escolhido",
-    "tr": "Bilinmeyen güvenlik analizörü seçildi"
-  },
-  "INVARIANT$UPDATE_POLICY_LABEL": {
-    "en": "Update Policy",
-    "es": "Actualizar política",
-    "zh-CN": "更新策略",
-    "zh-TW": "更新策略",
-    "ko-KR": "정책 업데이트",
-    "no": "Oppdater policy",
-    "ar": "تحديث السياسة",
-    "de": "Richtlinie aktualisieren",
-    "fr": "Mettre à jour la politique",
-    "it": "Aggiorna policy",
-    "pt": "Atualizar política",
-    "tr": "İlkeyi güncelle"
-  },
-  "INVARIANT$UPDATE_SETTINGS_LABEL": {
-    "en": "Update Settings",
-    "es": "Actualizar configuración",
-    "zh-CN": "更新设置",
-    "zh-TW": "更新設定",
-    "ko-KR": "설정 업데이트",
-    "no": "Oppdater innstillinger",
-    "ar": "تحديث الإعدادات",
-    "de": "Einstellungen aktualisieren",
-    "fr": "Mettre à jour les paramètres",
-    "it": "Aggiorna impostazioni",
-    "pt": "Atualizar configurações",
-    "tr": "Ayarları güncelle"
-  },
-  "INVARIANT$SETTINGS_LABEL": {
-    "en": "Settings",
-    "es": "Configuración",
-    "zh-CN": "设置",
-    "zh-TW": "設定",
-    "ko-KR": "설정",
-    "no": "Innstillinger",
-    "ar": "الإعدادات",
-    "de": "Einstellungen",
-    "fr": "Paramètres",
-    "it": "Impostazioni",
-    "pt": "Configurações",
-    "tr": "Ayarlar"
-  },
-  "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:",
-    "zh-CN": "询问用户确认风险等级：",
-    "zh-TW": "詢問用戶確認風險等級：",
-    "ko-KR": "위험 심각도에 대한 사용자 확인 요청:",
-    "no": "Be om brukerbekreftelse på risikoalvorlighet:",
-    "ar": "اطلب تأكيد المستخدم على مستوى الخطورة:",
-    "de": "Nach Benutzerbestätigung für Risikoschweregrad fragen:",
-    "fr": "Demander la confirmation de l'utilisateur sur la gravité du risque :",
-    "it": "Chiedi conferma all'utente sulla gravità del rischio:",
-    "pt": "Solicitar confirmação do usuário sobre a gravidade do risco:",
-    "tr": "Risk şiddeti için kullanıcı onayı iste:"
-  },
-  "INVARIANT$DONT_ASK_FOR_CONFIRMATION_LABEL": {
-    "en": "Don't ask for confirmation",
-    "es": "No solicitar confirmación",
-    "zh-CN": "不要请求确认",
-    "zh-TW": "不要請求確認",
-    "ko-KR": "확인 요청하지 않음",
-    "no": "Ikke spør om bekreftelse",
-    "ar": "لا تطلب التأكيد",
-    "de": "Nicht nach Bestätigung fragen",
-    "fr": "Ne pas demander de confirmation",
-    "it": "Non chiedere conferma",
-    "pt": "Não solicitar confirmação",
-    "tr": "Onay isteme"
-  },
-  "INVARIANT$INVARIANT_ANALYZER_LABEL": {
-    "en": "Invariant Analyzer",
-    "es": "Analizador de invariantes",
-    "zh-CN": "不变量分析器",
-    "zh-TW": "不變量分析器",
-    "ko-KR": "불변성 분석기",
-    "no": "Invariant-analysator",
-    "ar": "محلل الثوابت",
-    "de": "Invarianten-Analysator",
-    "fr": "Analyseur d'invariants",
-    "it": "Analizzatore di invarianti",
-    "pt": "Analisador de invariantes",
-    "tr": "Değişmez Analizörü"
-  },
-  "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.",
-    "zh-CN": "不变量分析器持续监控您的 OpenHands 代理的安全问题。",
-    "zh-TW": "不變量分析器持續監控您的 OpenHands 代理的安全問題。",
-    "ko-KR": "불변성 분석기는 OpenHands 에이전트의 보안 문제를 지속적으로 모니터링합니다.",
-    "no": "Invariant-analysatoren overvåker kontinuerlig OpenHands-agenten din for sikkerhetsproblemer.",
-    "ar": "يراقب محلل الثوابت وكيل OpenHands الخاص بك باستمرار للتحقق من المشاكل الأمنية.",
-    "de": "Der Invarianten-Analysator überwacht kontinuierlich Ihren OpenHands-Agenten auf Sicherheitsprobleme.",
-    "fr": "L'analyseur d'invariants surveille en permanence votre agent OpenHands pour détecter les problèmes de sécurité.",
-    "it": "L'analizzatore di invarianti monitora continuamente il tuo agente OpenHands per problemi di sicurezza.",
-    "pt": "O analisador de invariantes monitora continuamente seu agente OpenHands em busca de problemas de segurança.",
-    "tr": "Değişmez Analizörü, OpenHands ajanınızı güvenlik sorunları için sürekli olarak izler."
-  },
-  "INVARIANT$CLICK_TO_LEARN_MORE_LABEL": {
-    "en": "Click to learn more",
-    "es": "Clic para aprender más",
-    "zh-CN": "点击了解更多",
-    "zh-TW": "點擊了解更多",
-    "ko-KR": "자세히 알아보기",
-    "no": "Klikk for å lære mer",
-    "ar": "انقر لمعرفة المزيد",
-    "de": "Klicken Sie, um mehr zu erfahren",
-    "fr": "Cliquez pour en savoir plus",
-    "it": "Clicca per saperne di più",
-    "pt": "Clique para saber mais",
-    "tr": "Daha fazla bilgi için tıklayın"
-  },
-  "INVARIANT$POLICY_LABEL": {
-    "en": "Policy",
-    "es": "Política",
-    "zh-CN": "策略",
-    "zh-TW": "策略",
-    "ko-KR": "정책",
-    "no": "Policy",
-    "ar": "السياسة",
-    "de": "Richtlinie",
-    "fr": "Politique",
-    "it": "Policy",
-    "pt": "Política",
-    "tr": "İlke"
-  },
-  "INVARIANT$LOG_LABEL": {
-    "en": "Logs",
-    "es": "Logs",
-    "zh-CN": "日志",
-    "zh-TW": "日誌",
-    "ko-KR": "로그",
-    "no": "Logger",
-    "ar": "السجلات",
-    "de": "Protokolle",
-    "fr": "Journaux",
-    "it": "Log",
-    "pt": "Logs",
-    "tr": "Günlükler"
-  },
-  "INVARIANT$EXPORT_TRACE_LABEL": {
-    "en": "Export Trace",
-    "es": "Exportar traza",
-    "zh-CN": "导出跟踪",
-    "zh-TW": "匯出追蹤",
-    "ko-KR": "추적 내보내기",
-    "no": "Eksporter sporing",
-    "ar": "تصدير التتبع",
-    "de": "Ablaufverfolgung exportieren",
-    "fr": "Exporter la trace",
-    "it": "Esporta traccia",
-    "pt": "Exportar rastreamento",
-    "tr": "İzlemeyi dışa aktar"
-  },
-  "INVARIANT$TRACE_EXPORTED_MESSAGE": {
-    "en": "Trace exported",
-    "es": "Traza exportada",
-    "zh-CN": "跟踪已导出",
-    "zh-TW": "追蹤已匯出",
-    "ko-KR": "추적 내보내기 완료",
-    "no": "Sporing eksportert",
-    "ar": "تم تصدير التتبع",
-    "de": "Ablaufverfolgung exportiert",
-    "fr": "Trace exportée",
-    "it": "Traccia esportata",
-    "pt": "Rastreamento exportado",
-    "tr": "İzleme dışa aktarıldı"
-  },
-  "INVARIANT$POLICY_UPDATED_MESSAGE": {
-    "en": "Policy updated",
-    "es": "Política actualizada",
-    "zh-CN": "策略已更新",
-    "zh-TW": "策略已更新",
-    "ko-KR": "정책이 업데이트되었습니다",
-    "no": "Policy oppdatert",
-    "ar": "تم تحديث السياسة",
-    "de": "Richtlinie aktualisiert",
-    "fr": "Politique mise à jour",
-    "it": "Policy aggiornata",
-    "pt": "Política atualizada",
-    "tr": "İlke güncellendi"
-  },
-  "INVARIANT$SETTINGS_UPDATED_MESSAGE": {
-    "en": "Settings updated",
-    "es": "Configuración actualizada",
-    "zh-CN": "设置已更新",
-    "zh-TW": "設定已更新",
-    "ko-KR": "설정이 업데이트되었습니다",
-    "no": "Innstillinger oppdatert",
-    "ar": "تم تحديث الإعدادات",
-    "de": "Einstellungen aktualisiert",
-    "fr": "Paramètres mis à jour",
-    "it": "Impostazioni aggiornate",
-    "pt": "Configurações atualizadas",
-    "tr": "Ayarlar güncellendi"
-  },
-  "CHAT_INTERFACE$INITIALIZING_AGENT_LOADING_MESSAGE": {
-    "en": "Starting up!",
-    "de": "Wird gestartet!",
-    "zh-CN": "正在启动！",
-    "zh-TW": "正在啟動！",
-    "ko-KR": "시작 중입니다!",
-    "no": "Starter opp!",
-    "it": "Avvio in corso!",
-    "pt": "Iniciando!",
-    "es": "¡Iniciando!",
-    "ar": "جارٍ البدء!",
-    "fr": "Démarrage en cours !",
-    "tr": "Başlatılıyor!"
-  },
-  "CHAT_INTERFACE$AGENT_INIT_MESSAGE": {
-    "en": "Agent is initialized, waiting for task...",
-    "de": "Agent ist initialisiert und wartet auf Aufgabe...",
-    "zh-CN": "智能体已初始化，等待任务中...",
-    "zh-TW": "智能體已初始化，等待任務中...",
-    "ko-KR": "에이전트가 초기화되었습니다. 작업을 기다리는 중...",
-    "no": "Agenten er initialisert, venter på oppgave...",
-    "it": "L'agente è inizializzato, in attesa di compiti...",
-    "pt": "Agente inicializado, aguardando tarefa...",
-    "es": "El agente está inicializado, esperando tarea...",
-    "ar": "تم تهيئة الوكيل، في انتظار المهمة...",
-    "fr": "L'agent est initialisé, en attente de tâche...",
-    "tr": "Ajan başlatıldı, görev bekleniyor..."
-  },
-  "CHAT_INTERFACE$AGENT_RUNNING_MESSAGE": {
-    "en": "Agent is running task",
-    "de": "Agent führt Aufgabe aus",
-    "zh-CN": "智能体正在执行任务...",
-    "zh-TW": "智能體正在執行任務...",
-    "ko-KR": "에이전트가 작업을 실행 중입니다",
-    "no": "Agenten utfører oppgave",
-    "it": "L'agente sta eseguendo il compito",
-    "pt": "O agente está executando a tarefa",
-    "es": "El agente está ejecutando la tarea",
-    "ar": "الوكيل يقوم بتنفيذ المهمة",
-    "fr": "L'agent exécute la tâche",
-    "tr": "Ajan görevi yürütüyor"
-  },
-  "CHAT_INTERFACE$AGENT_AWAITING_USER_INPUT_MESSAGE": {
-    "en": "Agent is awaiting user input...",
-    "de": "Agent wartet auf Benutzereingabe...",
-    "zh-CN": "智能体正在等待用户输入...",
-    "zh-TW": "智能體正在等待用戶輸入...",
-    "ko-KR": "에이전트가 사용자 입력을 기다리고 있습니다...",
-    "no": "Agenten venter på brukerinndata...",
-    "it": "L'agente è in attesa dell'input dell'utente...",
-    "pt": "O agente está aguardando a entrada do usuário...",
-    "es": "El agente está esperando la entrada del usuario...",
-    "ar": "الوكيل في انتظار إدخال المستخدم...",
-    "fr": "L'agent attend l'entrée de l'utilisateur...",
-    "tr": "Ajan kullanıcı girdisini bekliyor..."
-  },
-  "CHAT_INTERFACE$AGENT_RATE_LIMITED_MESSAGE": {
-  "en": "Agent is Rate Limited",
-  "zh-CN": "智能体已达到速率限制",
-  "zh-TW": "智能體已達到速率限制",
-  "de": "Agent ist ratenbegrenzt",
-  "ko-KR": "에이전트가 속도 제한되었습니다",
-  "no": "Agenten er hastighetsbegrenset",
-  "it": "L'agente è limitato dalla frequenza",
-  "pt": "O agente está com limite de taxa",
-  "es": "El agente está limitado por tasa",
-  "ar": "الوكيل مقيد بحد السرعة",
-  "fr": "L'agent est limité en fréquence",
-  "tr": "Ajan hız sınırına ulaştı"
-  },
-  "CHAT_INTERFACE$AGENT_PAUSED_MESSAGE": {
-    "en": "Agent has paused.",
-    "de": "Agent pausiert.",
-    "zh-CN": "智能体已暂停",
-    "zh-TW": "智能體已暫停",
-    "ko-KR": "에이전트가 일시 중지되었습니다.",
-    "no": "Agenten har pauset.",
-    "it": "L'agente ha messo in pausa.",
-    "pt": "O agente foi pausado.",
-    "es": "El agente ha pausado.",
-    "ar": "توقف الوكيل مؤقتًا.",
-    "fr": "L'agent a mis en pause.",
-    "tr": "Ajan duraklatıldı."
-  },
-  "CHAT_INTERFACE$AGENT_STOPPED_MESSAGE": {
-    "en": "Agent has stopped.",
-    "de": "Agent hat angehalten.",
-    "zh-CN": "智能体已停止",
-    "zh-TW": "智能體已停止",
-    "ko-KR": "에이전트가 중지되었습니다.",
-    "no": "Agenten har stoppet.",
-    "it": "L'agente si è fermato.",
-    "pt": "O agente parou.",
-    "es": "El agente se ha detenido.",
-    "ar": "توقف الوكيل.",
-    "fr": "L'agent s'est arrêté.",
-    "tr": "Ajan durdu."
-  },
-  "CHAT_INTERFACE$AGENT_FINISHED_MESSAGE": {
-    "en": "Agent has finished the task.",
-    "de": "Agent hat die Aufgabe erledigt.",
-    "zh-CN": "智能体已完成任务",
-    "zh-TW": "智能體已完成任務",
-    "ko-KR": "에이전트가 작업을 완료했습니다.",
-    "no": "Agenten har fullført oppgaven.",
-    "it": "L'agente ha completato il compito.",
-    "pt": "O agente concluiu a tarefa.",
-    "es": "El agente ha terminado la tarea.",
-    "ar": "أنهى الوكيل المهمة.",
-    "fr": "L'agent a terminé la tâche.",
-    "tr": "Ajan görevi tamamladı."
-  },
-  "CHAT_INTERFACE$AGENT_REJECTED_MESSAGE": {
-    "en": "Agent has rejected the task.",
-    "de": "Agent hat die Aufgabe abgelehnt.",
-    "zh-CN": "智能体拒绝任务",
-    "zh-TW": "智能體拒絕任務",
-    "ko-KR": "에이전트가 작업을 거부했습니다.",
-    "no": "Agenten har avvist oppgaven.",
-    "it": "L'agente ha rifiutato il compito.",
-    "pt": "O agente rejeitou a tarefa.",
-    "es": "El agente ha rechazado la tarea.",
-    "ar": "رفض الوكيل المهمة.",
-    "fr": "L'agent a rejeté la tâche.",
-    "tr": "Ajan görevi reddetti."
-  },
-  "CHAT_INTERFACE$AGENT_ERROR_MESSAGE": {
-    "en": "Agent encountered an error.",
-    "de": "Agent ist auf einen Fehler gelaufen.",
-    "zh-CN": "智能体遇到错误",
-    "zh-TW": "智能體遇到錯誤",
-    "ko-KR": "에이전트에 오류가 발생했습니다.",
-    "no": "Agenten støtte på en feil.",
-    "it": "L'agente ha riscontrato un errore.",
-    "pt": "O agente encontrou um erro.",
-    "es": "El agente encontró un error.",
-    "ar": "واجه الوكيل خطأ.",
-    "fr": "L'agent a rencontré une erreur.",
-    "tr": "Ajan bir hatayla karşılaştı."
-  },
-  "CHAT_INTERFACE$AGENT_AWAITING_USER_CONFIRMATION_MESSAGE": {
-    "en": "Agent is awaiting user confirmation for the pending action.",
-    "de": "Agent wartet auf die Bestätigung des Benutzers für die ausstehende Aktion.",
-    "zh-CN": "代理正在等待用户确认待处理的操作。",
-    "zh-TW": "代理正在等待用戶確認待處理的操作。",
-    "ko-KR": "에이전트가 대기 중인 작업에 대한 사용자 확인을 기다리고 있습니다.",
-    "no": "Agenten venter på brukerbekreftelse for den ventende handlingen.",
-    "it": "L'agente è in attesa della conferma dell'utente per l'azione in sospeso.",
-    "pt": "O agente está aguardando a confirmação do usuário para a ação pendente.",
-    "es": "El agente está esperando la confirmación del usuario para la acción pendiente.",
-    "ar": "الوكيل ينتظر تأكيد المستخدم للإجراء المعلق.",
-    "fr": "L'agent attend la confirmation de l'utilisateur pour l'action en attente.",
-    "tr": "Ajan, bekleyen işlem için kullanıcı onayını bekliyor."
-  },
-  "CHAT_INTERFACE$AGENT_ACTION_USER_CONFIRMED_MESSAGE": {
-    "en": "Agent action has been confirmed!",
-    "de": "Die Aktion des Agenten wurde bestätigt!",
-    "zh-CN": "代理操作已确认！",
-    "zh-TW": "代理操作已確認！",
-    "ko-KR": "에이전트 작업이 확인되었습니다!",
-    "no": "Agenthandlingen har blitt bekreftet!",
-    "it": "L'azione dell'agente è stata confermata!",
-    "pt": "A ação do agente foi confirmada!",
-    "es": "¡La acción del agente ha sido confirmada!",
-    "ar": "تم تأكيد إجراء الوكيل!",
-    "fr": "L'action de l'agent a été confirmée !",
-    "tr": "Ajan eylemi onaylandı!"
-  },
-  "CHAT_INTERFACE$AGENT_ACTION_USER_REJECTED_MESSAGE": {
-    "en": "Agent action has been rejected!",
-    "de": "Die Aktion des Agenten wurde abgelehnt!",
-    "zh-CN": "代理操作已被拒绝！",
-    "zh-TW": "代理操作已被拒絕！",
-    "ko-KR": "에이전트 작업이 거부되었습니다!",
-    "no": "Agenthandlingen har blitt avvist!",
-    "it": "L'azione dell'agente è stata rifiutata!",
-    "pt": "A ação do agente foi rejeitada!",
-    "es": "¡La acción del agente ha sido rechazada!",
-    "ar": "تم رفض إجراء الوكيل!",
-    "fr": "L'action de l'agent a été rejetée !",
-    "tr": "Ajan eylemi reddedildi!"
-  },
-  "CHAT_INTERFACE$INPUT_PLACEHOLDER": {
-    "en": "Message assistant...",
-    "zh-CN": "给助理发消息",
-    "de": "Sende eine Nachricht an den Assistenten...",
-    "ko-KR": "어시스턴트에게 메시지 보내기",
-    "no": "Send melding til assistenten...",
-    "zh-TW": "给助理留言",
-    "it": "Invia un messaggio all'assistente...",
-    "pt": "Envie uma mensagem para o assistente...",
-    "es": "Mensaje al asistente...",
-    "ar": "مراسلة المساعد",
-    "fr": "Envoyez un message à l'assistant...",
-    "tr": "Asistana mesaj gönder..."
-  },
-  "CHAT_INTERFACE$INPUT_CONTINUE_MESSAGE": {
-    "en": "Continue",
-    "zh-CN": "继续",
-    "de": "Fortfahren",
-    "zh-TW": "繼續",
-    "ko-KR": "계속",
-    "no": "Fortsett",
-    "it": "Continua",
-    "pt": "Continuar",
-    "es": "Continuar",
-    "ar": "استمرار",
-    "fr": "Continuer",
-    "tr": "Devam et"
-  },
-  "CHAT_INTERFACE$USER_ASK_CONFIRMATION": {
-    "en": "Do you want to continue with this action?",
-    "de": "Möchten Sie mit dieser Aktion fortfahren?",
-    "zh-CN": "您要继续此操作吗？",
-    "zh-TW": "您要繼續此操作嗎？",
-    "ko-KR": "이 작업을 계속하시겠습니까?",
-    "no": "Vil du fortsette med denne handlingen?",
-    "it": "Vuoi continuare con questa azione?",
-    "pt": "Deseja continuar com esta ação?",
-    "es": "¿Desea continuar con esta acción?",
-    "ar": "هل تريد الاستمرار في هذا الإجراء؟",
-    "fr": "Voulez-vous continuer avec cette action ?",
-    "tr": "Bu işleme devam etmek istiyor musunuz?"
-  },
-  "CHAT_INTERFACE$USER_CONFIRMED": {
-    "en": "Confirm the requested action",
-    "de": "Bestätigen Sie die angeforderte Aktion",
-    "zh-CN": "确认请求的操作",
-    "zh-TW": "確認請求的操作",
-    "ko-KR": "요청된 작업 확인",
-    "no": "Bekreft den forespurte handlingen",
-    "it": "Conferma l'azione richiesta",
-    "pt": "Confirmar a ação solicitada",
-    "es": "Confirmar la acción solicitada",
-    "ar": "تأكيد الإجراء المطلوب",
-    "fr": "Confirmer l'action demandée",
-    "tr": "İstenen eylemi onayla"
-  },
-  "CHAT_INTERFACE$USER_REJECTED": {
-    "en": "Reject the requested action",
-    "de": "Lehnen Sie die angeforderte Aktion ab",
-    "zh-CN": "拒绝请求的操作",
-    "zh-TW": "拒絕請求的操作",
-    "ko-KR": "요청된 작업 거부",
-    "no": "Avvis den forespurte handlingen",
-    "it": "Rifiuta l'azione richiesta",
-    "pt": "Rejeitar a ação solicitada",
-    "es": "Rechazar la acción solicitada",
-    "ar": "رفض الإجراء المطلوب",
-    "fr": "Rejeter l'action demandée",
-    "tr": "İstenen eylemi reddet"
-  },
-  "CHAT_INTERFACE$INPUT_SEND_MESSAGE_BUTTON_CONTENT": {
-    "en": "Send",
-    "zh-CN": "发送",
-    "de": "Senden",
-    "ko-KR": "전송",
-    "no": "Send",
-    "zh-TW": "發送",
-    "it": "Invia",
-    "pt": "Enviar",
-    "es": "Enviar",
-    "ar": "إرسال",
-    "fr": "Envoyer"
-  },
-  "CHAT_INTERFACE$CHAT_MESSAGE_COPIED": {
-    "en": "Message copied to clipboard",
-    "zh-CN": "消息已复制到剪贴板",
-    "de": "Nachricht in die Zwischenablage kopiert",
-    "ko-KR": "메시지가 클립보드에 복사되었습니다",
-    "no": "Melding kopiert til utklippstavlen",
-    "zh-TW": "訊息已複製到剪貼簿",
-    "it": "Messaggio copiato negli appunti",
-    "pt": "Mensagem copiada para a área de transferência",
-    "es": "Mensaje copiado al portapapeles",
-    "ar": "تم نسخ الرسالة إلى الحافظة",
-    "fr": "Message copié dans le presse-papiers",
-    "tr": "Mesaj panoya kopyalandı"
-  },
-  "CHAT_INTERFACE$CHAT_MESSAGE_COPY_FAILED": {
-    "en": "Failed to copy message to clipboard",
-    "zh-CN": "复制消息到剪贴板失败",
-    "de": "Nachricht konnte nicht in die Zwischenablage kopiert werden",
-    "ko-KR": "메시지를 클립보드에 복사하지 못했습니다",
-    "no": "Kunne ikke kopiere meldingen til utklippstavlen",
-    "zh-TW": "無法將訊息複製到剪貼簿",
-    "it": "Impossibile copiare il messaggio negli appunti",
-    "pt": "Falha ao copiar mensagem para a área de transferência",
-    "es": "No se pudo copiar el mensaje al portapapeles",
-    "ar": "فشل نسخ الرسالة إلى الحافظة",
-    "fr": "Échec de la copie du message dans le presse-papiers",
-    "tr": "Mesaj panoya kopyalanamadı"
-  },
-  "CHAT_INTERFACE$TOOLTIP_COPY_MESSAGE": {
-    "en": "Copy message",
-    "zh-CN": "复制消息",
-    "de": "Nachricht kopieren",
-    "ko-KR": "메시지 복사",
-    "no": "Kopier melding",
-    "zh-TW": "複製訊息",
-    "it": "Copia messaggio",
-    "pt": "Copiar mensagem",
-    "es": "Copiar mensaje",
-    "ar": "نسخ الرسالة",
-    "fr": "Copier le message",
-    "tr": "Mesajı kopyala"
-  },
-  "CHAT_INTERFACE$TOOLTIP_SEND_MESSAGE": {
-    "en": "Send message",
-    "zh-CN": "发送消息",
-    "de": "Nachricht senden",
-    "ko-KR": "메시지 보내기",
-    "no": "Send melding",
-    "zh-TW": "發送訊息",
-    "it": "Invia messaggio",
-    "pt": "Enviar mensagem",
-    "es": "Enviar mensaje",
-    "ar": "إرسال الرسالة",
-    "fr": "Envoyer le message",
-    "tr": "Mesaj gönder"
-  },
-  "CHAT_INTERFACE$TOOLTIP_UPLOAD_IMAGE": {
-    "en": "Upload image",
-    "zh-CN": "上传图片",
-    "de": "Bild hochladen",
-    "ko-KR": "이미지 업로드",
-    "no": "Last opp bilde",
-    "zh-TW": "上傳圖片",
-    "it": "Carica immagine",
-    "pt": "Carregar imagem",
-    "es": "Subir imagen",
-    "ar": "تحميل الصورة",
-    "fr": "Télécharger une image",
-    "tr": "Resim yükle"
-  },
-  "CHAT_INTERFACE$INITIAL_MESSAGE": {
-    "en": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
-    "zh-CN": "你好！我是 OpenHands，一名 AI 软件工程师。今天想和我一起编写什么程序呢?",
-    "de": "Hi! Ich bin OpenHands, ein KI-Softwareingenieur. Was möchten Sie heute mit mir erstellen?",
-    "ko-KR": "안녕하세요! 저는 오픈데빈(OpenHands), AI 소프트웨어 엔지니어입니다. 오늘은 저와 함께 무엇을 만들어 볼까요?",
-    "no": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
-    "zh-TW": "嗨！我是 OpenHands，一位人工智慧軟體工程師。你今天想和我一起建造什麼？",
-    "it": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
-    "pt": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
-    "es": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
-    "ar": "مرحبا! أنا OpenHands، مهندس برمجيات AI. ماذا تود أن تبني معي اليوم؟",
-    "fr": "Salut! Je suis OpenHands, un ingénieur logiciel en IA. Que voudriez-vous construire avec moi aujourd'hui?"
-  },
-  "CHAT_INTERFACE$ASSISTANT": {
-    "en": "Assistant",
-    "zh-CN": "助理",
-    "ko-KR": "어시스턴트",
-    "de": "Assistent",
-    "no": "Assistant",
-    "zh-TW": "助理",
-    "it": "Assistant",
-    "pt": "Assistant",
-    "es": "Assistant",
-    "ar": "مساعد",
-    "fr": "Assistant",
-    "tr": "Gönder"
-  },
-  "CHAT_INTERFACE$TO_BOTTOM": {
-    "en": "To Bottom",
-    "de": "Nach unten",
-    "zh-CN": "回到底部",
-    "ko-KR": "맨 아래로",
-    "no": "Til bunnen",
-    "zh-TW": "回到底部",
-    "it": "In fondo",
-    "pt": "Para o fundo",
-    "es": "Ir al final",
-    "ar": "إلى الأسفل",
-    "fr": "Vers le bas",
-    "tr": "En alta"
-  },
-  "CHAT_INTERFACE$MESSAGE_ARIA_LABEL": {
-    "en": "Message from {{sender}}",
-    "zh-CN": "来自 {{sender}} 的消息",
-    "de": "Nachricht von {{sender}}",
-    "ko-KR": "{{sender}}의 메시지",
-    "no": "Melding fra {{sender}}",
-    "zh-TW": "來自 {{sender}} 的訊息",
-    "it": "Messaggio da {{sender}}",
-    "pt": "Mensagem de {{sender}}",
-    "es": "Mensaje de {{sender}}",
-    "ar": "رسالة من {{sender}}",
-    "fr": "Message de {{sender}}",
-    "tr": "{{sender}} tarafından gönderilen mesaj"
-  },
-  "CHAT_INTERFACE$CHAT_CONVERSATION": {
-    "en": "Chat Conversation",
-    "zh-CN": "聊天对话",
-    "de": "Chat-Konversation",
-    "ko-KR": "채팅 대화",
-    "no": "Chat-samtale",
-    "zh-TW": "聊天對話",
-    "it": "Conversazione di chat",
-    "pt": "Conversa de chat",
-    "es": "Conversación de chat",
-    "ar": "محادثة تلقيم",
-    "fr": "Conversation de chat",
-    "tr": "Sohbet Konuşması"
-  },
-  "CHAT_INTERFACE$UNKNOWN_SENDER": {
-    "en": "Unknown",
-    "zh-CN": "未知",
-    "de": "Unbekannt",
-    "ko-KR": "알 수 없음",
-    "no": "Ukjent",
-    "zh-TW": "未知",
-    "it": "Sconosciuto",
-    "pt": "Desconhecido",
-    "es": "Desconocido",
-    "ar": "مجهول",
-    "fr": "Inconnu",
-    "tr": "Bilinmeyen"
-  },
-  "SECURITY_ANALYZER$UNKNOWN_RISK": {
-    "en": "Unknown Risk",
-    "de": "Unbekanntes Risiko",
-    "zh-CN": "未知风险",
-    "ko-KR": "알 수 없는 위험",
-    "no": "Ukjent risiko",
-    "zh-TW": "未知風險",
-    "it": "Rischio sconosciuto",
-    "pt": "Risco desconhecido",
-    "es": "Riesgo desconocido",
-    "ar": "مخاطر غير معروفة",
-    "fr": "Risque inconnu",
-    "tr": "Bilinmeyen risk"
-  },
-  "SECURITY_ANALYZER$LOW_RISK": {
-    "en": "Low Risk",
-    "de": "Niedriges Risiko",
-    "zh-CN": "低风险",
-    "ko-KR": "낮은 위험",
-    "no": "Lav risiko",
-    "zh-TW": "低風險",
-    "it": "Rischio basso",
-    "pt": "Baixo risco",
-    "es": "Riesgo bajo",
-    "ar": "مخاطر منخفضة",
-    "fr": "Risque faible",
-    "tr": "Düşük risk"
-  },
-  "SECURITY_ANALYZER$MEDIUM_RISK": {
-    "en": "Medium Risk",
-    "de": "Mittleres Risiko",
-    "zh-CN": "中等风险",
-    "ko-KR": "중간 위험",
-    "no": "Middels risiko",
-    "zh-TW": "中等風險",
-    "it": "Rischio medio",
-    "pt": "Risco médio",
-    "es": "Riesgo medio",
-    "ar": "مخاطر متوسطة",
-    "fr": "Risque moyen",
-    "tr": "Orta risk"
-  },
-  "SECURITY_ANALYZER$HIGH_RISK": {
-    "en": "High Risk",
-    "de": "Hohes Risiko",
-    "zh-CN": "高风险",
-    "ko-KR": "높은 위험",
-    "no": "Høy risiko",
-    "zh-TW": "高風險",
-    "it": "Rischio elevato",
-    "pt": "Alto risco",
-    "es": "Riesgo alto",
-    "ar": "مخاطر عالية",
-    "fr": "Risque élevé",
-    "tr": "Yüksek risk"
-  },
-  "SETTINGS$MODEL_TOOLTIP": {
-    "en": "Select the language model to use.",
-    "zh-CN": "选择要使用的语言模型",
-    "zh-TW": "選擇要使用的語言模型。",
-    "de": "Wähle das zu verwendende Modell.",
-    "ko-KR": "사용할 언어 모델을 선택하세요.",
-    "no": "Velg språkmodellen som skal brukes.",
-    "it": "Seleziona il modello linguistico da utilizzare.",
-    "pt": "Selecione o modelo de linguagem a ser usado.",
-    "es": "Seleccione el modelo de lenguaje a utilizar.",
-    "ar": "اختر نموذج اللغة المراد استخدامه.",
-    "fr": "Sélectionnez le modèle de langage à utiliser.",
-    "tr": "Kullanılacak dil modelini seçin."
-  },
-  "SETTINGS$AGENT_TOOLTIP": {
-    "en": "Select the agent to use.",
-    "zh-CN": "选择要使用的智能体",
-    "zh-TW": "選擇要使用的智能體。",
-    "de": "Wähle den zu verwendenden Agenten.",
-    "ko-KR": "사용할 에이전트를 선택하세요.",
-    "no": "Velg agenten som skal brukes.",
-    "it": "Seleziona l'agente da utilizzare.",
-    "pt": "Selecione o agente a ser usado.",
-    "es": "Seleccione el agente a utilizar.",
-    "ar": "اختر الوكيل المراد استخدامه.",
-    "fr": "Sélectionnez l'agent à utiliser.",
-    "tr": "Kullanılacak ajanı seçin."
-  },
-  "SETTINGS$LANGUAGE_TOOLTIP": {
-    "en": "Select the language for the UI.",
-    "zh-CN": "选择界面语言",
-    "zh-TW": "選擇 UI 的語言。",
-    "de": "Wähle die Sprache für die Oberfläche.",
-    "ko-KR": "UI 언어를 선택하세요.",
-    "no": "Velg språk for brukergrensesnittet.",
-    "it": "Seleziona la lingua per l'interfaccia utente.",
-    "pt": "Selecione o idioma para a interface do usuário.",
-    "es": "Seleccione el idioma para la interfaz de usuario.",
-    "ar": "اختر لغة واجهة المستخدم.",
-    "fr": "Sélectionnez la langue de l'interface utilisateur.",
-    "tr": "Kullanıcı arayüzü için dil seçin."
-  },
-  "SETTINGS$DISABLED_RUNNING": {
-    "en": "Cannot be changed while the agent is running.",
-    "zh-CN": "在智能体运行时无法更改",
-    "zh-TW": "智能體正在執行時無法更改。",
-    "de": "Kann bei laufender Aufgabe nicht geändert werden.",
-    "ko-KR": "에이전트가 실행 중일 때는 변경할 수 없습니다.",
-    "no": "Kan ikke endres mens agenten kjører.",
-    "it": "Non può essere modificato mentre l'agente è in esecuzione.",
-    "pt": "Não pode ser alterado enquanto o agente está em execução.",
-    "es": "No se puede cambiar mientras el agente está en ejecución.",
-    "ar": "لا يمكن تغييره أثناء تشغيل الوكيل.",
-    "fr": "Ne peut pas être modifié pendant que l'agent est en cours d'exécution.",
-    "tr": "Ajan çalışırken değiştirilemez."
-  },
-  "SETTINGS$API_KEY_PLACEHOLDER": {
-    "en": "Enter your API key.",
-    "zh-CN": "输入您的 API key",
-    "zh-TW": "輸入您的 API 金鑰。",
-    "de": "Modell API Schlüssel.",
-    "ko-KR": "API 키를 입력하세요.",
-    "no": "Skriv inn din API-nøkkel.",
-    "it": "Inserisci la tua chiave API.",
-    "pt": "Digite sua chave de API.",
-    "es": "Ingrese su clave de API.",
-    "ar": "أدخل مفتاح API الخاص بك.",
-    "fr": "Entrez votre clé API.",
-    "tr": "API anahtarınızı girin."
-  },
-  "SETTINGS$CONFIRMATION_MODE": {
-    "en": "Enable Confirmation Mode",
-    "de": "Bestätigungsmodus aktivieren",
-    "zh-CN": "启用确认模式",
-    "zh-TW": "啟用確認模式",
-    "ko-KR": "확인 모드 활성화",
-    "no": "Aktiver bekreftelsesmodus",
-    "it": "Abilita modalità di conferma",
-    "pt": "Ativar modo de confirmação",
-    "es": "Habilitar modo de confirmación",
-    "ar": "تفعيل وضع التأكيد",
-    "fr": "Activer le mode de confirmation",
-    "tr": "Onay Modunu Etkinleştir"
-  },
-  "SETTINGS$CONFIRMATION_MODE_TOOLTIP": {
-    "en": "Awaits for user confirmation before executing code.",
-    "de": "Wartet auf die Bestätigung des Benutzers, bevor der Code ausgeführt wird.",
-    "zh-CN": "在执行代码之前等待用户确认。",
-    "zh-TW": "在執行程式碼之前等待使用者確認。",
-    "ko-KR": "코드 실행 전 사용자 확인을 기다립니다.",
-    "no": "Venter på brukerbekreftelse før koden utføres.",
-    "it": "Attende la conferma dell'utente prima di eseguire il codice.",
-    "pt": "Aguarda a confirmação do usuário antes de executar o código.",
-    "es": "Espera la confirmación del usuario antes de ejecutar el código.",
-    "ar": "ينتظر تأكيد المستخدم قبل تنفيذ الكود.",
-    "fr": "Attend la confirmation de l'utilisateur avant d'exécuter le code.",
-    "tr": "Kodu çalıştırmadan önce kullanıcı onayını bekler."
-  },
-  "SETTINGS$AGENT_SELECT_ENABLED": {
-    "en": "Enable Agent Selection - Advanced Users",
-    "zh-CN": "启用智能体选择 - 高级用户",
-    "zh-TW": "啟用智能體選擇 - 進階使用者",
-    "de": "Agentenauswahl aktivieren - Fortgeschrittene Benutzer",
-    "ko-KR": "에이전트 선택 활성화 - 고급 사용자",
-    "no": "Aktiver agentvalg - Avanserte brukere",
-    "it": "Abilita selezione agente - Utenti avanzati",
-    "pt": "Ativar seleção de agente - Usuários avançados",
-    "es": "Habilitar selección de agente - Usuarios avanzados",
-    "ar": "تمكين اختيار الوكيل - المستخدمين المتقدمين",
-    "fr": "Activer la sélection d'agent - Utilisateurs avancés",
-    "tr": "Ajan Seçimini Etkinleştir - İleri Düzey Kullanıcılar"
-  },
-  "SETTINGS$SECURITY_ANALYZER": {
-    "en": "Enable Security Analyzer",
-    "de": "Sicherheitsanalysator aktivieren",
-    "zh-CN": "启用安全分析器",
-    "zh-TW": "啟用安全分析器",
-    "ko-KR": "보안 분석기 활성화",
-    "no": "Aktiver sikkerhetsanalysator",
-    "it": "Abilita analizzatore di sicurezza",
-    "pt": "Ativar analisador de segurança",
-    "es": "Habilitar analizador de seguridad",
-    "ar": "تمكين محلل الأمان",
-    "fr": "Activer l'analyseur de sécurité",
-    "tr": "Güvenlik Analizörünü Etkinleştir"
-  },
-  "BROWSER$EMPTY_MESSAGE": {
-    "en": "No page loaded.",
-    "zh-CN": "页面未加载",
-    "zh-TW": "未加載任何頁面。",
-    "de": "Keine Seite geladen.",
-    "ko-KR": "페이지가 로드되지 않았습니다.",
-    "no": "Ingen side lastet.",
-    "it": "Nessuna pagina caricata.",
-    "pt": "Nenhuma página carregada.",
-    "es": "Ninguna página cargada.",
-    "ar": "لم يتم تحميل أي صفحة.",
-    "fr": "Aucune page chargée.",
-    "tr": "Sayfa yüklenmedi."
-  },
-  "PLANNER$EMPTY_MESSAGE": {
-    "en": "No plan created.",
-    "zh-CN": "计划未创建",
-    "zh-TW": "未創建任何計劃。",
-    "de": "Kein Plan erstellt.",
-    "ko-KR": "생성된 계획이 없습니다.",
-    "no": "Ingen plan opprettet.",
-    "it": "Nessun piano creato.",
-    "pt": "Nenhum plano criado.",
-    "es": "Ningún plan creado.",
-    "ar": "لم يتم إنشاء أي خطة.",
-    "fr": "Aucun plan créé.",
-    "tr": "Plan oluşturulmadı."
-  },
-  "FEEDBACK$PUBLIC_LABEL": {
-    "en": "Public",
-    "zh-CN": "公开",
-    "zh-TW": "公開",
-    "de": "Öffentlich",
-    "ko-KR": "공개",
-    "no": "Offentlig",
-    "it": "Pubblico",
-    "pt": "Público",
-    "es": "Público",
-    "ar": "عام",
-    "fr": "Public",
-    "tr": "Herkese Açık"
-  },
-  "FEEDBACK$PRIVATE_LABEL": {
-    "en": "Private",
-    "zh-CN": "私有",
-    "zh-TW": "私有",
-    "de": "Privat",
-    "ko-KR": "비공개",
-    "no": "Privat",
-    "it": "Privato",
-    "pt": "Privado",
-    "es": "Privado",
-    "ar": "خاص",
-    "fr": "Privé",
-    "tr": "Özel"
-  },
-  "STATUS$STARTING_RUNTIME": {
-    "en": "Starting Runtime...",
-    "zh-CN": "启动运行时...",
-    "zh-TW": "啟動運行時...",
-    "de": "Laufzeitumgebung wird gestartet...",
-    "ko-KR": "런타임 시작 중...",
-    "no": "Starter kjøretidsmiljø...",
-    "it": "Avvio dell'ambiente di esecuzione...",
-    "pt": "Iniciando o ambiente de execução...",
-    "es": "Iniciando el entorno de ejecución...",
-    "ar": "جارٍ بدء بيئة التشغيل...",
-    "fr": "Démarrage de l'environnement d'exécution...",
-    "tr": "Çalışma zamanı başlatılıyor..."
-  },
-  "STATUS$STARTING_CONTAINER": {
-    "en": "Preparing container, this might take a few minutes...",
-    "zh-CN": "正在准备容器，这可能需要几分钟...",
-    "zh-TW": "正在準備容器，這可能需要幾分鐘...",
-    "de": "Container wird vorbereitet, dies kann einige Minuten dauern...",
-    "ko-KR": "컨테이너를 준비 중입니다. 몇 분 정도 걸릴 수 있습니다...",
-    "no": "Forbereder container, dette kan ta noen minutter...",
-    "it": "Preparazione del container in corso, potrebbe richiedere alcuni minuti...",
-    "pt": "Preparando o container, isso pode levar alguns minutos...",
-    "es": "Preparando el contenedor, esto puede tardar unos minutos...",
-    "ar": "جارٍ إعداد الحاوية، قد يستغرق هذا بضع دقائق...",
-    "fr": "Préparation du conteneur, cela peut prendre quelques minutes...",
-    "tr": "Konteyner hazırlanıyor, bu işlem birkaç dakika sürebilir..."
-  },
-  "STATUS$PREPARING_CONTAINER": {
-    "en": "Preparing to start container...",
-    "zh-CN": "正在准备启动容器...",
-    "zh-TW": "正在準備啟動容器...",
-    "de": "Vorbereitung zum Starten des Containers...",
-    "ko-KR": "컨테이너 시작 준비 중...",
-    "no": "Forbereder å starte container...",
-    "it": "Preparazione all'avvio del container...",
-    "pt": "Preparando para iniciar o container...",
-    "es": "Preparando para iniciar el contenedor...",
-    "ar": "جارٍ التحضير لبدء الحاوية...",
-    "fr": "Préparation du démarrage du conteneur...",
-    "tr": "Konteyner başlatılmaya hazırlanıyor..."
-  },
-  "STATUS$CONTAINER_STARTED": {
-    "en": "Container started.",
-    "zh-CN": "容器已启动。",
-    "zh-TW": "容器已啟動。",
-    "de": "Container gestartet.",
-    "ko-KR": "컨테이너가 시작되었습니다.",
-    "no": "Container startet.",
-    "it": "Container avviato.",
-    "pt": "Container iniciado.",
-    "es": "Contenedor iniciado.",
-    "ar": "تم بدء الحاوية.",
-    "fr": "Conteneur démarré.",
-    "tr": "Konteyner başlatıldı."
-  },
-  "STATUS$WAITING_FOR_CLIENT": {
-    "en": "Waiting for client to become ready...",
-    "zh-CN": "等待客户端准备就绪...",
-    "zh-TW": "等待客戶端準備就緒...",
-    "de": "Warten auf Bereitschaft des Clients...",
-    "ko-KR": "클라이언트가 준비될 때까지 기다리는 중...",
-    "no": "Venter på at klienten skal bli klar...",
-    "it": "In attesa che il client sia pronto...",
-    "pt": "Aguardando o cliente ficar pronto...",
-    "es": "Esperando a que el cliente esté listo...",
-    "ar": "في انتظار جاهزية العميل...",
-    "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": "Cerrar"
-  },
-  "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..."
-  },
-  "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_PLACEHOLDER$CONNECT_TO_GITHUB": {
-    "en": "Connect to GitHub"
-  },
-  "PROJECT_MENU_DETAILS_PLACEHOLDER$CONNECTED": {
-    "en": "Connected"
-  },
-  "PROJECT_MENU_DETAILS$AGO_LABEL": {
-    "en": "ago",
-    "es": "atrás"
-  },
-  "STATUS$ERROR_LLM_AUTHENTICATION": {
-    "en": "Error authenticating with the LLM provider. Please check your API key",
-    "es": "Error autenticando con el proveedor de LLM. Por favor revisa tu API key"
-  },
-  "STATUS$ERROR_RUNTIME_DISCONNECTED": {
-    "en": "There was an error while connecting to the runtime. Please refresh the page."
-  },
-  "AGENT_ERROR$BAD_ACTION": {
-    "en": "Agent tried to execute a malformed action."
-  },
-  "AGENT_ERROR$ACTION_TIMEOUT": {
-    "en": "Action timed out."
-  },
-  "PROJECT_MENU_CARD_CONTEXT_MENU$CONNECT_TO_GITHUB_LABEL": {
-    "en": "Connect to GitHub",
-    "es": "Conectar a GitHub"
-  },
-  "PROJECT_MENU_CARD_CONTEXT_MENU$PUSH_TO_GITHUB_LABEL": {
-    "en": "Push to GitHub",
-    "es": "Subir a GitHub"
-  },
-  "PROJECT_MENU_CARD_CONTEXT_MENU$DOWNLOAD_FILES_LABEL": {
-    "en": "Download files",
-    "es": "Descargar archivos"
-  },
-  "PROJECT_MENU_CARD$OPEN": {
-    "en": "Open project menu"
-  },
-  "ACTION_BUTTON$RESUME": {
-    "en": "Resume the agent task"
-  },
-  "ACTION_BUTTON$PAUSE": {
-    "en": "Pause the current task"
-  },
-  "BROWSER$SCREENSHOT_ALT": {
-    "en": "Browser Screenshot"
-  },
-  "ACCOUNT_SETTINGS$SETTINGS": {
-    "en": "Account Settings"
-  },
-  "ACCOUNT_SETTINGS$LOGOUT": {
-    "en": "Logout"
-  },
-  "ERROR_TOAST$CLOSE_BUTTON_LABEL": {
-    "en": "Close"
-  },
-  "FILE_EXPLORER$UPLOAD": {
-    "en": "Upload File"
-  },
-  "FILE_EXPLORER$REFRESH_WORKSPACE": {
-    "en": "Refresh workspace"
-  },
-  "FILE_EXPLORER$OPEN_WORKSPACE": {
-    "en": "Open workspace"
-  },
-  "FILE_EXPLORER$CLOSE_WORKSPACE": {
-    "en": "Close workspace"
-  },
-  "ACTION_MESSAGE$RUN": {
-    "en": "Running a bash command"
-  },
-  "ACTION_MESSAGE$RUN_IPYTHON": {
-    "en": "Running a Python command"
-  },
-  "ACTION_MESSAGE$READ": {
-    "en": "Reading the contents of a file"
-  },
-  "ACTION_MESSAGE$EDIT": {
-    "en": "Editing the contents of a file"
-  },
-  "ACTION_MESSAGE$WRITE": {
-    "en": "Writing to a file"
-  },
-  "ACTION_MESSAGE$BROWSE": {
-    "en": "Browsing the web"
-  },
-  "OBSERVATION_MESSAGE$RUN": {
-    "en": "Ran a bash command"
-  },
-  "OBSERVATION_MESSAGE$RUN_IPYTHON": {
-    "en": "Ran a Python command"
-  },
-  "OBSERVATION_MESSAGE$READ": {
-    "en": "Read the contents of a file"
-  },
-  "OBSERVATION_MESSAGE$EDIT": {
-    "en": "Edited the contents of a file"
-  },
-  "OBSERVATION_MESSAGE$WRITE": {
-    "en": "Wrote to a file"
-  },
-  "OBSERVATION_MESSAGE$BROWSE": {
-    "en": "Browsing completed"
-  },
-  "EXPANDABLE_MESSAGE$SHOW_DETAILS": {
-    "en": "Show details"
-  },
-  "EXPANDABLE_MESSAGE$HIDE_DETAILS": {
-    "en": "Hide details"
-  }
+    "PROJECT$START_NEW": {
+        "en": "Start new project",
+        "ja": "新規プロジェクトを開始",
+        "zh-CN": "开始新项目",
+        "zh-TW": "開始新專案",
+        "ko-KR": "새 프로젝트 시작",
+        "no": "Start nytt prosjekt",
+        "it": "Avvia nuovo progetto",
+        "pt": "Iniciar novo projeto",
+        "es": "Iniciar nuevo proyecto",
+        "ar": "بدء مشروع جديد",
+        "fr": "Démarrer un nouveau projet",
+        "tr": "Yeni proje başlat",
+        "de": "Neues Projekt starten"
+    },
+    "PROJECT$NEW": {
+        "en": "New Project",
+        "ja": "新規プロジェクト",
+        "zh-CN": "新项目",
+        "zh-TW": "新專案",
+        "ko-KR": "새 프로젝트",
+        "no": "Nytt prosjekt",
+        "it": "Nuovo progetto",
+        "pt": "Novo projeto",
+        "es": "Nuevo proyecto",
+        "ar": "مشروع جديد",
+        "fr": "Nouveau projet",
+        "tr": "Yeni proje",
+        "de": "Neues Projekt"
+    },
+    "ACCOUNT_SETTINGS$TITLE": {
+        "en": "Account Settings",
+        "ja": "アカウント設定",
+        "zh-CN": "账户设置",
+        "zh-TW": "帳戶設定",
+        "ko-KR": "계정 설정",
+        "no": "Kontoinnstillinger",
+        "it": "Impostazioni account",
+        "pt": "Configurações da conta",
+        "es": "Configuración de la cuenta",
+        "ar": "إعدادات الحساب",
+        "fr": "Paramètres du compte",
+        "tr": "Hesap ayarları",
+        "de": "Kontoeinstellungen"
+    },
+    "WORKSPACE$TITLE": {
+        "en": "Workspace",
+        "zh-CN": "工作区",
+        "de": "Arbeitsbereich",
+        "ko-KR": "워크스페이스",
+        "no": "Arbeidsområde",
+        "zh-TW": "工作區",
+        "ar": "مساحة العمل",
+        "fr": "Espace de travail",
+        "it": "Area di lavoro",
+        "pt": "Espaço de trabalho",
+        "es": "Espacio de trabajo",
+        "ja": "ワークスペース",
+        "tr": "Çalışma Alanı"
+    },
+    "WORKSPACE$TERMINAL_TAB_LABEL": {
+        "en": "Terminal",
+        "zh-CN": "终端",
+        "de": "Terminal",
+        "ko-KR": "터미널",
+        "no": "Terminal",
+        "zh-TW": "終端機",
+        "it": "Terminale",
+        "pt": "Terminal",
+        "es": "Terminal",
+        "ar": "الطرفية",
+        "fr": "Terminal",
+        "tr": "Terminal",
+        "ja": "ターミナル"
+    },
+    "TERMINAL$WAITING_FOR_CLIENT": {
+        "en": "Waiting for client to become ready...",
+        "ja": "クライアントの準備を待機中...",
+        "zh-CN": "等待客户端准备就绪...",
+        "zh-TW": "等待客戶端準備就緒...",
+        "ko-KR": "클라이언트 준비를 기다리는 중...",
+        "de": "Warte auf Bereitschaft des Clients...",
+        "no": "Venter på at klienten skal bli klar...",
+        "it": "In attesa che il client sia pronto...",
+        "pt": "Aguardando o cliente ficar pronto...",
+        "es": "Esperando a que el cliente esté listo...",
+        "ar": "في انتظار جاهزية العميل...",
+        "fr": "En attente de la disponibilité du client...",
+        "tr": "İstemcinin hazır olması bekleniyor..."
+    },
+    "CODE_EDITOR$FILE_SAVED_SUCCESSFULLY": {
+        "en": "File saved successfully",
+        "zh-CN": "文件保存成功",
+        "de": "Datei erfolgreich gespeichert",
+        "ko-KR": "파일이 성공적으로 저장되었습니다",
+        "no": "Fil lagret vellykket",
+        "zh-TW": "檔案儲存成功",
+        "it": "File salvato con successo",
+        "pt": "Arquivo salvo com sucesso",
+        "es": "Archivo guardado exitosamente",
+        "ar": "تم حفظ الملف بنجاح",
+        "fr": "Fichier enregistré avec succès",
+        "tr": "Dosya başarıyla kaydedildi",
+        "ja": "ファイルが正常に保存されました"
+    },
+    "CODE_EDITOR$SAVING_LABEL": {
+        "en": "Saving...",
+        "zh-CN": "保存中...",
+        "de": "Speichern...",
+        "ko-KR": "저장 중...",
+        "no": "Lagrer...",
+        "zh-TW": "儲存中...",
+        "it": "Salvataggio in corso...",
+        "pt": "Salvando...",
+        "es": "Guardando...",
+        "ar": "حفظ مؤقت",
+        "fr": "Enregistrement en cours...",
+        "tr": "Kayıt yapılıyor...",
+        "ja": "保存中..."
+    },
+    "CODE_EDITOR$SAVE_LABEL": {
+        "en": "Save",
+        "zh-CN": "保存",
+        "de": "Speichern",
+        "ko-KR": "저장",
+        "no": "Lagrer",
+        "zh-TW": "儲存",
+        "it": "Salva",
+        "pt": "Salvar",
+        "es": "Guardar",
+        "ar": "حفظ",
+        "fr": "Enregistrer",
+        "tr": "Kayıt",
+        "ja": "保存"
+    },
+    "CODE_EDITOR$OPTIONS": {
+        "en": "Options",
+        "zh-CN": "选项",
+        "zh-TW": "選項",
+        "de": "Optionen",
+        "ko-KR": "옵션",
+        "no": "Alternativer",
+        "it": "Opzioni",
+        "pt": "Opções",
+        "es": "Opciones",
+        "ar": "خيارات",
+        "fr": "Options",
+        "tr": "Seçenekler",
+        "ja": "オプション"
+    },
+    "CODE_EDITOR$FILE_SAVE_ERROR": {
+        "en": "An unknown error occurred while saving the file",
+        "zh-CN": "保存文件时发生未知错误",
+        "zh-TW": "儲存檔案時發生未知錯誤",
+        "de": "Beim Speichern der Datei ist ein unbekannter Fehler aufgetreten",
+        "ko-KR": "파일 저장 중 알 수 없는 오류가 발생했습니다",
+        "no": "En ukjent feil oppstod under lagring av filen",
+        "it": "Si è verificato un errore sconosciuto durante il salvataggio del file",
+        "pt": "Ocorreu um erro desconhecido ao salvar o arquivo",
+        "es": "Ocurrió un error desconocido al guardar el archivo",
+        "ar": "حدث خطأ غير معروف أثناء حفظ الملف",
+        "fr": "Une erreur inconnue s'est produite lors de l'enregistrement du fichier",
+        "tr": "Dosya kaydedilirken bilinmeyen bir hata oluştu",
+        "ja": "ファイルの保存中に不明なエラーが発生しました"
+    },
+    "CODE_EDITOR$EMPTY_MESSAGE": {
+        "en": "No file selected.",
+        "zh-CN": "未选择文件",
+        "zh-TW": "未選擇檔案",
+        "de": "Keine Datei ausgewählt.",
+        "ko-KR": "선택된 파일이 없습니다",
+        "no": "Ingen fil valgt.",
+        "it": "Nessun file selezionato.",
+        "pt": "Nenhum arquivo selecionado.",
+        "es": "Ningún archivo seleccionado.",
+        "ar": "لم يتم اختيار أي ملف.",
+        "fr": "Aucun fichier sélectionné.",
+        "tr": "Hiçbir dosya seçilmedi.",
+        "ja": "ファイルが選択されていません。"
+    },
+    "FILE_SERVICE$SELECT_FILE_ERROR": {
+        "en": "Error selecting file. Please try again.",
+        "zh-CN": "选择文件时出错。请重试。",
+        "de": "Fehler beim Auswählen der Datei. Bitte versuchen Sie es erneut.",
+        "ko-KR": "파일 선택 중 오류가 발생했습니다. 다시 시도해 주세요.",
+        "no": "Feil ved valg av fil. Vennligst prøv igjen.",
+        "zh-TW": "選擇檔案時出錯。請重試。",
+        "it": "Errore durante la selezione del file. Riprova.",
+        "pt": "Erro ao selecionar o arquivo. Por favor, tente novamente.",
+        "es": "Error al seleccionar el archivo. Por favor, inténtelo de nuevo.",
+        "ar": "خطأ في اختيار الملف. يرجى المحاولة مرة أخرى.",
+        "fr": "Erreur lors de la sélection du fichier. Veuillez réessayer.",
+        "tr": "Dosya seçiminde hata oluştu. Lütfen tekrar deneyin.",
+        "ja": "ファイルの選択中にエラーが発生しました。もう一度お試しください。"
+    },
+    "FILE_SERVICE$UPLOAD_FILES_ERROR": {
+        "en": "Error uploading files. Please try again.",
+        "zh-CN": "上传文件时出错。请重试。",
+        "de": "Fehler beim Hochladen der Dateien. Bitte versuchen Sie es erneut.",
+        "ko-KR": "파일 업로드 중 오류가 발생했습니다. 다시 시도해 주세요.",
+        "no": "Feil ved opplasting av filer. Vennligst prøv igjen.",
+        "zh-TW": "上傳檔案時出錯。請重試。",
+        "it": "Errore durante il caricamento dei file. Riprova.",
+        "pt": "Erro ao fazer upload dos arquivos. Por favor, tente novamente.",
+        "es": "Error al subir los archivos. Por favor, inténtelo de nuevo.",
+        "ar": "خطأ في تحميل الملفات. يرجى المحاولة مرة أخرى.",
+        "fr": "Erreur lors du téléchargement des fichiers. Veuillez réessayer.",
+        "tr": "Dosyalar yüklenirken hata oluştu. Lütfen tekrar deneyin.",
+        "ja": "ファイルのアップロード中にエラーが発生しました。もう一度お試しください。"
+    },
+    "FILE_SERVICE$LIST_FILES_ERROR": {
+        "en": "Error listing files. Please try again.",
+        "zh-CN": "列出文件时出错。请重试。",
+        "de": "Fehler beim Auflisten der Dateien. Bitte versuchen Sie es erneut.",
+        "ko-KR": "파일 목록을 가져오는 중 오류가 발생했습니다. 다시 시도해 주세요.",
+        "no": "Feil ved listing av filer. Vennligst prøv igjen.",
+        "zh-TW": "列出檔案時出錯。請重試。",
+        "it": "Errore durante l'elenco dei file. Riprova.",
+        "pt": "Erro ao listar arquivos. Por favor, tente novamente.",
+        "es": "Error al listar los archivos. Por favor, inténtelo de nuevo.",
+        "ar": "خطأ في سرد الملفات. يرجى المحاولة مرة أخرى.",
+        "fr": "Erreur lors de la liste des fichiers. Veuillez réessayer.",
+        "tr": "Dosyalar listelenirken hata oluştu. Lütfen tekrar deneyin.",
+        "ja": "ファイル一覧の取得中にエラーが発生しました。もう一度お試しください。"
+    },
+    "FILE_SERVICE$SAVE_FILE_ERROR": {
+        "en": "Error saving file. Please try again.",
+        "zh-CN": "保存文件时出错。请重试。",
+        "de": "Fehler beim Speichern der Datei. Bitte versuchen Sie es erneut.",
+        "ko-KR": "파일 저장 중 오류가 발생했습니다. 다시 시도해 주세요.",
+        "no": "Feil ved lagring av fil. Vennligst prøv igjen.",
+        "zh-TW": "儲存檔案時出錯。請重試。",
+        "it": "Errore durante il salvataggio del file. Riprova.",
+        "pt": "Erro ao salvar o arquivo. Por favor, tente novamente.",
+        "es": "Error al guardar el archivo. Por favor, inténtelo de nuevo.",
+        "ar": "خطأ في حفظ الملف. يرجى المحاولة مرة أخرى.",
+        "fr": "Erreur lors de l'enregistrement du fichier. Veuillez réessayer.",
+        "tr": "Dosya kaydedilirken hata oluştu. Lütfen tekrar deneyin.",
+        "ja": "ファイルの保存中にエラーが発生しました。もう一度お試しください。"
+    },
+    "SUGGESTIONS$INCREASE_TEST_COVERAGE": {
+        "en": "Increase test coverage",
+        "ja": "テストカバレッジを向上させる",
+        "zh-CN": "提高测试覆盖率",
+        "zh-TW": "提高測試覆蓋率",
+        "ko-KR": "테스트 커버리지 향상",
+        "de": "Testabdeckung erhöhen",
+        "no": "Øk testdekning",
+        "it": "Aumenta la copertura dei test",
+        "pt": "Aumentar cobertura de testes",
+        "es": "Aumentar cobertura de pruebas",
+        "ar": "زيادة تغطية الاختبار",
+        "fr": "Augmenter la couverture des tests",
+        "tr": "Test kapsamını artır"
+    },
+    "SUGGESTIONS$AUTO_MERGE_PRS": {
+        "en": "Auto-merge Dependabot PRs",
+        "ja": "Dependabot PRを自動マージ",
+        "zh-CN": "自动合并Dependabot PR",
+        "zh-TW": "自動合併Dependabot PR",
+        "ko-KR": "Dependabot PR 자동 병합",
+        "de": "Dependabot PRs automatisch zusammenführen",
+        "no": "Auto-flett Dependabot PRs",
+        "it": "Unisci automaticamente le PR di Dependabot",
+        "pt": "Mesclar automaticamente PRs do Dependabot",
+        "es": "Fusionar automáticamente PRs de Dependabot",
+        "ar": "دمج تلقائي لـ PRs من Dependabot",
+        "fr": "Fusion automatique des PR Dependabot",
+        "tr": "Dependabot PR'larını otomatik birleştir"
+    },
+    "SUGGESTIONS$FIX_README": {
+        "en": "Improve README",
+        "ja": "READMEを改善",
+        "zh-CN": "改进README",
+        "zh-TW": "改進README",
+        "ko-KR": "README 개선",
+        "de": "README verbessern",
+        "no": "Forbedre README",
+        "it": "Migliorare README",
+        "pt": "Melhorar README",
+        "es": "Mejorar README",
+        "ar": "تحسين README",
+        "fr": "Améliorer le README",
+        "tr": "README'yi geliştir"
+    },
+    "SUGGESTIONS$CLEAN_DEPENDENCIES": {
+        "en": "Clean up dependencies",
+        "ja": "依存関係を整理",
+        "zh-CN": "清理依赖项",
+        "zh-TW": "清理依賴項",
+        "ko-KR": "의존성 정리",
+        "de": "Abhängigkeiten bereinigen",
+        "no": "Rydd opp i avhengigheter",
+        "it": "Pulire le dipendenze",
+        "pt": "Limpar dependências",
+        "es": "Limpiar dependencias",
+        "ar": "تنظيف التبعيات",
+        "fr": "Nettoyer les dépendances",
+        "tr": "Bağımlılıkları temizle"
+    },
+    "FILE_SERVICE$INVALID_FILE_PATH": {
+        "en": "Invalid file path. Please check the file name and try again.",
+        "zh-CN": "文件路径无效。请检查文件名并重试。",
+        "de": "Ungültiger Dateipfad. Bitte überprüfen Sie den Dateinamen und versuchen Sie es erneut.",
+        "ko-KR": "잘못된 파일 경로입니다. 파일 이름을 확인하고 다시 시도해 주세요.",
+        "no": "Ugyldig filbane. Vennligst sjekk filnavnet og prøv igjen.",
+        "zh-TW": "檔案路徑無效。請檢查檔案名稱並重試。",
+        "it": "Percorso del file non valido. Controlla il nome del file e riprova.",
+        "pt": "Caminho de arquivo inválido. Por favor, verifique o nome do arquivo e tente novamente.",
+        "es": "Ruta de archivo inválida. Por favor, verifique el nombre del archivo e inténtelo de nuevo.",
+        "ar": "مسار الملف غير صالح. يرجى التحقق من اسم الملف والمحاولة مرة أخرى.",
+        "fr": "Chemin de fichier invalide. Veuillez vérifier le nom du fichier et réessayer.",
+        "tr": "Geçersiz dosya yolu. Lütfen dosya adını kontrol edin ve tekrar deneyin.",
+        "ja": "ファイルパスが無効です。ファイル名を確認して、もう一度お試しください。"
+    },
+    "WORKSPACE$PLANNER_TAB_LABEL": {
+        "en": "Planner",
+        "zh-CN": "规划器",
+        "de": "Planer",
+        "ko-KR": "플래너",
+        "no": "Planlegger",
+        "zh-TW": "規劃器",
+        "ar": "المخطط",
+        "fr": "Planificateur",
+        "it": "Pianificatore",
+        "pt": "Planejador",
+        "es": "Planificador",
+        "ja": "プランナー",
+        "tr": "Planlayıcı"
+    },
+    "WORKSPACE$JUPYTER_TAB_LABEL": {
+        "en": "Jupyter",
+        "zh-CN": "Jupyter",
+        "de": "Jupyter",
+        "ko-KR": "Jupyter",
+        "no": "Jupyter",
+        "zh-TW": "Jupyter",
+        "ar": "Jupyter",
+        "fr": "Jupyter",
+        "it": "Jupyter",
+        "pt": "Jupyter",
+        "es": "Jupyter",
+        "ja": "Jupyter",
+        "tr": "Jupyter"
+    },
+    "WORKSPACE$CODE_EDITOR_TAB_LABEL": {
+        "en": "Code Editor",
+        "zh-CN": "代码编辑器",
+        "de": "Code-Editor",
+        "ko-KR": "코드 편집기",
+        "no": "Kode editor",
+        "zh-TW": "程式碼編輯器",
+        "ar": "محرر الكود",
+        "fr": "Éditeur de code",
+        "it": "Editor di codice",
+        "pt": "Editor de código",
+        "es": "Editor de código",
+        "ja": "コードエディタ",
+        "tr": "Kod Editörü"
+    },
+    "WORKSPACE$BROWSER_TAB_LABEL": {
+        "en": "Browser",
+        "zh-CN": "浏览器",
+        "de": "Browser",
+        "ko-KR": "브라우저",
+        "no": "Nettleser",
+        "zh-TW": "瀏覽器",
+        "it": "Browser",
+        "pt": "Navegador",
+        "es": "Navegador",
+        "ar": "المتصفح",
+        "fr": "Navigateur",
+        "tr": "Tarayıcı",
+        "ja": "ブラウザ"
+    },
+    "VSCODE$OPEN": {
+        "en": "Open in VS Code",
+        "ja": "VS Codeで開く",
+        "zh-CN": "在VS Code中打开",
+        "zh-TW": "在VS Code中開啟",
+        "ko-KR": "VS Code에서 열기",
+        "de": "In VS Code öffnen",
+        "no": "Åpne i VS Code",
+        "it": "Apri in VS Code",
+        "pt": "Abrir no VS Code",
+        "es": "Abrir en VS Code",
+        "ar": "فتح في VS Code",
+        "fr": "Ouvrir dans VS Code",
+        "tr": "VS Code'da aç"
+    },
+    "INCREASE_TEST_COVERAGE": {
+        "en": "Increase test coverage",
+        "ja": "テストカバレッジを向上",
+        "zh-CN": "提高测试覆盖率",
+        "zh-TW": "提高測試覆蓋率",
+        "ko-KR": "테스트 커버리지 향상",
+        "de": "Testabdeckung erhöhen",
+        "no": "Øk testdekning",
+        "it": "Aumenta la copertura dei test",
+        "pt": "Aumentar cobertura de testes",
+        "es": "Aumentar cobertura de pruebas",
+        "ar": "زيادة تغطية الاختبارات",
+        "fr": "Augmenter la couverture des tests",
+        "tr": "Test kapsamını artır"
+    },
+    "AUTO_MERGE_PRS": {
+        "en": "Auto-merge PRs",
+        "ja": "PRを自動マージ",
+        "zh-CN": "自动合并PR",
+        "zh-TW": "自動合併PR",
+        "ko-KR": "PR 자동 병합",
+        "de": "PRs automatisch zusammenführen",
+        "no": "Auto-flett PRer",
+        "it": "Unisci automaticamente le PR",
+        "pt": "Mesclar PRs automaticamente",
+        "es": "Fusionar PRs automáticamente",
+        "ar": "دمج طلبات السحب تلقائياً",
+        "fr": "Fusionner automatiquement les PR",
+        "tr": "PR'ları otomatik birleştir"
+    },
+    "FIX_README": {
+        "en": "Fix README",
+        "ja": "READMEを修正",
+        "zh-CN": "修复README",
+        "zh-TW": "修復README",
+        "ko-KR": "README 수정",
+        "de": "README korrigieren",
+        "no": "Fiks README",
+        "it": "Correggi README",
+        "pt": "Corrigir README",
+        "es": "Arreglar README",
+        "ar": "إصلاح README",
+        "fr": "Corriger le README",
+        "tr": "README'yi düzelt"
+    },
+    "CLEAN_DEPENDENCIES": {
+        "en": "Clean dependencies",
+        "ja": "依存関係を整理",
+        "zh-CN": "清理依赖项",
+        "zh-TW": "清理相依性",
+        "ko-KR": "의존성 정리",
+        "de": "Abhängigkeiten bereinigen",
+        "no": "Rydd avhengigheter",
+        "it": "Pulisci dipendenze",
+        "pt": "Limpar dependências",
+        "es": "Limpiar dependencias",
+        "ar": "تنظيف التبعيات",
+        "fr": "Nettoyer les dépendances",
+        "tr": "Bağımlılıkları temizle"
+    },
+    "CONFIGURATION$OPENHANDS_WORKSPACE_DIRECTORY_INPUT_LABEL": {
+        "en": "OpenHands Workspace directory",
+        "zh-CN": "OpenHands工作区目录",
+        "de": "OpenHands Arbeitsverzeichnis",
+        "ko-KR": "OpenHands 워크스페이스 디렉토리",
+        "no": "OpenHands arbeidsmappe",
+        "zh-TW": "OpenHands工作區目錄",
+        "it": "Directory dell'area di lavoro OpenHands",
+        "pt": "Diretório do espaço de trabalho OpenHands",
+        "es": "Directorio del espacio de trabajo de OpenHands",
+        "ar": "مجلد مساحة عمل أوبنديفين",
+        "fr": "Répertoire de l'espace de travail OpenHands",
+        "tr": "OpenHands çalışma alanı dizini",
+        "ja": "OpenHands ワークスペースディレクトリ"
+    },
+    "LLM$PROVIDER": {
+        "en": "LLM Provider",
+        "ja": "LLMプロバイダー",
+        "zh-CN": "LLM提供商",
+        "zh-TW": "LLM提供者",
+        "ko-KR": "LLM 제공자",
+        "no": "LLM-leverandør",
+        "it": "Provider LLM",
+        "pt": "Provedor LLM",
+        "es": "Proveedor LLM",
+        "ar": "مزود LLM",
+        "fr": "Fournisseur LLM",
+        "tr": "LLM Sağlayıcı",
+        "de": "LLM-Anbieter"
+    },
+    "LLM$SELECT_PROVIDER_PLACEHOLDER": {
+        "en": "Select a provider",
+        "ja": "プロバイダーを選択",
+        "zh-CN": "选择提供商",
+        "zh-TW": "選擇提供者",
+        "ko-KR": "제공자 선택",
+        "no": "Velg en leverandør",
+        "it": "Seleziona un provider",
+        "pt": "Selecione um provedor",
+        "es": "Seleccione un proveedor",
+        "ar": "اختر مزودًا",
+        "fr": "Sélectionner un fournisseur",
+        "tr": "Bir sağlayıcı seçin",
+        "de": "Anbieter auswählen"
+    },
+    "API$KEY": {
+        "en": "API Key",
+        "ja": "APIキー",
+        "zh-CN": "API密钥",
+        "zh-TW": "API金鑰",
+        "ko-KR": "API 키",
+        "no": "API-nøkkel",
+        "it": "Chiave API",
+        "pt": "Chave API",
+        "es": "Clave API",
+        "ar": "مفتاح API",
+        "fr": "Clé API",
+        "tr": "API Anahtarı",
+        "de": "API-Schlüssel"
+    },
+    "API$DONT_KNOW_KEY": {
+        "en": "Don't know your API key?",
+        "ja": "APIキーがわかりませんか？",
+        "zh-CN": "不知道您的API密钥？",
+        "zh-TW": "不知道您的API金鑰？",
+        "ko-KR": "API 키를 모르시나요?",
+        "no": "Kjenner du ikke API-nøkkelen din?",
+        "it": "Non conosci la tua chiave API?",
+        "pt": "Não sabe sua chave API?",
+        "es": "¿No conoce su clave API?",
+        "ar": "لا تعرف مفتاح API الخاص بك؟",
+        "fr": "Vous ne connaissez pas votre clé API ?",
+        "tr": "API anahtarınızı bilmiyor musunuz?",
+        "de": "API-Schlüssel unbekannt?"
+    },
+    "BUTTON$SAVE": {
+        "en": "Save",
+        "ja": "保存",
+        "zh-CN": "保存",
+        "zh-TW": "儲存",
+        "ko-KR": "저장",
+        "no": "Lagre",
+        "it": "Salva",
+        "pt": "Salvar",
+        "es": "Guardar",
+        "ar": "حفظ",
+        "fr": "Enregistrer",
+        "tr": "Kaydet",
+        "de": "Speichern"
+    },
+    "BUTTON$CLOSE": {
+        "en": "Close",
+        "ja": "閉じる",
+        "zh-CN": "关闭",
+        "zh-TW": "關閉",
+        "ko-KR": "닫기",
+        "no": "Lukk",
+        "it": "Chiudi",
+        "pt": "Fechar",
+        "es": "Cerrar",
+        "ar": "إغلاق",
+        "fr": "Fermer",
+        "tr": "Kapat",
+        "de": "Schließen"
+    },
+    "BUTTON$RESET_TO_DEFAULTS": {
+        "en": "Reset to defaults",
+        "ja": "デフォルトにリセット",
+        "zh-CN": "重置为默认值",
+        "zh-TW": "重置為預設值",
+        "ko-KR": "기본값으로 재설정",
+        "no": "Tilbakestill til standard",
+        "it": "Ripristina valori predefiniti",
+        "pt": "Restaurar padrões",
+        "es": "Restablecer valores predeterminados",
+        "ar": "إعادة التعيين إلى الإعدادات الافتراضية",
+        "fr": "Réinitialiser aux valeurs par défaut",
+        "tr": "Varsayılanlara sıfırla",
+        "de": "Auf Standardwerte zurücksetzen"
+    },
+    "MODAL$CONFIRM_RESET_TITLE": {
+        "en": "Are you sure?",
+        "ja": "本当によろしいですか？",
+        "zh-CN": "确定吗？",
+        "zh-TW": "確定嗎？",
+        "ko-KR": "확실합니까?",
+        "no": "Er du sikker?",
+        "it": "Sei sicuro?",
+        "pt": "Tem certeza?",
+        "es": "¿Está seguro?",
+        "ar": "هل أنت متأكد؟",
+        "fr": "Êtes-vous sûr ?",
+        "tr": "Emin misiniz?",
+        "de": "Sind Sie sicher?"
+    },
+    "MODAL$CONFIRM_RESET_MESSAGE": {
+        "en": "All information will be deleted",
+        "ja": "すべての情報が削除されます",
+        "zh-CN": "确定要重置所有设置吗？",
+        "zh-TW": "確定要重置所有設定嗎？",
+        "ko-KR": "모든 설정을 재설정하시겠습니까?",
+        "no": "All informasjon vil bli slettet",
+        "it": "Tutte le informazioni verranno eliminate",
+        "pt": "Todas as informações serão excluídas",
+        "es": "Toda la información será eliminada",
+        "ar": "سيتم حذف جميع المعلومات",
+        "fr": "Toutes les informations seront supprimées",
+        "tr": "Tüm bilgiler silinecek",
+        "de": "Möchten Sie alle Einstellungen zurücksetzen?"
+    },
+    "MODAL$END_SESSION_TITLE": {
+        "en": "End Session",
+        "ja": "セッションを終了",
+        "zh-CN": "结束会话",
+        "zh-TW": "結束工作階段",
+        "ko-KR": "세션 종료",
+        "no": "Avslutt økt",
+        "it": "Termina sessione",
+        "pt": "Encerrar sessão",
+        "es": "Finalizar sesión",
+        "ar": "إنهاء الجلسة",
+        "fr": "Terminer la session",
+        "tr": "Oturumu sonlandır",
+        "de": "Sitzung beenden"
+    },
+    "MODAL$END_SESSION_MESSAGE": {
+        "en": "Changing workspace settings will end the current session",
+        "ja": "ワークスペース設定を変更すると、現在のセッションが終了します",
+        "zh-CN": "确定要结束当前会话吗？",
+        "zh-TW": "確定要結束目前工作階段嗎？",
+        "ko-KR": "현재 세션을 종료하시겠습니까?",
+        "no": "Endring av arbeidsområdeinnstillinger vil avslutte gjeldende økt",
+        "it": "La modifica delle impostazioni dell'area di lavoro terminerà la sessione corrente",
+        "pt": "Alterar as configurações do espaço de trabalho encerrará a sessão atual",
+        "es": "Cambiar la configuración del espacio de trabajo finalizará la sesión actual",
+        "ar": "سيؤدي تغيير إعدادات مساحة العمل إلى إنهاء الجلسة الحالية",
+        "fr": "La modification des paramètres de l'espace de travail mettra fin à la session en cours",
+        "tr": "Çalışma alanı ayarlarını değiştirmek mevcut oturumu sonlandıracak",
+        "de": "Möchten Sie die aktuelle Sitzung beenden?"
+    },
+    "BUTTON$END_SESSION": {
+        "en": "End Session",
+        "ja": "セッションを終了",
+        "zh-CN": "结束会话",
+        "zh-TW": "結束工作階段",
+        "ko-KR": "세션 종료",
+        "no": "Avslutt økt",
+        "it": "Termina sessione",
+        "pt": "Encerrar sessão",
+        "es": "Finalizar sesión",
+        "ar": "إنهاء الجلسة",
+        "fr": "Terminer la session",
+        "tr": "Oturumu sonlandır",
+        "de": "Sitzung beenden"
+    },
+    "BUTTON$CANCEL": {
+        "en": "Cancel",
+        "ja": "キャンセル",
+        "zh-CN": "取消",
+        "zh-TW": "取消",
+        "ko-KR": "취소",
+        "no": "Avbryt",
+        "it": "Annulla",
+        "pt": "Cancelar",
+        "es": "Cancelar",
+        "ar": "إلغاء",
+        "fr": "Annuler",
+        "tr": "İptal",
+        "de": "Abbrechen"
+    },
+    "LANGUAGE$LABEL": {
+        "en": "Language",
+        "ja": "言語",
+        "zh-CN": "语言",
+        "zh-TW": "語言",
+        "ko-KR": "언어",
+        "no": "Språk",
+        "it": "Lingua",
+        "pt": "Idioma",
+        "es": "Idioma",
+        "ar": "اللغة",
+        "fr": "Langue",
+        "tr": "Dil",
+        "de": "Sprache"
+    },
+    "GITHUB$TOKEN_LABEL": {
+        "en": "GitHub Token",
+        "ja": "GitHubトークン",
+        "zh-CN": "GitHub令牌",
+        "zh-TW": "GitHub權杖",
+        "ko-KR": "GitHub 토큰",
+        "no": "GitHub-token",
+        "it": "Token GitHub",
+        "pt": "Token do GitHub",
+        "es": "Token de GitHub",
+        "ar": "رمز GitHub",
+        "fr": "Jeton GitHub",
+        "tr": "GitHub Jetonu",
+        "de": "GitHub-Token"
+    },
+    "GITHUB$TOKEN_OPTIONAL": {
+        "en": "GitHub Token (Optional)",
+        "ja": "GitHubトークン（任意）",
+        "zh-CN": "（可选）",
+        "zh-TW": "（選填）",
+        "ko-KR": "(선택사항)",
+        "no": "GitHub-token (valgfritt)",
+        "it": "Token GitHub (opzionale)",
+        "pt": "Token do GitHub (opcional)",
+        "es": "Token de GitHub (opcional)",
+        "ar": "رمز GitHub (اختياري)",
+        "fr": "Jeton GitHub (facultatif)",
+        "tr": "GitHub Jetonu (İsteğe bağlı)",
+        "de": "(Optional)"
+    },
+    "GITHUB$GET_TOKEN": {
+        "en": "Get your token",
+        "ja": "トークンを取得",
+        "zh-CN": "获取您的令牌",
+        "zh-TW": "取得您的權杖",
+        "ko-KR": "토큰 받기",
+        "no": "Få din token",
+        "it": "Ottieni il tuo token",
+        "pt": "Obter seu token",
+        "es": "Obtener su token",
+        "ar": "احصل على الرمز الخاص بك",
+        "fr": "Obtenir votre jeton",
+        "tr": "Jetonunuzu alın",
+        "de": "Token abrufen"
+    },
+    "COMMON$HERE": {
+        "en": "here",
+        "ja": "こちら",
+        "zh-CN": "这里",
+        "zh-TW": "這裡",
+        "ko-KR": "여기",
+        "no": "her",
+        "it": "qui",
+        "pt": "aqui",
+        "es": "aquí",
+        "ar": "هنا",
+        "fr": "ici",
+        "tr": "buradan",
+        "de": "Hier"
+    },
+    "ANALYTICS$ENABLE": {
+        "en": "Enable analytics",
+        "ja": "アナリティクスを有効にする",
+        "zh-CN": "启用分析",
+        "zh-TW": "啟用分析",
+        "ko-KR": "분석 활성화",
+        "no": "Aktiver analyse",
+        "it": "Abilita analisi",
+        "pt": "Ativar análise",
+        "es": "Habilitar análisis",
+        "ar": "تمكين التحليلات",
+        "fr": "Activer les analyses",
+        "tr": "Analitiği etkinleştir",
+        "de": "Analyse aktivieren"
+    },
+    "GITHUB$TOKEN_INVALID": {
+        "en": "Invalid GitHub token",
+        "ja": "GitHubトークンが無効です",
+        "zh-CN": "GitHub令牌无效",
+        "zh-TW": "GitHub權杖無效",
+        "ko-KR": "GitHub 토큰이 유효하지 않습니다",
+        "no": "Ugyldig GitHub-token",
+        "it": "Token GitHub non valido",
+        "pt": "Token do GitHub inválido",
+        "es": "Token de GitHub inválido",
+        "ar": "رمز GitHub غير صالح",
+        "fr": "Jeton GitHub invalide",
+        "tr": "Geçersiz GitHub jetonu",
+        "de": "GitHub-Token ungültig"
+    },
+    "BUTTON$DISCONNECT": {
+        "en": "Disconnect",
+        "ja": "切断",
+        "zh-CN": "断开连接",
+        "zh-TW": "中斷連線",
+        "ko-KR": "연결 해제",
+        "no": "Koble fra",
+        "it": "Disconnetti",
+        "pt": "Desconectar",
+        "es": "Desconectar",
+        "ar": "قطع الاتصال",
+        "fr": "Déconnecter",
+        "tr": "Bağlantıyı kes",
+        "de": "Verbindung trennen"
+    },
+    "GITHUB$CONFIGURE_REPOS": {
+        "en": "Configure Github Repositories",
+        "ja": "GitHubリポジトリを設定",
+        "zh-CN": "配置GitHub仓库",
+        "zh-TW": "設定GitHub儲存庫",
+        "ko-KR": "GitHub 저장소 설정",
+        "no": "Konfigurer GitHub-repositorier",
+        "it": "Configura repository GitHub",
+        "pt": "Configurar repositórios do GitHub",
+        "es": "Configurar repositorios de GitHub",
+        "ar": "تكوين مستودعات GitHub",
+        "fr": "Configurer les dépôts GitHub",
+        "tr": "GitHub depolarını yapılandır",
+        "de": "GitHub-Repositories konfigurieren"
+    },
+    "COMMON$CLICK_FOR_INSTRUCTIONS": {
+        "en": "Click here for instructions",
+        "ja": "手順はこちらをクリック",
+        "zh-CN": "点击查看说明",
+        "zh-TW": "點擊查看說明",
+        "ko-KR": "설명을 보려면 클릭하세요",
+        "no": "Klikk her for instruksjoner",
+        "it": "Clicca qui per le istruzioni",
+        "pt": "Clique aqui para instruções",
+        "es": "Haga clic aquí para ver las instrucciones",
+        "ar": "انقر هنا للتعليمات",
+        "fr": "Cliquez ici pour les instructions",
+        "tr": "Talimatlar için buraya tıklayın",
+        "de": "Für Anweisungen klicken"
+    },
+    "LLM$SELECT_MODEL_PLACEHOLDER": {
+        "en": "Select a model",
+        "ja": "モデルを選択",
+        "zh-CN": "选择模型",
+        "zh-TW": "選擇模型",
+        "ko-KR": "모델 선택",
+        "no": "Velg en modell",
+        "it": "Seleziona un modello",
+        "pt": "Selecione um modelo",
+        "es": "Seleccione un modelo",
+        "ar": "اختر نموذجًا",
+        "fr": "Sélectionner un modèle",
+        "tr": "Bir model seçin",
+        "de": "Modell auswählen"
+    },
+    "LLM$MODEL": {
+        "en": "LLM Model",
+        "ja": "LLMモデル",
+        "zh-CN": "LLM模型",
+        "zh-TW": "LLM模型",
+        "ko-KR": "LLM 모델",
+        "no": "LLM-modell",
+        "it": "Modello LLM",
+        "pt": "Modelo LLM",
+        "es": "Modelo LLM",
+        "ar": "نموذج LLM",
+        "fr": "Modèle LLM",
+        "tr": "LLM Modeli",
+        "de": "LLM-Modell"
+    },
+    "CONFIGURATION$OPENHANDS_WORKSPACE_DIRECTORY_INPUT_PLACEHOLDER": {
+        "en": "Default: ./workspace",
+        "zh-CN": "输入工作区目录路径",
+        "de": "Standard: ./workspace",
+        "ko-KR": "워크스페이스 디렉토리 경로 입력",
+        "no": "Standard: ./workspace",
+        "zh-TW": "輸入工作區目錄路徑",
+        "ar": "الافتراضي: ./workspace",
+        "fr": "Par défaut: ./workspace",
+        "it": "Predefinito: ./workspace",
+        "pt": "Padrão: ./workspace",
+        "es": "Predeterminado: ./workspace",
+        "ja": "デフォルト: ./workspace",
+        "tr": "Çalışma alanı dizinini girin"
+    },
+    "CONFIGURATION$MODAL_TITLE": {
+        "en": "Configuration",
+        "zh-CN": "配置",
+        "de": "Konfiguration",
+        "ko-KR": "설정",
+        "no": "Konfigurasjon",
+        "zh-TW": "設定",
+        "it": "Configurazione",
+        "pt": "Configuração",
+        "es": "Configuración",
+        "ar": "التكوين",
+        "fr": "Configuration",
+        "tr": "Konfigürasyon",
+        "ja": "設定"
+    },
+    "CONFIGURATION$MODEL_SELECT_LABEL": {
+        "en": "Model",
+        "zh-CN": "模型",
+        "de": "Modell",
+        "ko-KR": "모델",
+        "no": "Modell",
+        "zh-TW": "模型",
+        "it": "Modello",
+        "pt": "Modelo",
+        "es": "Modelo",
+        "ar": "النموذج",
+        "fr": "Modèle",
+        "tr": "Model",
+        "ja": "モデル"
+    },
+    "CONFIGURATION$MODEL_SELECT_PLACEHOLDER": {
+        "en": "Select a model",
+        "zh-CN": "选择模型",
+        "de": "Wähle ein Modell",
+        "ko-KR": "모델 선택",
+        "no": "Velg en modell",
+        "zh-TW": "選擇模型",
+        "it": "Seleziona un modello",
+        "pt": "Selecione um modelo",
+        "es": "Seleccionar un modelo",
+        "ar": "حدد نموذج",
+        "fr": "Sélectionner un modèle",
+        "tr": "Model Seç",
+        "ja": "モデルを選択"
+    },
+    "CONFIGURATION$AGENT_SELECT_LABEL": {
+        "en": "Agent",
+        "zh-CN": "代理",
+        "de": "Agent",
+        "ko-KR": "에이전트",
+        "no": "Agent",
+        "zh-TW": "代理",
+        "it": "Agente",
+        "pt": "Agente",
+        "es": "Agente",
+        "ar": "الوكيل",
+        "fr": "Agent",
+        "tr": "Ajan",
+        "ja": "エージェント"
+    },
+    "CONFIGURATION$AGENT_SELECT_PLACEHOLDER": {
+        "en": "Select an agent",
+        "zh-CN": "选择代理",
+        "de": "Wähle einen Agenten",
+        "ko-KR": "에이전트 선택",
+        "no": "Velg en agent",
+        "zh-TW": "選擇代理",
+        "it": "Seleziona un agente",
+        "pt": "Selecione um agente",
+        "es": "Seleccionar un agente",
+        "ar": "حدد وكيلا",
+        "fr": "Sélectionner un agent",
+        "tr": "Ajan Seç",
+        "ja": "エージェントを選択"
+    },
+    "CONFIGURATION$LANGUAGE_SELECT_LABEL": {
+        "en": "Language",
+        "zh-CN": "语言",
+        "de": "Sprache",
+        "ko-KR": "언어",
+        "no": "Språk",
+        "zh-TW": "語言",
+        "ar": "اللغة",
+        "fr": "Langue",
+        "it": "Lingua",
+        "pt": "Idioma",
+        "es": "Idioma",
+        "ja": "言語",
+        "tr": "Dil"
+    },
+    "CONFIGURATION$LANGUAGE_SELECT_PLACEHOLDER": {
+        "en": "Select a language",
+        "zh-CN": "选择语言",
+        "de": "Wähle eine Sprache",
+        "ko-KR": "언어 선택",
+        "no": "Velg et språk",
+        "zh-TW": "選擇語言",
+        "it": "Seleziona una lingua",
+        "pt": "Selecione um idioma",
+        "es": "Seleccionar un idioma",
+        "ar": "حدد لغة",
+        "fr": "Sélectionner une langue",
+        "tr": "Dil Seç",
+        "ja": "言語を選択"
+    },
+    "CONFIGURATION$SECURITY_SELECT_LABEL": {
+        "en": "Security analyzer",
+        "de": "Sicherheitsanalysator",
+        "zh-CN": "安全性",
+        "ko-KR": "보안",
+        "no": "Sikkerhetsanalysator",
+        "zh-TW": "安全性",
+        "it": "Analizzatore di sicurezza",
+        "pt": "Analisador de segurança",
+        "es": "Analizador de seguridad",
+        "ar": "محلل الأمان",
+        "fr": "Analyseur de sécurité",
+        "tr": "Güvenlik analizörü",
+        "ja": "セキュリティアナライザー"
+    },
+    "CONFIGURATION$SECURITY_SELECT_PLACEHOLDER": {
+        "en": "Select a security analyzer (optional)",
+        "de": "Wählen Sie einen Sicherheitsanalysator (optional)",
+        "zh-CN": "选择安全级别",
+        "ko-KR": "보안 수준 선택",
+        "no": "Velg en sikkerhetsanalysator (valgfritt)",
+        "zh-TW": "選擇安全等級",
+        "it": "Seleziona un analizzatore di sicurezza (opzionale)",
+        "pt": "Selecione um analisador de segurança (opcional)",
+        "es": "Seleccione un analizador de seguridad (opcional)",
+        "ar": "اختر محلل أمان (اختياري)",
+        "fr": "Sélectionnez un analyseur de sécurité (facultatif)",
+        "tr": "Bir güvenlik analizörü seçin (isteğe bağlı)",
+        "ja": "セキュリティアナライザーを選択（オプション）"
+    },
+    "CONFIGURATION$MODAL_CLOSE_BUTTON_LABEL": {
+        "en": "Close",
+        "zh-CN": "关闭",
+        "de": "Schließen",
+        "ko-KR": "닫기",
+        "no": "Lukk",
+        "zh-TW": "關閉",
+        "it": "Chiudi",
+        "pt": "Fechar",
+        "es": "Cerrar",
+        "ar": "إغلاق",
+        "fr": "Fermer",
+        "tr": "Kapat",
+        "ja": "閉じる"
+    },
+    "CONFIGURATION$MODAL_SAVE_BUTTON_LABEL": {
+        "en": "Save",
+        "zh-CN": "保存",
+        "de": "Speichern",
+        "ko-KR": "저장",
+        "no": "Lagre",
+        "zh-TW": "儲存",
+        "ar": "حفظ",
+        "fr": "Enregistrer",
+        "it": "Salva",
+        "pt": "Salvar",
+        "es": "Guardar",
+        "ja": "保存",
+        "tr": "Kaydet"
+    },
+    "CONFIGURATION$MODAL_RESET_BUTTON_LABEL": {
+        "en": "Reset to defaults",
+        "zh-CN": "重置",
+        "de": "Auf Standardwerte zurücksetzen",
+        "ko-KR": "재설정",
+        "no": "Tilbakestill til standardverdier",
+        "zh-TW": "重置",
+        "it": "Reimposta ai valori predefiniti",
+        "pt": "Redefinir para os padrões",
+        "es": "Restablecer valores predeterminados",
+        "ar": "إعادة التعيين إلى الإعدادات الافتراضية",
+        "fr": "Réinitialiser aux valeurs par défaut",
+        "tr": "Varsayılanlara Sıfırla",
+        "ja": "デフォルトにリセット"
+    },
+    "STATUS$CONNECTED_TO_SERVER": {
+        "en": "Connected to server",
+        "ja": "サーバーに接続済み",
+        "zh-CN": "已连接到服务器",
+        "zh-TW": "已連線到伺服器",
+        "ko-KR": "서버에 연결됨",
+        "de": "Mit Server verbunden",
+        "no": "Tilkoblet server",
+        "it": "Connesso al server",
+        "pt": "Conectado ao servidor",
+        "es": "Conectado al servidor",
+        "ar": "متصل بالخادم",
+        "fr": "Connecté au serveur",
+        "tr": "Sunucuya bağlandı"
+    },
+    "PROJECT$NEW_PROJECT": {
+        "en": "New Project",
+        "ja": "新規プロジェクト",
+        "zh-CN": "新项目",
+        "zh-TW": "新專案",
+        "ko-KR": "새 프로젝트",
+        "de": "Neues Projekt",
+        "no": "Nytt prosjekt",
+        "it": "Nuovo progetto",
+        "pt": "Novo projeto",
+        "es": "Nuevo proyecto",
+        "ar": "مشروع جديد",
+        "fr": "Nouveau projet",
+        "tr": "Yeni Proje"
+    },
+    "BROWSER$SCREENSHOT": {
+        "en": "Browser Screenshot",
+        "ja": "ブラウザのスクリーンショット",
+        "zh-CN": "截图",
+        "zh-TW": "截圖",
+        "ko-KR": "스크린샷",
+        "tr": "Ekran görüntüsü",
+        "no": "Nettleser skjermbilde",
+        "ar": "لقطة شاشة المتصفح",
+        "de": "Browser-Screenshot",
+        "fr": "Capture d'écran du navigateur",
+        "it": "Screenshot del browser",
+        "pt": "Captura de tela do navegador",
+        "es": "Captura de pantalla del navegador"
+    },
+    "TIME$MINUTES_AGO": {
+        "en": "minutes ago",
+        "ja": "分前",
+        "zh-CN": "{minutes}分钟前",
+        "zh-TW": "{minutes}分鐘前",
+        "ko-KR": "{minutes}분 전",
+        "de": "Minuten her",
+        "no": "minutter siden",
+        "it": "minuti fa",
+        "pt": "minutos atrás",
+        "es": "minutos atrás",
+        "ar": "دقائق مضت",
+        "fr": "minutes",
+        "tr": "dakika önce"
+    },
+    "TIME$HOURS_AGO": {
+        "en": "hours ago",
+        "ja": "時間前",
+        "zh-CN": "{hours}小时前",
+        "zh-TW": "{hours}小時前",
+        "ko-KR": "{hours}시간 전",
+        "de": "Stunden her",
+        "no": "timer siden",
+        "it": "ore fa",
+        "pt": "horas atrás",
+        "es": "horas atrás",
+        "ar": "ساعات مضت",
+        "fr": "heures",
+        "tr": "saat önce"
+    },
+    "TIME$DAYS_AGO": {
+        "en": "days ago",
+        "ja": "日前",
+        "zh-CN": "{days}天前",
+        "zh-TW": "{days}天前",
+        "ko-KR": "{days}일 전",
+        "de": "Tage her",
+        "no": "dager siden",
+        "it": "giorni fa",
+        "pt": "dias atrás",
+        "es": "días atrás",
+        "ar": "أيام مضت",
+        "fr": "jours",
+        "tr": "gün önce"
+    },
+    "SETTINGS_FORM$RUNTIME_SIZE_LABEL": {
+        "en": "Runtime Settings",
+        "zh-CN": "运行时大小",
+        "de": "Laufzeiteinstellungen",
+        "ko-KR": "런타임 크기",
+        "no": "Kjøretidsinnstillinger",
+        "zh-TW": "執行環境大小",
+        "it": "Impostazioni Runtime",
+        "pt": "Configurações de Runtime",
+        "es": "Configuración de Runtime",
+        "ar": "إعدادات وقت التشغيل",
+        "fr": "Paramètres d'exécution",
+        "tr": "Çalışma Zamanı Ayarları",
+        "ja": "ランタイムサイズ"
+    },
+    "CONFIGURATION$SETTINGS_NEED_UPDATE_MESSAGE": {
+        "en": "We've changed some settings in the latest update. Take a minute to review.",
+        "de": "Mit dem letzten Update haben wir ein paar Einstellungen geändert. Bitte kontrollieren Ihre Einstellungen.",
+        "zh-CN": "设置需要更新",
+        "ko-KR": "설정 업데이트 필요",
+        "no": "Vi har endret noen innstillinger i den siste oppdateringen. Ta deg tid til å se gjennom dem.",
+        "zh-TW": "設定需要更新",
+        "it": "Abbiamo modificato alcune impostazioni nell'ultimo aggiornamento. Prenditi un momento per rivederle.",
+        "pt": "Alteramos algumas configurações na última atualização. Reserve um momento para revisar.",
+        "es": "Hemos cambiado algunas configuraciones en la última actualización. Tómate un momento para revisarlas.",
+        "ar": "لقد قمنا بتغيير بعض الإعدادات في التحديث الأخير. خذ دقيقة لمراجعتها.",
+        "fr": "Nous avons modifié certains paramètres dans la dernière mise à jour. Prenez un moment pour les examiner.",
+        "tr": "Son güncellemede bazı ayarları değiştirdik. Gözden geçirmek için bir dakikanızı ayırın.",
+        "ja": "最新のアップデートで一部の設定を変更しました。確認のためにお時間をいただけますか。"
+    },
+    "CONFIGURATION$AGENT_LOADING": {
+        "en": "Please wait while the agent loads. This may take a few minutes...",
+        "de": "Bitte warten Sie, während der Agent lädt. Das kann ein paar Minuten dauern...",
+        "zh-CN": "代理加载中",
+        "ko-KR": "에이전트 로딩 중",
+        "no": "Vennligst vent mens agenten laster. Dette kan ta noen minutter...",
+        "zh-TW": "代理載入中",
+        "it": "Attendere mentre l'agente si carica. Potrebbe richiedere alcuni minuti...",
+        "pt": "Por favor, aguarde enquanto o agente carrega. Isso pode levar alguns minutos...",
+        "es": "Por favor, espere mientras el agente se carga. Esto puede tardar unos minutos...",
+        "ar": "يرجى الانتظار أثناء تحميل الوكيل. قد يستغرق هذا بضع دقائق...",
+        "fr": "Veuillez patienter pendant le chargement de l'agent. Cela peut prendre quelques minutes...",
+        "tr": "Lütfen ajan yüklenirken bekleyin. Bu birkaç dakika sürebilir...",
+        "ja": "エージェントの読み込み中です。数分かかる場合があります..."
+    },
+    "CONFIGURATION$AGENT_RUNNING": {
+        "en": "Please stop the agent before editing these settings.",
+        "de": "Bitte beenden Sie den Agenten vor der Bearbeitung der Einstellungen.",
+        "zh-CN": "代理运行中",
+        "ko-KR": "에이전트 실행 중",
+        "no": "Vennligst stopp agenten før du redigerer disse innstillingene.",
+        "zh-TW": "代理執行中",
+        "it": "Si prega di fermare l'agente prima di modificare queste impostazioni.",
+        "pt": "Por favor, pare o agente antes de editar estas configurações.",
+        "es": "Por favor, detenga el agente antes de editar estas configuraciones.",
+        "ar": "يرجى إيقاف الوكيل قبل تعديل هذه الإعدادات.",
+        "fr": "Veuillez arrêter l'agent avant de modifier ces paramètres.",
+        "tr": "Bu ayarları düzenlemeden önce lütfen ajanı durdurun.",
+        "ja": "これらの設定を編集する前にエージェントを停止してください。"
+    },
+    "CONFIGURATION$ERROR_FETCH_MODELS": {
+        "en": "Failed to fetch models and agents",
+        "zh-CN": "获取模型时出错",
+        "de": "Fehler beim Abrufen der Modelle und Agenten",
+        "zh-TW": "取得模型時出錯",
+        "es": "Error al obtener modelos y agentes",
+        "fr": "Échec de la récupération des modèles et des agents",
+        "it": "Impossibile recuperare modelli e agenti",
+        "pt": "Falha ao buscar modelos e agentes",
+        "ko-KR": "모델 가져오기 오류",
+        "ar": "فشل في جلب النماذج والوكلاء",
+        "tr": "Modeller ve ajanlar getirilemedi",
+        "no": "Kunne ikke hente modeller og agenter",
+        "ja": "モデルとエージェントの取得に失敗しました"
+    },
+    "SESSION$SESSION_HANDLING_ERROR_MESSAGE": {
+        "en": "Error handling message",
+        "zh-CN": "处理会话时出错",
+        "de": "Fehler beim Verarbeiten der Nachricht",
+        "zh-TW": "處理工作階段時出錯",
+        "es": "Error al procesar el mensaje",
+        "fr": "Erreur lors du traitement du message",
+        "it": "Errore durante l'elaborazione del messaggio",
+        "pt": "Erro ao processar a mensagem",
+        "ko-KR": "세션 처리 중 오류 발생",
+        "ar": "خطأ في معالجة الرسالة",
+        "tr": "Mesaj işlenirken hata oluştu",
+        "no": "Feil ved behandling av melding",
+        "ja": "メッセージの処理中にエラーが発生しました"
+    },
+    "SESSION$SESSION_CONNECTION_ERROR_MESSAGE": {
+        "en": "Error connecting to session",
+        "zh-CN": "连接会话时出错",
+        "de": "Verbindung zur Sitzung fehlgeschlagen",
+        "zh-TW": "連線工作階段時出錯",
+        "es": "Error al conectar con la sesión",
+        "fr": "Erreur de connexion à la session",
+        "it": "Errore durante la connessione alla sessione",
+        "pt": "Erro ao conectar à sessão",
+        "ko-KR": "세션 연결 중 오류 발생",
+        "ar": "خطأ في الاتصال بالجلسة",
+        "tr": "Oturuma bağlanırken hata oluştu",
+        "no": "Feil ved tilkobling til økt",
+        "ja": "セッションへの接続中にエラーが発生しました"
+    },
+    "SESSION$SOCKET_NOT_INITIALIZED_ERROR_MESSAGE": {
+        "en": "Socket not initialized",
+        "zh-CN": "套接字未初始化",
+        "de": "Socket nicht initialisiert",
+        "zh-TW": "套接字未初始化",
+        "es": "Socket no inicializado",
+        "fr": "Socket non initialisé",
+        "it": "Socket non inizializzato",
+        "pt": "Socket não inicializado",
+        "ko-KR": "소켓이 초기화되지 않았습니다",
+        "ar": "لم يتم تهيئة Socket",
+        "tr": "Soket başlatılmadı",
+        "no": "Socket ikke initialisert",
+        "ja": "ソケットが初期化されていません"
+    },
+    "EXPLORER$UPLOAD_ERROR_MESSAGE": {
+        "en": "Error uploading file",
+        "zh-CN": "上传时出错",
+        "de": "Fehler beim Hochladen der Datei",
+        "zh-TW": "上傳時出錯",
+        "es": "Error al subir el archivo",
+        "fr": "Erreur lors du téléchargement du fichier",
+        "it": "Errore durante il caricamento del file",
+        "pt": "Erro ao fazer upload do arquivo",
+        "ko-KR": "업로드 중 오류 발생",
+        "ar": "خطأ في تحميل الملف",
+        "tr": "Dosya yüklenirken hata oluştu",
+        "no": "Feil ved opplasting av fil",
+        "ja": "ファイルのアップロード中にエラーが発生しました"
+    },
+    "EXPLORER$LABEL_DROP_FILES": {
+        "en": "Drop files here",
+        "zh-CN": "拖放文件到此处",
+        "de": "Dateien hier ablegen",
+        "zh-TW": "拖放檔案到此處",
+        "es": "Suelta los archivos aquí",
+        "fr": "Déposez les fichiers ici",
+        "no": "Slipp filer her",
+        "it": "Trascina i file qui",
+        "pt": "Solte os arquivos aqui",
+        "ko-KR": "여기에 파일을 드롭하세요",
+        "ar": "أسقط الملفات هنا",
+        "tr": "Dosyaları buraya bırakın",
+        "ja": "ここにファイルをドロップ"
+    },
+    "EXPLORER$LABEL_WORKSPACE": {
+        "en": "Workspace",
+        "zh-CN": "工作区",
+        "de": "Arbeitsbereich",
+        "zh-TW": "工作區",
+        "es": "Espacio de trabajo",
+        "fr": "Espace de travail",
+        "it": "Area di lavoro",
+        "pt": "Espaço de trabalho",
+        "ko-KR": "워크스페이스",
+        "ar": "مساحة العمل",
+        "tr": "Çalışma alanı",
+        "no": "Arbeidsområde",
+        "ja": "ワークスペース"
+    },
+    "EXPLORER$EMPTY_WORKSPACE_MESSAGE": {
+        "en": "No files in workspace",
+        "zh-CN": "工作区为空",
+        "de": "Keine Dateien im Arbeitsbereich",
+        "zh-TW": "工作區為空",
+        "es": "No hay archivos en el espacio de trabajo",
+        "fr": "Aucun fichier dans l'espace de travail",
+        "it": "Nessun file nell'area di lavoro",
+        "pt": "Nenhum arquivo no espaço de trabalho",
+        "ko-KR": "워크스페이스가 비어 있습니다",
+        "ar": "لا توجد ملفات في مساحة العمل",
+        "tr": "Çalışma alanında dosya yok",
+        "no": "Ingen filer i arbeidsområdet",
+        "ja": "ワークスペースにファイルがありません"
+    },
+    "EXPLORER$LOADING_WORKSPACE_MESSAGE": {
+        "en": "Loading workspace...",
+        "zh-CN": "加载工作区中...",
+        "de": "Arbeitsbereich wird geladen...",
+        "zh-TW": "載入工作區中...",
+        "es": "Cargando espacio de trabajo...",
+        "fr": "Chargement de l'espace de travail...",
+        "it": "Caricamento dell'area di lavoro...",
+        "pt": "Carregando espaço de trabalho...",
+        "ko-KR": "워크스페이스 로딩 중...",
+        "ar": "جارٍ تحميل مساحة العمل...",
+        "tr": "Çalışma alanı yükleniyor...",
+        "no": "Laster arbeidsområde...",
+        "ja": "ワークスペースを読み込み中..."
+    },
+    "EXPLORER$REFRESH_ERROR_MESSAGE": {
+        "en": "Error refreshing workspace",
+        "zh-CN": "刷新时出错",
+        "de": "Fehler beim Aktualisieren des Arbeitsbereichs",
+        "zh-TW": "重新整理時出錯",
+        "es": "Error al actualizar el espacio de trabajo",
+        "fr": "Erreur lors de l'actualisation de l'espace de travail",
+        "it": "Errore durante l'aggiornamento dell'area di lavoro",
+        "pt": "Erro ao atualizar o espaço de trabalho",
+        "ko-KR": "새로고침 중 오류 발생",
+        "ar": "خطأ في تحديث مساحة العمل",
+        "tr": "Çalışma alanı yenilenirken hata oluştu",
+        "no": "Feil ved oppdatering av arbeidsområde",
+        "ja": "ワークスペースの更新中にエラーが発生しました"
+    },
+    "EXPLORER$UPLOAD_SUCCESS_MESSAGE": {
+        "en": "Successfully uploaded {{count}} file(s)",
+        "zh-CN": "上传成功",
+        "de": "Erfolgreich {{count}} Datei(en) hochgeladen",
+        "zh-TW": "上傳成功",
+        "es": "Se subieron {{count}} archivo(s) con éxito",
+        "fr": "{{count}} fichier(s) téléchargé(s) avec succès",
+        "it": "Caricato con successo {{count}} file",
+        "pt": "{{count}} arquivo(s) carregado(s) com sucesso",
+        "ko-KR": "업로드 성공",
+        "ar": "تم تحميل {{count}} ملف (ملفات) بنجاح",
+        "tr": "{{count}} dosya başarıyla yüklendi",
+        "no": "Lastet opp {{count}} fil(er) vellykket",
+        "ja": "{{count}}個のファイルが正常にアップロードされました"
+    },
+    "EXPLORER$NO_FILES_UPLOADED_MESSAGE": {
+        "en": "No files were uploaded",
+        "zh-CN": "未上传任何文件",
+        "de": "Keine Dateien wurden hochgeladen",
+        "zh-TW": "未上傳任何檔案",
+        "es": "No se subieron archivos",
+        "fr": "Aucun fichier n'a été téléchargé",
+        "it": "Nessun file è stato caricato",
+        "pt": "Nenhum arquivo foi carregado",
+        "ko-KR": "업로드된 파일이 없습니다",
+        "ar": "لم يتم تحميل أي ملفات",
+        "tr": "Hiçbir dosya yüklenmedi",
+        "no": "Ingen filer ble lastet opp",
+        "ja": "アップロードされたファイルはありません"
+    },
+    "EXPLORER$UPLOAD_PARTIAL_SUCCESS_MESSAGE": {
+        "en": "{{count}} file(s) were skipped during upload",
+        "de": "{{count}} Datei(en) wurden während des Hochladens übersprungen",
+        "zh-CN": "部分文件上传成功",
+        "zh-TW": "部分檔案上傳成功",
+        "es": "Se omitieron {{count}} archivo(s) durante la carga",
+        "fr": "{{count}} fichier(s) ont été ignorés pendant le téléchargement",
+        "it": "{{count}} file sono stati saltati durante il caricamento",
+        "pt": "{{count}} arquivo(s) foram ignorados durante o upload",
+        "ko-KR": "일부 파일 업로드 성공",
+        "ar": "تم تخطي {{count}} ملف (ملفات) أثناء التحميل",
+        "tr": "Yükleme sırasında {{count}} dosya atlandı",
+        "no": "{{count}} fil(er) ble hoppet over under opplasting",
+        "ja": "アップロード中に{{count}}個のファイルがスキップされました"
+    },
+    "EXPLORER$UPLOAD_UNEXPECTED_RESPONSE_MESSAGE": {
+        "en": "Unexpected response structure from server",
+        "zh-CN": "上传时收到意外响应",
+        "de": "Unerwartetes Antwortformat vom Server",
+        "zh-TW": "上傳時收到意外回應",
+        "es": "Estructura de respuesta inesperada del servidor",
+        "fr": "Structure de réponse inattendue du serveur",
+        "it": "Struttura di risposta inaspettata dal server",
+        "pt": "Estrutura de resposta inesperada do servidor",
+        "ko-KR": "업로드 중 예상치 못한 응답",
+        "ar": "بنية استجابة غير متوقعة من الخادم",
+        "tr": "Sunucudan beklenmeyen yanıt yapısı",
+        "no": "Uventet responsstruktur fra serveren",
+        "ja": "サーバーから予期しない応答構造が返されました"
+    },
+    "EXPLORER$VSCODE_SWITCHING_MESSAGE": {
+        "en": "Switching to VS Code in 3 seconds...\nImportant: Please inform the agent of any changes you make in VS Code. To avoid conflicts, wait for the assistant to complete its work before making your own changes.",
+        "zh-CN": "切换到VS Code中...",
+        "zh-TW": "切換到VS Code中...",
+        "ja": "3秒後にVS Codeに切り替わります...\n重要：VS Codeで行った変更はエージェントに通知してください。競合を避けるため、アシスタントの作業が完了するまで自身の変更を待ってください。",
+        "ko-KR": "VS Code로 전환 중...",
+        "no": "Bytter til VS Code om 3 sekunder...\nViktig: Vennligst informer agenten om eventuelle endringer du gjør i VS Code. For å unngå konflikter, vent til assistenten er ferdig med sitt arbeid før du gjør dine egne endringer.",
+        "ar": "جارٍ التبديل إلى VS Code في غضون 3 ثوانٍ...\nمهم: يرجى إبلاغ الوكيل بأي تغييرات تقوم بها في VS Code. لتجنب التعارضات، انتظر حتى يكمل المساعد عمله قبل إجراء تغييراتك.",
+        "de": "Wechsel zu VS Code in 3 Sekunden...\nWichtig: Bitte informieren Sie den Agenten über alle Änderungen, die Sie in VS Code vornehmen. Um Konflikte zu vermeiden, warten Sie, bis der Assistent seine Arbeit abgeschlossen hat, bevor Sie eigene Änderungen vornehmen.",
+        "fr": "Passage à VS Code dans 3 secondes...\nImportant : Veuillez informer l'agent de toute modification que vous apportez dans VS Code. Pour éviter les conflits, attendez que l'assistant ait terminé son travail avant d'apporter vos propres modifications.",
+        "it": "Passaggio a VS Code tra 3 secondi...\nImportante: Si prega di informare l'agente di eventuali modifiche apportate in VS Code. Per evitare conflitti, attendere che l'assistente completi il suo lavoro prima di apportare le proprie modifiche.",
+        "pt": "Mudando para o VS Code em 3 segundos...\nImportante: Por favor, informe o agente sobre quaisquer alterações que você fizer no VS Code. Para evitar conflitos, aguarde até que o assistente conclua seu trabalho antes de fazer suas próprias alterações.",
+        "es": "Cambiando a VS Code en 3 segundos...\nImportante: Por favor, informe al agente de cualquier cambio que realice en VS Code. Para evitar conflictos, espere a que el asistente complete su trabajo antes de realizar sus propios cambios.",
+        "tr": "3 saniye içinde VS Code'a geçiliyor...\nÖnemli: Lütfen VS Code'da yaptığınız değişiklikleri aracıya bildirin. Çakışmaları önlemek için, kendi değişikliklerinizi yapmadan önce asistanın işini tamamlamasını bekleyin."
+    },
+    "EXPLORER$VSCODE_SWITCHING_ERROR_MESSAGE": {
+        "en": "Error switching to VS Code: {{error}}",
+        "zh-CN": "切换到VS Code时出错",
+        "zh-TW": "切換到VS Code時出錯",
+        "ja": "VS Codeへの切り替え中にエラーが発生しました: {{error}}",
+        "ko-KR": "VS Code로 전환 중 오류 발생",
+        "no": "Feil ved bytte til VS Code: {{error}}",
+        "ar": "خطأ في التبديل إلى VS Code: {{error}}",
+        "de": "Fehler beim Wechsel zu VS Code: {{error}}",
+        "fr": "Erreur lors du passage à VS Code : {{error}}",
+        "it": "Errore durante il passaggio a VS Code: {{error}}",
+        "pt": "Erro ao mudar para o VS Code: {{error}}",
+        "es": "Error al cambiar a VS Code: {{error}}",
+        "tr": "VS Code'a geçişte hata: {{error}}"
+    },
+    "LOAD_SESSION$MODAL_TITLE": {
+        "en": "Return to existing session?",
+        "de": "Zurück zu vorhandener Sitzung?",
+        "zh-CN": "是否继续未完成的会话?",
+        "zh-TW": "是否繼續未完成的會話?",
+        "es": "¿Volver a la sesión existente?",
+        "fr": "Revenir à la session existante ?",
+        "it": "Tornare alla sessione esistente?",
+        "pt": "Retornar à sessão existente?",
+        "ko-KR": "기존 세션으로 돌아가시겠습니까?",
+        "ar": "العودة إلى الجلسة الحالية؟",
+        "tr": "Mevcut oturuma dönmek ister misiniz?",
+        "ja": "既存のセッションに戻りますか？",
+        "no": "Gå tilbake til eksisterende økt?"
+    },
+    "LOAD_SESSION$MODAL_CONTENT": {
+        "en": "You seem to have an ongoing session. Would you like to pick up where you left off, or start fresh?",
+        "de": "Sie haben eine aktive Sitzung. Möchten Sie die Arbeit an der vorherigen Stelle fortsetzen oder von vorne anfangen?",
+        "es": "Parece que tienes una sesión en curso. ¿Te gustaría continuar donde lo dejaste o empezar de nuevo?",
+        "fr": "Il semble que vous ayez une session en cours. Souhaitez-vous reprendre là où vous vous êtes arrêté ou recommencer à zéro ?",
+        "it": "Sembra che tu abbia una sessione in corso. Vorresti riprendere da dove hai lasciato o ricominciare da capo?",
+        "pt": "Parece que você tem uma sessão em andamento. Gostaria de continuar de onde parou ou começar do zero?",
+        "ko-KR": "진행 중인 세션이 있는 것 같습니다. 중단한 곳에서 계속하시겠습니까, 아니면 새로 시작하시겠습니까?",
+        "ar": "يبدو أن لديك جلسة جارية. هل ترغب في استكمال ما توقفت عنده أم البدء من جديد؟",
+        "tr": "Devam eden bir oturumunuz var gibi görünüyor. Kaldığınız yerden devam etmek mi yoksa yeniden başlamak mı istersiniz?",
+        "zh-CN": "您似乎有一个未完成的任务。您想继续之前的工作还是重新开始？",
+        "zh-TW": "您似乎有一個未完成的任務。您想從上次離開的地方繼續還是重新開始？",
+        "ja": "進行中のセッションがあるようです。中断した箇所から再開しますか、それとも新しく始めますか？",
+        "no": "Det ser ut som du har en pågående økt. Vil du fortsette der du slapp, eller starte på nytt?"
+    },
+    "LOAD_SESSION$RESUME_SESSION_MODAL_ACTION_LABEL": {
+        "en": "Resume Session",
+        "de": "Sitzung fortsetzen",
+        "zh-CN": "恢复会话",
+        "zh-TW": "恢復會話",
+        "es": "Reanudar sesión",
+        "no": "Fortsett økt",
+        "fr": "Reprendre la session",
+        "it": "Riprendi sessione",
+        "pt": "Retomar sessão",
+        "ko-KR": "세션 재개",
+        "ar": "استئناف الجلسة",
+        "tr": "Oturumu Devam Ettir",
+        "ja": "セッションを再開"
+    },
+    "LOAD_SESSION$START_NEW_SESSION_MODAL_ACTION_LABEL": {
+        "en": "Start New Session",
+        "de": "Neue Sitzung starten",
+        "zh-CN": "开始新会话",
+        "zh-TW": "開始新會話",
+        "es": "Iniciar nueva sesión",
+        "fr": "Démarrer une nouvelle session",
+        "it": "Avvia nuova sessione",
+        "pt": "Iniciar nova sessão",
+        "ko-KR": "새 세션 시작",
+        "ar": "بدء جلسة جديدة",
+        "tr": "Yeni Oturum Başlat",
+        "ja": "新しいセッションを開始",
+        "no": "Start ny økt"
+    },
+    "FEEDBACK$MODAL_TITLE": {
+        "en": "Share feedback",
+        "de": "Feedback teilen",
+        "zh-CN": "分享反馈",
+        "zh-TW": "分享反饋",
+        "es": "Compartir comentarios",
+        "fr": "Partager des commentaires",
+        "it": "Condividi feedback",
+        "pt": "Compartilhar feedback",
+        "ko-KR": "피드백 공유",
+        "ar": "مشاركة التعليقات",
+        "tr": "Geri bildirim paylaş",
+        "ja": "フィードバックを共有",
+        "no": "Del tilbakemelding"
+    },
+    "FEEDBACK$MODAL_CONTENT": {
+        "en": "To help us improve, we collect feedback from your interactions to improve our prompts. By submitting this form, you consent to us collecting this data.",
+        "de": "Um uns zu verbessern, sammeln wir Feedback aus Ihren Interaktionen, um unsere Prompts zu verbessern. Durch das Absenden dieses Formulars stimmen Sie der Erfassung dieser Daten zu.",
+        "zh-CN": "为了帮助我们改进，我们会收集您的互动反馈以改进我们的提示。提交此表单即表示您同意我们收集这些数据。",
+        "zh-TW": "為了幫助我們改進，我們會收集您的互動反饋以改進我們的提示。提交此表單即表示您同意我們收集這些數據。",
+        "es": "Para ayudarnos a mejorar, recopilamos comentarios de sus interacciones para mejorar nuestras indicaciones. Al enviar este formulario, usted consiente que recopilemos estos datos.",
+        "fr": "Pour nous aider à nous améliorer, nous recueillons des commentaires de vos interactions pour améliorer nos invites. En soumettant ce formulaire, vous consentez à ce que nous collections ces données.",
+        "it": "Per aiutarci a migliorare, raccogliamo feedback dalle tue interazioni per migliorare i nostri prompt. Inviando questo modulo, acconsenti alla raccolta di questi dati.",
+        "pt": "Para nos ajudar a melhorar, coletamos feedback de suas interações para aprimorar nossas sugestões. Ao enviar este formulário, você consente que coletemos esses dados.",
+        "ko-KR": "개선을 위해 귀하의 상호 작용에서 피드백을 수집하여 프롬프트를 개선합니다. 이 양식을 제출함으로써 귀하는 이 데이터 수집에 동의하게 됩니다.",
+        "no": "For å hjelpe oss med å forbedre oss, samler vi tilbakemeldinger fra dine interaksjoner for å forbedre våre instruksjoner. Ved å sende inn dette skjemaet, samtykker du til at vi samler inn disse dataene.",
+        "ar": "لمساعدتنا على التحسين، نقوم بجمع التعليقات من تفاعلاتك لتحسين مطالباتنا. من خلال إرسال هذا النموذج، فإنك توافق على جمعنا لهذه البيانات.",
+        "tr": "Kendimizi geliştirmemize yardımcı olmak için, etkileşimlerinizden geri bildirim toplayarak ipuçlarımızı iyileştiriyoruz. Bu formu göndererek, bu verileri toplamamıza izin vermiş olursunuz.",
+        "ja": "サービス改善のため、プロンプトの改善に向けてユーザーの操作からフィードバックを収集しています。このフォームを送信することで、データ収集に同意したことになります。"
+    },
+    "FEEDBACK$EMAIL_LABEL": {
+        "en": "Your email",
+        "de": "Ihre E-Mail-Adresse",
+        "zh-CN": "您的电子邮箱",
+        "zh-TW": "您的電子郵箱",
+        "es": "Su correo electrónico",
+        "fr": "Votre e-mail",
+        "it": "La tua email",
+        "pt": "Seu e-mail",
+        "ko-KR": "귀하의 이메일",
+        "ar": "بريدك الإلكتروني",
+        "tr": "E-posta adresiniz",
+        "ja": "メールアドレス",
+        "no": "Din e-post"
+    },
+    "FEEDBACK$CONTRIBUTE_LABEL": {
+        "en": "Contribute to public dataset",
+        "de": "Zum öffentlichen Datensatz beitragen",
+        "zh-CN": "贡献到公共数据集",
+        "zh-TW": "貢獻到公共數據集",
+        "es": "Contribuir al conjunto de datos público",
+        "fr": "Contribuer à l'ensemble de données public",
+        "it": "Contribuisci al dataset pubblico",
+        "pt": "Contribuir para o conjunto de dados público",
+        "ko-KR": "공개 데이터셋에 기여",
+        "no": "Bidra til offentlig datasett",
+        "ar": "المساهمة في مجموعة البيانات العامة",
+        "tr": "Genel veri setine katkıda bulun",
+        "ja": "公開データセットに貢献"
+    },
+    "FEEDBACK$SHARE_LABEL": {
+        "en": "Share",
+        "de": "Teilen",
+        "zh-CN": "分享",
+        "zh-TW": "分享",
+        "es": "Compartir",
+        "fr": "Partager",
+        "it": "Condividi",
+        "pt": "Compartilhar",
+        "ko-KR": "공유",
+        "ar": "مشاركة",
+        "tr": "Paylaş",
+        "ja": "共有",
+        "no": "Del"
+    },
+    "FEEDBACK$CANCEL_LABEL": {
+        "en": "Cancel",
+        "de": "Abbruch",
+        "zh-CN": "取消",
+        "zh-TW": "取消",
+        "es": "Cancelar",
+        "fr": "Annuler",
+        "it": "Annulla",
+        "pt": "Cancelar",
+        "ko-KR": "취소",
+        "no": "Avbryt",
+        "ar": "إلغاء",
+        "tr": "İptal",
+        "ja": "キャンセル"
+    },
+    "FEEDBACK$EMAIL_PLACEHOLDER": {
+        "en": "Enter your email address",
+        "es": "Ingresa tu correo electrónico",
+        "zh-CN": "输入您的电子邮件地址",
+        "zh-TW": "輸入您的電子郵件地址",
+        "ko-KR": "이메일 주소를 입력하세요",
+        "no": "Skriv inn din e-postadresse",
+        "ar": "أدخل عنوان بريدك الإلكتروني",
+        "de": "Geben Sie Ihre E-Mail-Adresse ein",
+        "fr": "Entrez votre adresse e-mail",
+        "it": "Inserisci il tuo indirizzo email",
+        "pt": "Digite seu endereço de e-mail",
+        "tr": "E-posta adresinizi girin",
+        "ja": "メールアドレスを入力してください"
+    },
+    "FEEDBACK$PASSWORD_COPIED_MESSAGE": {
+        "en": "Password copied to clipboard.",
+        "es": "Contraseña copiada al portapapeles.",
+        "zh-CN": "密码已复制到剪贴板。",
+        "zh-TW": "密碼已複製到剪貼板。",
+        "ko-KR": "비밀번호가 클립보드에 복사되었습니다.",
+        "no": "Passord kopiert til utklippstavlen.",
+        "ar": "تم نسخ كلمة المرور إلى الحافظة.",
+        "de": "Passwort in die Zwischenablage kopiert.",
+        "fr": "Mot de passe copié dans le presse-papiers.",
+        "it": "Password copiata negli appunti.",
+        "pt": "Senha copiada para a área de transferência.",
+        "tr": "Parola panoya kopyalandı.",
+        "ja": "パスワードがクリップボードにコピーされました。"
+    },
+    "FEEDBACK$GO_TO_FEEDBACK": {
+        "en": "Go to shared feedback",
+        "es": "Ir a feedback compartido",
+        "zh-CN": "转到共享反馈",
+        "zh-TW": "前往共享反饋",
+        "ko-KR": "공유된 피드백으로 이동",
+        "no": "Gå til delt tilbakemelding",
+        "ar": "الذهاب إلى التعليقات المشتركة",
+        "de": "Zum geteilten Feedback gehen",
+        "fr": "Aller aux commentaires partagés",
+        "it": "Vai al feedback condiviso",
+        "pt": "Ir para feedback compartilhado",
+        "tr": "Paylaşılan geri bildirimlere git",
+        "ja": "共有されたフィードバックへ移動"
+    },
+    "FEEDBACK$PASSWORD": {
+        "en": "Password:",
+        "es": "Contraseña:",
+        "zh-CN": "密码：",
+        "zh-TW": "密碼：",
+        "ko-KR": "비밀번호:",
+        "no": "Passord:",
+        "ar": "كلمة المرور:",
+        "de": "Passwort:",
+        "fr": "Mot de passe :",
+        "it": "Password:",
+        "pt": "Senha:",
+        "tr": "Parola:",
+        "ja": "パスワード："
+    },
+    "FEEDBACK$INVALID_EMAIL_FORMAT": {
+        "en": "Invalid email format",
+        "es": "Formato de correo inválido",
+        "zh-CN": "无效的电子邮件格式",
+        "zh-TW": "無效的電子郵件格式",
+        "ko-KR": "잘못된 이메일 형식",
+        "no": "Ugyldig e-postformat",
+        "ar": "تنسيق البريد الإلكتروني غير صالح",
+        "de": "Ungültiges E-Mail-Format",
+        "fr": "Format d'e-mail invalide",
+        "it": "Formato email non valido",
+        "pt": "Formato de e-mail inválido",
+        "tr": "Geçersiz e-posta biçimi",
+        "ja": "無効なメールアドレス形式"
+    },
+    "FEEDBACK$FAILED_TO_SHARE": {
+        "en": "Failed to share, please contact the developers:",
+        "es": "Error al compartir, por favor contacta con los desarrolladores:",
+        "zh-CN": "分享失败，请联系开发人员：",
+        "zh-TW": "分享失敗，請聯繫開發人員：",
+        "ko-KR": "공유 실패, 개발자에게 문의하세요:",
+        "no": "Deling mislyktes, vennligst kontakt utviklerne:",
+        "ar": "فشل المشاركة، يرجى الاتصال بالمطورين:",
+        "de": "Teilen fehlgeschlagen, bitte kontaktieren Sie die Entwickler:",
+        "fr": "Échec du partage, veuillez contacter les développeurs :",
+        "it": "Condivisione fallita, contattare gli sviluppatori:",
+        "pt": "Falha ao compartilhar, entre em contato com os desenvolvedores:",
+        "tr": "Paylaşım başarısız, lütfen geliştiricilerle iletişime geçin:",
+        "ja": "共有に失敗しました。開発者に連絡してください："
+    },
+    "FEEDBACK$COPY_LABEL": {
+        "en": "Copy",
+        "es": "Copiar",
+        "zh-CN": "复制",
+        "zh-TW": "複製",
+        "ko-KR": "복사",
+        "no": "Kopier",
+        "ar": "نسخ",
+        "de": "Kopieren",
+        "fr": "Copier",
+        "it": "Copia",
+        "pt": "Copiar",
+        "tr": "Kopyala",
+        "ja": "コピー"
+    },
+    "FEEDBACK$SHARING_SETTINGS_LABEL": {
+        "en": "Sharing settings",
+        "es": "Configuración de compartir",
+        "zh-CN": "共享设置",
+        "zh-TW": "共享設定",
+        "ko-KR": "공유 설정",
+        "no": "Delingsinnstillinger",
+        "ar": "إعدادات المشاركة",
+        "de": "Freigabeeinstellungen",
+        "fr": "Paramètres de partage",
+        "it": "Impostazioni di condivisione",
+        "pt": "Configurações de compartilhamento",
+        "tr": "Paylaşım ayarları",
+        "ja": "共有設定"
+    },
+    "SECURITY$UNKNOWN_ANALYZER_LABEL": {
+        "en": "Unknown security analyzer chosen",
+        "es": "Analizador de seguridad desconocido",
+        "zh-CN": "选择了未知的安全分析器",
+        "zh-TW": "選擇了未知的安全分析器",
+        "ko-KR": "알 수 없는 보안 분석기가 선택되었습니다",
+        "no": "Ukjent sikkerhetsanalysator valgt",
+        "ar": "تم اختيار محلل أمان غير معروف",
+        "de": "Unbekannter Sicherheitsanalysator ausgewählt",
+        "fr": "Analyseur de sécurité inconnu choisi",
+        "it": "Analizzatore di sicurezza sconosciuto selezionato",
+        "pt": "Analisador de segurança desconhecido escolhido",
+        "tr": "Bilinmeyen güvenlik analizörü seçildi",
+        "ja": "不明なセキュリティアナライザーが選択されました"
+    },
+    "INVARIANT$UPDATE_POLICY_LABEL": {
+        "en": "Update Policy",
+        "es": "Actualizar política",
+        "zh-CN": "更新策略",
+        "zh-TW": "更新策略",
+        "ko-KR": "정책 업데이트",
+        "no": "Oppdater policy",
+        "ar": "تحديث السياسة",
+        "de": "Richtlinie aktualisieren",
+        "fr": "Mettre à jour la politique",
+        "it": "Aggiorna policy",
+        "pt": "Atualizar política",
+        "tr": "İlkeyi güncelle",
+        "ja": "ポリシーを更新"
+    },
+    "INVARIANT$UPDATE_SETTINGS_LABEL": {
+        "en": "Update Settings",
+        "es": "Actualizar configuración",
+        "zh-CN": "更新设置",
+        "zh-TW": "更新設定",
+        "ko-KR": "설정 업데이트",
+        "no": "Oppdater innstillinger",
+        "ar": "تحديث الإعدادات",
+        "de": "Einstellungen aktualisieren",
+        "fr": "Mettre à jour les paramètres",
+        "it": "Aggiorna impostazioni",
+        "pt": "Atualizar configurações",
+        "tr": "Ayarları güncelle",
+        "ja": "設定を更新"
+    },
+    "INVARIANT$SETTINGS_LABEL": {
+        "en": "Settings",
+        "es": "Configuración",
+        "zh-CN": "设置",
+        "zh-TW": "設定",
+        "ko-KR": "설정",
+        "no": "Innstillinger",
+        "ar": "الإعدادات",
+        "de": "Einstellungen",
+        "fr": "Paramètres",
+        "it": "Impostazioni",
+        "pt": "Configurações",
+        "tr": "Ayarlar",
+        "ja": "設定"
+    },
+    "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:",
+        "zh-CN": "询问用户确认风险等级：",
+        "zh-TW": "詢問用戶確認風險等級：",
+        "ko-KR": "위험 심각도에 대한 사용자 확인 요청:",
+        "no": "Be om brukerbekreftelse på risikoalvorlighet:",
+        "ar": "اطلب تأكيد المستخدم على مستوى الخطورة:",
+        "de": "Nach Benutzerbestätigung für Risikoschweregrad fragen:",
+        "fr": "Demander la confirmation de l'utilisateur sur la gravité du risque :",
+        "it": "Chiedi conferma all'utente sulla gravità del rischio:",
+        "pt": "Solicitar confirmação do usuário sobre a gravidade do risco:",
+        "tr": "Risk şiddeti için kullanıcı onayı iste:",
+        "ja": "リスクの重大度についてユーザーの確認を求める："
+    },
+    "INVARIANT$DONT_ASK_FOR_CONFIRMATION_LABEL": {
+        "en": "Don't ask for confirmation",
+        "es": "No solicitar confirmación",
+        "zh-CN": "不要请求确认",
+        "zh-TW": "不要請求確認",
+        "ko-KR": "확인 요청하지 않음",
+        "no": "Ikke spør om bekreftelse",
+        "ar": "لا تطلب التأكيد",
+        "de": "Nicht nach Bestätigung fragen",
+        "fr": "Ne pas demander de confirmation",
+        "it": "Non chiedere conferma",
+        "pt": "Não solicitar confirmação",
+        "tr": "Onay isteme",
+        "ja": "確認を求めない"
+    },
+    "INVARIANT$INVARIANT_ANALYZER_LABEL": {
+        "en": "Invariant Analyzer",
+        "es": "Analizador de invariantes",
+        "zh-CN": "不变量分析器",
+        "zh-TW": "不變量分析器",
+        "ko-KR": "불변성 분석기",
+        "no": "Invariant-analysator",
+        "ar": "محلل الثوابت",
+        "de": "Invarianten-Analysator",
+        "fr": "Analyseur d'invariants",
+        "it": "Analizzatore di invarianti",
+        "pt": "Analisador de invariantes",
+        "tr": "Değişmez Analizörü",
+        "ja": "不変条件アナライザー"
+    },
+    "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.",
+        "zh-CN": "不变量分析器持续监控您的 OpenHands 代理的安全问题。",
+        "zh-TW": "不變量分析器持續監控您的 OpenHands 代理的安全問題。",
+        "ko-KR": "불변성 분석기는 OpenHands 에이전트의 보안 문제를 지속적으로 모니터링합니다.",
+        "no": "Invariant-analysatoren overvåker kontinuerlig OpenHands-agenten din for sikkerhetsproblemer.",
+        "ar": "يراقب محلل الثوابت وكيل OpenHands الخاص بك باستمرار للتحقق من المشاكل الأمنية.",
+        "de": "Der Invarianten-Analysator überwacht kontinuierlich Ihren OpenHands-Agenten auf Sicherheitsprobleme.",
+        "fr": "L'analyseur d'invariants surveille en permanence votre agent OpenHands pour détecter les problèmes de sécurité.",
+        "it": "L'analizzatore di invarianti monitora continuamente il tuo agente OpenHands per problemi di sicurezza.",
+        "pt": "O analisador de invariantes monitora continuamente seu agente OpenHands em busca de problemas de segurança.",
+        "tr": "Değişmez Analizörü, OpenHands ajanınızı güvenlik sorunları için sürekli olarak izler.",
+        "ja": "不変条件アナライザーは、OpenHandsエージェントのセキュリティ問題を継続的に監視します。"
+    },
+    "INVARIANT$CLICK_TO_LEARN_MORE_LABEL": {
+        "en": "Click to learn more",
+        "es": "Clic para aprender más",
+        "zh-CN": "点击了解更多",
+        "zh-TW": "點擊了解更多",
+        "ko-KR": "자세히 알아보기",
+        "no": "Klikk for å lære mer",
+        "ar": "انقر لمعرفة المزيد",
+        "de": "Klicken Sie, um mehr zu erfahren",
+        "fr": "Cliquez pour en savoir plus",
+        "it": "Clicca per saperne di più",
+        "pt": "Clique para saber mais",
+        "tr": "Daha fazla bilgi için tıklayın",
+        "ja": "詳細はこちらをクリック"
+    },
+    "INVARIANT$POLICY_LABEL": {
+        "en": "Policy",
+        "es": "Política",
+        "zh-CN": "策略",
+        "zh-TW": "策略",
+        "ko-KR": "정책",
+        "no": "Policy",
+        "ar": "السياسة",
+        "de": "Richtlinie",
+        "fr": "Politique",
+        "it": "Policy",
+        "pt": "Política",
+        "tr": "İlke",
+        "ja": "ポリシー"
+    },
+    "INVARIANT$LOG_LABEL": {
+        "en": "Logs",
+        "es": "Logs",
+        "zh-CN": "日志",
+        "zh-TW": "日誌",
+        "ko-KR": "로그",
+        "no": "Logger",
+        "ar": "السجلات",
+        "de": "Protokolle",
+        "fr": "Journaux",
+        "it": "Log",
+        "pt": "Logs",
+        "tr": "Günlükler",
+        "ja": "ログ"
+    },
+    "INVARIANT$EXPORT_TRACE_LABEL": {
+        "en": "Export Trace",
+        "es": "Exportar traza",
+        "zh-CN": "导出跟踪",
+        "zh-TW": "匯出追蹤",
+        "ko-KR": "추적 내보내기",
+        "no": "Eksporter sporing",
+        "ar": "تصدير التتبع",
+        "de": "Ablaufverfolgung exportieren",
+        "fr": "Exporter la trace",
+        "it": "Esporta traccia",
+        "pt": "Exportar rastreamento",
+        "tr": "İzlemeyi dışa aktar",
+        "ja": "トレースをエクスポート"
+    },
+    "INVARIANT$TRACE_EXPORTED_MESSAGE": {
+        "en": "Trace exported",
+        "es": "Traza exportada",
+        "zh-CN": "跟踪已导出",
+        "zh-TW": "追蹤已匯出",
+        "ko-KR": "추적 내보내기 완료",
+        "no": "Sporing eksportert",
+        "ar": "تم تصدير التتبع",
+        "de": "Ablaufverfolgung exportiert",
+        "fr": "Trace exportée",
+        "it": "Traccia esportata",
+        "pt": "Rastreamento exportado",
+        "tr": "İzleme dışa aktarıldı",
+        "ja": "トレースをエクスポートしました"
+    },
+    "INVARIANT$POLICY_UPDATED_MESSAGE": {
+        "en": "Policy updated",
+        "es": "Política actualizada",
+        "zh-CN": "策略已更新",
+        "zh-TW": "策略已更新",
+        "ko-KR": "정책이 업데이트되었습니다",
+        "no": "Policy oppdatert",
+        "ar": "تم تحديث السياسة",
+        "de": "Richtlinie aktualisiert",
+        "fr": "Politique mise à jour",
+        "it": "Policy aggiornata",
+        "pt": "Política atualizada",
+        "tr": "İlke güncellendi",
+        "ja": "ポリシーを更新しました"
+    },
+    "INVARIANT$SETTINGS_UPDATED_MESSAGE": {
+        "en": "Settings updated",
+        "es": "Configuración actualizada",
+        "zh-CN": "设置已更新",
+        "zh-TW": "設定已更新",
+        "ko-KR": "설정이 업데이트되었습니다",
+        "no": "Innstillinger oppdatert",
+        "ar": "تم تحديث الإعدادات",
+        "de": "Einstellungen aktualisiert",
+        "fr": "Paramètres mis à jour",
+        "it": "Impostazioni aggiornate",
+        "pt": "Configurações atualizadas",
+        "tr": "Ayarlar güncellendi",
+        "ja": "設定を更新しました"
+    },
+    "CHAT_INTERFACE$INITIALIZING_AGENT_LOADING_MESSAGE": {
+        "en": "Starting up!",
+        "de": "Wird gestartet!",
+        "zh-CN": "正在启动！",
+        "zh-TW": "正在啟動！",
+        "ko-KR": "시작 중입니다!",
+        "no": "Starter opp!",
+        "it": "Avvio in corso!",
+        "pt": "Iniciando!",
+        "es": "¡Iniciando!",
+        "ar": "جارٍ البدء!",
+        "fr": "Démarrage en cours !",
+        "tr": "Başlatılıyor!",
+        "ja": "起動中！"
+    },
+    "CHAT_INTERFACE$AGENT_INIT_MESSAGE": {
+        "en": "Agent is initialized, waiting for task...",
+        "de": "Agent ist initialisiert und wartet auf Aufgabe...",
+        "zh-CN": "智能体已初始化，等待任务中...",
+        "zh-TW": "智能體已初始化，等待任務中...",
+        "ko-KR": "에이전트가 초기화되었습니다. 작업을 기다리는 중...",
+        "no": "Agenten er initialisert, venter på oppgave...",
+        "it": "L'agente è inizializzato, in attesa di compiti...",
+        "pt": "Agente inicializado, aguardando tarefa...",
+        "es": "El agente está inicializado, esperando tarea...",
+        "ar": "تم تهيئة الوكيل، في انتظار المهمة...",
+        "fr": "L'agent est initialisé, en attente de tâche...",
+        "tr": "Ajan başlatıldı, görev bekleniyor...",
+        "ja": "エージェントの初期化が完了しました。タスクを待機中..."
+    },
+    "CHAT_INTERFACE$AGENT_RUNNING_MESSAGE": {
+        "en": "Agent is running task",
+        "de": "Agent führt Aufgabe aus",
+        "zh-CN": "智能体正在执行任务...",
+        "zh-TW": "智能體正在執行任務...",
+        "ko-KR": "에이전트가 작업을 실행 중입니다",
+        "no": "Agenten utfører oppgave",
+        "it": "L'agente sta eseguendo il compito",
+        "pt": "O agente está executando a tarefa",
+        "es": "El agente está ejecutando la tarea",
+        "ar": "الوكيل يقوم بتنفيذ المهمة",
+        "fr": "L'agent exécute la tâche",
+        "tr": "Ajan görevi yürütüyor",
+        "ja": "エージェントがタスクを実行中"
+    },
+    "CHAT_INTERFACE$AGENT_AWAITING_USER_INPUT_MESSAGE": {
+        "en": "Agent is awaiting user input...",
+        "de": "Agent wartet auf Benutzereingabe...",
+        "zh-CN": "智能体正在等待用户输入...",
+        "zh-TW": "智能體正在等待用戶輸入...",
+        "ko-KR": "에이전트가 사용자 입력을 기다리고 있습니다...",
+        "no": "Agenten venter på brukerinndata...",
+        "it": "L'agente è in attesa dell'input dell'utente...",
+        "pt": "O agente está aguardando a entrada do usuário...",
+        "es": "El agente está esperando la entrada del usuario...",
+        "ar": "الوكيل في انتظار إدخال المستخدم...",
+        "fr": "L'agent attend l'entrée de l'utilisateur...",
+        "tr": "Ajan kullanıcı girdisini bekliyor...",
+        "ja": "エージェントがユーザー入力を待機中..."
+    },
+    "CHAT_INTERFACE$AGENT_RATE_LIMITED_MESSAGE": {
+        "en": "Agent is Rate Limited",
+        "zh-CN": "智能体已达到速率限制",
+        "zh-TW": "智能體已達到速率限制",
+        "de": "Agent ist ratenbegrenzt",
+        "ko-KR": "에이전트가 속도 제한되었습니다",
+        "no": "Agenten er hastighetsbegrenset",
+        "it": "L'agente è limitato dalla frequenza",
+        "pt": "O agente está com limite de taxa",
+        "es": "El agente está limitado por tasa",
+        "ar": "الوكيل مقيد بحد السرعة",
+        "fr": "L'agent est limité en fréquence",
+        "tr": "Ajan hız sınırına ulaştı",
+        "ja": "エージェントがレート制限中"
+    },
+    "CHAT_INTERFACE$AGENT_PAUSED_MESSAGE": {
+        "en": "Agent has paused.",
+        "de": "Agent pausiert.",
+        "zh-CN": "智能体已暂停",
+        "zh-TW": "智能體已暫停",
+        "ko-KR": "에이전트가 일시 중지되었습니다.",
+        "no": "Agenten har pauset.",
+        "it": "L'agente ha messo in pausa.",
+        "pt": "O agente foi pausado.",
+        "es": "El agente ha pausado.",
+        "ar": "توقف الوكيل مؤقتًا.",
+        "fr": "L'agent a mis en pause.",
+        "tr": "Ajan duraklatıldı.",
+        "ja": "エージェントが一時停止中"
+    },
+    "LANDING$TITLE": {
+        "en": "Let's start building!",
+        "ja": "開発を始めましょう！",
+        "zh-CN": "让我们开始构建！",
+        "zh-TW": "讓我們開始構建！",
+        "ko-KR": "시작해봅시다!",
+        "fr": "Commençons à construire !",
+        "es": "¡Empecemos a construir!",
+        "de": "Lass uns anfangen zu bauen!",
+        "it": "Iniziamo a costruire!",
+        "pt": "Vamos começar a construir!",
+        "ar": "هيا نبدأ البناء!",
+        "no": "La oss begynne å bygge!",
+        "tr": "Hadi inşa etmeye başlayalım!"
+    },
+    "LANDING$SUBTITLE": {
+        "en": "OpenHands makes it easy to build and maintain software using a simple prompt.",
+        "ja": "OpenHandsは、シンプルなプロンプトを使用してソフトウェアの開発と保守を簡単にします。",
+        "zh-CN": "OpenHands 使用简单的提示来轻松构建和维护软件。",
+        "zh-TW": "OpenHands 使用簡單的提示來輕鬆構建和維護軟件。",
+        "ko-KR": "OpenHands는 간단한 프롬프트를 사용하여 소프트웨어를 쉽게 구축하고 유지관리할 수 있게 해줍니다.",
+        "fr": "OpenHands facilite la construction et la maintenance de logiciels à l'aide d'une invite simple.",
+        "es": "OpenHands facilita la construcción y el mantenimiento de software usando un prompt simple.",
+        "de": "OpenHands macht es einfach, Software mit einem einfachen Prompt zu erstellen und zu warten.",
+        "it": "OpenHands rende facile costruire e mantenere software usando un prompt semplice.",
+        "pt": "OpenHands torna fácil construir e manter software usando um prompt simples.",
+        "ar": "يجعل OpenHands من السهل بناء وصيانة البرمجيات باستخدام موجه بسيط.",
+        "no": "OpenHands gjør det enkelt å bygge og vedlikeholde programvare ved hjelp av en enkel prompt.",
+        "tr": "Yapay zeka destekli yazılım geliştirme"
+    },
+    "LANDING$START_HELP": {
+        "en": "Not sure how to start?",
+        "ja": "始め方がわからない場合は",
+        "zh-CN": "不知道如何开始？",
+        "zh-TW": "不知道如何開始？",
+        "ko-KR": "시작하는 방법을 모르시나요?",
+        "fr": "Vous ne savez pas par où commencer ?",
+        "es": "¿No sabes por dónde empezar?",
+        "de": "Unsicher, wie man anfängt?",
+        "it": "Non sai come iniziare?",
+        "pt": "Não sabe como começar?",
+        "ar": "غير متأكد من كيفية البدء؟",
+        "no": "Usikker på hvordan du skal begynne?",
+        "tr": "Başlamak için yardım"
+    },
+    "LANDING$START_HELP_LINK": {
+        "en": "Read this",
+        "ja": "こちらをお読みください",
+        "zh-CN": "阅读这个",
+        "zh-TW": "閱讀這個",
+        "ko-KR": "이것을 읽어보세요",
+        "fr": "Lisez ceci",
+        "es": "Lee esto",
+        "de": "Lies dies",
+        "it": "Leggi questo",
+        "pt": "Leia isto",
+        "ar": "اقرأ هذا",
+        "no": "Les dette",
+        "tr": "Başlangıç kılavuzu"
+    },
+    "LANDING$BUILD_APP_BUTTON": {
+        "en": "Build an app to view pull requests",
+        "ja": "プルリクエストを表示するアプリを開発する",
+        "zh-CN": "构建一个查看拉取请求的应用",
+        "zh-TW": "構建一個查看拉取請求的應用",
+        "ko-KR": "풀 리퀘스트를 보기 위한 앱 만들기",
+        "fr": "Construire une application pour voir les pull requests",
+        "es": "Construir una aplicación para ver pull requests",
+        "de": "Eine App zum Anzeigen von Pull Requests erstellen",
+        "it": "Costruisci un'app per visualizzare le pull request",
+        "pt": "Construir um aplicativo para visualizar pull requests",
+        "ar": "بناء تطبيق لعرض طلبات السحب",
+        "no": "Bygg en app for å se pull requests",
+        "tr": "Uygulama oluştur"
+    },
+    "SUGGESTIONS$TODO_APP": {
+        "en": "Build a todo list application",
+        "ja": "ToDoリストアプリを開発する",
+        "zh-CN": "构建一个待办事项列表应用",
+        "zh-TW": "構建一個待辦事項列表應用",
+        "ko-KR": "할 일 목록 앱 만들기",
+        "fr": "Construire une application de liste de tâches",
+        "es": "Construir una aplicación de lista de tareas",
+        "de": "Eine To-Do-Listen-App erstellen",
+        "it": "Costruisci un'applicazione per la lista delle cose da fare",
+        "pt": "Construir um aplicativo de lista de tarefas",
+        "ar": "بناء تطبيق قائمة المهام",
+        "no": "Bygg en gjøremålsliste-app",
+        "tr": "Yapılacaklar uygulaması"
+    },
+    "SUGGESTIONS$HACKER_NEWS": {
+        "en": "Write a bash script that shows the top story on Hacker News",
+        "ja": "Hacker Newsのトップ記事を表示するbashスクリプトを作成する",
+        "zh-CN": "编写一个显示Hacker News头条新闻的bash脚本",
+        "zh-TW": "編寫一個顯示Hacker News頭條新聞的bash腳本",
+        "ko-KR": "Hacker News의 상위 기사를 보여주는 bash 스크립트 작성하기",
+        "fr": "Écrire un script bash qui affiche l'article principal de Hacker News",
+        "es": "Escribir un script bash que muestre la noticia principal de Hacker News",
+        "de": "Ein Bash-Skript schreiben, das die Top-Story von Hacker News anzeigt",
+        "it": "Scrivi uno script bash che mostra la notizia principale su Hacker News",
+        "pt": "Escrever um script bash que mostra a principal notícia do Hacker News",
+        "ar": "كتابة سكربت باش يعرض أهم خبر على هاكر نيوز",
+        "no": "Skriv et bash-script som viser topphistorien på Hacker News",
+        "tr": "Hacker News klonu"
+    },
+    "LANDING$CHANGE_PROMPT": {
+        "en": "What would you like to change in {{repo}}?",
+        "ja": "{{repo}}で何を変更したいですか？",
+        "zh-CN": "你想在{{repo}}中更改什么？",
+        "zh-TW": "你想在{{repo}}中更改什麼？",
+        "ko-KR": "{{repo}}에서 무엇을 변경하시겠습니까?",
+        "fr": "Que souhaitez-vous modifier dans {{repo}} ?",
+        "es": "¿Qué te gustaría cambiar en {{repo}}?",
+        "de": "Was möchtest du in {{repo}} ändern?",
+        "it": "Cosa vorresti cambiare in {{repo}}?",
+        "pt": "O que você gostaria de mudar em {{repo}}?",
+        "ar": "ماذا تريد أن تغير في {{repo}}؟",
+        "no": "Hva vil du endre i {{repo}}?",
+        "tr": "İsteği değiştir"
+    },
+    "GITHUB$CONNECT": {
+        "en": "Connect to GitHub",
+        "ja": "GitHubに接続",
+        "zh-CN": "连接到GitHub",
+        "zh-TW": "連接到GitHub",
+        "ko-KR": "GitHub에 연결",
+        "fr": "Se connecter à GitHub",
+        "es": "Conectar con GitHub",
+        "de": "Mit GitHub verbinden",
+        "it": "Connetti a GitHub",
+        "pt": "Conectar ao GitHub",
+        "ar": "الاتصال بـ GitHub",
+        "no": "Koble til GitHub",
+        "tr": "GitHub'a bağlan"
+    },
+    "GITHUB$NO_RESULTS": {
+        "en": "No results found.",
+        "ja": "結果が見つかりません。",
+        "zh-CN": "未找到结果。",
+        "zh-TW": "未找到結果。",
+        "ko-KR": "결과를 찾을 수 없습니다.",
+        "fr": "Aucun résultat trouvé.",
+        "es": "No se encontraron resultados.",
+        "de": "Keine Ergebnisse gefunden.",
+        "it": "Nessun risultato trovato.",
+        "pt": "Nenhum resultado encontrado.",
+        "ar": "لم يتم العثور على نتائج.",
+        "no": "Ingen resultater funnet.",
+        "tr": "Sonuç bulunamadı"
+    },
+    "GITHUB$ADD_MORE_REPOS": {
+        "en": "Add more repositories...",
+        "ja": "リポジトリを追加...",
+        "zh-CN": "添加更多仓库...",
+        "zh-TW": "添加更多儲存庫...",
+        "ko-KR": "더 많은 저장소 추가...",
+        "fr": "Ajouter plus de dépôts...",
+        "es": "Agregar más repositorios...",
+        "de": "Weitere Repositories hinzufügen...",
+        "it": "Aggiungi altri repository...",
+        "pt": "Adicionar mais repositórios...",
+        "ar": "إضافة المزيد من المستودعات...",
+        "no": "Legg til flere repositories...",
+        "tr": "Daha fazla depo ekle"
+    },
+    "GITHUB$YOUR_REPOS": {
+        "en": "Your Repos",
+        "ja": "あなたのリポジトリ",
+        "zh-CN": "你的仓库",
+        "zh-TW": "你的儲存庫",
+        "ko-KR": "내 저장소",
+        "fr": "Vos dépôts",
+        "es": "Tus repositorios",
+        "de": "Deine Repositories",
+        "it": "I tuoi repository",
+        "pt": "Seus repositórios",
+        "ar": "مستودعاتك",
+        "no": "Dine repositories",
+        "tr": "Depolarınız"
+    },
+    "GITHUB$PUBLIC_REPOS": {
+        "en": "Public Repos",
+        "ja": "公開リポジトリ",
+        "zh-CN": "公共仓库",
+        "zh-TW": "公開儲存庫",
+        "ko-KR": "공개 저장소",
+        "fr": "Dépôts publics",
+        "es": "Repositorios públicos",
+        "de": "Öffentliche Repositories",
+        "it": "Repository pubblici",
+        "pt": "Repositórios públicos",
+        "ar": "المستودعات العامة",
+        "no": "Offentlige repositories",
+        "tr": "Herkese açık depolar"
+    },
+    "DOWNLOAD$PREPARING": {
+        "en": "Preparing Download...",
+        "ja": "ダウンロードの準備中...",
+        "zh-CN": "准备下载...",
+        "zh-TW": "準備下載...",
+        "ko-KR": "다운로드 준비 중...",
+        "fr": "Préparation du téléchargement...",
+        "es": "Preparando descarga...",
+        "de": "Download wird vorbereitet...",
+        "it": "Preparazione download...",
+        "pt": "Preparando download...",
+        "ar": "جاري تحضير التنزيل...",
+        "no": "Forbereder nedlasting...",
+        "tr": "Hazırlanıyor"
+    },
+    "DOWNLOAD$DOWNLOADING": {
+        "en": "Downloading Files",
+        "ja": "ファイルをダウンロード中",
+        "zh-CN": "正在下载文件",
+        "zh-TW": "正在下載檔案",
+        "ko-KR": "파일 다운로드 중",
+        "fr": "Téléchargement des fichiers",
+        "es": "Descargando archivos",
+        "de": "Dateien werden heruntergeladen",
+        "it": "Download dei file in corso",
+        "pt": "Baixando arquivos",
+        "ar": "جاري تنزيل الملفات",
+        "no": "Laster ned filer",
+        "tr": "İndiriliyor"
+    },
+    "DOWNLOAD$FOUND_FILES": {
+        "en": "Found {{count}} files...",
+        "ja": "{{count}}個のファイルが見つかりました...",
+        "zh-CN": "找到{{count}}个文件...",
+        "zh-TW": "找到{{count}}個檔案...",
+        "ko-KR": "{{count}}개의 파일을 찾았습니다...",
+        "fr": "{{count}} fichiers trouvés...",
+        "es": "{{count}} archivos encontrados...",
+        "de": "{{count}} Dateien gefunden...",
+        "it": "Trovati {{count}} file...",
+        "pt": "{{count}} arquivos encontrados...",
+        "ar": "تم العثور على {{count}} ملف...",
+        "no": "Fant {{count}} filer...",
+        "tr": "Dosyalar bulundu"
+    },
+    "DOWNLOAD$SCANNING": {
+        "en": "Scanning workspace...",
+        "ja": "ワークスペースをスキャン中...",
+        "zh-CN": "正在扫描工作区...",
+        "zh-TW": "正在掃描工作區...",
+        "ko-KR": "워크스페이스 스캔 중...",
+        "fr": "Analyse de l'espace de travail...",
+        "es": "Escaneando espacio de trabajo...",
+        "de": "Arbeitsbereich wird gescannt...",
+        "it": "Scansione dell'area di lavoro...",
+        "pt": "Escaneando área de trabalho...",
+        "ar": "جاري فحص مساحة العمل...",
+        "no": "Skanner arbeidsområde...",
+        "tr": "Taranıyor"
+    },
+    "DOWNLOAD$FILES_PROGRESS": {
+        "en": "{{downloaded}} of {{total}} files",
+        "ja": "{{total}}個中{{downloaded}}個のファイル",
+        "zh-CN": "{{downloaded}}/{{total}}个文件",
+        "zh-TW": "{{downloaded}}/{{total}}個檔案",
+        "ko-KR": "{{total}}개 중 {{downloaded}}개 파일",
+        "fr": "{{downloaded}} sur {{total}} fichiers",
+        "es": "{{downloaded}} de {{total}} archivos",
+        "de": "{{downloaded}} von {{total}} Dateien",
+        "it": "{{downloaded}} di {{total}} file",
+        "pt": "{{downloaded}} de {{total}} arquivos",
+        "ar": "{{downloaded}} من {{total}} ملف",
+        "no": "{{downloaded}} av {{total}} filer",
+        "tr": "Dosya ilerleme durumu"
+    },
+    "DOWNLOAD$CANCEL": {
+        "en": "Cancel",
+        "ja": "キャンセル",
+        "zh-CN": "取消",
+        "zh-TW": "取消",
+        "ko-KR": "취소",
+        "fr": "Annuler",
+        "es": "Cancelar",
+        "de": "Abbrechen",
+        "it": "Annulla",
+        "pt": "Cancelar",
+        "ar": "إلغاء",
+        "no": "Avbryt",
+        "tr": "İptal"
+    },
+    "ACTION$CONFIRM": {
+        "en": "Confirm action",
+        "ja": "アクションを確認",
+        "zh-CN": "确认操作",
+        "zh-TW": "確認操作",
+        "ko-KR": "작업 확인",
+        "fr": "Confirmer l'action",
+        "es": "Confirmar acción",
+        "de": "Aktion bestätigen",
+        "it": "Conferma azione",
+        "pt": "Confirmar ação",
+        "ar": "تأكيد الإجراء",
+        "no": "Bekreft handling",
+        "tr": "Onayla"
+    },
+    "ACTION$REJECT": {
+        "en": "Reject action",
+        "ja": "アクションを拒否",
+        "zh-CN": "拒绝操作",
+        "zh-TW": "拒絕操作",
+        "ko-KR": "작업 거부",
+        "fr": "Rejeter l'action",
+        "es": "Rechazar acción",
+        "de": "Aktion ablehnen",
+        "it": "Rifiuta azione",
+        "pt": "Rejeitar ação",
+        "ar": "رفض الإجراء",
+        "no": "Avvis handling",
+        "tr": "Reddet"
+    },
+    "BADGE$BETA": {
+        "en": "Beta",
+        "ja": "ベータ",
+        "zh-CN": "测试版",
+        "zh-TW": "測試版",
+        "ko-KR": "베타",
+        "fr": "Bêta",
+        "es": "Beta",
+        "de": "Beta",
+        "it": "Beta",
+        "pt": "Beta",
+        "ar": "تجريبي",
+        "no": "Beta",
+        "tr": "Beta"
+    },
+    "AGENT$RESUME_TASK": {
+        "en": "Resume the agent task",
+        "ja": "エージェントのタスクを再開",
+        "zh-CN": "恢复代理任务",
+        "zh-TW": "恢復代理任務",
+        "ko-KR": "에이전트 작업 재개",
+        "fr": "Reprendre la tâche de l'agent",
+        "es": "Reanudar la tarea del agente",
+        "de": "Agentenaufgabe fortsetzen",
+        "it": "Riprendi il compito dell'agente",
+        "pt": "Retomar a tarefa do agente",
+        "ar": "استئناف مهمة الوكيل",
+        "no": "Gjenoppta agentoppgaven",
+        "tr": "Görevi devam ettir"
+    },
+    "AGENT$PAUSE_TASK": {
+        "en": "Pause the current task",
+        "ja": "現在のタスクを一時停止",
+        "zh-CN": "暂停当前任务",
+        "zh-TW": "暫停當前任務",
+        "ko-KR": "현재 작업 일시 중지",
+        "fr": "Mettre en pause la tâche actuelle",
+        "es": "Pausar la tarea actual",
+        "de": "Aktuelle Aufgabe pausieren",
+        "it": "Metti in pausa il compito corrente",
+        "pt": "Pausar a tarefa atual",
+        "ar": "إيقاف المهمة الحالية مؤقتًا",
+        "no": "Pause gjeldende oppgave",
+        "tr": "Görevi duraklat"
+    },
+    "TOS$ACCEPT": {
+        "en": "I accept the",
+        "ja": "私は",
+        "zh-CN": "我接受",
+        "zh-TW": "我接受",
+        "ko-KR": "나는",
+        "fr": "J'accepte les",
+        "es": "Acepto los",
+        "de": "Ich akzeptiere die",
+        "it": "Accetto i",
+        "pt": "Eu aceito os",
+        "ar": "أوافق على",
+        "no": "Jeg godtar",
+        "tr": "Kabul et"
+    },
+    "TOS$TERMS": {
+        "en": "terms of service",
+        "ja": "利用規約に同意します",
+        "zh-CN": "服务条款",
+        "zh-TW": "服務條款",
+        "ko-KR": "서비스 약관에 동의합니다",
+        "fr": "conditions d'utilisation",
+        "es": "términos de servicio",
+        "de": "Nutzungsbedingungen",
+        "it": "termini di servizio",
+        "pt": "termos de serviço",
+        "ar": "شروط الخدمة",
+        "no": "vilkårene for bruk",
+        "tr": "Kullanım şartları"
+    },
+    "USER$ACCOUNT_SETTINGS": {
+        "en": "Account settings",
+        "ja": "アカウント設定",
+        "zh-CN": "账户设置",
+        "zh-TW": "帳戶設定",
+        "ko-KR": "계정 설정",
+        "fr": "Paramètres du compte",
+        "es": "Configuración de la cuenta",
+        "de": "Kontoeinstellungen",
+        "it": "Impostazioni account",
+        "pt": "Configurações da conta",
+        "ar": "إعدادات الحساب",
+        "no": "Kontoinnstillinger",
+        "tr": "Hesap ayarları"
+    },
+    "JUPYTER$OUTPUT_LABEL": {
+        "en": "STDOUT/STDERR",
+        "ja": "標準出力/標準エラー",
+        "zh-CN": "标准输出/标准错误",
+        "zh-TW": "標準輸出/標準錯誤",
+        "ko-KR": "표준 출력/표준 오류",
+        "fr": "STDOUT/STDERR",
+        "es": "STDOUT/STDERR",
+        "de": "STDOUT/STDERR",
+        "it": "STDOUT/STDERR",
+        "pt": "STDOUT/STDERR",
+        "ar": "المخرجات القياسية/الأخطاء القياسية",
+        "no": "STDOUT/STDERR",
+        "tr": "Çıktı"
+    },
+    "BUTTON$STOP": {
+        "en": "Stop",
+        "ja": "停止",
+        "zh-CN": "停止",
+        "zh-TW": "停止",
+        "ko-KR": "중지",
+        "fr": "Arrêter",
+        "es": "Detener",
+        "de": "Stopp",
+        "it": "Ferma",
+        "pt": "Parar",
+        "ar": "توقف",
+        "no": "Stopp",
+        "tr": "Durdur"
+    },
+    "LANDING$ATTACH_IMAGES": {
+        "en": "Attach images",
+        "ja": "画像を添付",
+        "zh-CN": "附加图片",
+        "zh-TW": "附加圖片",
+        "ko-KR": "이미지 첨부",
+        "fr": "Joindre des images",
+        "es": "Adjuntar imágenes",
+        "de": "Bilder anhängen",
+        "it": "Allega immagini",
+        "pt": "Anexar imagens",
+        "ar": "إرفاق صور",
+        "no": "Legg ved bilder",
+        "tr": "Resim ekle"
+    },
+    "LANDING$OPEN_REPO": {
+        "en": "Open a Repo",
+        "ja": "リポジトリを開く",
+        "zh-CN": "打开仓库",
+        "zh-TW": "開啟儲存庫",
+        "ko-KR": "저장소 열기",
+        "fr": "Ouvrir un dépôt",
+        "es": "Abrir un repositorio",
+        "de": "Ein Repository öffnen",
+        "it": "Apri un repository",
+        "pt": "Abrir um repositório",
+        "ar": "فتح مستودع",
+        "no": "Åpne et repo",
+        "tr": "Depo aç"
+    },
+    "LANDING$IMPORT_PROJECT": {
+        "en": "+ Import Project",
+        "ja": "+ プロジェクトをインポート",
+        "zh-CN": "+ 导入项目",
+        "zh-TW": "+ 匯入專案",
+        "ko-KR": "+ 프로젝트 가져오기",
+        "fr": "+ Importer un projet",
+        "es": "+ Importar proyecto",
+        "de": "+ Projekt importieren",
+        "it": "+ Importa progetto",
+        "pt": "+ Importar projeto",
+        "ar": "+ استيراد مشروع",
+        "no": "+ Importer prosjekt",
+        "tr": "Proje içe aktar"
+    },
+    "LANDING$UPLOAD_ZIP": {
+        "en": "Upload a .zip",
+        "ja": ".zipファイルをアップロード",
+        "zh-CN": "上传.zip文件",
+        "zh-TW": "上傳.zip檔案",
+        "ko-KR": ".zip 파일 업로드",
+        "fr": "Télécharger un .zip",
+        "es": "Subir un .zip",
+        "de": "Eine .zip-Datei hochladen",
+        "it": "Carica un .zip",
+        "pt": "Fazer upload de um .zip",
+        "ar": "تحميل ملف .zip",
+        "no": "Last opp en .zip",
+        "tr": "ZIP yükle"
+    },
+    "LANDING$RECENT_CONVERSATION": {
+        "en": "jump back to your most recent conversation",
+        "ja": "最新の会話に戻る",
+        "zh-CN": "返回到最近的对话",
+        "zh-TW": "返回到最近的對話",
+        "ko-KR": "가장 최근 대화로 돌아가기",
+        "fr": "revenez à votre conversation la plus récente",
+        "es": "vuelve a tu conversación más reciente",
+        "de": "kehre zu deiner letzten Konversation zurück",
+        "it": "torna alla tua conversazione più recente",
+        "pt": "volte para sua conversa mais recente",
+        "ar": "أو العودة إلى آخر محادثة",
+        "no": "gå tilbake til din siste samtale",
+        "tr": "Son konuşma"
+    },
+    "LANDING$OR": {
+        "en": "Or",
+        "ja": "または",
+        "zh-CN": "或",
+        "zh-TW": "或",
+        "ko-KR": "또는",
+        "fr": "Ou",
+        "es": "O",
+        "de": "Oder",
+        "it": "O",
+        "pt": "Ou",
+        "ar": "أو",
+        "no": "Eller",
+        "tr": "veya"
+    },
+    "SUGGESTIONS$TEST_COVERAGE": {
+        "en": "Increase my test coverage",
+        "ja": "テストカバレッジを向上させる",
+        "zh-CN": "提高我的测试覆盖率",
+        "zh-TW": "提高我的測試覆蓋率",
+        "ko-KR": "테스트 커버리지 높이기",
+        "fr": "Augmenter ma couverture de tests",
+        "es": "Aumentar mi cobertura de pruebas",
+        "de": "Meine Testabdeckung erhöhen",
+        "it": "Aumenta la mia copertura dei test",
+        "pt": "Aumentar minha cobertura de testes",
+        "ar": "زيادة تغطية الاختبار",
+        "no": "Øk min testdekning",
+        "tr": "Test kapsamı"
+    },
+    "SUGGESTIONS$AUTO_MERGE": {
+        "en": "Auto-merge Dependabot PRs",
+        "ja": "DependabotのPRを自動マージ",
+        "zh-CN": "自动合并Dependabot PR",
+        "zh-TW": "自動合併Dependabot PR",
+        "ko-KR": "Dependabot PR 자동 병합",
+        "fr": "Fusion automatique des PR Dependabot",
+        "es": "Auto-fusionar PRs de Dependabot",
+        "de": "Dependabot PRs automatisch zusammenführen",
+        "it": "Unione automatica delle PR di Dependabot",
+        "pt": "Mesclar automaticamente PRs do Dependabot",
+        "ar": "دمج تلقائي لطلبات سحب Dependabot",
+        "no": "Auto-flett Dependabot PRs",
+        "tr": "Otomatik birleştirme"
+    },
+    "CHAT_INTERFACE$AGENT_STOPPED_MESSAGE": {
+        "en": "Agent has stopped.",
+        "de": "Agent hat angehalten.",
+        "zh-CN": "智能体已停止",
+        "zh-TW": "智能體已停止",
+        "ko-KR": "에이전트가 중지되었습니다.",
+        "no": "Agenten har stoppet.",
+        "it": "L'agente si è fermato.",
+        "pt": "O agente parou.",
+        "es": "El agente se ha detenido.",
+        "ar": "توقف الوكيل.",
+        "fr": "L'agent s'est arrêté.",
+        "tr": "Ajan durdu.",
+        "ja": "エージェントが停止しました"
+    },
+    "CHAT_INTERFACE$AGENT_FINISHED_MESSAGE": {
+        "en": "Agent has finished the task.",
+        "de": "Agent hat die Aufgabe erledigt.",
+        "zh-CN": "智能体已完成任务",
+        "zh-TW": "智能體已完成任務",
+        "ko-KR": "에이전트가 작업을 완료했습니다.",
+        "no": "Agenten har fullført oppgaven.",
+        "it": "L'agente ha completato il compito.",
+        "pt": "O agente concluiu a tarefa.",
+        "es": "El agente ha terminado la tarea.",
+        "ar": "أنهى الوكيل المهمة.",
+        "fr": "L'agent a terminé la tâche.",
+        "tr": "Ajan görevi tamamladı.",
+        "ja": "エージェントがタスクを完了しました"
+    },
+    "CHAT_INTERFACE$AGENT_REJECTED_MESSAGE": {
+        "en": "Agent has rejected the task.",
+        "de": "Agent hat die Aufgabe abgelehnt.",
+        "zh-CN": "智能体拒绝任务",
+        "zh-TW": "智能體拒絕任務",
+        "ko-KR": "에이전트가 작업을 거부했습니다.",
+        "no": "Agenten har avvist oppgaven.",
+        "it": "L'agente ha rifiutato il compito.",
+        "pt": "O agente rejeitou a tarefa.",
+        "es": "El agente ha rechazado la tarea.",
+        "ar": "رفض الوكيل المهمة.",
+        "fr": "L'agent a rejeté la tâche.",
+        "tr": "Ajan görevi reddetti.",
+        "ja": "エージェントがタスクを拒否しました"
+    },
+    "CHAT_INTERFACE$AGENT_ERROR_MESSAGE": {
+        "en": "Agent encountered an error.",
+        "de": "Agent ist auf einen Fehler gelaufen.",
+        "zh-CN": "智能体遇到错误",
+        "zh-TW": "智能體遇到錯誤",
+        "ko-KR": "에이전트에 오류가 발생했습니다.",
+        "no": "Agenten støtte på en feil.",
+        "it": "L'agente ha riscontrato un errore.",
+        "pt": "O agente encontrou um erro.",
+        "es": "El agente encontró un error.",
+        "ar": "واجه الوكيل خطأ.",
+        "fr": "L'agent a rencontré une erreur.",
+        "tr": "Ajan bir hatayla karşılaştı.",
+        "ja": "エージェントでエラーが発生しました"
+    },
+    "CHAT_INTERFACE$AGENT_AWAITING_USER_CONFIRMATION_MESSAGE": {
+        "en": "Agent is awaiting user confirmation for the pending action.",
+        "de": "Agent wartet auf die Bestätigung des Benutzers für die ausstehende Aktion.",
+        "zh-CN": "代理正在等待用户确认待处理的操作。",
+        "zh-TW": "代理正在等待用戶確認待處理的操作。",
+        "ko-KR": "에이전트가 대기 중인 작업에 대한 사용자 확인을 기다리고 있습니다.",
+        "no": "Agenten venter på brukerbekreftelse for den ventende handlingen.",
+        "it": "L'agente è in attesa della conferma dell'utente per l'azione in sospeso.",
+        "pt": "O agente está aguardando a confirmação do usuário para a ação pendente.",
+        "es": "El agente está esperando la confirmación del usuario para la acción pendiente.",
+        "ar": "الوكيل ينتظر تأكيد المستخدم للإجراء المعلق.",
+        "fr": "L'agent attend la confirmation de l'utilisateur pour l'action en attente.",
+        "tr": "Ajan, bekleyen işlem için kullanıcı onayını bekliyor.",
+        "ja": "ユーザーの確認を待っています"
+    },
+    "CHAT_INTERFACE$AGENT_ACTION_USER_CONFIRMED_MESSAGE": {
+        "en": "Agent action has been confirmed!",
+        "de": "Die Aktion des Agenten wurde bestätigt!",
+        "zh-CN": "代理操作已确认！",
+        "zh-TW": "代理操作已確認！",
+        "ko-KR": "에이전트 작업이 확인되었습니다!",
+        "no": "Agenthandlingen har blitt bekreftet!",
+        "it": "L'azione dell'agente è stata confermata!",
+        "pt": "A ação do agente foi confirmada!",
+        "es": "¡La acción del agente ha sido confirmada!",
+        "ar": "تم تأكيد إجراء الوكيل!",
+        "fr": "L'action de l'agent a été confirmée !",
+        "tr": "Ajan eylemi onaylandı!",
+        "ja": "ユーザーがアクションを承認しました"
+    },
+    "CHAT_INTERFACE$AGENT_ACTION_USER_REJECTED_MESSAGE": {
+        "en": "Agent action has been rejected!",
+        "de": "Die Aktion des Agenten wurde abgelehnt!",
+        "zh-CN": "代理操作已被拒绝！",
+        "zh-TW": "代理操作已被拒絕！",
+        "ko-KR": "에이전트 작업이 거부되었습니다!",
+        "no": "Agenthandlingen har blitt avvist!",
+        "it": "L'azione dell'agente è stata rifiutata!",
+        "pt": "A ação do agente foi rejeitada!",
+        "es": "¡La acción del agente ha sido rechazada!",
+        "ar": "تم رفض إجراء الوكيل!",
+        "fr": "L'action de l'agent a été rejetée !",
+        "tr": "Ajan eylemi reddedildi!",
+        "ja": "ユーザーがアクションを拒否しました"
+    },
+    "CHAT_INTERFACE$INPUT_PLACEHOLDER": {
+        "en": "Message assistant...",
+        "zh-CN": "给助理发消息",
+        "de": "Sende eine Nachricht an den Assistenten...",
+        "ko-KR": "어시스턴트에게 메시지 보내기",
+        "no": "Send melding til assistenten...",
+        "zh-TW": "给助理留言",
+        "it": "Invia un messaggio all'assistente...",
+        "pt": "Envie uma mensagem para o assistente...",
+        "es": "Mensaje al asistente...",
+        "ar": "مراسلة المساعد",
+        "fr": "Envoyez un message à l'assistant...",
+        "tr": "Asistana mesaj gönder...",
+        "ja": "メッセージを入力してください..."
+    },
+    "CHAT_INTERFACE$INPUT_CONTINUE_MESSAGE": {
+        "en": "Continue",
+        "zh-CN": "继续",
+        "de": "Fortfahren",
+        "zh-TW": "繼續",
+        "ko-KR": "계속",
+        "no": "Fortsett",
+        "it": "Continua",
+        "pt": "Continuar",
+        "es": "Continuar",
+        "ar": "استمرار",
+        "fr": "Continuer",
+        "tr": "Devam et",
+        "ja": "続行するにはEnterを押してください"
+    },
+    "CHAT_INTERFACE$USER_ASK_CONFIRMATION": {
+        "en": "Do you want to continue with this action?",
+        "de": "Möchten Sie mit dieser Aktion fortfahren?",
+        "zh-CN": "您要继续此操作吗？",
+        "zh-TW": "您要繼續此操作嗎？",
+        "ko-KR": "이 작업을 계속하시겠습니까?",
+        "no": "Vil du fortsette med denne handlingen?",
+        "it": "Vuoi continuare con questa azione?",
+        "pt": "Deseja continuar com esta ação?",
+        "es": "¿Desea continuar con esta acción?",
+        "ar": "هل تريد الاستمرار في هذا الإجراء؟",
+        "fr": "Voulez-vous continuer avec cette action ?",
+        "tr": "Bu işleme devam etmek istiyor musunuz?",
+        "ja": "このアクションを実行してもよろしいですか？"
+    },
+    "CHAT_INTERFACE$USER_CONFIRMED": {
+        "en": "Confirm the requested action",
+        "de": "Bestätigen Sie die angeforderte Aktion",
+        "zh-CN": "确认请求的操作",
+        "zh-TW": "確認請求的操作",
+        "ko-KR": "요청된 작업 확인",
+        "no": "Bekreft den forespurte handlingen",
+        "it": "Conferma l'azione richiesta",
+        "pt": "Confirmar a ação solicitada",
+        "es": "Confirmar la acción solicitada",
+        "ar": "تأكيد الإجراء المطلوب",
+        "fr": "Confirmer l'action demandée",
+        "tr": "İstenen eylemi onayla",
+        "ja": "ユーザーが承認しました"
+    },
+    "CHAT_INTERFACE$USER_REJECTED": {
+        "en": "Reject the requested action",
+        "de": "Lehnen Sie die angeforderte Aktion ab",
+        "zh-CN": "拒绝请求的操作",
+        "zh-TW": "拒絕請求的操作",
+        "ko-KR": "요청된 작업 거부",
+        "no": "Avvis den forespurte handlingen",
+        "it": "Rifiuta l'azione richiesta",
+        "pt": "Rejeitar a ação solicitada",
+        "es": "Rechazar la acción solicitada",
+        "ar": "رفض الإجراء المطلوب",
+        "fr": "Rejeter l'action demandée",
+        "tr": "İstenen eylemi reddet",
+        "ja": "ユーザーが拒否しました"
+    },
+    "CHAT_INTERFACE$INPUT_SEND_MESSAGE_BUTTON_CONTENT": {
+        "en": "Send",
+        "zh-CN": "发送",
+        "de": "Senden",
+        "ko-KR": "전송",
+        "no": "Send",
+        "zh-TW": "發送",
+        "it": "Invia",
+        "pt": "Enviar",
+        "es": "Enviar",
+        "ar": "إرسال",
+        "fr": "Envoyer",
+        "ja": "送信",
+        "tr": "Gönder"
+    },
+    "CHAT_INTERFACE$CHAT_MESSAGE_COPIED": {
+        "en": "Message copied to clipboard",
+        "zh-CN": "消息已复制到剪贴板",
+        "de": "Nachricht in die Zwischenablage kopiert",
+        "ko-KR": "메시지가 클립보드에 복사되었습니다",
+        "no": "Melding kopiert til utklippstavlen",
+        "zh-TW": "訊息已複製到剪貼簿",
+        "it": "Messaggio copiato negli appunti",
+        "pt": "Mensagem copiada para a área de transferência",
+        "es": "Mensaje copiado al portapapeles",
+        "ar": "تم نسخ الرسالة إلى الحافظة",
+        "fr": "Message copié dans le presse-papiers",
+        "tr": "Mesaj panoya kopyalandı",
+        "ja": "メッセージをコピーしました"
+    },
+    "CHAT_INTERFACE$CHAT_MESSAGE_COPY_FAILED": {
+        "en": "Failed to copy message to clipboard",
+        "zh-CN": "复制消息到剪贴板失败",
+        "de": "Nachricht konnte nicht in die Zwischenablage kopiert werden",
+        "ko-KR": "메시지를 클립보드에 복사하지 못했습니다",
+        "no": "Kunne ikke kopiere meldingen til utklippstavlen",
+        "zh-TW": "無法將訊息複製到剪貼簿",
+        "it": "Impossibile copiare il messaggio negli appunti",
+        "pt": "Falha ao copiar mensagem para a área de transferência",
+        "es": "No se pudo copiar el mensaje al portapapeles",
+        "ar": "فشل نسخ الرسالة إلى الحافظة",
+        "fr": "Échec de la copie du message dans le presse-papiers",
+        "tr": "Mesaj panoya kopyalanamadı",
+        "ja": "メッセージのコピーに失敗しました"
+    },
+    "CHAT_INTERFACE$TOOLTIP_COPY_MESSAGE": {
+        "en": "Copy message",
+        "zh-CN": "复制消息",
+        "de": "Nachricht kopieren",
+        "ko-KR": "메시지 복사",
+        "no": "Kopier melding",
+        "zh-TW": "複製訊息",
+        "it": "Copia messaggio",
+        "pt": "Copiar mensagem",
+        "es": "Copiar mensaje",
+        "ar": "نسخ الرسالة",
+        "fr": "Copier le message",
+        "tr": "Mesajı kopyala",
+        "ja": "メッセージをコピー"
+    },
+    "CHAT_INTERFACE$TOOLTIP_SEND_MESSAGE": {
+        "en": "Send message",
+        "zh-CN": "发送消息",
+        "de": "Nachricht senden",
+        "ko-KR": "메시지 보내기",
+        "no": "Send melding",
+        "zh-TW": "發送訊息",
+        "it": "Invia messaggio",
+        "pt": "Enviar mensagem",
+        "es": "Enviar mensaje",
+        "ar": "إرسال الرسالة",
+        "fr": "Envoyer le message",
+        "tr": "Mesaj gönder",
+        "ja": "メッセージを送信"
+    },
+    "CHAT_INTERFACE$TOOLTIP_UPLOAD_IMAGE": {
+        "en": "Upload image",
+        "zh-CN": "上传图片",
+        "de": "Bild hochladen",
+        "ko-KR": "이미지 업로드",
+        "no": "Last opp bilde",
+        "zh-TW": "上傳圖片",
+        "it": "Carica immagine",
+        "pt": "Carregar imagem",
+        "es": "Subir imagen",
+        "ar": "تحميل الصورة",
+        "fr": "Télécharger une image",
+        "tr": "Resim yükle",
+        "ja": "画像をアップロード"
+    },
+    "CHAT_INTERFACE$INITIAL_MESSAGE": {
+        "en": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
+        "zh-CN": "你好！我是 OpenHands，一名 AI 软件工程师。今天想和我一起编写什么程序呢?",
+        "de": "Hi! Ich bin OpenHands, ein KI-Softwareingenieur. Was möchten Sie heute mit mir erstellen?",
+        "ko-KR": "안녕하세요! 저는 오픈데빈(OpenHands), AI 소프트웨어 엔지니어입니다. 오늘은 저와 함께 무엇을 만들어 볼까요?",
+        "no": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
+        "zh-TW": "嗨！我是 OpenHands，一位人工智慧軟體工程師。你今天想和我一起建造什麼？",
+        "it": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
+        "pt": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
+        "es": "Hi! I'm OpenHands, an AI Software Engineer. What would you like to build with me today?",
+        "ar": "مرحبا! أنا OpenHands، مهندس برمجيات AI. ماذا تود أن تبني معي اليوم؟",
+        "fr": "Salut! Je suis OpenHands, un ingénieur logiciel en IA. Que voudriez-vous construire avec moi aujourd'hui?",
+        "ja": "何を作りたいですか？",
+        "tr": "Ne yapmak istersiniz?"
+    },
+    "CHAT_INTERFACE$ASSISTANT": {
+        "en": "Assistant",
+        "zh-CN": "助理",
+        "ko-KR": "어시스턴트",
+        "de": "Assistent",
+        "no": "Assistant",
+        "zh-TW": "助理",
+        "it": "Assistant",
+        "pt": "Assistant",
+        "es": "Assistant",
+        "ar": "مساعد",
+        "fr": "Assistant",
+        "tr": "Gönder",
+        "ja": "アシスタント"
+    },
+    "CHAT_INTERFACE$TO_BOTTOM": {
+        "en": "To Bottom",
+        "de": "Nach unten",
+        "zh-CN": "回到底部",
+        "ko-KR": "맨 아래로",
+        "no": "Til bunnen",
+        "zh-TW": "回到底部",
+        "it": "In fondo",
+        "pt": "Para o fundo",
+        "es": "Ir al final",
+        "ar": "إلى الأسفل",
+        "fr": "Vers le bas",
+        "tr": "En alta",
+        "ja": "一番下へ"
+    },
+    "CHAT_INTERFACE$MESSAGE_ARIA_LABEL": {
+        "en": "Message from {{sender}}",
+        "zh-CN": "来自 {{sender}} 的消息",
+        "de": "Nachricht von {{sender}}",
+        "ko-KR": "{{sender}}의 메시지",
+        "no": "Melding fra {{sender}}",
+        "zh-TW": "來自 {{sender}} 的訊息",
+        "it": "Messaggio da {{sender}}",
+        "pt": "Mensagem de {{sender}}",
+        "es": "Mensaje de {{sender}}",
+        "ar": "رسالة من {{sender}}",
+        "fr": "Message de {{sender}}",
+        "tr": "{{sender}} tarafından gönderilen mesaj",
+        "ja": "メッセージ"
+    },
+    "CHAT_INTERFACE$CHAT_CONVERSATION": {
+        "en": "Chat Conversation",
+        "zh-CN": "聊天对话",
+        "de": "Chat-Konversation",
+        "ko-KR": "채팅 대화",
+        "no": "Chat-samtale",
+        "zh-TW": "聊天對話",
+        "it": "Conversazione di chat",
+        "pt": "Conversa de chat",
+        "es": "Conversación de chat",
+        "ar": "محادثة تلقيم",
+        "fr": "Conversation de chat",
+        "tr": "Sohbet Konuşması",
+        "ja": "チャット会話"
+    },
+    "CHAT_INTERFACE$UNKNOWN_SENDER": {
+        "en": "Unknown",
+        "zh-CN": "未知",
+        "de": "Unbekannt",
+        "ko-KR": "알 수 없음",
+        "no": "Ukjent",
+        "zh-TW": "未知",
+        "it": "Sconosciuto",
+        "pt": "Desconhecido",
+        "es": "Desconocido",
+        "ar": "مجهول",
+        "fr": "Inconnu",
+        "tr": "Bilinmeyen",
+        "ja": "不明な送信者"
+    },
+    "SECURITY_ANALYZER$UNKNOWN_RISK": {
+        "en": "Unknown Risk",
+        "de": "Unbekanntes Risiko",
+        "zh-CN": "未知风险",
+        "ko-KR": "알 수 없는 위험",
+        "no": "Ukjent risiko",
+        "zh-TW": "未知風險",
+        "it": "Rischio sconosciuto",
+        "pt": "Risco desconhecido",
+        "es": "Riesgo desconocido",
+        "ar": "مخاطر غير معروفة",
+        "fr": "Risque inconnu",
+        "tr": "Bilinmeyen risk",
+        "ja": "不明なリスク"
+    },
+    "SECURITY_ANALYZER$LOW_RISK": {
+        "en": "Low Risk",
+        "de": "Niedriges Risiko",
+        "zh-CN": "低风险",
+        "ko-KR": "낮은 위험",
+        "no": "Lav risiko",
+        "zh-TW": "低風險",
+        "it": "Rischio basso",
+        "pt": "Baixo risco",
+        "es": "Riesgo bajo",
+        "ar": "مخاطر منخفضة",
+        "fr": "Risque faible",
+        "tr": "Düşük risk",
+        "ja": "低リスク"
+    },
+    "SECURITY_ANALYZER$MEDIUM_RISK": {
+        "en": "Medium Risk",
+        "de": "Mittleres Risiko",
+        "zh-CN": "中等风险",
+        "ko-KR": "중간 위험",
+        "no": "Middels risiko",
+        "zh-TW": "中等風險",
+        "it": "Rischio medio",
+        "pt": "Risco médio",
+        "es": "Riesgo medio",
+        "ar": "مخاطر متوسطة",
+        "fr": "Risque moyen",
+        "tr": "Orta risk",
+        "ja": "中リスク"
+    },
+    "SECURITY_ANALYZER$HIGH_RISK": {
+        "en": "High Risk",
+        "de": "Hohes Risiko",
+        "zh-CN": "高风险",
+        "ko-KR": "높은 위험",
+        "no": "Høy risiko",
+        "zh-TW": "高風險",
+        "it": "Rischio elevato",
+        "pt": "Alto risco",
+        "es": "Riesgo alto",
+        "ar": "مخاطر عالية",
+        "fr": "Risque élevé",
+        "tr": "Yüksek risk",
+        "ja": "高リスク"
+    },
+    "SETTINGS$MODEL_TOOLTIP": {
+        "en": "Select the language model to use.",
+        "zh-CN": "选择要使用的语言模型",
+        "zh-TW": "選擇要使用的語言模型。",
+        "de": "Wähle das zu verwendende Modell.",
+        "ko-KR": "사용할 언어 모델을 선택하세요.",
+        "no": "Velg språkmodellen som skal brukes.",
+        "it": "Seleziona il modello linguistico da utilizzare.",
+        "pt": "Selecione o modelo de linguagem a ser usado.",
+        "es": "Seleccione el modelo de lenguaje a utilizar.",
+        "ar": "اختر نموذج اللغة المراد استخدامه.",
+        "fr": "Sélectionnez le modèle de langage à utiliser.",
+        "tr": "Kullanılacak dil modelini seçin.",
+        "ja": "使用するモデルを選択"
+    },
+    "SETTINGS$AGENT_TOOLTIP": {
+        "en": "Select the agent to use.",
+        "zh-CN": "选择要使用的智能体",
+        "zh-TW": "選擇要使用的智能體。",
+        "de": "Wähle den zu verwendenden Agenten.",
+        "ko-KR": "사용할 에이전트를 선택하세요.",
+        "no": "Velg agenten som skal brukes.",
+        "it": "Seleziona l'agente da utilizzare.",
+        "pt": "Selecione o agente a ser usado.",
+        "es": "Seleccione el agente a utilizar.",
+        "ar": "اختر الوكيل المراد استخدامه.",
+        "fr": "Sélectionnez l'agent à utiliser.",
+        "tr": "Kullanılacak ajanı seçin.",
+        "ja": "使用するエージェントを選択"
+    },
+    "SETTINGS$LANGUAGE_TOOLTIP": {
+        "en": "Select the language for the UI.",
+        "zh-CN": "选择界面语言",
+        "zh-TW": "選擇 UI 的語言。",
+        "de": "Wähle die Sprache für die Oberfläche.",
+        "ko-KR": "UI 언어를 선택하세요.",
+        "no": "Velg språk for brukergrensesnittet.",
+        "it": "Seleziona la lingua per l'interfaccia utente.",
+        "pt": "Selecione o idioma para a interface do usuário.",
+        "es": "Seleccione el idioma para la interfaz de usuario.",
+        "ar": "اختر لغة واجهة المستخدم.",
+        "fr": "Sélectionnez la langue de l'interface utilisateur.",
+        "tr": "Kullanıcı arayüzü için dil seçin.",
+        "ja": "インターフェースの言語を選択"
+    },
+    "SETTINGS$DISABLED_RUNNING": {
+        "en": "Cannot be changed while the agent is running.",
+        "zh-CN": "在智能体运行时无法更改",
+        "zh-TW": "智能體正在執行時無法更改。",
+        "de": "Kann bei laufender Aufgabe nicht geändert werden.",
+        "ko-KR": "에이전트가 실행 중일 때는 변경할 수 없습니다.",
+        "no": "Kan ikke endres mens agenten kjører.",
+        "it": "Non può essere modificato mentre l'agente è in esecuzione.",
+        "pt": "Não pode ser alterado enquanto o agente está em execução.",
+        "es": "No se puede cambiar mientras el agente está en ejecución.",
+        "ar": "لا يمكن تغييره أثناء تشغيل الوكيل.",
+        "fr": "Ne peut pas être modifié pendant que l'agent est en cours d'exécution.",
+        "tr": "Ajan çalışırken değiştirilemez.",
+        "ja": "エージェントの実行中は設定を変更できません"
+    },
+    "SETTINGS$API_KEY_PLACEHOLDER": {
+        "en": "Enter your API key.",
+        "zh-CN": "输入您的 API key",
+        "zh-TW": "輸入您的 API 金鑰。",
+        "de": "Modell API Schlüssel.",
+        "ko-KR": "API 키를 입력하세요.",
+        "no": "Skriv inn din API-nøkkel.",
+        "it": "Inserisci la tua chiave API.",
+        "pt": "Digite sua chave de API.",
+        "es": "Ingrese su clave de API.",
+        "ar": "أدخل مفتاح API الخاص بك.",
+        "fr": "Entrez votre clé API.",
+        "tr": "API anahtarınızı girin.",
+        "ja": "APIキーを入力"
+    },
+    "SETTINGS$CONFIRMATION_MODE": {
+        "en": "Enable Confirmation Mode",
+        "de": "Bestätigungsmodus aktivieren",
+        "zh-CN": "启用确认模式",
+        "zh-TW": "啟用確認模式",
+        "ko-KR": "확인 모드 활성화",
+        "no": "Aktiver bekreftelsesmodus",
+        "it": "Abilita modalità di conferma",
+        "pt": "Ativar modo de confirmação",
+        "es": "Habilitar modo de confirmación",
+        "ar": "تفعيل وضع التأكيد",
+        "fr": "Activer le mode de confirmation",
+        "tr": "Onay Modunu Etkinleştir",
+        "ja": "確認モード"
+    },
+    "SETTINGS$CONFIRMATION_MODE_TOOLTIP": {
+        "en": "Awaits for user confirmation before executing code.",
+        "de": "Wartet auf die Bestätigung des Benutzers, bevor der Code ausgeführt wird.",
+        "zh-CN": "在执行代码之前等待用户确认。",
+        "zh-TW": "在執行程式碼之前等待使用者確認。",
+        "ko-KR": "코드 실행 전 사용자 확인을 기다립니다.",
+        "no": "Venter på brukerbekreftelse før koden utføres.",
+        "it": "Attende la conferma dell'utente prima di eseguire il codice.",
+        "pt": "Aguarda a confirmação do usuário antes de executar o código.",
+        "es": "Espera la confirmación del usuario antes de ejecutar el código.",
+        "ar": "ينتظر تأكيد المستخدم قبل تنفيذ الكود.",
+        "fr": "Attend la confirmation de l'utilisateur avant d'exécuter le code.",
+        "tr": "Kodu çalıştırmadan önce kullanıcı onayını bekler.",
+        "ja": "エージェントのアクションを実行前に確認"
+    },
+    "SETTINGS$AGENT_SELECT_ENABLED": {
+        "en": "Enable Agent Selection - Advanced Users",
+        "zh-CN": "启用智能体选择 - 高级用户",
+        "zh-TW": "啟用智能體選擇 - 進階使用者",
+        "de": "Agentenauswahl aktivieren - Fortgeschrittene Benutzer",
+        "ko-KR": "에이전트 선택 활성화 - 고급 사용자",
+        "no": "Aktiver agentvalg - Avanserte brukere",
+        "it": "Abilita selezione agente - Utenti avanzati",
+        "pt": "Ativar seleção de agente - Usuários avançados",
+        "es": "Habilitar selección de agente - Usuarios avanzados",
+        "ar": "تمكين اختيار الوكيل - المستخدمين المتقدمين",
+        "fr": "Activer la sélection d'agent - Utilisateurs avancés",
+        "tr": "Ajan Seçimini Etkinleştir - İleri Düzey Kullanıcılar",
+        "ja": "エージェント選択を有効化"
+    },
+    "SETTINGS$SECURITY_ANALYZER": {
+        "en": "Enable Security Analyzer",
+        "de": "Sicherheitsanalysator aktivieren",
+        "zh-CN": "启用安全分析器",
+        "zh-TW": "啟用安全分析器",
+        "ko-KR": "보안 분석기 활성화",
+        "no": "Aktiver sikkerhetsanalysator",
+        "it": "Abilita analizzatore di sicurezza",
+        "pt": "Ativar analisador de segurança",
+        "es": "Habilitar analizador de seguridad",
+        "ar": "تمكين محلل الأمان",
+        "fr": "Activer l'analyseur de sécurité",
+        "tr": "Güvenlik Analizörünü Etkinleştir",
+        "ja": "セキュリティアナライザー"
+    },
+    "PLANNER$EMPTY_MESSAGE": {
+        "en": "No plan created.",
+        "zh-CN": "计划未创建",
+        "zh-TW": "未創建任何計劃。",
+        "de": "Kein Plan erstellt.",
+        "ko-KR": "생성된 계획이 없습니다.",
+        "no": "Ingen plan opprettet.",
+        "it": "Nessun piano creato.",
+        "pt": "Nenhum plano criado.",
+        "es": "Ningún plan creado.",
+        "ar": "لم يتم إنشاء أي خطة.",
+        "fr": "Aucun plan créé.",
+        "tr": "Plan oluşturulmadı.",
+        "ja": "プランナーは空です"
+    },
+    "FEEDBACK$PUBLIC_LABEL": {
+        "en": "Public",
+        "zh-CN": "公开",
+        "zh-TW": "公開",
+        "de": "Öffentlich",
+        "ko-KR": "공개",
+        "no": "Offentlig",
+        "it": "Pubblico",
+        "pt": "Público",
+        "es": "Público",
+        "ar": "عام",
+        "fr": "Public",
+        "tr": "Herkese Açık",
+        "ja": "公開"
+    },
+    "FEEDBACK$PRIVATE_LABEL": {
+        "en": "Private",
+        "zh-CN": "私有",
+        "zh-TW": "私有",
+        "de": "Privat",
+        "ko-KR": "비공개",
+        "no": "Privat",
+        "it": "Privato",
+        "pt": "Privado",
+        "es": "Privado",
+        "ar": "خاص",
+        "fr": "Privé",
+        "tr": "Özel",
+        "ja": "非公開"
+    },
+    "STATUS$STARTING_RUNTIME": {
+        "en": "Starting Runtime...",
+        "zh-CN": "启动运行时...",
+        "zh-TW": "啟動運行時...",
+        "de": "Laufzeitumgebung wird gestartet...",
+        "ko-KR": "런타임 시작 중...",
+        "no": "Starter kjøretidsmiljø...",
+        "it": "Avvio dell'ambiente di esecuzione...",
+        "pt": "Iniciando o ambiente de execução...",
+        "es": "Iniciando el entorno de ejecución...",
+        "ar": "جارٍ بدء بيئة التشغيل...",
+        "fr": "Démarrage de l'environnement d'exécution...",
+        "tr": "Çalışma zamanı başlatılıyor...",
+        "ja": "ランタイムを開始中"
+    },
+    "STATUS$STARTING_CONTAINER": {
+        "en": "Preparing container, this might take a few minutes...",
+        "zh-CN": "正在准备容器，这可能需要几分钟...",
+        "zh-TW": "正在準備容器，這可能需要幾分鐘...",
+        "de": "Container wird vorbereitet, dies kann einige Minuten dauern...",
+        "ko-KR": "컨테이너를 준비 중입니다. 몇 분 정도 걸릴 수 있습니다...",
+        "no": "Forbereder container, dette kan ta noen minutter...",
+        "it": "Preparazione del container in corso, potrebbe richiedere alcuni minuti...",
+        "pt": "Preparando o container, isso pode levar alguns minutos...",
+        "es": "Preparando el contenedor, esto puede tardar unos minutos...",
+        "ar": "جارٍ إعداد الحاوية، قد يستغرق هذا بضع دقائق...",
+        "fr": "Préparation du conteneur, cela peut prendre quelques minutes...",
+        "tr": "Konteyner hazırlanıyor, bu işlem birkaç dakika sürebilir...",
+        "ja": "コンテナを開始中"
+    },
+    "STATUS$PREPARING_CONTAINER": {
+        "en": "Preparing to start container...",
+        "zh-CN": "正在准备启动容器...",
+        "zh-TW": "正在準備啟動容器...",
+        "de": "Vorbereitung zum Starten des Containers...",
+        "ko-KR": "컨테이너 시작 준비 중...",
+        "no": "Forbereder å starte container...",
+        "it": "Preparazione all'avvio del container...",
+        "pt": "Preparando para iniciar o container...",
+        "es": "Preparando para iniciar el contenedor...",
+        "ar": "جارٍ التحضير لبدء الحاوية...",
+        "fr": "Préparation du démarrage du conteneur...",
+        "tr": "Konteyner başlatılmaya hazırlanıyor...",
+        "ja": "コンテナを準備中"
+    },
+    "STATUS$CONTAINER_STARTED": {
+        "en": "Container started.",
+        "zh-CN": "容器已启动。",
+        "zh-TW": "容器已啟動。",
+        "de": "Container gestartet.",
+        "ko-KR": "컨테이너가 시작되었습니다.",
+        "no": "Container startet.",
+        "it": "Container avviato.",
+        "pt": "Container iniciado.",
+        "es": "Contenedor iniciado.",
+        "ar": "تم بدء الحاوية.",
+        "fr": "Conteneur démarré.",
+        "tr": "Konteyner başlatıldı.",
+        "ja": "コンテナが開始されました"
+    },
+    "ACCOUNT_SETTINGS_MODAL$DISCONNECT": {
+        "en": "Disconnect",
+        "es": "Desconectar",
+        "zh-CN": "断开连接",
+        "zh-TW": "中斷連線",
+        "ko-KR": "연결 해제",
+        "ja": "切断",
+        "no": "Koble fra",
+        "ar": "قطع الاتصال",
+        "de": "Trennen",
+        "fr": "Déconnecter",
+        "it": "Disconnetti",
+        "pt": "Desconectar",
+        "tr": "Bağlantıyı kes"
+    },
+    "ACCOUNT_SETTINGS_MODAL$SAVE": {
+        "en": "Save",
+        "es": "Guardar",
+        "zh-CN": "保存",
+        "zh-TW": "儲存",
+        "ko-KR": "저장",
+        "ja": "保存",
+        "no": "Lagre",
+        "ar": "حفظ",
+        "de": "Speichern",
+        "fr": "Enregistrer",
+        "it": "Salva",
+        "pt": "Salvar",
+        "tr": "Kaydet"
+    },
+    "ACCOUNT_SETTINGS_MODAL$CLOSE": {
+        "en": "Close",
+        "es": "Cerrar",
+        "zh-CN": "关闭",
+        "zh-TW": "關閉",
+        "ko-KR": "닫기",
+        "ja": "閉じる",
+        "no": "Lukk",
+        "ar": "إغلاق",
+        "de": "Schließen",
+        "fr": "Fermer",
+        "it": "Chiudi",
+        "pt": "Fechar",
+        "tr": "Kapat"
+    },
+    "ACCOUNT_SETTINGS_MODAL$GITHUB_TOKEN_INVALID": {
+        "en": "GitHub token is invalid. Please try again.",
+        "es": "El token de GitHub no es válido. Por favor, inténtelo de nuevo.",
+        "zh-CN": "GitHub令牌无效。请重试。",
+        "zh-TW": "GitHub權杖無效",
+        "ko-KR": "GitHub 토큰이 유효하지 않습니다",
+        "ja": "GitHubトークンが無効です",
+        "no": "GitHub-token er ugyldig. Vennligst prøv igjen.",
+        "ar": "رمز GitHub غير صالح. يرجى المحاولة مرة أخرى.",
+        "de": "GitHub-Token ist ungültig. Bitte versuchen Sie es erneut.",
+        "fr": "Le jeton GitHub n'est pas valide. Veuillez réessayer.",
+        "it": "Il token GitHub non è valido. Per favore riprova.",
+        "pt": "O token do GitHub é inválido. Por favor, tente novamente.",
+        "tr": "GitHub token'ı geçersiz. Lütfen tekrar deneyin."
+    },
+    "CONNECT_TO_GITHUB_MODAL$GET_YOUR_TOKEN": {
+        "en": "Get your token",
+        "es": "Obten tu token",
+        "zh-CN": "获取您的令牌",
+        "zh-TW": "取得您的權杖",
+        "ko-KR": "토큰 받기",
+        "ja": "トークンを取得",
+        "no": "Få din token",
+        "ar": "احصل على الرمز الخاص بك",
+        "de": "Holen Sie sich Ihren Token",
+        "fr": "Obtenez votre jeton",
+        "it": "Ottieni il tuo token",
+        "pt": "Obtenha seu token",
+        "tr": "Token'ınızı alın"
+    },
+    "CONNECT_TO_GITHUB_MODAL$HERE": {
+        "en": "here",
+        "es": "aquí",
+        "zh-CN": "这里",
+        "zh-TW": "這裡",
+        "ko-KR": "여기",
+        "ja": "こちら",
+        "no": "her",
+        "ar": "هنا",
+        "de": "hier",
+        "fr": "ici",
+        "it": "qui",
+        "pt": "aqui",
+        "tr": "burada"
+    },
+    "CONNECT_TO_GITHUB_MODAL$CONNECT": {
+        "en": "Connect",
+        "es": "Conectar",
+        "zh-CN": "连接",
+        "zh-TW": "連線",
+        "no": "Koble til",
+        "ar": "اتصال",
+        "de": "Verbinden",
+        "fr": "Connecter",
+        "it": "Connetti",
+        "pt": "Conectar",
+        "tr": "Bağlan",
+        "ko-KR": "연결",
+        "ja": "接続"
+    },
+    "CONNECT_TO_GITHUB_MODAL$CLOSE": {
+        "en": "Close",
+        "es": "Cerrar",
+        "zh-CN": "关闭",
+        "zh-TW": "關閉",
+        "ko-KR": "닫기",
+        "ja": "閉じる",
+        "no": "Lukk",
+        "ar": "إغلاق",
+        "de": "Schließen",
+        "fr": "Fermer",
+        "it": "Chiudi",
+        "pt": "Fechar",
+        "tr": "Kapat"
+    },
+    "CONNECT_TO_GITHUB_BY_TOKEN_MODAL$BY_CONNECTING_YOU_AGREE": {
+        "en": "By connecting you agree to our",
+        "es": "Al conectarte tu aceptas nuestros",
+        "zh-CN": "连接即表示您同意",
+        "zh-TW": "連線即表示您同意",
+        "ko-KR": "연결함으로써 귀하는 우리의",
+        "ja": "接続することで、あなたは当社の",
+        "no": "Ved å koble til godtar du våre",
+        "ar": "بالاتصال فإنك توافق على",
+        "de": "Durch die Verbindung stimmen Sie unseren",
+        "fr": "En vous connectant, vous acceptez nos",
+        "it": "Connettendoti accetti i nostri",
+        "pt": "Ao conectar você concorda com nossos",
+        "tr": "Bağlanarak kabul etmiş olursunuz"
+    },
+    "CONNECT_TO_GITHUB_BY_TOKEN_MODAL$CONTINUE": {
+        "en": "Continue",
+        "es": "Continuar",
+        "zh-CN": "继续",
+        "zh-TW": "繼續",
+        "ko-KR": "계속",
+        "ja": "続行",
+        "no": "Fortsett",
+        "ar": "متابعة",
+        "de": "Fortfahren",
+        "fr": "Continuer",
+        "it": "Continua",
+        "pt": "Continuar",
+        "tr": "Devam et"
+    },
+    "LOADING_PROJECT$LOADING": {
+        "en": "Loading...",
+        "es": "Cargando...",
+        "zh-CN": "加载中...",
+        "zh-TW": "載入中...",
+        "ko-KR": "로딩 중...",
+        "ja": "読み込み中...",
+        "no": "Laster...",
+        "ar": "جارٍ التحميل...",
+        "de": "Wird geladen...",
+        "fr": "Chargement...",
+        "it": "Caricamento...",
+        "pt": "Carregando...",
+        "tr": "Yükleniyor..."
+    },
+    "CUSTOM_INPUT$OPTIONAL_LABEL": {
+        "en": "(Optional)",
+        "es": "(Opcional)",
+        "zh-CN": "可选",
+        "zh-TW": "選填",
+        "ko-KR": "선택사항",
+        "ja": "任意",
+        "no": "(Valgfritt)",
+        "ar": "(اختياري)",
+        "de": "(Optional)",
+        "fr": "(Facultatif)",
+        "it": "(Opzionale)",
+        "pt": "(Opcional)",
+        "tr": "(İsteğe bağlı)"
+    },
+    "SETTINGS_FORM$CUSTOM_MODEL_LABEL": {
+        "en": "Custom Model",
+        "es": "Modelo personalizado",
+        "zh-CN": "自定义模型",
+        "zh-TW": "自訂模型",
+        "ko-KR": "사용자 정의 모델",
+        "ja": "カスタムモデル",
+        "no": "Tilpasset modell",
+        "ar": "نموذج مخصص",
+        "de": "Benutzerdefiniertes Modell",
+        "fr": "Modèle personnalisé",
+        "it": "Modello personalizzato",
+        "pt": "Modelo personalizado",
+        "tr": "Özel model"
+    },
+    "SETTINGS_FORM$BASE_URL_LABEL": {
+        "en": "Base URL",
+        "es": "URL base",
+        "zh-CN": "基础URL",
+        "zh-TW": "基礎URL",
+        "ko-KR": "기본 URL",
+        "ja": "ベースURL",
+        "no": "Base URL",
+        "ar": "عنوان URL الأساسي",
+        "de": "Basis-URL",
+        "fr": "URL de base",
+        "it": "URL di base",
+        "pt": "URL base",
+        "tr": "Temel URL"
+    },
+    "SETTINGS_FORM$API_KEY_LABEL": {
+        "en": "API Key",
+        "es": "API Key",
+        "zh-CN": "API密钥",
+        "zh-TW": "API金鑰",
+        "ko-KR": "API 키",
+        "ja": "APIキー",
+        "no": "API-nøkkel",
+        "ar": "مفتاح API",
+        "de": "API-Schlüssel",
+        "fr": "Clé API",
+        "it": "Chiave API",
+        "pt": "Chave API",
+        "tr": "API Anahtarı"
+    },
+    "SETTINGS_FORM$DONT_KNOW_API_KEY_LABEL": {
+        "en": "Don't know your API key?",
+        "es": "¿No sabes tu API key?",
+        "zh-CN": "不知道您的API密钥？",
+        "zh-TW": "不知道您的API金鑰？",
+        "ko-KR": "API 키를 모르시나요?",
+        "ja": "APIキーがわかりませんか？",
+        "no": "Kjenner du ikke API-nøkkelen din?",
+        "ar": "لا تعرف مفتاح API الخاص بك؟",
+        "de": "Kennen Sie Ihren API-Schlüssel nicht?",
+        "fr": "Vous ne connaissez pas votre clé API ?",
+        "it": "Non conosci la tua chiave API?",
+        "pt": "Não sabe sua chave API?",
+        "tr": "API anahtarınızı bilmiyor musunuz?"
+    },
+    "SETTINGS_FORM$CLICK_HERE_FOR_INSTRUCTIONS_LABEL": {
+        "en": "Click here for instructions",
+        "es": "Clic aquí para instrucciones",
+        "zh-CN": "点击这里查看说明",
+        "zh-TW": "點擊這裡查看說明",
+        "ko-KR": "설명을 보려면 여기를 클릭하세요",
+        "ja": "説明を見るにはここをクリック",
+        "no": "Klikk her for instruksjoner",
+        "ar": "انقر هنا للتعليمات",
+        "de": "Klicken Sie hier für Anweisungen",
+        "fr": "Cliquez ici pour les instructions",
+        "it": "Clicca qui per le istruzioni",
+        "pt": "Clique aqui para instruções",
+        "tr": "Talimatlar için buraya tıklayın"
+    },
+    "SETTINGS_FORM$AGENT_LABEL": {
+        "en": "Agent",
+        "es": "Agente",
+        "zh-CN": "代理",
+        "zh-TW": "代理",
+        "ko-KR": "에이전트",
+        "ja": "エージェント",
+        "no": "Agent",
+        "ar": "الوكيل",
+        "de": "Agent",
+        "fr": "Agent",
+        "it": "Agente",
+        "pt": "Agente",
+        "tr": "Ajan"
+    },
+    "SETTINGS_FORM$SECURITY_ANALYZER_LABEL": {
+        "en": "Security Analyzer (Optional)",
+        "es": "Analizador de seguridad (opcional)",
+        "zh-CN": "安全分析器",
+        "zh-TW": "安全分析器",
+        "ko-KR": "보안 분석기",
+        "ja": "セキュリティアナライザー",
+        "no": "Sikkerhetsanalysator (valgfritt)",
+        "ar": "محلل الأمان (اختياري)",
+        "de": "Sicherheitsanalyse (Optional)",
+        "fr": "Analyseur de sécurité (Facultatif)",
+        "it": "Analizzatore di sicurezza (Opzionale)",
+        "pt": "Analisador de segurança (Opcional)",
+        "tr": "Güvenlik Analizörü (İsteğe bağlı)"
+    },
+    "SETTINGS_FORM$ENABLE_CONFIRMATION_MODE_LABEL": {
+        "en": "Enable Confirmation Mode",
+        "es": "Habilitar modo de confirmación",
+        "zh-CN": "启用确认模式",
+        "zh-TW": "啟用確認模式",
+        "ko-KR": "확인 모드 활성화",
+        "ja": "確認モードを有効化",
+        "no": "Aktiver bekreftelsesmodus",
+        "ar": "تمكين وضع التأكيد",
+        "de": "Bestätigungsmodus aktivieren",
+        "fr": "Activer le mode de confirmation",
+        "it": "Abilita modalità di conferma",
+        "pt": "Ativar modo de confirmação",
+        "tr": "Onay modunu etkinleştir"
+    },
+    "SETTINGS_FORM$SAVE_LABEL": {
+        "en": "Save",
+        "es": "Guardar",
+        "zh-CN": "保存",
+        "zh-TW": "儲存",
+        "ko-KR": "저장",
+        "ja": "保存",
+        "no": "Lagre",
+        "ar": "حفظ",
+        "de": "Speichern",
+        "fr": "Enregistrer",
+        "it": "Salva",
+        "pt": "Salvar",
+        "tr": "Kaydet"
+    },
+    "SETTINGS_FORM$CLOSE_LABEL": {
+        "en": "Close",
+        "es": "Cerrar",
+        "zh-CN": "关闭",
+        "zh-TW": "關閉",
+        "ko-KR": "닫기",
+        "ja": "閉じる",
+        "no": "Lukk",
+        "ar": "إغلاق",
+        "de": "Schließen",
+        "fr": "Fermer",
+        "it": "Chiudi",
+        "pt": "Fechar",
+        "tr": "Kapat"
+    },
+    "SETTINGS_FORM$RESET_TO_DEFAULTS_LABEL": {
+        "en": "Reset to defaults",
+        "es": "Reiniciar valores por defect",
+        "zh-CN": "重置为默认值",
+        "zh-TW": "重置為預設值",
+        "ko-KR": "기본값으로 재설정",
+        "ja": "デフォルトに戻す",
+        "no": "Tilbakestill til standardverdier",
+        "ar": "إعادة التعيين إلى الإعدادات الافتراضية",
+        "de": "Auf Standardwerte zurücksetzen",
+        "fr": "Réinitialiser aux valeurs par défaut",
+        "it": "Ripristina valori predefiniti",
+        "pt": "Restaurar padrões",
+        "tr": "Varsayılanlara sıfırla"
+    },
+    "SETTINGS_FORM$CANCEL_LABEL": {
+        "en": "Cancel",
+        "es": "Cancelar",
+        "zh-CN": "取消",
+        "zh-TW": "取消",
+        "ko-KR": "취소",
+        "ja": "キャンセル",
+        "no": "Avbryt",
+        "ar": "إلغاء",
+        "de": "Abbrechen",
+        "fr": "Annuler",
+        "it": "Annulla",
+        "pt": "Cancelar",
+        "tr": "İptal"
+    },
+    "SETTINGS_FORM$END_SESSION_LABEL": {
+        "en": "End Session",
+        "es": "Terminar sesión",
+        "zh-CN": "结束会话",
+        "zh-TW": "結束工作階段",
+        "ko-KR": "세션 종료",
+        "ja": "セッションを終了",
+        "no": "Avslutt økt",
+        "ar": "إنهاء الجلسة",
+        "de": "Sitzung beenden",
+        "fr": "Terminer la session",
+        "it": "Termina sessione",
+        "pt": "Encerrar sessão",
+        "tr": "Oturumu sonlandır"
+    },
+    "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?",
+        "zh-CN": "更改工作区将删除所有信息",
+        "zh-TW": "更改工作區將刪除所有資訊",
+        "ko-KR": "워크스페이스 변경 시 모든 정보가 삭제됩니다",
+        "ja": "ワークスペースを変更すると全ての情報が削除されます",
+        "no": "Å endre innstillingene vil tømme arbeidsområdet ditt og starte en ny økt. Er du sikker på at du vil fortsette?",
+        "ar": "سيؤدي تغيير الإعدادات إلى مسح مساحة العمل وبدء جلسة جديدة. هل أنت متأكد من أنك تريد المتابعة؟",
+        "de": "Wenn Sie Ihre Einstellungen ändern, wird Ihr Arbeitsbereich gelöscht und eine neue Sitzung gestartet. Möchten Sie wirklich fortfahren?",
+        "fr": "La modification de vos paramètres effacera votre espace de travail et démarrera une nouvelle session. Êtes-vous sûr de vouloir continuer ?",
+        "it": "La modifica delle impostazioni cancellerà il tuo spazio di lavoro e avvierà una nuova sessione. Sei sicuro di voler continuare?",
+        "pt": "Alterar suas configurações limpará seu espaço de trabalho e iniciará uma nova sessão. Tem certeza de que deseja continuar?",
+        "tr": "Ayarlarınızı değiştirmek çalışma alanınızı temizleyecek ve yeni bir oturum başlatacak. Devam etmek istediğinizden emin misiniz?"
+    },
+    "SETTINGS_FORM$ARE_YOU_SURE_LABEL": {
+        "en": "Are you sure?",
+        "es": "¿Estás seguro?",
+        "zh-CN": "确定吗？",
+        "zh-TW": "確定嗎？",
+        "ko-KR": "확실합니까?",
+        "ja": "よろしいですか？",
+        "no": "Er du sikker?",
+        "ar": "هل أنت متأكد؟",
+        "de": "Sind Sie sicher?",
+        "fr": "Êtes-vous sûr ?",
+        "it": "Sei sicuro?",
+        "pt": "Tem certeza?",
+        "tr": "Emin misiniz?"
+    },
+    "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",
+        "zh-CN": "所有信息将被删除",
+        "zh-TW": "所有資訊將被刪除",
+        "ko-KR": "모든 정보가 삭제됩니다",
+        "ja": "全ての情報が削除されます",
+        "no": "All lagret informasjon i AI-innstillingene dine vil bli slettet, inkludert API-nøkler.",
+        "ar": "سيتم حذف جميع المعلومات المحفوظة في إعدادات الذكاء الاصطناعي الخاصة بك، بما في ذلك أي مفاتيح API.",
+        "de": "Alle gespeicherten Informationen in Ihren KI-Einstellungen werden gelöscht, einschließlich aller API-Schlüssel.",
+        "fr": "Toutes les informations enregistrées dans vos paramètres d'IA seront supprimées, y compris les clés API.",
+        "it": "Tutte le informazioni salvate nelle tue impostazioni AI saranno eliminate, incluse le chiavi API.",
+        "pt": "Todas as informações salvas nas suas configurações de IA serão excluídas, incluindo quaisquer chaves API.",
+        "tr": "API anahtarları dahil olmak üzere AI ayarlarınızdaki tüm kayıtlı bilgiler silinecektir."
+    },
+    "PROJECT_MENU_DETAILS_PLACEHOLDER$NEW_PROJECT_LABEL": {
+        "en": "New Project",
+        "es": "Nuevo proyecto",
+        "zh-CN": "新项目",
+        "zh-TW": "新專案",
+        "ko-KR": "새 프로젝트",
+        "ja": "新規プロジェクト",
+        "no": "Nytt prosjekt",
+        "ar": "مشروع جديد",
+        "de": "Neues Projekt",
+        "fr": "Nouveau projet",
+        "it": "Nuovo progetto",
+        "pt": "Novo projeto",
+        "tr": "Yeni proje"
+    },
+    "PROJECT_MENU_DETAILS_PLACEHOLDER$CONNECT_TO_GITHUB": {
+        "en": "Connect to GitHub",
+        "zh-CN": "连接到GitHub",
+        "zh-TW": "連線到GitHub",
+        "ko-KR": "GitHub에 연결",
+        "ja": "GitHubに接続",
+        "no": "Koble til GitHub",
+        "ar": "الاتصال بـ GitHub",
+        "de": "Mit GitHub verbinden",
+        "fr": "Se connecter à GitHub",
+        "it": "Connetti a GitHub",
+        "pt": "Conectar ao GitHub",
+        "es": "Conectar a GitHub",
+        "tr": "GitHub'a bağlan"
+    },
+    "PROJECT_MENU_DETAILS_PLACEHOLDER$CONNECTED": {
+        "en": "Connected",
+        "zh-CN": "已连接",
+        "zh-TW": "已連線",
+        "ko-KR": "연결됨",
+        "ja": "接続済み",
+        "no": "Tilkoblet",
+        "ar": "متصل",
+        "de": "Verbunden",
+        "fr": "Connecté",
+        "it": "Connesso",
+        "pt": "Conectado",
+        "es": "Conectado",
+        "tr": "Bağlandı"
+    },
+    "PROJECT_MENU_DETAILS$AGO_LABEL": {
+        "en": "ago",
+        "es": "atrás",
+        "zh-CN": "前",
+        "zh-TW": "前",
+        "ko-KR": "전",
+        "ja": "前",
+        "no": "siden",
+        "ar": "منذ",
+        "de": "vor",
+        "fr": "il y a",
+        "it": "fa",
+        "pt": "atrás",
+        "tr": "önce"
+    },
+    "STATUS$ERROR_LLM_AUTHENTICATION": {
+        "en": "Error authenticating with the LLM provider. Please check your API key",
+        "es": "Error autenticando con el proveedor de LLM. Por favor revisa tu API key",
+        "zh-CN": "LLM认证错误",
+        "zh-TW": "LLM認證錯誤",
+        "ko-KR": "LLM 인증 오류",
+        "ja": "LLM認証エラー",
+        "no": "Feil ved autentisering med LLM-leverandøren. Vennligst sjekk API-nøkkelen din",
+        "ar": "خطأ في المصادقة مع مزود LLM. يرجى التحقق من مفتاح API الخاص بك",
+        "de": "Fehler bei der Authentifizierung mit dem LLM-Anbieter. Bitte überprüfen Sie Ihren API-Schlüssel",
+        "fr": "Erreur d'authentification auprès du fournisseur LLM. Veuillez vérifier votre clé API",
+        "it": "Errore di autenticazione con il provider LLM. Controlla la tua chiave API",
+        "pt": "Erro ao autenticar com o provedor LLM. Por favor, verifique sua chave API",
+        "tr": "LLM sağlayıcısı ile kimlik doğrulama hatası. Lütfen API anahtarınızı kontrol edin"
+    },
+    "STATUS$ERROR_RUNTIME_DISCONNECTED": {
+        "en": "There was an error while connecting to the runtime. Please refresh the page.",
+        "zh-CN": "运行时已断开连接",
+        "zh-TW": "執行環境已中斷連線",
+        "ko-KR": "런타임 연결 해제됨",
+        "ja": "ランタイムが切断されました",
+        "no": "Det oppstod en feil ved tilkobling til kjøretidsmiljøet. Vennligst oppdater siden.",
+        "ar": "حدث خطأ أثناء الاتصال بوقت التشغيل. يرجى تحديث الصفحة.",
+        "de": "Beim Verbinden mit der Laufzeitumgebung ist ein Fehler aufgetreten. Bitte aktualisieren Sie die Seite.",
+        "fr": "Une erreur s'est produite lors de la connexion à l'environnement d'exécution. Veuillez rafraîchir la page.",
+        "it": "Si è verificato un errore durante la connessione al runtime. Aggiorna la pagina.",
+        "pt": "Ocorreu um erro ao conectar ao ambiente de execução. Por favor, atualize a página.",
+        "es": "Hubo un error al conectar con el entorno de ejecución. Por favor, actualice la página.",
+        "tr": "Çalışma zamanına bağlanırken bir hata oluştu. Lütfen sayfayı yenileyin."
+    },
+    "AGENT_ERROR$BAD_ACTION": {
+        "en": "Agent tried to execute a malformed action.",
+        "zh-CN": "错误的操作",
+        "zh-TW": "錯誤的操作",
+        "ko-KR": "잘못된 작업",
+        "ja": "不正な操作",
+        "no": "Agenten prøvde å utføre en ugyldig handling",
+        "ar": "حاول الوكيل تنفيذ إجراء غير صحيح",
+        "de": "Der Agent versuchte, eine fehlerhafte Aktion auszuführen",
+        "fr": "L'agent a tenté d'exécuter une action malformée",
+        "it": "L'agente ha tentato di eseguire un'azione non valida",
+        "pt": "O agente tentou executar uma ação malformada",
+        "es": "El agente intentó ejecutar una acción malformada",
+        "tr": "Ajan hatalı bir eylem gerçekleştirmeye çalıştı"
+    },
+    "AGENT_ERROR$ACTION_TIMEOUT": {
+        "en": "Action timed out.",
+        "zh-CN": "操作超时",
+        "zh-TW": "操作逾時",
+        "ko-KR": "작업 시간 초과",
+        "ja": "操作がタイムアウトしました",
+        "no": "Handlingen ble tidsavbrutt",
+        "ar": "انتهت مهلة الإجراء",
+        "de": "Zeitüberschreitung bei der Aktion",
+        "fr": "L'action a expiré",
+        "it": "Azione scaduta",
+        "pt": "Ação expirou",
+        "es": "La acción expiró",
+        "tr": "İşlem zaman aşımına uğradı"
+    },
+    "PROJECT_MENU_CARD_CONTEXT_MENU$CONNECT_TO_GITHUB_LABEL": {
+        "en": "Connect to GitHub",
+        "es": "Conectar a GitHub",
+        "zh-CN": "连接到GitHub",
+        "zh-TW": "連線到GitHub",
+        "ko-KR": "GitHub에 연결",
+        "ja": "GitHubに接続",
+        "no": "Koble til GitHub",
+        "ar": "الاتصال بـ GitHub",
+        "de": "Mit GitHub verbinden",
+        "fr": "Se connecter à GitHub",
+        "it": "Connetti a GitHub",
+        "pt": "Conectar ao GitHub",
+        "tr": "GitHub'a bağlan"
+    },
+    "PROJECT_MENU_CARD_CONTEXT_MENU$PUSH_TO_GITHUB_LABEL": {
+        "en": "Push to GitHub",
+        "es": "Subir a GitHub",
+        "zh-CN": "推送到GitHub",
+        "zh-TW": "推送到GitHub",
+        "ko-KR": "GitHub에 푸시",
+        "ja": "GitHubにプッシュ",
+        "no": "Push til GitHub",
+        "ar": "دفع إلى GitHub",
+        "de": "Zu GitHub pushen",
+        "fr": "Pousser vers GitHub",
+        "it": "Invia a GitHub",
+        "pt": "Enviar para GitHub",
+        "tr": "GitHub'a gönder"
+    },
+    "PROJECT_MENU_CARD_CONTEXT_MENU$DOWNLOAD_FILES_LABEL": {
+        "en": "Download files",
+        "es": "Descargar archivos",
+        "zh-CN": "下载文件",
+        "zh-TW": "下載檔案",
+        "ko-KR": "파일 다운로드",
+        "ja": "ファイルをダウンロード",
+        "no": "Last ned filer",
+        "ar": "تنزيل الملفات",
+        "de": "Dateien herunterladen",
+        "fr": "Télécharger les fichiers",
+        "it": "Scarica file",
+        "pt": "Baixar arquivos",
+        "tr": "Dosyaları indir"
+    },
+    "PROJECT_MENU_CARD$OPEN": {
+        "en": "Open project menu",
+        "zh-CN": "打开",
+        "zh-TW": "開啟",
+        "ko-KR": "열기",
+        "ja": "開く",
+        "no": "Åpne prosjektmeny",
+        "ar": "فتح قائمة المشروع",
+        "de": "Projektmenü öffnen",
+        "fr": "Ouvrir le menu du projet",
+        "it": "Apri menu progetto",
+        "pt": "Abrir menu do projeto",
+        "es": "Abrir menú del proyecto",
+        "tr": "Proje menüsünü aç"
+    },
+    "ACTION_BUTTON$RESUME": {
+        "en": "Resume the agent task",
+        "zh-CN": "继续",
+        "zh-TW": "繼續",
+        "ko-KR": "재개",
+        "ja": "再開",
+        "no": "Fortsett agentoppgaven",
+        "ar": "استئناف مهمة الوكيل",
+        "de": "Agentenaufgabe fortsetzen",
+        "fr": "Reprendre la tâche de l'agent",
+        "it": "Riprendi il compito dell'agente",
+        "pt": "Retomar a tarefa do agente",
+        "es": "Reanudar la tarea del agente",
+        "tr": "Ajan görevine devam et"
+    },
+    "ACTION_BUTTON$PAUSE": {
+        "en": "Pause the current task",
+        "zh-CN": "暂停",
+        "zh-TW": "暫停",
+        "ko-KR": "일시정지",
+        "ja": "一時停止",
+        "no": "Sett gjeldende oppgave på pause",
+        "ar": "إيقاف المهمة الحالية مؤقتاً",
+        "de": "Aktuelle Aufgabe pausieren",
+        "fr": "Mettre en pause la tâche actuelle",
+        "it": "Metti in pausa il compito corrente",
+        "pt": "Pausar a tarefa atual",
+        "es": "Pausar la tarea actual",
+        "tr": "Mevcut görevi duraklat"
+    },
+    "BROWSER$SCREENSHOT_ALT": {
+        "en": "Browser Screenshot",
+        "zh-CN": "截图",
+        "zh-TW": "截圖",
+        "ko-KR": "스크린샷",
+        "ja": "スクリーンショット",
+        "no": "Nettleser skjermbilde",
+        "ar": "لقطة شاشة المتصفح",
+        "de": "Browser-Screenshot",
+        "fr": "Capture d'écran du navigateur",
+        "it": "Screenshot del browser",
+        "pt": "Captura de tela do navegador",
+        "es": "Captura de pantalla del navegador",
+        "tr": "Tarayıcı ekran görüntüsü"
+    },
+    "ERROR_TOAST$CLOSE_BUTTON_LABEL": {
+        "en": "Close",
+        "zh-CN": "关闭",
+        "zh-TW": "關閉",
+        "ko-KR": "닫기",
+        "ja": "閉じる",
+        "no": "Lukk",
+        "ar": "إغلاق",
+        "de": "Schließen",
+        "fr": "Fermer",
+        "it": "Chiudi",
+        "pt": "Fechar",
+        "es": "Cerrar",
+        "tr": "Kapat"
+    },
+    "FILE_EXPLORER$UPLOAD": {
+        "en": "Upload File",
+        "zh-CN": "上传",
+        "zh-TW": "上傳",
+        "ko-KR": "업로드",
+        "ja": "アップロード",
+        "no": "Last opp fil",
+        "ar": "تحميل ملف",
+        "de": "Datei hochladen",
+        "fr": "Téléverser un fichier",
+        "it": "Carica file",
+        "pt": "Enviar arquivo",
+        "es": "Subir archivo",
+        "tr": "Dosya yükle"
+    },
+    "FILE_EXPLORER$REFRESH_WORKSPACE": {
+        "en": "Refresh workspace",
+        "zh-CN": "刷新工作区",
+        "zh-TW": "重新整理工作區",
+        "ko-KR": "워크스페이스 새로고침",
+        "ja": "ワークスペースを更新",
+        "no": "Oppdater arbeidsområde",
+        "ar": "تحديث مساحة العمل",
+        "de": "Arbeitsbereich aktualisieren",
+        "fr": "Actualiser l'espace de travail",
+        "it": "Aggiorna area di lavoro",
+        "pt": "Atualizar área de trabalho",
+        "es": "Actualizar espacio de trabajo",
+        "tr": "Çalışma alanını yenile"
+    },
+    "FILE_EXPLORER$OPEN_WORKSPACE": {
+        "en": "Open workspace",
+        "zh-CN": "打开工作区",
+        "zh-TW": "開啟工作區",
+        "ko-KR": "워크스페이스 열기",
+        "ja": "ワークスペースを開く",
+        "no": "Åpne arbeidsområde",
+        "ar": "فتح مساحة العمل",
+        "de": "Arbeitsbereich öffnen",
+        "fr": "Ouvrir l'espace de travail",
+        "it": "Apri area di lavoro",
+        "pt": "Abrir área de trabalho",
+        "es": "Abrir espacio de trabajo",
+        "tr": "Çalışma alanını aç"
+    },
+    "FILE_EXPLORER$CLOSE_WORKSPACE": {
+        "en": "Close workspace",
+        "zh-CN": "关闭工作区",
+        "zh-TW": "關閉工作區",
+        "ko-KR": "워크스페이스 닫기",
+        "ja": "ワークスペースを閉じる",
+        "no": "Lukk arbeidsområde",
+        "ar": "إغلاق مساحة العمل",
+        "de": "Arbeitsbereich schließen",
+        "fr": "Fermer l'espace de travail",
+        "it": "Chiudi area di lavoro",
+        "pt": "Fechar área de trabalho",
+        "es": "Cerrar espacio de trabajo",
+        "tr": "Çalışma alanını kapat"
+    },
+    "ACTION_MESSAGE$RUN": {
+        "en": "Running a bash command",
+        "zh-CN": "运行",
+        "zh-TW": "執行",
+        "ko-KR": "실행",
+        "ja": "実行",
+        "no": "Kjører en bash-kommando",
+        "ar": "تشغيل أمر باش",
+        "de": "Führt einen Bash-Befehl aus",
+        "fr": "Exécution d'une commande bash",
+        "it": "Esecuzione di un comando bash",
+        "pt": "Executando um comando bash",
+        "es": "Ejecutando un comando bash",
+        "tr": "Bash komutu çalıştırılıyor"
+    },
+    "ACTION_MESSAGE$RUN_IPYTHON": {
+        "en": "Running a Python command",
+        "zh-CN": "运行IPython",
+        "zh-TW": "執行IPython",
+        "ko-KR": "IPython 실행",
+        "ja": "IPythonを実行",
+        "no": "Kjører en Python-kommando",
+        "ar": "تشغيل أمر Python",
+        "de": "Führt einen Python-Befehl aus",
+        "fr": "Exécution d'une commande Python",
+        "it": "Esecuzione di un comando Python",
+        "pt": "Executando um comando Python",
+        "es": "Ejecutando un comando Python",
+        "tr": "Python komutu çalıştırılıyor"
+    },
+    "ACTION_MESSAGE$READ": {
+        "en": "Reading the contents of a file",
+        "zh-CN": "读取",
+        "zh-TW": "讀取",
+        "ko-KR": "읽기",
+        "ja": "読み取り",
+        "no": "Leser innholdet i en fil",
+        "ar": "قراءة محتويات ملف",
+        "de": "Liest den Inhalt einer Datei",
+        "fr": "Lecture du contenu d'un fichier",
+        "it": "Lettura del contenuto di un file",
+        "pt": "Lendo o conteúdo de um arquivo",
+        "es": "Leyendo el contenido de un archivo",
+        "tr": "Dosya içeriği okunuyor"
+    },
+    "ACTION_MESSAGE$EDIT": {
+        "en": "Editing the contents of a file",
+        "zh-CN": "编辑",
+        "zh-TW": "編輯",
+        "ko-KR": "편집",
+        "ja": "編集",
+        "no": "Redigerer innholdet i en fil",
+        "ar": "تحرير محتويات ملف",
+        "de": "Bearbeitet den Inhalt einer Datei",
+        "fr": "Modification du contenu d'un fichier",
+        "it": "Modifica del contenuto di un file",
+        "pt": "Editando o conteúdo de um arquivo",
+        "es": "Editando el contenido de un archivo",
+        "tr": "Dosya içeriği düzenleniyor"
+    },
+    "ACTION_MESSAGE$WRITE": {
+        "en": "Writing to a file",
+        "zh-CN": "写入",
+        "zh-TW": "寫入",
+        "ko-KR": "쓰기",
+        "ja": "書き込み",
+        "no": "Skriver til en fil",
+        "ar": "الكتابة إلى ملف",
+        "de": "Schreibt in eine Datei",
+        "fr": "Écriture dans un fichier",
+        "it": "Scrittura su file",
+        "pt": "Escrevendo em um arquivo",
+        "es": "Escribiendo en un archivo",
+        "tr": "Dosyaya yazılıyor"
+    },
+    "ACTION_MESSAGE$BROWSE": {
+        "en": "Browsing the web",
+        "zh-CN": "浏览",
+        "zh-TW": "瀏覽",
+        "ko-KR": "탐색",
+        "ja": "閲覧",
+        "no": "Surfer på nettet",
+        "ar": "تصفح الويب",
+        "de": "Durchsucht das Web",
+        "fr": "Navigation sur le web",
+        "it": "Navigazione sul web",
+        "pt": "Navegando na web",
+        "es": "Navegando en la web",
+        "tr": "Web'de geziniyor"
+    },
+    "OBSERVATION_MESSAGE$RUN": {
+        "en": "Ran a bash command",
+        "zh-CN": "运行",
+        "zh-TW": "執行",
+        "ko-KR": "실행",
+        "ja": "実行",
+        "no": "Kjørte en bash-kommando",
+        "ar": "تم تشغيل أمر باش",
+        "de": "Führte einen Bash-Befehl aus",
+        "fr": "A exécuté une commande bash",
+        "it": "Ha eseguito un comando bash",
+        "pt": "Executou um comando bash",
+        "es": "Ejecutó un comando bash",
+        "tr": "Bash komutu çalıştırıldı"
+    },
+    "OBSERVATION_MESSAGE$RUN_IPYTHON": {
+        "en": "Ran a Python command",
+        "zh-CN": "运行IPython",
+        "zh-TW": "執行IPython",
+        "ko-KR": "IPython 실행",
+        "ja": "IPythonを実行",
+        "no": "Kjørte en Python-kommando",
+        "ar": "تم تشغيل أمر Python",
+        "de": "Führte einen Python-Befehl aus",
+        "fr": "A exécuté une commande Python",
+        "it": "Ha eseguito un comando Python",
+        "pt": "Executou um comando Python",
+        "es": "Ejecutó un comando Python",
+        "tr": "Python komutu çalıştırıldı"
+    },
+    "OBSERVATION_MESSAGE$READ": {
+        "en": "Read the contents of a file",
+        "zh-CN": "读取",
+        "zh-TW": "讀取",
+        "ko-KR": "읽기",
+        "ja": "読み取り",
+        "no": "Leste innholdet i en fil",
+        "ar": "تمت قراءة محتويات ملف",
+        "de": "Las den Inhalt einer Datei",
+        "fr": "A lu le contenu d'un fichier",
+        "it": "Ha letto il contenuto di un file",
+        "pt": "Leu o conteúdo de um arquivo",
+        "es": "Leyó el contenido de un archivo",
+        "tr": "Dosya içeriği okundu"
+    },
+    "OBSERVATION_MESSAGE$EDIT": {
+        "en": "Edited the contents of a file",
+        "zh-CN": "编辑",
+        "zh-TW": "編輯",
+        "ko-KR": "편집",
+        "ja": "編集",
+        "no": "Redigerte innholdet i en fil",
+        "ar": "تم تحرير محتويات ملف",
+        "de": "Hat den Inhalt einer Datei bearbeitet",
+        "fr": "A modifié le contenu d'un fichier",
+        "it": "Ha modificato il contenuto di un file",
+        "pt": "Editou o conteúdo de um arquivo",
+        "es": "Editó el contenido de un archivo",
+        "tr": "Dosya içeriği düzenlendi"
+    },
+    "OBSERVATION_MESSAGE$WRITE": {
+        "en": "Wrote to a file",
+        "zh-CN": "写入",
+        "zh-TW": "寫入",
+        "ko-KR": "쓰기",
+        "ja": "書き込み",
+        "no": "Skrev til en fil",
+        "ar": "تمت الكتابة إلى ملف",
+        "de": "Hat in eine Datei geschrieben",
+        "fr": "A écrit dans un fichier",
+        "it": "Ha scritto su un file",
+        "pt": "Escreveu em um arquivo",
+        "es": "Escribió en un archivo",
+        "tr": "Dosyaya yazıldı"
+    },
+    "OBSERVATION_MESSAGE$BROWSE": {
+        "en": "Browsing completed",
+        "zh-CN": "浏览",
+        "zh-TW": "瀏覽",
+        "ko-KR": "탐색",
+        "ja": "閲覧",
+        "no": "Surfing fullført",
+        "ar": "اكتمل التصفح",
+        "de": "Durchsuchen abgeschlossen",
+        "fr": "Navigation terminée",
+        "it": "Navigazione completata",
+        "pt": "Navegação concluída",
+        "es": "Navegación completada",
+        "tr": "Gezinme tamamlandı"
+    },
+    "EXPANDABLE_MESSAGE$SHOW_DETAILS": {
+        "en": "Show details",
+        "zh-CN": "显示详情",
+        "zh-TW": "顯示詳情",
+        "ko-KR": "상세 정보 표시",
+        "ja": "詳細を表示",
+        "no": "Vis detaljer",
+        "ar": "عرض التفاصيل",
+        "de": "Details anzeigen",
+        "fr": "Afficher les détails",
+        "it": "Mostra dettagli",
+        "pt": "Mostrar detalhes",
+        "es": "Mostrar detalles",
+        "tr": "Detayları göster"
+    },
+    "EXPANDABLE_MESSAGE$HIDE_DETAILS": {
+        "en": "Hide details",
+        "zh-CN": "隐藏详情",
+        "zh-TW": "隱藏詳情",
+        "ko-KR": "상세 정보 숨기기",
+        "ja": "詳細を非表示",
+        "no": "Skjul detaljer",
+        "ar": "إخفاء التفاصيل",
+        "de": "Details ausblenden",
+        "fr": "Masquer les détails",
+        "it": "Nascondi dettagli",
+        "pt": "Ocultar detalhes",
+        "es": "Ocultar detalles",
+        "tr": "Detayları gizle"
+    },
+    "SETTINGS$TITLE": {
+        "en": "AI Provider Configuration",
+        "ja": "AI プロバイダー設定",
+        "zh-CN": "AI 提供商配置",
+        "zh-TW": "AI 提供商配置",
+        "ko-KR": "AI 제공자 설정",
+        "no": "AI-leverandørkonfigurasjon",
+        "it": "Configurazione del provider AI",
+        "pt": "Configuração do provedor de IA",
+        "es": "Configuración del proveedor de IA",
+        "ar": "إعدادات مزود الذكاء الاصطناعي",
+        "fr": "Configuration du fournisseur d'IA",
+        "tr": "AI Sağlayıcı Yapılandırması",
+        "de": "Einstellungen"
+    },
+    "SETTINGS$DESCRIPTION": {
+        "en": "To continue, connect an OpenAI, Anthropic, or other LLM account",
+        "ja": "続行するには、OpenAI、Anthropic、または他のLLMアカウントを接続してください",
+        "zh-CN": "要继续，请连接 OpenAI、Anthropic 或其他 LLM 账户",
+        "zh-TW": "要繼續，請連接 OpenAI、Anthropic 或其他 LLM 帳戶",
+        "ko-KR": "계속하려면 OpenAI, Anthropic 또는 다른 LLM 계정을 연결하세요",
+        "no": "For å fortsette, koble til en OpenAI, Anthropic eller annen LLM-konto",
+        "it": "Per continuare, connetti un account OpenAI, Anthropic o altro LLM",
+        "pt": "Para continuar, conecte uma conta OpenAI, Anthropic ou outra LLM",
+        "es": "Para continuar, conecte una cuenta de OpenAI, Anthropic u otro LLM",
+        "ar": "للمتابعة، قم بتوصيل حساب OpenAI أو Anthropic أو حساب LLM آخر",
+        "fr": "Pour continuer, connectez un compte OpenAI, Anthropic ou autre LLM",
+        "tr": "Devam etmek için bir OpenAI, Anthropic veya başka bir LLM hesabı bağlayın",
+        "de": "Konfigurieren Sie Ihre OpenHands-Umgebung"
+    },
+    "SETTINGS$WARNING": {
+        "en": "Changing settings during an active session will end the session",
+        "ja": "アクティブなセッション中に設定を変更すると、セッションが終了します",
+        "zh-CN": "在活动会话期间更改设置将结束会话",
+        "zh-TW": "在活動會話期間更改設定將結束會話",
+        "ko-KR": "활성 세션 중 설정을 변경하면 세션이 종료됩니다",
+        "no": "Endring av innstillinger under en aktiv økt vil avslutte økten",
+        "it": "La modifica delle impostazioni durante una sessione attiva terminerà la sessione",
+        "pt": "Alterar as configurações durante uma sessão ativa encerrará a sessão",
+        "es": "Cambiar la configuración durante una sesión activa finalizará la sesión",
+        "ar": "سيؤدي تغيير الإعدادات أثناء جلسة نشطة إلى إنهاء الجلسة",
+        "fr": "La modification des paramètres pendant une session active mettra fin à la session",
+        "tr": "Aktif bir oturum sırasında ayarları değiştirmek oturumu sonlandıracaktır",
+        "de": "Einige Einstellungen können nicht geändert werden, während der Agent läuft"
+    },
+    "SIDEBAR$SETTINGS": {
+        "en": "Settings",
+        "ja": "設定",
+        "zh-CN": "设置",
+        "zh-TW": "設定",
+        "ko-KR": "설정",
+        "no": "Innstillinger",
+        "it": "Impostazioni",
+        "pt": "Configurações",
+        "es": "Configuración",
+        "ar": "الإعدادات",
+        "fr": "Paramètres",
+        "tr": "Ayarlar",
+        "de": "Einstellungen"
+    },
+    "SIDEBAR$DOCS": {
+        "en": "Documentation",
+        "ja": "ドキュメント",
+        "zh-CN": "文档",
+        "zh-TW": "文件",
+        "ko-KR": "문서",
+        "no": "Dokumentasjon",
+        "it": "Documentazione",
+        "pt": "Documentação",
+        "es": "Documentación",
+        "ar": "التوثيق",
+        "fr": "Documentation",
+        "tr": "Belgeler",
+        "de": "Dokumentation"
+    },
+    "SUGGESTIONS$ADD_DOCS": {
+        "en": "Add best practices docs for contributors",
+        "ja": "コントリビューター向けのベストプラクティスドキュメントを追加",
+        "zh-CN": "为贡献者添加最佳实践文档",
+        "zh-TW": "為貢獻者添加最佳實踐文檔",
+        "ko-KR": "기여자를 위한 모범 사례 문서 추가",
+        "no": "Legg til beste praksis dokumentasjon for bidragsytere",
+        "it": "Aggiungere documenti sulle migliori pratiche per i contributori",
+        "pt": "Adicionar documentação de melhores práticas para contribuidores",
+        "es": "Agregar documentación de mejores prácticas para contribuyentes",
+        "ar": "إضافة وثائق أفضل الممارسات للمساهمين",
+        "fr": "Ajouter des documents sur les meilleures pratiques pour les contributeurs",
+        "tr": "Katkıda bulunanlar için en iyi uygulama belgelerini ekle",
+        "de": "Dokumentation hinzufügen"
+    },
+    "SUGGESTIONS$ADD_DOCKERFILE": {
+        "en": "Add/improve a Dockerfile",
+        "ja": "Dockerfileを追加/改善",
+        "zh-CN": "添加/改进 Dockerfile",
+        "zh-TW": "添加/改進 Dockerfile",
+        "ko-KR": "Dockerfile 추가/개선",
+        "no": "Legg til/forbedre en Dockerfile",
+        "it": "Aggiungere/migliorare un Dockerfile",
+        "pt": "Adicionar/melhorar um Dockerfile",
+        "es": "Agregar/mejorar un Dockerfile",
+        "ar": "إضافة/تحسين ملف Docker",
+        "fr": "Ajouter/améliorer un Dockerfile",
+        "tr": "Dockerfile ekle/geliştir",
+        "de": "Dockerfile hinzufügen"
+    },
+    "STATUS$CONNECTED": {
+        "en": "Connected",
+        "ja": "接続済み",
+        "zh-CN": "已连接",
+        "zh-TW": "已連接",
+        "ko-KR": "연결됨",
+        "de": "Verbunden",
+        "no": "Tilkoblet",
+        "it": "Connesso",
+        "pt": "Conectado",
+        "es": "Conectado",
+        "ar": "متصل",
+        "fr": "Connecté",
+        "tr": "Bağlandı"
+    },
+    "BROWSER$EMPTY_MESSAGE": {
+        "en": "No page loaded.",
+        "zh-CN": "页面未加载",
+        "zh-TW": "未加載任何頁面。",
+        "de": "Keine Seite geladen.",
+        "ko-KR": "페이지가 로드되지 않았습니다.",
+        "no": "Ingen side lastet.",
+        "it": "Nessuna pagina caricata.",
+        "pt": "Nenhuma página carregada.",
+        "es": "Ninguna página cargada.",
+        "ar": "لم يتم تحميل أي صفحة.",
+        "fr": "Aucune page chargée.",
+        "tr": "Sayfa yüklenmedi.",
+        "ja": "ブラウザは空です"
+    },
+    "USER$AVATAR_PLACEHOLDER": {
+        "en": "user avatar placeholder",
+        "ja": "ユーザーアバターのプレースホルダー",
+        "zh-CN": "用户头像占位符",
+        "zh-TW": "使用者頭像佔位符",
+        "ko-KR": "사용자 아바타 플레이스홀더",
+        "fr": "espace réservé pour l'avatar de l'utilisateur",
+        "es": "marcador de posición del avatar del usuario",
+        "de": "Platzhalter für Benutzeravatar",
+        "it": "segnaposto avatar utente",
+        "pt": "espaço reservado para avatar do usuário",
+        "ar": "عنصر نائب لصورة المستخدم",
+        "no": "plassholder for brukeravatar",
+        "tr": "Kullanıcı avatarı yer tutucusu"
+    },
+    "ACCOUNT_SETTINGS$SETTINGS": {
+        "en": "Account Settings",
+        "ja": "アカウント設定",
+        "zh-CN": "账户设置",
+        "zh-TW": "帳戶設定",
+        "ko-KR": "계정 설정",
+        "no": "Kontoinnstillinger",
+        "it": "Impostazioni account",
+        "pt": "Configurações da conta",
+        "es": "Configuración de la cuenta",
+        "ar": "إعدادات الحساب",
+        "fr": "Paramètres du compte",
+        "tr": "Hesap ayarları",
+        "de": "Kontoeinstellungen"
+    },
+    "ACCOUNT_SETTINGS$LOGOUT": {
+        "en": "Logout",
+        "ja": "ログアウト",
+        "zh-CN": "退出登录",
+        "zh-TW": "登出",
+        "ko-KR": "로그아웃",
+        "no": "Logg ut",
+        "it": "Esci",
+        "pt": "Sair",
+        "es": "Cerrar sesión",
+        "ar": "تسجيل الخروج",
+        "fr": "Déconnexion",
+        "tr": "Çıkış yap",
+        "de": "Abmelden"
+    },
+    "SETTINGS_FORM$ADVANCED_OPTIONS_LABEL": {
+        "en": "Advanced Options",
+        "es": "Opciones avanzadas",
+        "ja": "詳細オプション",
+        "zh-CN": "高级选项",
+        "zh-TW": "進階選項",
+        "ko-KR": "고급 옵션",
+        "no": "Avanserte alternativer",
+        "ar": "خيارات متقدمة",
+        "de": "Erweiterte Optionen",
+        "fr": "Options avancées",
+        "it": "Opzioni avanzate",
+        "pt": "Opções avançadas",
+        "tr": "Gelişmiş seçenekler"
+    },
+    "CONVERSATION$NO_CONVERSATIONS": {
+        "en": "No conversations found",
+        "ja": "会話が見つかりません",
+        "zh-CN": "未找到对话",
+        "zh-TW": "未找到對話",
+        "ko-KR": "대화를 찾을 수 없습니다",
+        "fr": "Aucune conversation trouvée",
+        "es": "No se encontraron conversaciones",
+        "de": "Keine Gespräche gefunden",
+        "it": "Nessuna conversazione trovata",
+        "pt": "Nenhuma conversa encontrada",
+        "ar": "لم يتم العثور على محادثات",
+        "no": "Ingen samtaler funnet",
+        "tr": "Konuşma yok"
+    },
+    "LANDING$SELECT_REPO": {
+        "en": "Select a GitHub project",
+        "ja": "GitHubプロジェクトを選択",
+        "zh-CN": "选择GitHub项目",
+        "zh-TW": "選擇GitHub專案",
+        "ko-KR": "GitHub 프로젝트 선택",
+        "fr": "Sélectionner un projet GitHub",
+        "es": "Seleccionar un proyecto de GitHub",
+        "de": "Ein GitHub-Projekt auswählen",
+        "it": "Seleziona un progetto GitHub",
+        "pt": "Selecionar um projeto do GitHub",
+        "ar": "اختر مشروع GitHub",
+        "no": "Velg et GitHub-prosjekt",
+        "tr": "Depo seç"
+    },
+    "BUTTON$SEND": {
+        "en": "Send",
+        "ja": "送信",
+        "zh-CN": "发送",
+        "zh-TW": "發送",
+        "ko-KR": "보내기",
+        "fr": "Envoyer",
+        "es": "Enviar",
+        "de": "Senden",
+        "it": "Invia",
+        "pt": "Enviar",
+        "ar": "إرسال",
+        "no": "Send",
+        "tr": "Gönder"
+    },
+    "STATUS$WAITING_FOR_CLIENT": {
+        "en": "Waiting for client to become ready...",
+        "zh-CN": "等待客户端准备就绪...",
+        "zh-TW": "等待客戶端準備就緒...",
+        "de": "Warten auf Bereitschaft des Clients...",
+        "ko-KR": "클라이언트가 준비될 때까지 기다리는 중...",
+        "no": "Venter på at klienten skal bli klar...",
+        "it": "In attesa che il client sia pronto...",
+        "pt": "Aguardando o cliente ficar pronto...",
+        "es": "Esperando a que el cliente esté listo...",
+        "ar": "في انتظار جاهزية العميل...",
+        "fr": "En attente que le client soit prêt...",
+        "tr": "İstemcinin hazır olması bekleniyor...",
+        "ja": "クライアントの準備を待機中"
+    },
+    "SUGGESTIONS$WHAT_TO_BUILD": {
+        "en": "What do you want to build?",
+        "ja": "何を開発しますか？",
+        "zh-CN": "你想要构建什么？",
+        "zh-TW": "你想要建構什麼？",
+        "ko-KR": "무엇을 만들고 싶으신가요?",
+        "no": "Hva vil du bygge?",
+        "it": "Cosa vuoi costruire?",
+        "pt": "O que você quer construir?",
+        "es": "¿Qué quieres construir?",
+        "ar": "ماذا تريد أن تبني؟",
+        "fr": "Que voulez-vous construire ?",
+        "tr": "Ne inşa etmek istiyorsun?",
+        "de": "Was möchten Sie erstellen?"
+    }
 }
diff --git a/frontend/src/routes/_oh._index/route.tsx b/frontend/src/routes/_oh._index/route.tsx
index cd2478403803..ad84a4d4a840 100644
--- a/frontend/src/routes/_oh._index/route.tsx
+++ b/frontend/src/routes/_oh._index/route.tsx
@@ -1,6 +1,8 @@
 import React from "react";
 import { useDispatch } from "react-redux";
+import { useTranslation } from "react-i18next";
 import posthog from "posthog-js";
+import { I18nKey } from "#/i18n/declaration";
 import { setImportedProjectZip } from "#/state/initial-query-slice";
 import { convertZipToBase64 } from "#/utils/convert-zip-to-base64";
 import { useGitHubUser } from "#/hooks/query/use-github-user";
@@ -13,6 +15,7 @@ import { HeroHeading } from "#/components/shared/hero-heading";
 import { TaskForm } from "#/components/shared/task-form";
 
 function Home() {
+  const { t } = useTranslation();
   const { gitHubToken } = useAuth();
   const dispatch = useDispatch();
   const formRef = React.useRef<HTMLFormElement>(null);
@@ -62,12 +65,12 @@ function Home() {
       {latestConversation && (
         <div className="flex gap-4 w-full text-center mt-8">
           <p className="text-center w-full">
-            Or&nbsp;
+            {t(I18nKey.LANDING$OR)}&nbsp;
             <a
               className="underline"
               href={`/conversations/${latestConversation}`}
             >
-              jump back to your most recent conversation
+              {t(I18nKey.LANDING$RECENT_CONVERSATION)}
             </a>
           </p>
         </div>
diff --git a/frontend/src/routes/_oh.app/route.tsx b/frontend/src/routes/_oh.app/route.tsx
index ab3384f951ec..4bec92067d0b 100644
--- a/frontend/src/routes/_oh.app/route.tsx
+++ b/frontend/src/routes/_oh.app/route.tsx
@@ -3,6 +3,8 @@ import React from "react";
 import { Outlet } from "react-router";
 import { useDispatch, useSelector } from "react-redux";
 import toast from "react-hot-toast";
+import { useTranslation } from "react-i18next";
+import { I18nKey } from "#/i18n/declaration";
 import {
   ConversationProvider,
   useConversation,
@@ -37,6 +39,7 @@ import { useSettings } from "#/hooks/query/use-settings";
 import { MULTI_CONVERSATION_UI } from "#/utils/feature-flags";
 
 function AppContent() {
+  const { t } = useTranslation();
   const { gitHubToken } = useAuth();
   const { data: settings } = useSettings();
 
@@ -137,12 +140,20 @@ function AppContent() {
               <Container
                 className="h-full"
                 labels={[
-                  { label: "Workspace", to: "", icon: <CodeIcon /> },
-                  { label: "Jupyter", to: "jupyter", icon: <ListIcon /> },
+                  {
+                    label: t(I18nKey.WORKSPACE$TITLE),
+                    to: "",
+                    icon: <CodeIcon />,
+                  },
+                  {
+                    label: t(I18nKey.WORKSPACE$JUPYTER_TAB_LABEL),
+                    to: "jupyter",
+                    icon: <ListIcon />,
+                  },
                   {
                     label: (
                       <div className="flex items-center gap-1">
-                        Browser
+                        {t(I18nKey.WORKSPACE$BROWSER_TAB_LABEL)}
                         {updateCount > 0 && <CountBadge count={updateCount} />}
                       </div>
                     ),
diff --git a/frontend/src/utils/suggestions/non-repo-suggestions.ts b/frontend/src/utils/suggestions/non-repo-suggestions.ts
index d9cf04992ac1..e052d7797104 100644
--- a/frontend/src/utils/suggestions/non-repo-suggestions.ts
+++ b/frontend/src/utils/suggestions/non-repo-suggestions.ts
@@ -1,4 +1,6 @@
-const KEY_1 = "Build an app to view pull requests";
+import { I18nKey } from "#/i18n/declaration";
+
+const KEY_1 = I18nKey.LANDING$BUILD_APP_BUTTON;
 const VALUE_1 = `I want to create a React app to view all of the open pull
 requests that exist on all of my team's github repos. Here
 are some details:
@@ -15,7 +17,7 @@ are some details:
 When things are working, initialize a github repo, create
 a .gitignore file, and commit the changes.`;
 
-const KEY_2 = "Build a todo list application";
+const KEY_2 = I18nKey.SUGGESTIONS$TODO_APP;
 const VALUE_2 = `I want to create a VueJS app that allows me to:
 * See all the items on my todo list
 * add a new item to the list
@@ -28,7 +30,7 @@ This should be a client-only app with no backend. The list should persist in loc
 
 Please add tests for all of the above and make sure they pass`;
 
-const KEY_3 = "Write a bash script that shows the top story on Hacker News";
+const KEY_3 = I18nKey.SUGGESTIONS$HACKER_NEWS;
 const VALUE_3 = `Please write a bash script which displays the top story on Hacker News. It should show the title, the link, and the number of points.
 
 The script should only use tools that are widely available on unix systems, like curl and grep.`;
diff --git a/frontend/src/utils/suggestions/repo-suggestions.ts b/frontend/src/utils/suggestions/repo-suggestions.ts
index 156931948d85..2aa27caaada4 100644
--- a/frontend/src/utils/suggestions/repo-suggestions.ts
+++ b/frontend/src/utils/suggestions/repo-suggestions.ts
@@ -1,4 +1,4 @@
-const KEY_1 = "Increase my test coverage";
+const KEY_1 = "INCREASE_TEST_COVERAGE";
 const VALUE_1 = `I want to increase the test coverage of the repository in the current directory.
 
 Please investigate the repo to figure out what language is being used, and where tests are located, if there are any.
@@ -9,10 +9,10 @@ If there are existing tests, find a function or method which lacks adequate unit
 
 Make sure the tests pass before you finish.`;
 
-const KEY_2 = "Auto-merge Dependabot PRs";
+const KEY_2 = "AUTO_MERGE_PRS";
 const VALUE_2 = `Please add a GitHub action to this repository which automatically merges pull requests from Dependabot so long as the tests are passing.`;
 
-const KEY_3 = "Fix up my README";
+const KEY_3 = "FIX_README";
 const VALUE_3 = `Please look at the README and make the following improvements, if they make sense:
 * correct any typos that you find
 * add missing language annotations on codeblocks
@@ -22,7 +22,7 @@ const VALUE_3 = `Please look at the README and make the following improvements,
 
 If there are no obvious ways to improve the README, make at least one small change to make the wording clearer or friendlier`;
 
-const KEY_4 = "Clean up my dependencies";
+const KEY_4 = "CLEAN_DEPENDENCIES";
 const VALUE_4 = `Examine the dependencies of the current codebase. Make sure you can run the code and any tests.
 
 Then run any commands necessary to update all dependencies to the latest versions, and make sure the code continues to run correctly and the tests pass. If changes need to be made to the codebase, go ahead and make those changes. You can look up documentation for new versions using the browser if you need to.
@@ -31,10 +31,10 @@ If a particular dependency update is causing trouble (e.g. breaking changes that
 
 Additionally, if you're able to prune any dependencies that are obviously unused, please do so. You may use third party tools to check for unused dependencies.`;
 
-const KEY_5 = "Add best practices docs for contributors";
+const KEY_5 = "ADD_DOCS";
 const VALUE_5 = `Investigate the documentation in the root of the current repo. Please add a CODE_OF_CONDUCT.md and CONTRIBUTORS.md with good defaults if they are not present. Use information in the README to inform the CONTRIBUTORS doc. If there is no LICENSE currently in the repo, please add the Apache 2.0 license. Add links to all these documents into the README`;
 
-const KEY_6 = "Add/improve a Dockerfile";
+const KEY_6 = "ADD_DOCKERFILE";
 const VALUE_6 = `Investigate the current repo to understand the installation instructions. Then create a Dockerfile that runs the application, using best practices like arguments and multi-stage builds wherever appropriate.
 
 If there is an existing Dockerfile, and there are ways to improve it according to best practices, do so.`;
diff --git a/openhands/runtime/impl/docker/docker_runtime.py b/openhands/runtime/impl/docker/docker_runtime.py
index 852e50f617d1..f5962943b2c0 100644
--- a/openhands/runtime/impl/docker/docker_runtime.py
+++ b/openhands/runtime/impl/docker/docker_runtime.py
@@ -267,10 +267,7 @@ def _init_container(self):
                 environment=environment,
                 volumes=volumes,
                 device_requests=(
-                    [docker.types.DeviceRequest(
-                        capabilities=[['gpu']],
-                        count=-1
-                    )]
+                    [docker.types.DeviceRequest(capabilities=[['gpu']], count=-1)]
                     if self.config.sandbox.enable_gpu
                     else None
                 ),
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 000000000000..475d80ba0d6b
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,28 @@
+{
+  "name": "OpenHands",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "devDependencies": {
+        "husky": "^9.1.7"
+      }
+    },
+    "node_modules/husky": {
+      "version": "9.1.7",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+      "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "husky": "bin.js"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/typicode"
+      }
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 000000000000..8d3ecd7127b7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,5 @@
+{
+  "devDependencies": {
+    "husky": "^9.1.7"
+  }
+}


Code review comments:
path: package-lock.json
text: @user1:
Added by mistake, should remove

path: package.json
text: @user1:
Added by mistake, should remove

path: frontend/src/i18n/index.ts
text: @user1:
Are these changes necessary? They seem repetitive and it previously worked without them

diff_hunk: @@ -0,0 +1,47 @@
+import { render } from "@testing-library/react";
path: frontend/__tests__/utils/check-hardcoded-strings.test.tsx
text: @user2:
```suggestion
import { render, screen } from "@user1-library/react";
```

diff_hunk: @@ -0,0 +1,61 @@
+import { render, screen } from '@testing-library/react';
+import { describe, expect, it } from 'vitest';
+import { I18nextProvider } from 'react-i18next';
+import i18n, { AvailableLanguages } from '../../src/i18n';
+import { AccountSettingsContextMenu } from '../../src/components/features/context-menu/account-settings-context-menu';
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import translations from '../../src/i18n/translation.json';
+
+const queryClient = new QueryClient();
+
+const renderWithI18n = (component: React.ReactNode, language: string = 'en') => {
+  i18n.changeLanguage(language);
+  return render(
+    <QueryClientProvider client={queryClient}>
+      <I18nextProvider i18n={i18n}>
+        {component}
+      </I18nextProvider>
+    </QueryClientProvider>
+  );
+};
+
+describe('Translations', () => {
+  describe('Translation Coverage', () => {
path: frontend/__tests__/i18n/translations.test.tsx
text: @user1:
Nested describe, we can unpack to have under a single describe since there are no other describe suites present.

diff_hunk: @@ -0,0 +1,47 @@
+import { render } from "@testing-library/react";
+import { test, expect, describe, vi } from "vitest";
+import { InteractiveChatBox } from "#/components/features/chat/interactive-chat-box";
+import { ChatInput } from "#/components/features/chat/chat-input";
+
+// Mock react-i18next
+vi.mock("react-i18next", () => ({
+  useTranslation: () => ({
+    t: (key: string) => key,
+  }),
+}));
+
+describe("Check for hardcoded English strings", () => {
+  test("InteractiveChatBox should not have hardcoded English strings", () => {
+    const { container } = render(
+      <InteractiveChatBox
+        onSubmit={() => {}}
+        onStop={() => {}}
+      />
+    );
+
+    // Get all text content
+    const text = container.textContent;
+
+    // List of English strings that should be translated
+    const hardcodedStrings = [
+      "What do you want to build?",
+    ];
+
+    // Check each string
+    hardcodedStrings.forEach(str => {
+      expect(text).not.toContain(str);
+    });
+  });
+
+  test("ChatInput should use translation key for placeholder", () => {
+    const { container } = render(
+      <ChatInput
+        onSubmit={() => {}}
+      />
+    );
+
+    // The placeholder should be a translation key, not English text
+    const textarea = container.querySelector("textarea");
+    expect(textarea?.placeholder).toBe("SUGGESTIONS$WHAT_TO_BUILD");
path: frontend/__tests__/utils/check-hardcoded-strings.test.tsx
text: @user1:
```suggestion
    render(<ChatInput onSubmit={() => {}} />);
    screen.getByPlaceholderText("SUGGESTIONS$WHAT_TO_BUILD");
```