{
  "name": "translate",
  "kind": "registry",
  "title": "Translate",
  "description": "Translate what you type, the selected text or the clipboard, with the language detected as you type. Alternatives, dictionary entries and romanisation included; uses Google Translate without a key, or DeepL with one.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "glyph": "󰗊",
      "bg": "blue"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/translate@v0.9.1",
  "source": "https://github.com/zcag/pal/tree/HEAD/extensions/translate",
  "commit": "63287e180ce349dac3aa87c68ce4c80bc42ad409",
  "manifest": {
    "name": "translate",
    "title": "Translate",
    "description": "Translate what you type, the selected text or the clipboard, with the language detected as you type. Alternatives, dictionary entries and romanisation included; uses Google Translate without a key, or DeepL with one.",
    "version": "0.1.0",
    "icon": {
      "tile": {
        "glyph": "󰗊",
        "bg": "blue"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "license": "MIT",
    "settings": [
      {
        "kind": "text",
        "id": "from",
        "label": "From",
        "description": "The source language as a code or a name (`en`, `turkish`); `auto` detects it. A prefix in the query (`en\u003etr`) overrides it once.",
        "placeholder": "auto",
        "default": "auto"
      },
      {
        "kind": "text",
        "id": "to",
        "label": "To",
        "description": "The target language as a code or a name; empty is the system language. Text already in it is translated the other way. A prefix (`tr:`, `\u003ede`) overrides it once.",
        "placeholder": "the system language",
        "default": ""
      },
      {
        "kind": "select",
        "id": "backend",
        "label": "Backend",
        "description": "Google is the web app's unofficial endpoint, no key, with alternatives and romanisation; DeepL needs a key (the free tier does) and answers the translation alone.",
        "options": [
          {
            "id": "google",
            "title": "Google Translate (no key, unofficial)"
          },
          {
            "id": "deepl",
            "title": "DeepL (needs a key)"
          }
        ],
        "default": "google"
      },
      {
        "kind": "secret",
        "id": "api_key",
        "required": true,
        "label": "DeepL API key",
        "only": {
          "backend": "deepl"
        },
        "description": "From deepl.com/your-account/keys; a free key ends in `:fx`. Only read when the backend is DeepL.",
        "placeholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:fx",
        "default": ""
      },
      {
        "kind": "boolean",
        "id": "speak",
        "label": "Speak on copy",
        "text": "Also read the translation aloud when Enter copies it (cmd+shift+s speaks either way)",
        "default": false
      }
    ],
    "store": {
      "tagline": "Translate typed, selected or copied text as you type",
      "category": "productivity",
      "features": [
        "Translates as you type, the source detected, into the language you set or the system's",
        "Name the target inline: `tr: hello`, `\u003ede hello`, `en\u003etr merhaba`; works at the root too",
        "With nothing typed, starts from the selected text or the newest clipboard text",
        "`enter` copies, `cmd+enter` pastes, `cmd+shift+s` reads it aloud; Swap translates the result back",
        "Alternatives, dictionary entries for a single word, and romanisation for non-Latin scripts",
        "Google Translate needs no key (unofficial, some networks are refused), or DeepL with a free key; a history of what you used"
      ],
      "permissions": [
        "network",
        "accessibility"
      ],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-translate.png",
          "caption": "hello world typed with the system language Turkish: the translation first, the detected language, the alternatives, Swap"
        },
        {
          "file": "2-prefix.png",
          "caption": "tr\u003een merhaba dünya. Nasılsın?: both ends named in the prefix; the detail pane shows both texts and the pair"
        },
        {
          "file": "3-romanisation.png",
          "caption": "\u003eja hello: the Japanese with its romanisation and the dictionary entry"
        },
        {
          "file": "4-actions.png",
          "caption": "What a translation can do: copy, paste, speak, the source, Google Translate"
        },
        {
          "file": "5-history.png",
          "caption": "Translation History: what was copied or spoken, newest first"
        }
      ],
      "actions": [
        {
          "title": "Copy",
          "description": "The translation onto the clipboard; with `speak` on, read aloud too.",
          "keys": "enter"
        },
        {
          "title": "Paste",
          "description": "Hides, then pastes the translation into the app in front.",
          "keys": "cmd+enter"
        },
        {
          "title": "Speak",
          "description": "Reads the row aloud in its language: `say` with a voice of that language on macOS, `spd-say` or `espeak` on Linux.",
          "keys": "cmd+shift+s"
        },
        {
          "title": "Copy the source text",
          "keys": "cmd+shift+c"
        },
        {
          "title": "Open in Google Translate",
          "description": "The pair and the text in the web app.",
          "keys": "cmd+o"
        },
        {
          "title": "Swap and translate",
          "description": "On the Swap row: the result translated back the other way.",
          "keys": "enter"
        },
        {
          "title": "Translate again",
          "description": "In the history: the entry's text translated afresh.",
          "keys": "cmd+t"
        },
        {
          "title": "Remove from history",
          "keys": "cmd+d"
        }
      ]
    },
    "palettes": {
      "translate": {
        "title": "Translate",
        "kind": "input",
        "inline": true,
        "match": "^\\s*(?:[a-z][a-z-]{1,24}\\s*\u003e\\s*[a-z][a-z-]{1,24}|\u003e[a-z][a-z-]{1,24}|[a-z][a-z-]{1,24}\\s*:)\\s+\\S",
        "description": "Type text and it is translated to the `to` language (or the system's) with the source detected; `tr: text`, `\u003ede text` or `en\u003etr text` name the ends once; nothing typed translates the selection, else the clipboard. At the root a prefixed query answers inline.",
        "keys": [
          {
            "keys": "enter",
            "title": "Copy the translation (on Swap: translate it back)"
          },
          {
            "keys": "cmd+enter",
            "title": "Paste the translation into the app in front"
          },
          {
            "keys": "cmd+shift+s",
            "title": "Speak the row aloud"
          },
          {
            "keys": "cmd+shift+c",
            "title": "Copy the source text"
          },
          {
            "keys": "cmd+o",
            "title": "Open in Google Translate"
          }
        ]
      },
      "history": {
        "title": "Translation History",
        "kind": "live",
        "description": "Translations you copied, pasted or spoke, newest first; Enter copies the translation again.",
        "keys": [
          {
            "keys": "enter",
            "title": "Copy the translation"
          },
          {
            "keys": "cmd+enter",
            "title": "Paste the translation"
          },
          {
            "keys": "cmd+shift+s",
            "title": "Speak it"
          },
          {
            "keys": "cmd+t",
            "title": "Translate the entry again"
          },
          {
            "keys": "cmd+shift+c",
            "title": "Copy the source text"
          },
          {
            "keys": "cmd+d",
            "title": "Remove the entry"
          }
        ]
      }
    }
  },
  "playable": false,
  "updated_at": "2026-09-30T01:45:08Z",
  "url": "https://pal.cagdas.io/extensions/translate",
  "tagline": "Translate typed, selected or copied text as you type",
  "category": "productivity",
  "screenshots": [
    "https://pal.cagdas.io/extensions/translate/screenshots/1-translate-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/1-translate.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/2-prefix-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/2-prefix.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/3-romanisation-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/3-romanisation.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/4-actions-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/4-actions.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/5-history-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/5-history.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/translate/screenshots/1-translate.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/2-prefix.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/3-romanisation.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/4-actions.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/5-history.png"
  ],
  "bar_screenshots": [],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/translate/screenshots/1-translate-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/2-prefix-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/3-romanisation-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/4-actions-dark.png",
    "https://pal.cagdas.io/extensions/translate/screenshots/5-history-dark.png"
  ],
  "bar_screenshots_dark": [],
  "has_bar": false,
  "bar_items": [],
  "has_links": false,
  "links": [],
  "multi": false,
  "has_readme": true
}
