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.
Para usar o Crowdin CLI, deves primeiro gerar o teu ficheiro de configuração e depois, executar a ferramenta. 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).
Para criar o ficheiro de configuração, executa o seguinte comando:
$ crowdin init
A valid Crowdin CLI configuration file has the following structure, so please make sure that you fill out all the needed information:
A typical configuration file looks similar to the following:
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.crowdin.com"
"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 Enterprise:
$ crowdin upload sources
Get translations from Crowdin Enterprise and put them in the right locations:
$ crowdin download
Podes carregar as Credenciais API duma variável ambiente, por exemplo:
"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://{organization-name}.crowdin.com" # High priority
The crowdin.yml file contains a description of the resources to manage and API credentials (project_id, api_token, base_path, base_url). Isto significa que, não é seguro enviar (commit) este ficheiro no repositório do código, porque a chave API pode ser acessada por outros utilizadores. Crowdin CLI supports 2 types of configuration files:
Se precisas de executar um comando com as credenciais específicas do utilizador (por exemplo, upload sources
), então executa o seguinte comando:
$ crowdin upload sources --identity 'caminho-para-o-ficheiro-das-credenciais-do-utilizador'
Mas se o ficheiro de credenciais específicas do utilizador, residir em $HOME/.crowdin.yml, podes simplesmente executar:
$ crowdin upload sources
O exemplo de configuração fornecido acima, possui atributos de origem e tradução, ao conter caracteres especiais (wildcards) padrão(também conhecidos como globalizar padrões) para facilitar o trabalho com vários ficheiros.
Aqui estão os padrões que podes usar:
* (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)
Corresponde a qualquer frase recursiva (incluindo subdiretórios). 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%’.
? (ponto de interrogação)
Corresponde a qualquer caractere único.
[set]
Matches any single character in a set. Behaves exactly like character sets in Regexp, including set negation ([^a-z]).
\ (barra invertida)
Escapa o próximo metacaractere.
O Crowdin CLI permite usar os seguintes espaços reservados para colocar as variáveis apropriadas no nome do ficheiro resultante:
Nome | Descrição |
---|---|
%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) |
%original_file_name% | Nome do ficheiro original |
%android_code% | Identificador de localidade do Android usado para nomear diretórios "values-" |
%osx_code% | Identificador de localidade do OS X usado para nomear diretórios ".lproj" |
%original_path% | Use nomes das pastas pai no projeto do Crowdin para criar um caminho de ficheiro no pacote resultante |
%file_extension% | Extensão do ficheiro original |
%file_name% | Nome do ficheiro sem extensão |
Também podes definir o caminho para os ficheiros no arquivamento resultante, ao colocar uma barra (/) no início do padrão.
A tua opção translation
pode se parecer como: “/locale/%two_letters_code%/LC_MESSAGES/%original_file_name%”.
Estrutura de ficheiros e diretórios na máquina local:
- 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:
#........a tua configuração de projeto........
"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:
#........a tua configuração de projeto........
"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
]
}
]
Muitas vezes, os projetos de software têm nomes personalizados para diretórios de localidade. Crowdin Enterprise allows you to map your own languages to be recognizable in your projects.
Digamos que os teus diretórios locais são denominados ‘en’, ‘uk’, ‘fr’, ‘de’. Todos eles podem ser representados pelo espaço reservado %two_letters_code%. Ainda assim, tens um diretório chamado ‘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:
To set up Language Mapping in your configuration file, add the languages_mapping
section to your file set as shown below.
Exemplo de configuração:
"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 Enterprise language codes that can be used for mapping.
Se precisas de renomear um ficheiro com traduções, após, a exportação, podes fazer isto com a ajuda do parâmetro translation_replace
.
For example, if the file is named “en_strings.po” it can be renamed to “strings.po”. Para isto, adiciona um novo parâmetro (no mesmo nível do parâmetro de tradução) para o ficheiro de configuração (crowdin.yml):
"files": [
{
"source": "/locale/**/en_*.po",
"translation": "/locale/**/%two_letters_code%_%original_file_name%",
"translation_replace": {
"en_": ""
}
}
]
Neste caso, “_en” será, simplesmente, apagado do nome do ficheiro.
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"
]
}
]
If a CSV or XLS/XLSX file contains the translations for all target languages, you should specify appropriate language codes in the scheme.
Exemplo de ficheiro CSV:
identifier,source_phrase,context,Ukrainian,Russian,French ident1,Source 1,Context 1,,, ident2,Source 2,Context 2,,, ident3,Source 3,Context 3,,,
Exemplo de ficheiro de configuração:
"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"
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.
"preserve_hierarchy": true
Example of the configuration file using the preserve_hierarchy
option:
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.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
Por padrão, os ficheiros do projeto serão representados no Crowdin da seguinte forma:
- foo.po
- bar.po
Ao usar a opção preserve_hierarchy
, a estrutura do ficheiro no Crowdin será a seguinte:
- en | |-- foo.po |-- bar.po
This feature adds support for 2 optional parameters in the yml file section: dest
and type
. Isto é, normalmente, usado para projetos, onde o nome enviado deve ser diferente, para que o Crowdin possa detetar, corretamente, o tipo. O parâmetro dest
permite que especifiques um nome de ficheiro no Crowdin.
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.Exemplo do ficheiro de configuração com os dois parâmetros:
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.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.
Dependendo do valor, update_option
é usado para preservar as traduções e preservar/remover as validações de frases alteradas durante a atualização do ficheiro.
Os valores são:
Exemplo do ficheiro de configuração com o parâmetro update_option:
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.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"
}
]
The command upload translations uploads existing translations to 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.
Os valores são:
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" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.crowdin.com"
"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
}
]
translate_content opcional | bool | Defines whether to translate texts placed inside the tags. Acceptable values are: 0 or 1. O padrão é 1. |
translate_attributes opcional | bool | Defines whether to translate tags' attributes. Acceptable values are: 0 or 1. O padrão é 1. |
content_segmentation opcional | bool | Defines whether to split long texts into smaller text segments. Acceptable values are: 0 or 1. O padrão é 1. Importante! Esta opção desativa a possibilidade de enviar traduções existentes para ficheiros XML quando ativada. |
translatable_elements opcional | array | Este é um array de frases, onde cada item é o XPaths para elemento DOM que deve ser importado. Exemplo de caminho: /path/to/node or /path/to/attribute[@attr] Nota! se definido. os parâmetros translate_content e translate_attributes não são considerados durante a importação. |
Exemplo do ficheiro de configuração com parâmetros adicionais:
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.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
]
}
]
Define se uma aspa simples deve ser ignorada por outra ou barra invertida em traduções exportadas. You can add escape_quotes
per-file option. Os valores aceitáveis são: 0, 1, 2, 3. O padrão é 3.
Os valores são:
Escape special characters
Defines whether any special characters (=, :, ! e #) devem ser escapados por barras invertidas nas traduções exportadas. Podes adicionar escape_special_characters
por opção de ficheiro.
Acceptable values are: 0, 1. O padrão é 1.
Exemplo de ficheiro de configuração:
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.crowdin.com"
"files": [
{
"source": "/en/strings.properties",
"translation": "/%two_letters_code%/%original_file_name%",
"escape_quotes": 1,
"translate_content": 0,
"escape_special_characters": 0
}
]
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.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"
}
]
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.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"
}
}
}
]
"project_id": "projectId" #open project and go to Resources > Integrations & API > Integration tool
"api_token": "personal-access-token" #open project and go to Resources > Integrations & API > Integration tool
"base_path": "/project-base-path"
"base_url": "https://{organization-name}.crowdin.com"
"files" : [
{
"source" : "/res/values/*.xml",
"translation" : "/res/values-%android_code%/%original_file_name%",
"languages_mapping" : {
"android_code" : {
"de" : "de",
"ru" : "ru"
}
}
}
]
As integrações VCS requerem o mesmo ficheiro de configuração como a ferramenta CLI, o que significa que, a mesma estrutura é suportada. A única diferença, é que as credenciais do projeto, não devem ser armazenadas no cabeçalho do ficheiro por razões de segurança. Além disso, podem ser utilizados dois parâmetros adicionais.
Cada vez que as traduções são enviadas, a mensagem padrão “Novas traduções {fileName} ({languageName})”, é mostrada. You can use commit_message
parameter to add Git tags (e.g. to skip builds).
Exemplo:
"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 append_commit_message
parameter with the value false. Também podes adicionar dois espaços reservados: %original_file_name% e %language% para usar o nome de ficheiro e variáveis de idioma apropriados.
Exemplo:
"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%"
}
]
By default, all the languages are exported. If you need to export some specific languages, use export_languages
paramenter to specify them.
Exemplo:
"base_path": "/project-base-path"
"export_languages": [
"ru",
"uk",
"ja"
]
"files": [
{
"source" : "/resources/en/*.json",
"translation" : "/resources/%two_letters_code%/%original_file_name%"
}
]
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 Enterprise project.
The strings uploaded to the Crowdin Enterprise 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 Enterprise, it won’t be re-added on the next syncs.
The label names can contain any characters except “,
”.
Exemplo:
"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.
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.