Skip to main content
The CLI reads a .nt3.yml file from your project root (the directory where you run nt3 commands). This file defines which Entri project to sync with and where your translation files are located.

Minimal example

project_id: "proj_abc123"
source_language: en
file_patterns:
  - path: "src/locales/{lang}.json"
    format: json-nested

Full reference

project_id

Required. The ID of your Entri project. Found in the Entri dashboard under Project Settings.
project_id: "proj_abc123"

source_language

Required. The language code for your source strings — the language your developers write in. Common values: en, de, fr, ja.
source_language: en

file_patterns

Required. A list of file pattern objects. Each entry defines one set of translation files to sync.
file_patterns:
  - path: "src/locales/{lang}.json"
    format: json-nested
Each file pattern has the following fields:

path

Required. The file path pattern with a {lang} placeholder. The CLI replaces {lang} with the language code at runtime.
path: "src/locales/{lang}.json"
# Resolves to: src/locales/en.json, src/locales/fr.json, etc.
The path is resolved relative to the directory where you run nt3 commands (typically your project root).

format

Required. The file format. Must be one of the supported format identifiers:
ValueFile type
json-flatFlat key-value JSON (e.g., {"key": "value"})
json-nestedNested JSON objects (e.g., {"section": {"key": "value"}})
yamlYAML key-value
poGNU gettext PO files
xliffXLIFF 1.2
xliff2XLIFF 2.0
arbApplication Resource Bundle (Flutter)
android-xmlAndroid string resources (res/values/strings.xml)
ios-stringsiOS Localizable.strings
ios-stringsdictiOS Stringsdict files (plurals)

namespace (optional)

A namespace string to scope this file’s keys within the project. Useful when multiple file patterns share the same project but represent different parts of the app.
file_patterns:
  - path: "src/locales/{lang}/common.json"
    format: json-nested
    namespace: common
  - path: "src/locales/{lang}/checkout.json"
    format: json-nested
    namespace: checkout

Multiple file patterns

Projects that split translations across multiple files — by feature, by library, or by format — can define multiple patterns:
project_id: "proj_abc123"
source_language: en
file_patterns:
  - path: "src/locales/{lang}.json"
    format: json-nested
    namespace: app
  - path: "public/locales/{lang}/marketing.json"
    format: json-flat
    namespace: marketing
  - path: "mobile/ios/{lang}.strings"
    format: ios-strings
    namespace: ios
All patterns are processed in order when you run nt3 push or nt3 pull.

Mobile app example

project_id: "proj_abc123"
source_language: en
file_patterns:
  - path: "android/app/src/main/res/values-{lang}/strings.xml"
    format: android-xml
For Android XML, the source language file path should use the base values directory convention. When using the CLI, make sure the path pattern resolves correctly for both the source and target languages.

Flutter example

project_id: "proj_abc123"
source_language: en
file_patterns:
  - path: "lib/l10n/intl_{lang}.arb"
    format: arb

GNU gettext example

project_id: "proj_abc123"
source_language: en
file_patterns:
  - path: "locales/{lang}/LC_MESSAGES/messages.po"
    format: po

Generating the config file

Rather than writing .nt3.yml by hand, use nt3 init to create it interactively or non-interactively:
nt3 init -p proj_abc123 -f po --path "locales/{lang}/messages.po"
Use --force to overwrite an existing config:
nt3 init --force -p proj_new123