Parcourir le centre d'aide

Localiser un catalogue de chaînes via l'API

Maintenu par Vitalii VlasiukCo-founder

Les textes d'interface, les chaînes de jeu et les modèles d'e-mail sont gérés sous forme de catalogues indexés, et ce sont ces clés qui permettent d'automatiser la localisation : Transept compare votre catalogue par clé, traduit uniquement ce qui a réellement changé et renvoie chaque langue structurée de la même manière. Ainsi, le cycle ne vous coûte qu'une seule chaîne quand une seule chaîne est modifiée.

Sur cette page

Qu'est-ce qu'un catalogue de chaînes ?

Le format indexé de Transept est le .tstrings.json : une liste d'unités, chacune dotée d'un id stable, d'une source et, facultativement, d'un context (ce qu'est la chaîne, où elle apparaît), d'une max_length et de placeholders. L'identifiant fait office de contrat : c'est lui qui permet aux traductions de conserver leur identité au fil des réimportations, à l'état de révision de perdurer et à l'exportation d'indexer chaque langue. Ces deux options jouent un rôle concret : le contexte sert de guide au modèle, et la limite de caractères est appliquée via un processus automatique de raccourcissement et de nouvel essai.

Les fichiers CSV, gettext PO et XLIFF sont importés sous forme d'unités indexées identiques via l'application ou le point de terminaison d'importation ; consultez la page fichiers de chaînes pour connaître les correspondances de chaque format. Cet article explique comment piloter ce cycle par programmation, le .tstrings.json étant ici le format natif.

Comment importer un catalogue via l'API ?

POST /documents/import-strings avec le catalogue au format JSON. La résolution des langues cibles suit un ordre fixe : une mention explicite de target_language / target_languages dans la requête l'emporte ; sinon, ce sont les target_locales de l'en-tête du catalogue qui sont utilisées ; à défaut, l'appel échoue immédiatement avec l'erreur no_target_languages au lieu d'importer un document sans aucune cible. L'appel renvoie un processing_job_id ; interrogez GET /document-jobs/{id} jusqu'à ce que l'importation soit terminée et que vous disposiez des identifiants du document.

Les traductions déjà présentes dans le fichier (targets: {de: "…"}) sont injectées comme traduction active pour chaque chaîne, gratuitement et sans nécessiter de cycle, et alimentent immédiatement votre mémoire de traduction. Le comportement est identique à celui de l'importation de traductions existantes via l'application.

# BASE="https://app.transept.ai/api/public/v1"; KEY from Settings → Developer
curl -s -X POST $BASE/documents/import-strings \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"document": {
        "format": "transept-strings", "version": 1, "source_locale": "en",
        "target_locales": ["de", "fr", "uk"],
        "metadata": {"name": "App UI"},
        "units": [
          {"id": "app.save", "source": "Save", "context": "Toolbar button"},
          {"id": "app.greeting", "source": "Welcome, {name}", "context": "Dashboard header"}
        ]}}'
# → { processing_job_id }; poll GET /document-jobs/{id}

Comment ne retraduire que ce qui a été modifié ?

Soumettez à nouveau l'intégralité du catalogue actuel à POST /documents/{id}/import-strings, et non une version tronquée. Le serveur compare le catalogue par identifiant d'unité et renvoie les résultats trouvés (added, changed, unchanged, removed) ainsi que les delta_block_ids : les blocs précis nécessitant une intervention, pour chaque langue. Transmettez cet objet tel quel en tant que block_ids d'un cycle groupé et seuls ces blocs seront traduits ; vous pouvez également passer run directement lors de la réimportation pour traiter le delta dans le même appel.

Les unités inchangées conservent leurs traductions ainsi que les révisions déjà effectuées ; c'est le pendant API de la fonction Ne lancer que ce qui a changé. Corriger une seule chaîne dans un catalogue qui en compte des centaines ne vous coûte qu'une seule chaîne.

# 1. Re-submit the whole current catalog; the server diffs it by unit id
curl -s -X POST $BASE/documents/<master>/import-strings \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d @app-ui.tstrings.json
# → { units: {added, changed, unchanged, removed}, delta_block_ids: {<doc_id>: [block ids]} }

# 2. Feed delta_block_ids VERBATIM into a group run; only those blocks translate
curl -s -X POST $BASE/group-runs \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"document_id": "<master>", "template_id": "end_to_end",
       "target_languages": "all", "block_ids": { "<doc_id>": ["<block id>", "…"] }}'

Comment récupérer les résultats indexés ?

L'appel GET /documents/{id}/content?format=strings sur le document principal renvoie un fichier .tstrings.json contenant les traductions de chaque langue, indexées par identifiant d'unité : un seul appel, prêt à être intégré ou réinjecté dans votre build. Le même point de terminaison propose des rendus par langue (markdown, html, csv, xliff, tmx) si un pipeline nécessite plutôt un format d'échange spécifique ; le tableau complet figure dans Automatiser Transept avec l'API.

Pour les catalogues importés au format CSV, PO ou XLIFF, l'exportation au format d'origine complète les cellules et les entrées de votre propre fichier (une copie à l'octet près de ce que vous avez envoyé, les traductions en plus), afin que le fichier puisse être réintégré directement dans son système d'origine.

curl -s "$BASE/documents/<master>/content?format=strings" \
  -H "Authorization: Bearer $KEY"
# → one .tstrings.json with every language keyed by unit id
Questions fréquentes

Les chaînes inchangées sont-elles refacturées ?

Non. À chaque réimportation, Transept compare le catalogue soumis à la version stockée par identifiant d'unité, et seules les unités nouvelles ou modifiées sont intégrées au cycle. Les chaînes inchangées conservent leurs traductions ainsi que les révisions déjà effectuées ; soumettre à nouveau l'intégralité du fichier ne coûte rien en soi.

Qu'advient-il des variables comme {name} ?

Elles sont protégées et ne sont pas traduites. Les variables sont masquées avant que le texte ne parvienne au modèle, puis vérifiées par rapport à la source après chaque réponse. Si une traduction en oublie ou en altère une, elle est réparée ou fait l'objet d'un nouvel essai ; l'erreur ne passe jamais inaperçue. Le texte de la variable est restauré à l'identique.

Dois-je calculer moi-même les différences avant la réimportation ?

Non ; c'est là tout l'intérêt de la boucle. Envoyez toujours l'intégralité du catalogue actuel ; le serveur se charge de la comparaison et indique précisément quels blocs ont été modifiés. Envoyer un fichier tronqué manuellement est en réalité une erreur : les unités absentes de l'envoi sont traitées comme supprimées.

Explorer les fonctionnalités

Un problème persiste ? Demandez à Literess dans l'application, ou écrivez à [email protected].