Skip to main content

Connectors

Connectors pull translatable content directly from the systems where it lives and push translations back, removing manual file shuffling.

Connector configuration

Available connectors​

  • TMS platforms: Phrase (Strings), Lokalise, Crowdin, XTM, XTRF, memoQ CMS, Plunet, Lionbridge
  • Code & content repos: GitHub, GitLab, SharePoint, SFTP
  • CMS / commerce: WordPress, Shopify, Adobe Experience Manager, Zendesk

Each connector lives under Connectors in the sidebar with its own configuration page for credentials, project mapping, and content selection. Every connector page includes a setup guide that covers where to create the source-system token, which scopes to grant, and whether admin consent is required. Newer connectors are marked Beta.

Typical flow​

  1. Configure the connector with API credentials for the source system.
  2. Browse and select the content to translate (e.g. a Phrase project, a GitHub branch's locale files, WordPress posts).
  3. Imported content becomes files in a LanguageOps project and goes through the normal translate → QA → review pipeline.
  4. Push the completed translations back to the source system from the same page.
tip

Connector credentials are stored per organisation. If a connector reports authentication errors after working previously, the source-system token has usually expired. Re-enter the credentials in the connector configuration.

Folder sync for GitHub and GitLab​

Folder sync keeps the translation files in a repository in step with a LanguageOps project, key by key. Use it for app and website strings. For documents (Markdown, Word, HTML) in a repository, use Import files once on the GitHub page and download the translated files from the editor.

Set it up​

  1. Open Connectors → GitHub (or GitLab), add a connection, then go to the Folder sync tab and click New folder sync.

  2. Pick the repository, the branch to sync, the source language and the target languages.

  3. Map the source files to where translations go. Start from a preset or write your own:

    Source filesTranslations go to
    locales/en/**/*.jsonlocales/{locale}/**/*.json
    app/src/main/res/values/strings.xmlapp/src/main/res/values-{android}/strings.xml
    **/en.lproj/*.strings**/{ios}.lproj/*.strings
    locale/messages.potlocale/{locale_underscore}/LC_MESSAGES/messages.po

    ** matches any folders and * any name; what they match in the source path is reused in the target path. Language placeholders: {locale} (pt-BR), {locale_underscore} (pt_BR), {lang} (pt), {android} (pt-rBR), {ios}. If your repository spells a language differently, add it under Language codes in file paths, for example pt-BR=pt_BR.

  4. Click Preview matching files to check which files match and where each translation will be written.

  5. Choose how to watch for changes: only when you click Sync now, every 10 minutes, or instantly with a webhook on push.

Supported files: JSON (nested, flat, i18next, Chrome messages.json), Flutter ARB, YAML (including Rails files with a language root key), gettext PO/POT, Android strings.xml, iOS .strings and Java .properties.

What a sync does​

  • New keys become new segments in the project. Changed keys are reset for translation; the previous translation is kept on the segment for reference. Removed keys are removed from the project.
  • On the first sync, translations already in the target files are read in, so nothing is translated twice.
  • New and changed keys are translated with AI, if that option is on. The AI sees each string's key (for example checkout.button.pay), developer comments from the file, length limits and, with code context on, a line showing where the code uses the key. That is how it tells a button from a title.
  • Changed or added words count toward the monthly word allowance, the same as an upload.

Screenshots​

If your repository has a folder of UI screenshots, enter it under Screenshot images, for example docs/screenshots/**/*.png (PNG, JPEG, WebP or GIF). Name each image after the key it shows:

ImageUsed for
checkout.button.pay.pngthe key checkout.button.pay
checkout/button.pay.pngthe same key: folders count as parts of the key
checkout.pngevery checkout.* key that has no image of its own
checkout.button.pay@2x.pngcheckout.button.pay (scale suffixes are ignored)

Matching ignores upper and lower case. For a file such as locales/en/checkout.json, a key button.pay also matches checkout.button.pay.png, and plural keys such as items_one use the image for items.

Each sync picks up new, changed and deleted images. Translators see the screenshot in the editor's preview pane, and the AI is shown it when it translates the key (turn off Show the screenshots to the AI to keep them for translators only). The sync history lists images that matched no key, so you can spot a misnamed file.

Automatic screenshots​

Instead of keeping screenshots by hand, let LanguageOps take them. Open Automatic screenshots in the folder sync settings and list the pages to capture, one per line. A staging site works best; the pages must be reachable from the internet.

https://staging.acme.com/
Checkout = https://staging.acme.com/cart | click: #coupon | wait_for: .coupon-form

A label before = names the screenshots. Steps after | run before the capture, for menus and dialogs: click: selector, hover: selector, fill: #field=text, press: Enter, wait_for: selector and wait: 500 (milliseconds). You can also give a Storybook address to capture every story, or only stories whose id or title matches a pattern such as checkout-*.

Each page is captured as desktop and/or mobile screens, scrolling down the page. LanguageOps finds where each key's text appears, keeps the screens that show at least one key, and highlights the string on them in the editor. The AI sees them too. Matching ignores upper and lower case, extra spaces and inline tags, and placeholders such as {name}, {{count}} or %s match whatever text the page shows. Text used by several keys is linked to all of them.

For pages behind a login, add headers (for example Authorization: Basic …) or cookies (session=…; add @staging.acme.com for a different site). They are stored encrypted and never shown again.

Click Capture screenshots on the folder sync, or choose to capture after each sync or every night. Each capture replaces the screens of the pages it captured. The history shows how many keys were found, and which pages could not be loaded.

Exact matches with a marker language. Enter a code such as en-XA under Marker language. Each push then also writes that language: the source text with an invisible marker in front of every string. Switch a staging build to that language and it looks exactly like the source, but every string tells LanguageOps its key, so even text shared by several keys is matched exactly.

note

The capture browser only connects to public internet addresses. Staging sites on a private network or VPN cannot be captured. Keys that only appear after more complex interactions need steps, or a Storybook story.

Pushing translations back​

Click Push translations (or turn on Open or update the pull request automatically). All changed target files go into one commit on the pull request branch (languageops/translations by default), and a pull request is opened if there isn't one already. Later pushes add commits to the same open pull request. Choose whether to push everything translated, or only reviewed or approved translations.

Keys without a translation are left out of the target file so the app falls back to the source language, unless you choose to copy the source text. Existing translations in the repository are kept.

:::note Current limits YAML comments are not kept when a YAML file is rewritten. Plural strings follow the forms of the source file, so languages with extra plural forms (Polish, Russian, Arabic) need those forms added by hand for now; PO files leave them empty and the push reports it. :::