Файл конфигурации

Note: This configuration file can work only with new CLI (v3).

Введение

Crowdin CLI использует файл конфигурации YAML, который содержит описание ресурсов для управления: файлы, которые будут загружены в Crowdin, и местоположения соответствующих переводов.

Чтобы использовать Crowdin CLI, вы должны сначала сгенерировать файл конфигурации, а затем запустить инструмент. By default, Crowdin CLI looks for a configuration file named crowdin.yaml (so you don’t have to specify the file name unless it’s different from crowdin.yaml).

Для создания файла конфигурации выполните следующую команду:

$ crowdin init

Структура файла конфигурации

Правильный файл конфигурации Crowdin CLI YAML имеет следующую структуру, поэтому убедитесь, что вы заполнили всю необходимую информацию:

  • Заглавие файла с учетными данными проекта, настройками и информацией о доступе
  • Один элемент массива файлов, который описывает набор исходных файлов и файлов перевода, которыми вы будете управлять
  • 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

Создание простого файла конфигурации

Типичный файл конфигурации YAML выглядит примерно так:

"project_id": "projectId"                     #open project settings and go to API section 
"api_token": "personal-access-token"          #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"
"preserve_hierarchy": true

"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%"
  }
]

Чтобы запустить этот файл конфигурации и загрузить исходные файлы на Crowdin, стоит всего лишь выполнить команду:

$ crowdin upload sources

Скачать переводы из Crowdin и положить их в правильные директории:

$ crowdin download

Учетные данные API из переменных окружения

Вы можете загрузить учетные данные API из переменной окружения, например:

"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://crowdin.com"           # High priority

Разделение конфигурации проекта и учетных данных API

The crowdin.yaml file contains a description of the resources to manage and API credentials (project_id, api_token, base_path, base_url). Это означает, что небезопасно, помещать этот файл в репозиторий кода, так как ключ API будет доступен другим пользователям. Crowdin CLI supports 2 types of configuration files:

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

Если вам нужно запустить команду с пользовательскими учетными данными (например, upload sources) то выполните следующую команду:

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

Но если файл пользовательских учетных данных находится в $HOME/.crowdin.yaml, вы можете просто запустить:

$ crowdin upload sources

Общие настройки

Приведенный выше пример конфигурации имеет атрибуты ‘source’ и ‘translation’, которые содержат стандартные постановочные знаки (также известные как универсальные шаблоны) для упрощения работы с несколькими файлами.

Вот шаблоны, которые вы можете использовать:

* (asterisk)

Represents any character in 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)

Совпадает с любой строчкой рекурсивно (включая подпапки). Note that you can use ** in both source and translation patterns. When using ** in the translation pattern, it will always contain sub-path from 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%’.

? (воспросительный знак)

Соответствует любому одному символу.

[set]

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

\ (Обратный слэш)

Экранирует следующий метасимвол.

Заполнители

В crowdin cli можно использовать следующие заполнители для внесения соответствующих переменных в результирующее имя файла:

Название Описание
%language% Название языка (напр. Русский)
%two_letters_code% Код языка ISO 639-1 (напр. ru)
%three_letters_code% Код языка ISO 639-2/T (напр. rus)
%locale% Локаль (напр. ru-RU)
%locale_with_underscore% Локаль (напр. ru_RU)
%original_file_name% Исходное имя файла
%android_code% Идентификатор языка в Android используемый в названиях «values-» директорий
%osx_code% Локаль OS X, используемая для названий *.lproj" директорий
%original_path% Используйте имена родительских папок в проекте Crowdin для создания пути к файлу в полученном пакете
%file_extension% Исходное расширение файла
%file_name% Имя файла без расширения

Вы также можете указать полный путь к файлам в архиве, поставив косую черту (/) в начале шаблона.

Шаблон translation может выглядеть следующим образом: “/locale/%two_letters_code%/LC_MESSAGES/%original_file_name%”.

Использование постановочных знаков (wildcards)

Структура файлов и папок на локальном компьютере:

- 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
    ]
  }
]

Сопоставление языка

Часто программные проекты имеют собственные имена для каталогов локали. Crowdin allows you to map your own languages to be recognizable in your projects.

Предположим, папки с вашими локалями называются ‘en’, ‘uk’, ‘fr’, ‘de’. Все они могут быть представлены заполнителем %two_letters_code%. В то же время у вас имеется папка ‘zh_CH’. To make it work with Crowdin without changes in your project, you can set up Language Mapping. You can also override language codes for other placeholders like %android_code%, %locale%, etc.

You can set up Language Mapping either via the user interface (UI) or by adding a languages_mapping section to your file set. We recommend setting up a language mapping via UI since it eliminates the need for duplicating the languages_mapping parameter for each file filter, but of course, you can choose the option that works best for you.

To set up Language Mapping via UI, follow these steps:

  1. Open the Project settings > General tab and scroll down to the Export section.
  2. Click Language Mapping to add custom language codes to the target languages of your project.

To set up Language Mapping in your configuration file, add the languages_mapping section to your file set as shown below.

Sample configuration:

"files": [
  {
    "source" : "/locale/en/**/*.po",
    "translation" : "/locale/%two_letters_code%/**/%original_file_name%",
    "languages_mapping" : {
      "two_letters_code" : {
        "uk" : "ukr",
        "pl" : "pol"
      }
    }
  }
]

Mapping format is the following: “crowdin_language_code” : “code_you_use”. Check the full list of Crowdin language codes that can be used for mapping.

Переименование файла перевода

Если вам нужно переименовать файл с переводами после экспорта, это легко сделать с помощью параметра ` translation_replace`.

For example, if the file is named “en_strings.po” it can be renamed to “strings.po”. Для этого добавьте новый параметр (на том же уровне, что и параметр перевода) в файл конфигурации (crowdin.yaml):

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

В этом случае «_en» будет просто удален из имени файла.

Игнорирование файлов и каталогов

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"
    ]
  }
]

Многоколоночный CSV

Если файл CSV содержит переводы для всех целевых языков, вы должны указать соответствующие коды языков в схеме.

Пример файла CSV:

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

Пример файла конфигурации:

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

If your CSV 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"

Сохранение структуры каталогов на сервере

"preserve_hierarchy": true

Пример использования конфигурации с использованием параметра preserve_hierarchy:

"project_id": "projectId"                     #open project settings and go to API section
"api_token": "personal-access-token"          #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"
"preserve_hierarchy": true

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

By default, directories that do not contain any files for translation will not be created in Crowdin. For example:

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

По умолчанию файлы проекта будут представлены в Crowdin следующим образом:

- foo.po
- bar.po

С использованием параметра preserve_hierarchy структура файлов в Crowdin будет следующей:

- en | |-- foo.po |-- bar.po

Загрузить файлы указанного типа по указанному пути

Эта функция добавляет поддержку 2 дополнительных параметров в yaml файл: dest и type. Это как правило полезно для некоторых проектов, где загруженные имена должны отличаться от Crowdin, но он мог определить тип правильно. Параметр Dest позволяет задать имя файла в Crowdin.

Note! The dest parameter only works for single files, and if you use it, the configuration file should also include the preserve_hierarchy parameter with true value.

Пример конфигурационного файла с обоими параметрами:

"project_id": "projectId"                     #open project settings and go to API section
"api_token": "personal-access-token"          #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"
"preserve_hierarchy": true

"files": [
  {
    "source": "/conf/messages",
    "dest": "/messages.properties",
    "translation": "/conf/messages.%two_letters_code%",
    "type": "properties"
  },
  {
    "source": "/app/strings.xml",
    "dest": "/strings.xml",
    "translation": "/res/values-%android_code%/%original_file_name%",
    "type": "properties"
  }
]

Обновление изменённых строк

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.

В зависимости от значения update_option используется для сохранения переводов и сохранения/удаления утверждений переводов и изменённых строк во время обновления файла.

Используйте следующие значения:

  • 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

Пример конфигурационного файла с использованием параметра update_option:</p>

"project_id": "projectId"                     #open project settings and go to API section
"api_token": "personal-access-token"          #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"

"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"
  }
]

Загрузка переводов

Команда upload translations загружает существующие переводы в Crowdin. If no options specified, the uploaded translations will not be imported even if they are equal with the source strings and will not be approved.

Используйте следующие значения:

  • -l, --language=language_code - defines the language translations that should be uploaded to Crowdin. По умолчанию переводы загружаются на все целевые языки проекта. (языковые коды Crowdin)
  • --[no-]import-eq-suggestions - defines whether to add translation if it is equal to source string in Crowdin project
  • --[no-]auto-approve-imported - automatically approves uploaded translations

Дополнительные параметры для XML-файлов

translate_content
необязательный
булево Defines whether to translate texts placed inside the tags.
Acceptable values are: 0 or 1. Значение по умолчанию 1.
translate_attributes
необязательный
булево Defines whether to translate tags' attributes.
Acceptable values are: 0 or 1. Значение по умолчанию 1.
content_segmentation
необязательный
булево Defines whether to split long texts into smaller text segments.
Acceptable values are: 0 or 1. Значение по умолчанию 1.
Важно! Эта опция отключает возможность загружать существующие переводы для файлов XML, когда включена.
translatable_elements
необязательный
массив Это массив строк, где каждый элемент является элементом XPath для DOM, который должен быть импортирован.
Пример пути: /path/to/node or /path/to/attribute[@attr]
Внимание! Если задан, параметры translate_content и translate_attributes не учитываются при импорте.

Пример конфигурационного файла с дополнительными параметрами:

"project_id": "projectId"                   #open project settings and go to API section
"api_token": "personal-access-token"        #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"

"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
    ]
  }
]

Экранирование кавычек в формате .properties

Определяет, будет ли одинарная кавычка экранирована другой одинарной кавычкой или обратным слешем в экспортированных переводах. You can add escape_quotes per-file option. Допустимые значения: 0, 1, 2, 3. Значение по умолчанию 3.

Используйте следующие значения:

  • 0 - не экранировать одинарную кавычку
  • 1 - экранировать одинарную кавычку другой одинарной кавычкой
  • 2 - экранировать одинарную кавычку обратным слешем
  • 3 - экранировать одинарную кавычку другой одинарной кавычкой только в строках, содержащих переменные ( {0} )

Экранирование специальных символов
Определяет, нужно ли экранировать специальные символы (=,:,! и #) обратной косой чертой в экспортированных переводах. Вы можете добавить параметр escape_special_characters для каждого файла.

Допустимые значения: 0, 1. Значение по умолчанию 1.

  • 0 - не экранировать специальные символы
  • 1 - экранировать специальные символы обратной косой чертой

Пример конфигурационного файла:

"project_id": "projectId"                   #open project settings and go to API section
"api_token": "personal-access-token"        #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"

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

Примеры конфигурации

Загрузка файлов CSV через API

"project_id": "projectId"                   #open project settings and go to API section
"api_token": "personal-access-token"        #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"

"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_id": "projectId"                   #open project settings and go to API section
"api_token": "personal-access-token"        #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"

"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_id": "projectId"                   #open project settings and go to API section
"api_token": "personal-access-token"        #open profile settings and go to API & SSO > New Token > create Token
"base_path": "/project-base-path"
"base_url": "https://crowdin.com"

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

Файл конфигурации для интеграции VCS

Интеграция VCS требует того же файла конфигурации, что и инструмент CLI, то есть поддерживается та же структура. Единственное отличие состоит в том, что учетные данные проекта не должны храниться в заголовке файла по соображениям безопасности. Также можно использовать два дополнительных параметра.

Параметр сообщения слияния для интеграции VCS

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

Пример:

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

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

Чтобы заменить сообщение коммита по умолчанию, используйте параметр append_commit_message со значением false. Вы также можете добавить два необязательных заполнителя: %original_file_name% и %language% чтобы использовать переменные имя файла и язык соответственно.

Пример:

"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%"
  }
]

Параметр экспорта языков для интеграции VCS

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

Пример:

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

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, there is a possibility to use a single configuration file for both cases.

Since the VCS integration configuration file doesn’t contain project_id and api_token credentials that are 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}

Нужна помощь

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

Полезная информация

Была ли эта статья полезной?