Synclang Flow

Getting started

  1. Create a project in the app and set languages.
  2. Use the Synclang MCP server to bootstrap your project with a specific integration (e.g., React + i18next, Angular + Transloco/ngx-translate, Vue + vue-i18n, Node.js + i18next). MCP can scaffold configuration, export formats, and initial keys.
  3. Integrate translations in code using your chosen i18n library.
  4. Add and manage keys in the UI or via API, and keep them in sync with MCP.

Use the MCP server first

  • Create a project with a framework-specific integration and guided setup.
  • Configure export formats and directory structure for your framework.
  • Scan your repository to detect missing translation keys and automatically create them.
  • Generate draft translations to speed up localization work.
  • Keep code and translations in sync during development and refactors.

Integration: popular i18n libraries

  • React: i18next, react-intl
  • Angular: @ngx-translate/core, Transloco
  • Vue: vue-i18n
  • Node.js: i18next, polyglot.js
  • Mobile: Android string resources, iOS NSLocalizedString

i18next setup (TypeScript) with Synclang i18n API

Overview

Integrate i18next in a TypeScript application and load translations from the Synclang CDN. This approach is framework-agnostic, light-weight, and suitable for SPAs or micro-frontends. You initialise i18next once on app start, translate anywhere, and switch languages at runtime. The CDN serves immutable, cached JSON per locale so clients remain simple.

Steps

  • Install dependencies
  • Create an i18n initialiser file
  • Initialise i18next on app start
  • Translate strings in code
  • Switch language at runtime

File structure

src/
  i18n.ts

Prepare/Install

Installs i18next and the HTTP backend used to fetch translations from Synclang.

npm install i18next i18next-http-backend

Code configuration steps

Creates the i18n initialiser that points i18next at the Synclang CDN.

import i18next, { TFunction } from 'i18next';
import Backend from 'i18next-http-backend';

type InitOptions = {
  defaultLanguage: string;
  supportedLanguages: string[];
  workspaceId: string;
};

export async function initI18n(options: InitOptions): Promise<TFunction> {
  const loadPath = `https://cdn.synclang.com/${options.workspaceId}/json/{{lng}}`;
  await i18next
    .use(Backend)
    .init({
      lng: options.defaultLanguage,
      fallbackLng: options.defaultLanguage,
      supportedLngs: options.supportedLanguages,
      load: 'currentOnly',
      backend: { loadPath },
    });
  return i18next.t.bind(i18next);
}

Adds small helpers for translating and changing language.

export function t(key: string, vars?: Record<string, unknown>) {
  return i18next.t(key, vars as any) as string;
}

export function setLanguage(language: string) {
  return i18next.changeLanguage(language);
}

Examples/Usage

Initialises i18n on startup, then reads and switches translations.

import { initI18n, t, setLanguage } from './i18n';

await initI18n({
  defaultLanguage: 'en-GB',
  supportedLanguages: ['en-GB', 'es-ES'],
  workspaceId: 'YOUR_WORKSPACE_ID',
});

console.log(t('app.title'));
await setLanguage('es-ES');
console.log(t('app.title'));

Summary

In this guide, you installed i18next and its HTTP backend and pointed it at the Synclang CDN. You created a small initialiser and exported helpers to translate strings and change language. You initialised i18next on app start and verified translations and runtime language switching. The result is a lightweight setup powered by CDN-hosted locale data.

React + i18next (TypeScript)

Overview

Integrate React with i18next and fetch translations from the Synclang CDN. You initialise i18next with React bindings, wrap your app with the provider, and translate in components. The CDN delivers per-locale JSON so the client remains minimal. This guide focuses on client-side React apps using TypeScript.

Steps

  • Install dependencies
  • Create i18n initialiser
  • Register I18nextProvider in the root
  • Translate in components
  • Switch language at runtime

File structure

src/
  i18n.ts
  main.tsx
  App.tsx

Prepare/Install

Installs i18next for React and the HTTP backend.

npm install i18next react-i18next i18next-http-backend

Code configuration steps

Configures i18next with React bindings and Synclang CDN as the source.

import i18next from 'i18next';
import { initReactI18next } from 'react-i18next';
import HttpBackend from 'i18next-http-backend';

const WORKSPACE_UUID = import.meta.env.VITE_TL_WORKSPACE_UUID as string;

void i18next
  .use(HttpBackend)
  .use(initReactI18next)
  .init({
    lng: 'en-GB',
    fallbackLng: 'en-GB',
    supportedLngs: ['en-GB', 'es-ES'],
    interpolation: { escapeValue: false },
    backend: { loadPath: `https://cdn.synclang.com/${WORKSPACE_UUID}/json/{{lng}}` }
  });

Wraps the application with I18nextProvider so hooks/components can translate.

import React from 'react';
import ReactDOM from 'react-dom/client';
import { I18nextProvider } from 'react-i18next';
import i18next from './i18n';
import App from './App';

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <I18nextProvider i18n={i18next}>
      <App />
    </I18nextProvider>
  </React.StrictMode>
);

Examples/Usage

Translates a title and provides language switch buttons in a component.

import { useTranslation } from 'react-i18next';

export function WelcomeCard() {
  const { t, i18n } = useTranslation();
  return (
    <div>
      <h1>{t('welcome.title', { userName: 'Synclang' })}</h1>
      <button onClick={() => i18n.changeLanguage('es-ES')}>ES</button>
      <button onClick={() => i18n.changeLanguage('en-GB')}>EN</button>
    </div>
  );
}

Summary

You installed React bindings for i18next and configured a CDN-backed loader. You wrapped the application with I18nextProvider and translated keys directly in React components. Runtime language switching was demonstrated using the i18n instance. The result is a straightforward React setup with externalised translations served as JSON.

React + react-intl

Overview

Integrate React with react-intl, loading locale-specific message bundles from the Synclang CDN. You create a tiny loader, wrap the app with IntlProvider, and render messages declaratively or imperatively. This approach fits CSR apps and keeps message delivery via CDN JSON.

Steps

  • Install react-intl
  • Create a messages loader
  • Wrap the app with IntlProvider
  • Render messages in components
  • Change locale and reload messages

File structure

src/
  i18n.ts
  main.tsx
  App.tsx

Prepare/Install

Installs the react-intl runtime.

npm install react-intl

Code configuration steps

Adds a helper that fetches messages for the active locale from Synclang.

export type SupportedLocale = 'en-GB' | 'en-US' | 'pl-PL';

const WORKSPACE_UUID = '<WORKSPACE_UUID>';

export async function loadMessages(locale: SupportedLocale): Promise<Record<string, string>> {
  const url = `https://cdn.synclang.com/${WORKSPACE_UUID}/json/${locale}`;
  const res = await fetch(url, { cache: 'no-store' });
  if (!res.ok) throw new Error(`Failed to load messages: ${res.status}`);
  return await res.json();
}

Bootstraps React with IntlProvider and the loaded messages.

import React, { StrictMode, useEffect, useState } from 'react';
import { createRoot } from 'react-dom/client';
import { IntlProvider } from 'react-intl';
import App from './App';
import { loadMessages } from './i18n';

function Root() {
  const [locale, setLocale] = useState<'en-GB' | 'en-US' | 'pl-PL'>('en-GB');
  const [messages, setMessages] = useState<Record<string, string>>({});
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    setIsLoading(true);
    loadMessages(locale).then(setMessages).finally(() => setIsLoading(false));
  }, [locale]);

  if (isLoading) return <div>Loading…</div>;

  return (
    <IntlProvider locale={locale} defaultLocale="en-GB" messages={messages}>
      <App onChangeLocale={setLocale} />
    </IntlProvider>
  );
}

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <Root />
  </StrictMode>
);

Examples/Usage

Renders messages using the component API and the imperative API.

import React from 'react';
import { FormattedMessage, useIntl } from 'react-intl';

export default function App({ onChangeLocale }: { onChangeLocale: (l: string) => void }) {
  const intl = useIntl();
  const title = intl.formatMessage({ id: 'app.header.title', defaultMessage: 'Welcome' });
  return (
    <div>
      <h1>{title}</h1>
      <p><FormattedMessage id="app.cta.start" defaultMessage="Get started" /></p>
      <div>
        <button onClick={() => onChangeLocale('en-GB')}>English (GB)</button>
        <button onClick={() => onChangeLocale('en-US')}>English (US)</button>
        <button onClick={() => onChangeLocale('pl-PL')}>Polski</button>
      </div>
    </div>
  );
}

Summary

You installed react-intl and added a loader to retrieve per-locale messages from Synclang. You wrapped the application with IntlProvider and rendered messages using both component and imperative APIs. You switched the active locale and reloaded the appropriate bundle. The result is a clear, client-side integration that sources messages from the CDN.

Angular + i18next

Overview Integrate Angular with i18next and load translations from the Synclang CDN. You initialise i18next at app start via an APP_INITIALIZER, expose a small translation service, and translate in components. The CDN serves per-locale JSON, keeping clients fast and cache-friendly. This guide targets modern Angular with TypeScript. Steps

  • Install dependencies
  • Add environment variable for the workspace UUID
  • Create an i18n service that initialises i18next with HTTP backend
  • Register APP_INITIALIZER so i18n is ready before the app renders
  • Translate in components and switch language at runtime File structure src/app/ i18n/ i18n.service.ts app.config.ts app.component.ts Prepare/Install Installs i18next and the HTTP backend for fetching translations.
# Installs i18next core and the HTTP backend
npm install i18next i18next-http-backend

Code configuration steps Creates an Angular service that initialises i18next with the Synclang CDN backend.

// src/app/i18n/i18n.service.ts
import { Injectable } from '@angular/core';
import i18next, { TFunction } from 'i18next';
import HttpBackend from 'i18next-http-backend';

const WORKSPACE_UUID = (typeof window !== 'undefined'
  ? (window as any).TL_WORKSPACE_UUID
  : (globalThis as any).TL_WORKSPACE_UUID) as string;

@Injectable({ providedIn: 'root' })
export class I18nService {
  t: TFunction = i18next.t.bind(i18next);

  init(): Promise<TFunction> {
    return i18next
      .use(HttpBackend)
      .init({
        lng: 'en-GB',
        fallbackLng: 'en-GB',
        supportedLngs: ['en-GB', 'es-ES'],
        interpolation: { escapeValue: false },
        backend: { loadPath: `https://cdn.synclang.com/${WORKSPACE_UUID}/json/{{lng}}` },
      });
  }

  changeLanguage(lang: string): Promise<TFunction> {
    return i18next.changeLanguage(lang);
  }
}

Registers an APP_INITIALIZER so i18n is ready before the application renders.

// src/app/app.config.ts
import { ApplicationConfig, APP_INITIALIZER, inject } from '@angular/core';
import { provideRouter } from '@angular/router';
import { I18nService } from './i18n/i18n.service';

function initI18n() {
  const i18n = inject(I18nService);
  return () => i18n.init();
}

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter([]),
    { provide: APP_INITIALIZER, useFactory: initI18n, multi: true },
  ],
};

Examples/Usage Translates a title and provides language switch buttons in a component.

// src/app/app.component.ts
import { Component } from '@angular/core';
import { I18nService } from './i18n/i18n.service';

@Component({
  selector: 'app-root',
  standalone: true,
  template: `
    <main>
      <h1>{{ i18n.t('welcome.title', { userName: 'Synclang' }) }}</h1>
      <button (click)="i18n.changeLanguage('es-ES')">ES</button>
      <button (click)="i18n.changeLanguage('en-GB')">EN</button>
    </main>
  `,
})
export class AppComponent {
  constructor(public i18n: I18nService) {}
}

Summary You installed i18next and configured it to fetch translations from the Synclang CDN. The i18n service initialises via APP_INITIALIZER before the app renders, and components use the exposed translate function. Language switching is handled at runtime using the i18next API.

Next.js + next-i18next

Overview Integrate Next.js (App Router) with next-i18next and load translations from the Synclang CDN. You initialise i18next with the HTTP backend, wire it with next-i18next, and render translations in client components. The CDN serves per-locale JSON so the client stays lean and cache-friendly. This guide targets modern Next.js with TypeScript. Steps

  • Install dependencies
  • Add environment variable for the workspace
  • Create i18n initialiser with HTTP backend
  • Provide the i18n instance to the app
  • Translate in components and switch language File structure project/ next-i18next.config.js next.config.js app/ providers.tsx layout.tsx page.tsx i18n/ i18n.ts Prepare/Install Installs next-i18next, i18next, and the HTTP backend.
npm install next-i18next i18next i18next-http-backend

Add environment variable Defines the Synclang workspace UUID for the CDN loader.

# .env.local
NEXT_PUBLIC_TL_WORKSPACE_UUID=YOUR_WORKSPACE_UUID

Code configuration steps Configures next-i18next locales and defaults. Keep it minimal; loading is delegated to i18next-http-backend.

// next-i18next.config.js
/** @type {import('next-i18next').UserConfig} */
const config = {
  i18n: {
    defaultLocale: 'en-GB',
    locales: ['en-GB', 'es-ES'],
  },
  reloadOnPrerender: false,
};
module.exports = config;

Enables internationalised routing in Next.js (optional if already configured).

// next.config.js
const { i18n } = require('./next-i18next.config');
/** @type {import('next').NextConfig} */
const nextConfig = { i18n };
module.exports = nextConfig;

Initialises i18next with the HTTP backend pointing at the Synclang CDN.

// i18n/i18n.ts
'use client';
import i18next from 'i18next';
import HttpBackend from 'i18next-http-backend';
import { initReactI18next } from 'react-i18next';

const WORKSPACE_UUID = process.env.NEXT_PUBLIC_TL_WORKSPACE_UUID as string;

void i18next
  .use(HttpBackend)
  .use(initReactI18next)
  .init({
    lng: 'en-GB',
    fallbackLng: 'en-GB',
    supportedLngs: ['en-GB', 'es-ES'],
    interpolation: { escapeValue: false },
    backend: { loadPath: `https://cdn.synclang.com/${WORKSPACE_UUID}/json/{{lng}}` },
  });

export default i18next;

Provides the i18n instance to client components in the App Router.

// app/providers.tsx
'use client';
import { ReactNode } from 'react';
import { I18nextProvider } from 'react-i18next';
import i18next from '../i18n/i18n';

export default function Providers({ children }: { children: ReactNode }) {
  return <I18nextProvider i18n={i18next}>{children}</I18nextProvider>;
}

Registers the provider in the root layout.

// app/layout.tsx
import Providers from './providers';

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        <Providers>{children}</Providers>
      </body>
    </html>
  );
}

Examples/Usage Translates a title and provides language switch buttons in a client component.

// app/page.tsx
'use client';
import { useTranslation } from 'react-i18next';

export default function Page() {
  const { t, i18n } = useTranslation();
  return (
    <main>
      <h1>{t('welcome.title', { userName: 'Synclang' })}</h1>
      <button onClick={() => i18n.changeLanguage('es-ES')}>ES</button>
      <button onClick={() => i18n.changeLanguage('en-GB')}>EN</button>
    </main>
  );
}

Summary You installed next-i18next and configured i18next to fetch translations from the Synclang CDN. You provided the i18n instance to the App Router using a client-side provider and translated keys in a page component. Runtime language switching was demonstrated. The setup keeps translations externalised and cached as JSON per locale.

Angular + @ngx-translate/core

Overview

Integrate Angular with @ngx-translate/core and load translations from the Synclang CDN. You configure a standard HTTP loader, provide it at bootstrap, and translate keys in templates and components. This keeps Angular apps lightweight while sourcing locale data from the CDN.

Steps

  • Install dependencies
  • Create a TranslateHttpLoader factory
  • Provide TranslateModule with the loader
  • Translate in templates and components

File structure

src/
  i18n-loader.ts
  main.ts
  app/
    welcome/
      welcome.component.ts
      welcome.component.html

Prepare/Install

Installs the translation library and the HTTP loader.

npm install @ngx-translate/core @ngx-translate/http-loader

Code configuration steps

Creates an HTTP loader that reads JSON from the Synclang CDN.

import { HttpClient } from '@angular/common/http';
import { TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';

const WORKSPACE_UUID = 'YOUR_WORKSPACE_UUID';

export function httpLoaderFactory(http: HttpClient): TranslateLoader {
  const prefix = `https://cdn.synclang.com/${WORKSPACE_UUID}/json/`;
  return new TranslateHttpLoader(http, prefix, '');
}

Provides TranslateModule at bootstrap with the custom loader.

import { bootstrapApplication, importProvidersFrom } from '@angular/platform-browser';
import { provideHttpClient } from '@angular/common/http';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { HttpClient } from '@angular/common/http';
import { httpLoaderFactory } from './i18n-loader';
import { AppComponent } from './app/app.component';

bootstrapApplication(AppComponent, {
  providers: [
    provideHttpClient(),
    importProvidersFrom(
      TranslateModule.forRoot({
        defaultLanguage: 'en-GB',
        loader: { provide: TranslateLoader, useFactory: (http: HttpClient) => httpLoaderFactory(http), deps: [HttpClient] }
      })
    )
  ]
});

Examples/Usage

Translates a key in the template and reads a value in the component.

<h1>{{ 'welcome.title' | translate: { userName: 'Synclang' } }}</h1>
<button (click)="translate.use('es-ES')">ES</button>
<button (click)="translate.use('en-GB')">EN</button>
import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

@Component({ selector: 'app-welcome', templateUrl: './welcome.component.html' })
export class WelcomeComponent {
  userName = 'Synclang';
  constructor(public translate: TranslateService) {}
  ngOnInit() {
    const title = this.translate.instant('welcome.title', { userName: this.userName });
    console.log(title);
  }
}

Summary

You installed @ngx-translate/core and configured a CDN-backed HTTP loader to fetch JSON. You provided TranslateModule at bootstrap and rendered translations in templates and TypeScript. You verified runtime language switching through the service. The application now reads translations from the CDN with minimal configuration.

Android string resources

Overview Integrate Synclang translations into Android as string resources. You will export Android XML files using the Synclang CLI and place them under the correct res/values-*/strings.xml directories. This keeps translations in standard Android format and allows the app to use Android’s resource system. Steps

  • Install the Synclang CLI
  • Authenticate the CLI (if required)
  • Export an Android XML file for your target language
  • Place the file under the appropriate res directory
  • Reference strings in layouts and code File structure
app/
  src/
    main/
      res/
        values/
          strings.xml               # default (e.g., en-GB)
        values-pl/
          strings.xml               # Polish
        values-es/
          strings.xml               # Spanish

Prepare/Install Installs the Synclang CLI globally.

# Installs the Synclang CLI used to export translations
npm install -g @synclang/cli

Code configuration steps Exports Android XML for one language and writes to the default location.

# Exports Android XML for English (Great Britain)
synclang export android-xml --lang en-GB --out app/src/main/res/values/strings.xml

Examples/Usage References a string in an Android layout file.

<!-- res/layout/activity_main.xml -->
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/welcome_title"/>

References and formats a string in Kotlin code.

// MainActivity.kt
class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val msg = getString(R.string.welcome_title, "Synclang")
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
  }
}

Summary You installed the Synclang CLI and exported translations in Android XML format. You placed the file under res/values-* so Android’s resource system can load it per locale. The app then references keys via @string/... in layouts and getString(...) in code, keeping translations maintainable and native to Android.

iOS NSLocalizedString

Overview Integrate Synclang translations into iOS using NSLocalizedString. You will export XLIFF files with the Synclang CLI, import them into Xcode, and generate/update Localizable.strings per locale. This keeps translations in Apple’s native format and tooling. Steps

  • Install the Synclang CLI
  • Export XLIFF from Synclang for your locales
  • Import XLIFF into Xcode and generate Localizable.strings
  • Reference keys with NSLocalizedString in Swift File structure
MyApp/
  Base.lproj/
    Main.storyboard
  en-GB.lproj/
    Localizable.strings
  pl-PL.lproj/
    Localizable.strings

Prepare/Install Installs the Synclang CLI globally.

# Installs the Synclang CLI used to export translations
npm install -g @synclang/cli

Code configuration steps Exports XLIFF 2.0 for one target locale with a source language.

# Exports XLIFF 2.0 for Polish using English (GB) as source
synclang export xliff-2.0 --lang pl-PL --source-language en-GB --out i18n/pl.xliff

Imports the XLIFF file into Xcode and updates Localizable.strings.

Xcode -> Product -> Export Localizations... / Import Localizations...
- Choose the exported XLIFF file (e.g., i18n/pl.xliff)
- Xcode merges new/changed strings into "pl-PL.lproj/Localizable.strings"

Examples/Usage References a translation in Swift code using NSLocalizedString.

// ViewController.swift
import UIKit

class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    let title = NSLocalizedString("welcome.title", comment: "Welcome title")
    self.title = title
  }
}

References a string in Interface Builder by setting the Key Path to your key and checking Localize.

Interface Builder
- Set the text to the key name (e.g., "welcome.title")
- Ensure the view is Localized and available for each language

Summary You installed the Synclang CLI, exported XLIFF for your target locales, and imported it in Xcode to generate/update Localizable.strings. The app uses NSLocalizedString in Swift and Interface Builder supports localised text, ensuring a fully native iOS localisation workflow.

iOS XCLOC packages

Overview Integrate Synclang translations with iOS using XCLOC packages for translators. You will export XLIFF from Synclang, convert/import into an .xcloc container with Xcode tooling, send to translators, and then merge back to update Localizable.strings. This leverages Apple’s localisation workflow. Steps

  • Install the Synclang CLI
  • Export XLIFF 2.0 from Synclang for target locales
  • Create/Update an XCLOC package in Xcode
  • Share the .xcloc with translators and receive updated files
  • Import updates and generate Localizable.strings File structure
MyApp/
  en-GB.lproj/Localizable.strings
  pl-PL.lproj/Localizable.strings
Translations/
  MyApp.pl-PL.xcloc/
    Contents.json
    pl-PL.xliff

Prepare/Install Installs the Synclang CLI globally.

# Installs the Synclang CLI used to export translations
npm install -g @synclang/cli

Code configuration steps Exports XLIFF 2.0 for a locale with a source language (for context).

# Export XLIFF for Polish using English GB as the source
synclang export xliff-2.0 --lang pl-PL --source-language en-GB --out Translations/pl-PL.xliff

Creates or updates an XCLOC package via Xcode.

Xcode -> Product -> Export Localizations...
- Choose 'English (UK)' as source and select 'Polish' target
- Save to 'Translations/MyApp.pl-PL.xcloc'
- Replace the generated .xliff inside the .xcloc with Synclang's 'pl-PL.xliff' if needed

Examples/Usage Merges translator updates back into the project via Xcode.

Xcode -> Product -> Import Localizations...
- Select the updated 'MyApp.pl-PL.xcloc'
- Xcode updates 'pl-PL.lproj/Localizable.strings' with new translations

Summary You exported XLIFF from Synclang, produced an .xcloc with Xcode, and shared it with translators. After receiving updates, you imported the .xcloc back into Xcode to regenerate Localizable.strings. This integrates Synclang’s content with Apple’s native localisation packaging and review tools.

Vue: vue-i18n integration

Overview

This guide explains how to initialise and use vue-i18n in a Vue 3 application with translations managed by Synclang. You will install dependencies, configure the i18n instance, load translations at runtime, and render them in components. The approach is production-friendly while keeping the setup simple.

Steps

  1. Install dependencies
  2. Create the i18n setup file
  3. Provide i18n to the Vue application
  4. Load translations from Synclang
  5. Use translations in components

File structure

Create the following files during the guide.

src/
  i18n.ts
  main.ts
  components/
    HelloI18n.vue

This shows the minimal structure added for the integration.

Prepare / Install

npm install vue-i18n

Installs vue-i18n to provide internationalisation capabilities.

Code configuration steps

// src/i18n.ts
import { createI18n } from 'vue-i18n';

const WORKSPACE_UUID = import.meta.env.VITE_SYNCLANG_WORKSPACE_UUID; // your workspace UUID

async function loadLocaleMessages(locale: string) {
  const url = `https://cdn.synclang.com/${WORKSPACE_UUID}/json/${locale}`;
  const response = await fetch(url);
  if (!response.ok) throw new Error('Failed to load translations');
  return await response.json();
}

export const i18n = createI18n({
  legacy: false,
  locale: 'en-GB',
  fallbackLocale: 'en-GB',
  messages: {}
});

export async function setLocale(locale: string) {
  const messages = await loadLocaleMessages(locale);
  i18n.global.setLocaleMessage(locale, messages);
  i18n.global.locale.value = locale;
}

export async function initI18n() {
  await setLocale('en-GB');
}

Creates the i18n instance, fetches translations from Synclang, and prepares a helper to switch locale.

// src/main.ts
import { createApp } from 'vue';
import App from './App.vue';
import { i18n, initI18n } from './i18n';

async function bootstrap() {
  await initI18n();
  const app = createApp(App);
  app.use(i18n);
  app.mount('#app');
}

bootstrap();

Initialises translations and installs the i18n plugin before the app mounts.

Examples / Usage

<!-- src/components/HelloI18n.vue -->
<template>
  <h1>{{ t('app.title') }}</h1>
  <p>{{ t('greeting.user', { name: 'Alex' }) }}</p>
  <button @click="changeToPolish">{{ t('actions.changeLanguage') }}</button>
</template>

<script setup lang="ts">
import { useI18n } from 'vue-i18n';
import { setLocale } from '../i18n';

const { t } = useI18n();

async function changeToPolish() {
  await setLocale('pl-PL');
}
</script>

Renders translation keys in the template and switches language at runtime using a helper.

{
  "app": { "title": "My Application" },
  "greeting": { "user": "Hello, {{name}}!" },
  "actions": { "changeLanguage": "Change language" }
}

Shows a minimal local message structure you can use as a fallback during early development.

Summary

You installed vue-i18n, configured an i18n instance for Vue 3, and loaded translations from Synclang. The app renders translations via $t and useI18n, and you can switch locales at runtime by loading messages for the selected language.

Synclang CLI overview

Synclang CLI helps you import and export translation keys for your workspace from the terminal. It is cross‑platform (Linux, macOS, Windows) and designed to be fast, safe, and script‑friendly.

What it does:

  • Import flat key/value files in multiple formats
  • Export translations for one or many languages, in parallel
  • Read credentials from flags, environment variables, or config files
  • Respect safe file writes (no overwrite unless you pass --force)

Formats supported: json, yaml, properties, android-xml, xliff-1.2, xliff-2.0. For XLIFF exports, pass --source-language alongside --lang.

Installation

Install the Synclang CLI using the one‑liners below for your platform. After installation, verify with synclang -v.

Linux

curl -fsSL https://raw.githubusercontent.com/Synclang/synclang-cli/main/scripts/install-linux.sh | bash

macOS

curl -fsSL https://raw.githubusercontent.com/Synclang/synclang-cli/main/scripts/install-macos.sh | bash

Windows (PowerShell)

Default one‑liner (PowerShell 5+ or pwsh):

powershell -NoProfile -ExecutionPolicy Bypass -Command "iwr -useb https://raw.githubusercontent.com/Synclang/synclang-cli/main/scripts/install-windows.ps1 | iex"

Notes:

  • The installer downloads the latest release and adds it to your PATH when possible.
  • If your shell session doesn’t pick up the PATH change, open a new terminal.

Authentication and workspace

Every command needs two pieces of information: your API Token and the Workspace UUID. You can provide them via flags, environment variables, or config files. If either one is missing, the CLI exits with a helpful error message.

Precedence (highest first):

  1. CLI flags: --token, --workspace
  2. Env vars: SYNCLANG_TOKEN, SYNCLANG_WORKSPACE
  3. Project config (see below)
  4. User config (see below)

Config files

The CLI looks for configuration in this order (first match wins):

  • ./synclang.config.json|yaml|yml
  • ./.synclangrc.json|yaml|yml

User config locations:

  • macOS: ~/Library/Application Support/Synclang/config.(json|yaml|yml)
  • Linux: ~/.config/synclang/config.(json|yaml|yml)
  • Windows: %AppData%/Synclang/config.(json|yaml|yml)

You can also pass --config <path> to use a specific file.

Example config (no host field supported):

{
  "token": "YOUR_API_TOKEN",
  "workspace": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "timeout": 30000,
  "concurrency": 4
}

Import

Import translations from JSON or YAML. Provide input via --file <path> or pipe from stdin. Use --file - to force stdin.

JSON:

synclang import json --lang en-GB --file ./strings.en.json
cat strings.pl.json | synclang import json --lang pl-PL --file -

YAML:

synclang import yaml --lang en-GB --file ./strings.en.yml
cat strings.pl.yml | synclang import yaml --lang pl-PL

Behavior:

  • Accepts flat key/value objects (nested structures should be flattened in paths)
  • Reads from file or stdin (use --file - to force stdin)
  • Validates input before sending to the API

Export

Export translations for one or more languages. Multiple languages can be passed as a comma‑separated list. For XLIFF, also pass --source-language.

synclang export json --lang en-GB > en.json
synclang export yaml --lang en-GB,pl-PL --out ./i18n.{lang}.yaml
synclang export xliff-2.0 --lang pl-PL --source-language en-GB --out xliff/pl.xlf
  • Formats: json|yaml|properties|android-xml|xliff-1.2|xliff-2.0
  • Parallel downloads for multiple languages (default --concurrency 4)
  • Stdout is allowed only for a single language (unless you specify --out)
  • --out may include {lang}; parent folders are created automatically
  • Existing files are never overwritten unless you pass --force
  • --pretty pretty‑prints JSON/YAML when writing to stdout

Global options

  • --token <string>
  • --workspace <uuid>
  • --config <path>
  • --timeout <ms> (default 30000)
  • --concurrency <n> (export only; default 4)
  • --quiet (suppress non‑error output), --debug (verbose logs)
  • -v, --version, -h, --help

List keys

Retrieve paginated keys for a workspace with optional filtering.

GET

List keys

/v1/workspaces/{workspaceUuid}/keys

Fetch paginated keys for a workspace with optional filtering.

Parameters
  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

  • filter(query)
    string

    Optional filter by key name or translation value.

  • page(query)
    0

    Page number

  • size(query)
    10

    Page size

Successful response
{
  "content": [
    {
      "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
      "path": "string",
      "translations": [
        {
          "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
          "value": "string",
          "language": "string"
        }
      ]
    }
  ],
  "size": 0,
  "total": 0,
  "page": 0,
  "pages": 0
}
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys' /
-H 'X-Api-Token: ${TOKEN}'

Delete key

Delete a key in a workspace by its UUID.

DELETE

Delete key

/v1/workspaces/{workspaceUuid}/keys/{path}

Delete a key in the workspace by its UUID.

Parameters
  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

  • path(path)Required
    string

    docs.api.keys.delete.key.path

cURL example
curl -X DELETE /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/{path}' /
-H 'X-Api-Token: ${TOKEN}'

Export keys (JSON)

Export workspace translations for one language in JSON format.

GET

Export keys (JSON)

/v1/workspaces/{workspaceUuid}/keys/export/{language}/json

Export workspace translations for one language in JSON format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
{
  "key.path": "value",
  "key.path2": "value2"
}
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/export/{language}/json' /
-H 'X-Api-Token: ${TOKEN}'

Export keys (YAML)

Export workspace translations for one language in YAML format.

GET

Export keys (YAML)

/v1/workspaces/{workspaceUuid}/keys/export/{language}/yaml

Export workspace translations for one language in YAML format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
key.path: value
key.path2: value2
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/export/{language}/yaml' /
-H 'X-Api-Token: ${TOKEN}'

Export keys (Java .properties)

Export workspace translations for one language in Java .properties format.

GET

Export keys (Java .properties)

/v1/workspaces/{workspaceUuid}/keys/export/{language}/properties

Export workspace translations for one language in Java .properties format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
key.path=value
key.path2=value2
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/export/{language}/properties' /
-H 'X-Api-Token: ${TOKEN}'

Export keys (Android XML)

Export workspace translations for one language in Android XML format.

GET

Export keys (Android XML)

/v1/workspaces/{workspaceUuid}/keys/export/{language}/android-xml

Export workspace translations for one language in Android XML format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="key.path">value</string>
    <string name="key.path2">value2</string>
</resources>
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/export/{language}/android-xml' /
-H 'X-Api-Token: ${TOKEN}'

Export keys (XLIFF 1.2)

Export workspace translations for one language in XLIFF 1.2 format.

GET

Export keys (XLIFF 1.2)

/v1/workspaces/{workspaceUuid}/keys/export/{language}/xliff-1.2

Export workspace translations for one language in XLIFF 1.2 format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • sourceLanguage(query)Required
    en-GB

    Optional source language code used as a fallback.

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
  <file original="translations" datatype="plaintext" source-language="en-GB" target-language="pl-PL">
    <body>
      <trans-unit id="key.path" resname="key.path">
        <source>value</source>
        <target>value2</target>
      </trans-unit>
      <trans-unit id="key.path2" resname="key.path2">
        <source>value</source>
        <target>value2</target>
      </trans-unit>
    </body>
  </file>
</xliff>
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/export/{language}/xliff-1.2' /
-H 'X-Api-Token: ${TOKEN}'

Export keys (XLIFF 2.0)

Export workspace translations for one language in XLIFF 2.0 format.

GET

Export keys (XLIFF 2.0)

/v1/workspaces/{workspaceUuid}/keys/export/{language}/xliff-2.0

Export workspace translations for one language in XLIFF 2.0 format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • sourceLanguage(query)Required
    en-GB

    Optional source language code used as a fallback.

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en-GB" trgLang="pl-PL">
  <file id="translations">
    <unit id="key.path">
      <segment>
        <source>value</source>
        <target>value2</target>
      </segment>
    </unit>
    <unit id="key.path2">
      <segment>
        <source>value</source>
        <target>value2</target>
      </segment>
    </unit>
  </file>
</xliff>
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/export/{language}/xliff-2.0' /
-H 'X-Api-Token: ${TOKEN}'

Import keys (JSON)

Import workspace translations from JSON content for a target language.

POST

Import keys (JSON)

/v1/workspaces/{workspaceUuid}/keys/import/{language}/json

Import workspace translations from JSON content for a target language.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Input body
{
  "key.path": "value",
  "key.path2": "value2"
}
Successful response
0
cURL example
curl -X POST /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/import/{language}/json' /
-H 'X-Api-Token: ${TOKEN}' /
--data '{
  "key.path": "value",
  "key.path2": "value2"
}'

Import keys (YAML)

Import workspace translations from YAML content for a target language.

POST

Import keys (YAML)

/v1/workspaces/{workspaceUuid}/keys/import/{language}/yaml

Import workspace translations from YAML content for a target language.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Input body
key.path: value
key.path2: value2
Successful response
0
cURL example
curl -X POST /
'https://api.synclang.com/api/v1/workspaces/{workspaceUuid}/keys/import/{language}/yaml' /
-H 'X-Api-Token: ${TOKEN}' /
--data 'key.path: value
key.path2: value2'

List project languages

Fetch paginated languages configured for the project.

GET

List project languages

/v1/projects/{projectUuid}/languages

Fetch paginated languages configured for the project.

Parameters
  • projectUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Project UUID.

  • filter(query)
    string

    Optional filter by language code or name.

  • page(query)
    0

    Page number

  • size(query)
    10

    Page size

Successful response
{
  "content": [
    {
      "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
      "name": "string",
      "projectDefault": true
    }
  ],
  "size": 0,
  "total": 0,
  "page": 0,
  "pages": 0
}
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/projects/{projectUuid}/languages' /
-H 'X-Api-Token: ${TOKEN}'

Add project languages

Attach languages to the project.

POST

Add project languages

/v1/projects/{projectUuid}/languages

Attach languages to the project.

Parameters
  • projectUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Project UUID.

Input body
{
  "languages": [
    "string"
  ]
}
cURL example
curl -X POST /
'https://api.synclang.com/api/v1/projects/{projectUuid}/languages' /
-H 'X-Api-Token: ${TOKEN}' /
--data '{
  "languages": [
    "string"
  ]
}'

Remove project language

Detach a language from the project.

DELETE

Remove project language

/v1/projects/{projectUuid}/languages/{language}

Detach a language from the project.

Parameters
  • projectUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Project UUID.

  • language(path)Required
    en-GB

    Language code to remove (e.g., en-GB).

cURL example
curl -X DELETE /
'https://api.synclang.com/api/v1/projects/{projectUuid}/languages/{language}' /
-H 'X-Api-Token: ${TOKEN}'

Get project

Fetch project details by UUID.

GET

Get project

/v1/projects/{projectUuid}

Fetch project details by UUID.

Parameters
  • projectUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Project UUID.

Successful response
{
  "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
  "name": "string",
  "workspaces": [
    {
      "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
      "name": "string",
      "published": true
    }
  ],
  "languages": [
    {
      "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
      "name": "string",
      "projectDefault": true
    }
  ],
  "userAccess": [
    {
      "name": "string",
      "scope": [
        "string"
      ]
    }
  ],
  "stats": {
    "totalKeys": 0,
    "keysCountByWorkspace": {
      "property1": {},
      "property2": {}
    },
    "translationsCountByLanguage": {
      "property1": {},
      "property2": {}
    },
    "lastModifiedAt": "2019-08-24T14:15:22Z"
  }
}
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/projects/{projectUuid}' /
-H 'X-Api-Token: ${TOKEN}'

Export keys (JSON)

Publicly export all workspace translations for selected languages in JSON format.

GET

Export keys (JSON)

/v1/public/workspaces/{workspaceUuid}/json

Publicly export all workspace translations for selected languages in JSON format.

Parameters
  • lang(query)
    [en-GB, en-US]

    List of target language codes.

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
{
  "en-GB": {
    "key.path": "value",
    "key.path2": "value2"
  },
  "en-US": {
    "key.path": "value",
    "key.path2": "value2"
  }
}
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/json'

Export keys (YAML)

Publicly export all workspace translations for selected languages in YAML format.

GET

Export keys (YAML)

/v1/public/workspaces/{workspaceUuid}/yaml

Publicly export all workspace translations for selected languages in YAML format.

Parameters
  • lang(query)
    [en-GB, en-US]

    List of target language codes.

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
en-GB:
  key.path: value
  key.path2: value2
en-US:
  key.path: value
  key.path2: value2
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/yaml'

Export keys (CSV)

Publicly export all workspace translations for selected languages in CSV format.

GET

Export keys (CSV)

/v1/public/workspaces/{workspaceUuid}/csv

Publicly export all workspace translations for selected languages in CSV format.

Parameters
  • lang(query)
    [en-GB, en-US]

    List of target language codes.

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
key,en-GB,en-US
key.path,value,value
key.path2,value2,value2
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/csv'

Export language (JSON)

Publicly export translations for one language in JSON format.

GET

Export language (JSON)

/v1/public/workspaces/{workspaceUuid}/json/{language}

Publicly export translations for one language in JSON format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
{
  "key.path": "value",
  "key.path2": "value2"
}
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/json/{language}'

Export language (YAML)

Publicly export translations for one language in YAML format.

GET

Export language (YAML)

/v1/public/workspaces/{workspaceUuid}/yaml/{language}

Publicly export translations for one language in YAML format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
key.path: value
key.path2: value2
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/yaml/{language}'

Export language (Java .properties)

Publicly export translations for one language in Java .properties format.

GET

Export language (Java .properties)

/v1/public/workspaces/{workspaceUuid}/properties/{language}

Publicly export translations for one language in Java .properties format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
key.path=value
key.path2=value2
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/properties/{language}'

Export language (Android XML)

Publicly export translations for one language in Android XML format.

GET

Export language (Android XML)

/v1/public/workspaces/{workspaceUuid}/android-xml/{language}

Publicly export translations for one language in Android XML format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="key.path">value</string>
    <string name="key.path2">value2</string>
</resources>
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/android-xml/{language}'

Export language (XLIFF 1.2)

Publicly export translations for one language in XLIFF 1.2 format.

GET

Public export language (XLIFF 1.2)

/v1/public/workspaces/{workspaceUuid}/xliff-1.2/{language}

Publicly export translations for one language in XLIFF 1.2 format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • sourceLanguage(query)Required
    en-US

    Optional source language code used as a fallback.

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
  <file original="translations" datatype="plaintext" source-language="en-GB" target-language="pl-PL">
    <body>
      <trans-unit id="key.path" resname="key.path">
        <source>value</source>
        <target>value2</target>
      </trans-unit>
      <trans-unit id="key.path2" resname="key.path2">
        <source>value</source>
        <target>value2</target>
      </trans-unit>
    </body>
  </file>
</xliff>
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/xliff-1.2/{language}'

Export language (XLIFF 2.0)

Publicly export translations for one language in XLIFF 2.0 format.

GET

Export language (XLIFF 2.0)

/v1/public/workspaces/{workspaceUuid}/xliff-2.0/{language}

Publicly export translations for one language in XLIFF 2.0 format.

Parameters
  • language(path)Required
    en-GB

    Target language code (e.g., en-GB).

  • sourceLanguage(query)Required
    en-US

    Optional source language code used as a fallback.

  • workspaceUuid(path)Required
    497f6eca-6276-4993-bfeb-53cbbbba6f08

    Workspace UUID.

Successful response
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en-GB" trgLang="pl-PL">
  <file id="translations">
    <unit id="key.path">
      <segment>
        <source>value</source>
        <target>value2</target>
      </segment>
    </unit>
    <unit id="key.path2">
      <segment>
        <source>value</source>
        <target>value2</target>
      </segment>
    </unit>
  </file>
</xliff>
cURL example
curl -X GET /
'https://api.synclang.com/api/v1/public/workspaces/{workspaceUuid}/xliff-2.0/{language}'