Configuration File

Introduction

Crowdin CLI uses a configuration file that contains a description of the resources to manage: files to be uploaded into Crowdin and the locations of the corresponding translations.

To use Crowdin CLI, you should first generate your configuration file and then run the tool. By default, Crowdin CLI looks for a configuration file named crowdin.yml (so you don’t have to specify the file name unless it’s different from crowdin.yml).

To create the configuration file, run the following command:

$ crowdin init

Configuration File Structure

A valid Crowdin CLI configuration file has the following structure, so please ensure that you fill out all the needed information:

  • Head of the file with project credentials, preferences, and access information
  • One files array element that describes a set of source and translation files you will manage
  • Required fields in the files array: Source that defines filters for the source files and Translation with instructions on where to store the translated files or where to look for translations you already have if you want to upload them while setting up the CLI

Writing a Simple Configuration File

A typical configuration file looks similar to the following:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"preserve_hierarchy": true
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files": [
  {
    "source": "/locale/en/folder1/[0-2].txt",                                       #source files filter
    "translation": "/locale/%two_letters_code%/folder1/%original_file_name%"        #where translations are stored
  },
  {
    "source": "/locale/en/folder2/[0-2].txt",
    "translation": "/locale/%two_letters_code%/folder2/%original_file_name%"
  }
]

To run the above configuration file and upload source files to Crowdin:

$ crowdin upload sources

Get translations from Crowdin and put them in the right locations:

$ crowdin download

API Credentials from Environment Variables

You could load the API Credentials from an environment variable, for example:

"project_id_env": "CROWDIN_PROJECT_ID"
"api_token_env": "CROWDIN_PERSONAL_TOKEN"
"base_path_env": "CROWDIN_BASE_PATH"
"base_url_env": "CROWDIN_BASE_URL"

If mixed, api_token and project_id are prioritized:

"project_id_env": "CROWDIN_PROJECT_ID"      # Low priority
"api_token_env": "CROWDIN_PERSONAL_TOKEN"   # Low priority
"base_path_env": "CROWDIN_BASE_PATH"        # Low priority
"base_url_env": "CROWDIN_BASE_PATH"         # Low priority
"project_id": "projectId"                   # High priority
"api_token": "personal-access-token"        # High priority
"base_path": "/project-base-path"           # High priority
"base_url": "https://api.crowdin.com"       # High priority

Split Project Configuration and API Credentials

The crowdin.yml file contains a description of the resources to manage and API credentials (project_id, api_token, base_path, base_url). It means that it’s unsafe to commit this file into the code repository because the API key would be accessible to other users. Crowdin CLI supports two types of configuration files:

  • a description of the resources to manage, residing in the project directory
  • API credentials, probably residing in $HOME/.crowdin.yml
Note: API credentials from the .crowdin.yml configuration file have higher priority than credentials from the project directory(crowdin.yml).

If you need to run a command with user-specific credentials (for example, upload sources), run the following command:

$ crowdin upload sources --identity 'path-to-user-credentials-file'

But if user-specific credentials file residing in $HOME/.crowdin.yml you can run:

$ crowdin upload sources

General Configuration

The sample configuration provided above has source and translation attributes containing standard wildcards (also known as globbing patterns) to make it easier to work with multiple files.

Here are patterns you can use:

* (asterisk)

Represents any character in the file or directory name. If you specify a “*.json” it will include all files like “messages.json”, “about_us.json”, and anything that ends with “.json”.

** (doubled asterisk)

Matches any string recursively (including sub-directories). Note that you can use ** in both source and translation patterns. When using ** in the translation pattern, it will always contain a sub-path from the source for a certain file. For example, you can use source: ‘/en/**/*.po’ to upload all *.po files to Crowdin recursively. The translation pattern will be ‘/%two_letters_code%/**/%original_file_name%’.

? (question mark)

Matches any single character.

[set]

Matches any single character in a set. Behaves exactly like character sets in Regexp, including set negation ([^a-z]).

\ (backslash)

Escapes the next metacharacter.

Placeholders

Crowdin CLI allows to use the following placeholders to put appropriate variables into the resulting file name:

Name Description
%original_file_name% Original file name
%original_path% Take parent folders names in Crowdin project to build file path in the resulted bundle
%file_extension% Original file extension
%file_name% File name without extension
%language% Language name (e.g., Ukrainian)
%two_letters_code% Language code ISO 639-1 (e.g., uk)
%three_letters_code% Language code ISO 639-2/T (e.g., ukr)
%locale% Locale (e.g., uk-UA)
%locale_with_underscore% Locale (e.g., uk_UA)
%android_code% Android Locale identifier used to name "values-" directories
%osx_code% OS X Locale identifier used to name ".lproj" directories
%osx_locale% OS X locale used to name translation resources (e.g., uk, zh-Hans, zh_HK)

You can also define the path for files in the resulting archive by putting a slash (/) at the beginning of the pattern.

Your translation option may look like: “/locale/%two_letters_code%/LC_MESSAGES/%original_file_name%”.

Usage of Wildcards

Structure of files and directories on the local machine:

- base_path
      |
      |-- folder
      |     |
      |     |-- 1.xml
      |     |-- 1.txt
      |     |-- 123.txt
      |     |-- 123_test.txt
      |     |-- a.txt
      |     |-- a1.txt
      |     |-- crowdin?test.txt
      |     |-- crowdin_test.txt
      |
      |-- 1.xml
      |-- 1.txt
      |-- 123.txt
      |-- 123_test.txt
      |-- a.txt
      |-- a1.txt
      |-- crowdin?test.txt
      |-- crowdin_test.txt
      |-- 3.txt

Example 1. Usage of wildcards in the source path:

#........your project configuration........
"files": [
  {
      "source": "/**/?[0-9].txt", #upload a1.txt, folder/a1.txt
      "translation": "/**/%two_letters_code%_%original_file_name%"
  },
  {
      "source": "/**/*\\?*.txt",  #upload crowdin?test.txt, folder/crowdin?test.txt
      "translation": "/**/%two_letters_code%_%original_file_name%"
  },
  {
      "source": "/**/[^0-2].txt", #upload 3.txt, folder/3.txt, a.txt, folder/a.txt (ignore 1.txt, folder/1.txt)
      "translation": "/**/%two_letters_code%_%original_file_name%"
  }
]

Example 2. Usage of wildcards for ignoring files:

#........your project configuration........
"files": [
  {
    "source": "/**/*.*",                             #upload all files that  the base_path contains
    "translation": "/**/%two_letters_code%_%original_file_name%",
    "ignore": [
      "/**/%two_letters_code%_%original_file_name%", #ignore the translated files
      "/**/?.txt",                                   #ignore 1.txt, a.txt, folder/1.txt, folder/a.txt
      "/**/[0-9].txt",                               #ignore 1.txt, folder/1.txt
      "/**/*\\?*.txt",                               #ignore crowdin?test.txt, folder/crowdin?test.txt
      "/**/[0-9][0-9][0-9].txt",                     #ignore 123.txt , folder/123.txt
      "/**/[0-9]*_*.txt"                             #ignore 123_test.txt, folder/123_test.txt
    ]
  }
]

Language Mapping

Often software projects have custom names for locale directories. Crowdin allows you to map your own languages to be recognizable in your projects.

Let’s say your locale directories are named ‘en’, ‘uk’, ‘fr’, ‘de’. All of them can be represented by the %two_letters_code% placeholder. Still, you have one directory named ‘zh_CH’. You can also override language codes for other placeholders like %android_code%, %locale%, etc.

To make it work with Crowdin without changes in your project, you can set up Language Mapping via UI.

Renaming Translations File

If you need to rename a file with translations after the export, you can easily do this with the help of the parameter translation_replace.

For example, if the file is named “strings_en.po”, it can be renamed to “strings.po”. For this, add a new parameter (at the same level as the translation parameter) to the configuration file (crowdin.yml):

"files": [
  {
    "source": "/locale/**/*_en.po",
    "translation": "/locale/**/%original_file_name%_%two_letters_code%",
    "translation_replace": {
      "_en": ""
    }
  }
]

In this case, “_en” will be erased from the file name.

Ignoring Files and Directories

From time to time, there are files and directories you don’t need to translate in Crowdin. In such cases, local per-file rules can be added to the config file in your project.

"files": [
  {
    "source": "/**/*.properties",
    "translation": "/**/%file_name%_%two_letters_code%.%file_extension%",
    "ignore": [
      "/test/file.properties",
      "/example.properties"
    ]
  },
  {
    "source": "/locale/en/**/*.po",
    "translation": "/locale/%two_letters_code%/**/%original_file_name%",
    "ignore": [
      "/locale/en/templates",
      "/locale/en/workflow"
    ]
  }
]

Excluding Target Languages for Source Files

By default, the source files are available for translation into all target languages of the project. If some source files shouldn’t be translated into specific target languages, you can exclude them with the help of the parameter excluded_target_languages.

Configuration file example:

"files": [
  {
    "source": "/resources/en/*.json",
    "translation": "/resources/%two_letters_code%/%original_file_name%",
    "excluded_target_languages": [
      "uk",
      "fr"
    ]
  }
]

Multilingual Spreadsheet

If a CSV or XLS/XLSX file contains the translations for all target languages, you should specify appropriate language codes in the scheme.

CSV file example:

identifier,source_phrase,context,Ukrainian,Russian,French
ident1,Source 1,Context 1,,,
ident2,Source 2,Context 2,,,
ident3,Source 3,Context 3,,,

Configuration file example:

"files": [
  {
    "source": "multicolumn.csv",
    "translation": "multicolumn.csv",
    "first_line_contains_header": true,
    "scheme": "identifier,source_phrase,context,uk,ru,fr"
  }
]

If your CSV or XLS/XLSX file contains columns that should be skipped on import, use none for such columns in the scheme, for example:

"scheme" : "identifier,source_phrase,context,uk,none,ru,none,fr"

Scheme Constants

To form the scheme for your CSV or XLS/XLSX file, use the following constants:

identifier – Column contains string identifiers.
source_phrase – Column contains source strings.
source_or_translation – Column contains source strings, but the same column will be filled with translations when the file is exported. When uploading existing translations, the values from this column will be used as translations.
translation – Column contains translations.
context – Column contains comments or context information for the source strings.
max_length – Column contains max.length limit values for the translations of the strings.
labels – Column contains labels for the source strings.
none – Column that will be skipped on import.

Saving Directory Structure on Server

"preserve_hierarchy": true

Example of the configuration file using the preserve_hierarchy option:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise
"preserve_hierarchy": true

"files": [
  {
    "source": "/locale/en/**/*.po",
    "translation": "/locale/%two_letters_code%/**/%original_file_name%"
  }
]
Note: For VCS integrations, the default value of the preserve hierarchy option is true.

Let’s say the file/folder structure on your machine looks like this:

- locale
    |
    |-- en
        |-- emails
        |-- app
             |-- foo.po
             |-- bar.po

If you don’t use the "preserve_hierarchy": true option in your configuration file at all or use it with the false value, all shared directories will be skipped, and the file structure in Crowdin will be represented as follows:

- foo.po
- bar.po
Note: For VCS integrations, the "preserve_hierarchy": false option works only if your source files have a shared root directory.

Using the "preserve_hierarchy": true option, the file structure in Crowdin will be represented as follows:

- locale
    |
    |-- en
        |-- app
             |-- foo.po
             |-- bar.po

The directories that don’t contain any files for translation won’t be created in Crowdin (i.e., as the emails directory in the example above).

Uploading Files to Specified Path with Specified Type

This feature adds support for two optional parameters in the yml file section: dest and type. It’s typically used for projects where the uploaded name must be different so that Crowdin can detect the type correctly.

The dest parameter allows you to specify a file name in Crowdin. It works for multiple files at once and supports the following placeholders: %original_file_name%, %original_path%, %file_extension%, %file_name%.

Note! If you use the dest parameter, the configuration file should include the preserve_hierarchy parameter with the true value.

Example of the configuration file with both parameters:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise
"preserve_hierarchy": true

"files": [
  {
    "source": "/conf/**/*.txt",
    "dest": "/conf/**/%file_name%.properties",
    "translation": "/conf/**/%two_letters_code%/%file_name%.properties",
    "type": "properties"
  },
  {
    "source": "/app/*.txt",
    "dest": "/app/%file_name%.xml",
    "translation": "/res/values-%android_code%/%original_file_name%",
    "type": "android"
  },
  {
    "source": "/conf/**/*.txt",
    "dest": "/%original_path%/%file_name%.properties",
    "translation": "/conf/**/%two_letters_code%/%original_file_name%",
    "type": "properties"
  }
]

Changed Strings Update

The parameter update_option is optional. If it is not set, translations for changed strings will be lost. Useful for typo fixes and minor changes in source strings.

Depending on the value, update_option is used to preserve translations and preserve/remove validations of changed strings during file update.

The values are:

  • update_as_unapproved - preserve translations of changed strings and remove validations of those translations if they exist
  • update_without_changes - preserve translations and validations of changed strings

Example of the configuration file with update_option parameter:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files": [
  {
    "source": "/*.csv",
    "translation": "/%three_letters_code%/%file_name%.csv",
    "first_line_contains_header": true,
    "scheme": "identifier,source_phrase,translation,context",
    "update_option": "update_as_unapproved"
  },
  {
    "source": "/**/*.xlsx",
    "translation": "/%three_letters_code%/folder/%file_name%.xlsx",
    "update_option": "update_without_changes"
  }
]

Uploading Files with Custom Segmentation

Upload your XML, HTML, MD, or any other source files without a key-value structure with your own segmentation rules. If not specified, the pre-defined segmentation rules (SRX 2.0) are used for automatic content segmentation.

Example of the configuration file with custom segmentation:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files": [
  {
    "source": "/emails/sample1.html",
    "translation": "/emails/%locale%/%original_file_name%",
    "custom_segmentation": "/rules/sample.srx.xml"
  }
]

Translations Upload

The command upload translations uploads existing translations to Crowdin. If no options are specified, the uploaded translations will not be imported even if they are equal to the source strings and will not be approved.

The values are:

  • -l, --language=language_code - defines the language translations that should be uploaded to Crowdin. By default, translations are uploaded to all project’s target languages. (Crowdin Language Codes)
  • --[no-]import-eq-suggestions - defines whether to add translation if it is equal to source string in the Crowdin project
  • --[no-]auto-approve-imported - automatically approves uploaded translations

Import Options

XML Files Import Options

translate_content
optional
bool Defines whether to translate texts placed inside the tags.
Acceptable values are 0 or 1. Default is 1.
translate_attributes
optional
bool Defines whether to translate tags' attributes.
Acceptable values are 0 or 1. Default is 1.
content_segmentation
optional
bool Defines whether to split long texts into smaller text segments.
Acceptable values are 0 or 1. Default is 1.
Note: When Content segmentation is enabled, the translation upload is handled by an experimental machine learning technology.
translatable_elements
optional
array This is an array of strings, where each item is the XPaths to DOM element that should be imported.
Sample path: /path/to/node or /path/to/attribute[@attr]
Note! If defined, the parameters translate_content and translate_attributes are not taken into account while importing.

Example of the configuration file with additional parameters:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files": [
  {
    "source": "/app/sample1.xml",
    "translation": "/app/%locale%/%original_file_name%",
    "translate_attributes": 1,
    "translate_content": 0
  },
  {
    "source": "/app/sample2.xml",
    "translation": "/app/%locale%/%original_file_name%",
    "translatable_elements": [
      "/content/text",                      # translatable texts are stored in 'text' nodes of parent node 'content'
      "/content/text[@value]"               # translatable texts are stored in 'value' attribute of 'text' nodes
    ]
  }
]

Other Files Import Options

content_segmentation
optional
bool Defines whether to split long texts into smaller text segments. Only for TXT, DOCX, DITA, IDML, MIF, MEDIAWIKI, HTML, Front Matter HTML, Markdown, Front Matter Markdown, XML, XLIFF, XLIFF 2.0
Acceptable values are 0 or 1. Default is 1.
Note: When Content segmentation is enabled, the translation upload is handled by an experimental machine learning technology.

Example of the configuration file with additional parameters:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files": [
  {
    "source": "/emails/sample1.html",
    "translation": "/emails/%locale%/%original_file_name%",
    "content_segmentation": 1
  }
]

Export Options

To configure the preferred export behavior for each file group, you may use the following export options:

skip_untranslated_strings – Only translated strings will be included in the exported translation files.
skip_untranslated_files – Only translated files will be included in the exported translation archive.
export_only_approved – Only texts that are both translated and approved will be included in the exported translation files.

Example of the configuration file with the export options:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise
"preserve_hierarchy": true

"files": [
  {
    "source": "/locale/en/**/*.po",
    "translation": "/locale/%two_letters_code%/**/%original_file_name%",
    "skip_untranslated_strings": true
  },
  {
    "source": "/locale/en/**/*.json",
    "translation": "/locale/%two_letters_code%/**/%original_file_name%",
    "skip_untranslated_files": true
  },
  {
    "source": "/locale/en/**/*.yml",
    "translation": "/locale/%two_letters_code%/**/%original_file_name%",
    "export_only_approved": true
  }
]
Note: The export options work only with CLI.

Escape Quotes Options for .properties File Format

Defines whether a single quote should be escaped by another single quote or backslash in exported translations. You can add the escape_quotes per-file option. Acceptable values are 0, 1, 2, 3. Default is 3.

The values are:

  • 0 - do not escape single quote
  • 1 - escape single quote with another single quote
  • 2 - escape single quote with a backslash
  • 3 - escape single quote with another single quote only in strings containing variables ( {0} )

Escape special characters
Defines whether any special characters (=, :, ! and #) should be escaped by a backslash in exported translations. You can add the escape_special_characters per-file option.

Acceptable values are 0, 1. Default is 1.

  • 0 - do not escape special characters
  • 1 - escape special characters by a backslash

Example of the configuration file:

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files": [
  {
    "source": "/en/strings.properties",
    "translation": "/%two_letters_code%/%original_file_name%",
    "escape_quotes": 1,
    "translate_content": 0,
    "escape_special_characters": 0
  }
]

Example Configurations

Uploading CSV files

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files": [
  {
    "source": "/*.csv",
    "translation": "/%two_letters_code%/%original_file_name%",
    # Specifies whether first line should be imported or it contains columns headers
    "first_line_contains_header": true,
    # used only when uploading CSV file to define data columns mapping
    "scheme": "identifier,source_phrase,translation,context,max_length"
  }
]

GetText Project

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files" : [
  {
    "source" : "/locale/en/**/*.po",
    "translation" : "/locale/%two_letters_code%/LC_MESSAGES/%original_file_name%",
    "languages_mapping" : {
      "two_letters_code" : {
        "zh-CN" : "zh_CH",
        "fr-QC": "fr"
      }
    }
  }
]

Android Project

"project_id": "projectId"
"api_token": "personal-access-token"
"base_path": "/project-base-path"
"base_url": "https://api.crowdin.com"         # https://{organization-name}.crowdin.com for Crowdin Enterprise

"files" : [
  {
    "source" : "/res/values/*.xml",
    "translation" : "/res/values-%android_code%/%original_file_name%",
    "languages_mapping" : {
      "android_code" : {
        "de" : "de",
        "ru" : "ru"
      }
    }
  }
]

Configuration File for VCS Integrations

VCS integrations require the same configuration file as the CLI tool, meaning the same structure is supported. The only difference is that you should not store the project credentials in the file header for security reasons. Also, you can use a few additional parameters.

Pull Request Title and Labels for VCS Integrations

The default pull request title is New Crowdin updates. To specify your custom pull request title and add labels to the pull request, you can use the following parameters in the configuration file: pull_request_title, pull_request_labels.

Note: Pull request labels are not supported by the Bitbucket integration.

Example:

"base_path": "/project-base-path"
"pull_request_title": "Custom PR title"
"pull_request_labels": [
  "crowdin",
  "l10n"
]

"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

Commit Message Parameter for VCS Integrations

Each time translations are committed the default message is shown “New translations {fileName} ({languageName})”. You can use the commit_message parameter to add Git tags (e.g., to skip builds).

Example:

"base_path": "/project-base-path"
"commit_message": "[ci skip]"

"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

To replace the default commit message, use the append_commit_message parameter with the value false. You can also add two optional placeholders: %original_file_name% and %language% to use the appropriate file name and language variables accordingly.

Example:

"commit_message": "Fix: New translations %original_file_name% from Crowdin"
"append_commit_message": false

"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

Export Languages Parameter for VCS Integrations

By default, all the languages are exported. If you need to export some specific languages, use the export_languages parameter to specify them.

Example:

"base_path": "/project-base-path"
"export_languages": [                                   
    "ru", 
    "uk", 
    "ja"
  ]
"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

Pull Request Assignee Parameter for VCS Integrations

If you need to assign a pull request to particular users, use the pull_request_assignees parameter to specify them.

Note: Pull request assignee parameter is not supported by the Bitbucket, Bitbucket Server, and Azure Repos integrations.

GitHub/GitHub Server

Example:

"base_path": "/project-base-path"
"pull_request_assignees": [                                   
    "login1", 
    "login2"
  ]
"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

GitLab/GitLab Self-Managed

Example:

"base_path": "/project-base-path"
"pull_request_assignees": [                                   
    "user_id1", # numeric ID
    "user_id2"  # numeric ID
  ]
"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

Pull Request Reviewer Parameter for VCS Integrations

If you need to request a pull request review from particular users, use the pull_request_reviewers parameter to specify them.

GitHub/GitHub Server

Example:

"base_path": "/project-base-path"
"pull_request_reviewers": [                                   
    "login1", 
    "login2"
  ]
"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

GitLab/GitLab Self-Managed

Example:

"base_path": "/project-base-path"
"pull_request_reviewers": [                                   
    "user_id1", # numeric ID
    "user_id2"  # numeric ID
  ]
"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

Bitbucket

Example:

"base_path": "/project-base-path"
"pull_request_reviewers": [                                   
    "uuid1", # user uuid
    "uuid2"  # user uuid
  ]
"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

Bitbucket Server

Example:

"base_path": "/project-base-path"
"pull_request_reviewers": [                                   
    "username1",
    "username2"
  ]
"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]
  • Azure Repos

Example:

"base_path": "/project-base-path"
"pull_request_reviewers": [                                   
    "guid1", # user ID
    "guid2"  # user ID
  ]
"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%"
  }
]

Adding Labels to Source Strings

To add existing or new labels to the source strings, use the labels parameter. Labels will be added to the source strings only during the initial upload to the Crowdin project.

The strings uploaded to the Crowdin project before the use of the labels parameter won’t be labeled. If you remove the label added during the initial upload directly in Crowdin, it won’t be re-added on the next syncs.

The label names can contain any characters except “,”.

Example:

"base_path": "/project-base-path"

"files": [
  {
    "source" : "/resources/en/*.json",
    "translation" : "/resources/%two_letters_code%/%original_file_name%",
    "labels" : [
      "android",
      "emails"
    ]
  }
]

Read more about Labels.

Using One Configuration File for VCS Integrations and CLI

There are cases when it’s necessary to use VCS integration and CLI for one project. Mostly, in this kind of situation, you’d need to have two separate configuration files, one for VCS integration and another for CLI. However, you can use a single configuration file for both cases.

Since the VCS integration configuration file doesn’t contain project_id and api_token credentials required for CLI, you can pass them directly in the command using the following parameters: -i/--project-id, -T/--token. Alternatively, you may use environment variables for this purpose.

As a result, your command for downloading translations via CLI will look like the following:

$ crowdin download -i {your-project-id} -T {your-token}

Seeking Assistance

Need help working with Crowdin CLI or have any questions? Contact Support Team.

See Also

Was this article helpful?