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.
Per usare la CLI di Crowdin, dovresti prima generare il tuo file di configurazione e poi eseguire lo strumento. 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).
Per creare il file di configurazione esegui il seguente 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 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%"
}
]
Per eseguire il file di configurazione sopra e caricare file risorsa a Crowdin:
$ crowdin upload sources
Get translations from Crowdin and put them in the right locations:
$ crowdin download
Potresti caricare le Credenziali API da un ambiente variabile, per esempio:
"project_id_env": "CROWDIN_PROJECT_ID"
"api_token_env": "CROWDIN_PERSONAL_TOKEN"
"base_path_env": "CROWDIN_BASE_PATH"
"base_url_env": "CROWDIN_BASE_URL"
Se misti, api_token e project_id sono di priorità:
"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
The crowdin.yml file contains a description of the resources to manage and API credentials (project_id, api_token, base_path, base_url). Ciò significa che è insicuro impegnate questo file nella Repository del codice perché la chiave API sarebbe accessibile ad altri utenti. Crowdin CLI supporta 2 tipi di file di configurazione:
Se devi eseguire un comando con credenziali utente specifiche (per esempio carica risorse
) allora esegui il comando seguente:
$ crowdin upload sources --identity 'path-to-user-credentials-file'
Ma se il file delle credenziali specifiche dell’utente risiede in $HOME/.crowdin.yml puoi semplicemente eseguire:
$ crowdin upload sources
La configurazione campione fornita sopra ha attributi di risorsa e traduzione contenenti wildcard standard (anche note come globbing patterns) per rendere più facile lavorare con file multipli.
Ecco i pattern che puoi usare:
* (asterisco)
Rappresenta ogni carattere nel nome del file o della directory. Se specifici un “*.json” includerà tutti i file come “messages.json”, “about_us.json” e qualsiasi cosa finisca con “.json”.
** (asterisco doppio)
Corrispondi ricorsivamente ogni stringa (includendo le sub-directory). Nota che puoi usare ** sia nei modelli di traduzione che in quelli di origine. Quando usi ** nel modello di traduzione, conterrà sempre il sotto-percorso dall’origine per un certo file. Per esempio, puoi usare l’origine: ‘/en/**/*.po per caricare tutti i file *.po ricorsivamente in Crowdin. Il modello di traduzione sarà ‘/%two_letters_code%/**/%original_file_name%’.
? (punto interrogativo)
Corrisponde ad ogni carattere singolo.
[set]
Abbina ogni carattere singolo in una serie. Si comporta esattamente come i set di caratteri in Regexp, incluso il set di negazione ([^a-z]).
\ (backslash)
Esce dal prossimo metacarattere.
La CLI di Crowdin consente di usare i seguenti segnaposto per mettere le variabili appropriate nel nome file risultante:
Nome | Descrizione |
---|---|
%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 file originale |
%android_code% | Identificatore Locale Android usato per denominare le directory "values-" |
%osx_code% | Identificatore Locale OS X usato per denominare le directory ".lproj" |
%original_path% | Usa nomi di cartelle genitori nel progetto Crowdin per costruire un percorso file nel pacchetto risultato |
%file_extension% | Estensione file originale |
%file_name% | Nome file senza estensione |
Puoi anche definire il percorso per file nell’archivio risultante mettendo uno slash (/) all’inizio del pattern.
La tua opzione di traduzione
può sembrare come: “/locale/%two_letters_code%/LC_MESSAGES/%original_file_name%”.
Struttura dei file e directory sulla macchina locale:
- 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
Esempio 1. Uso delle wildcard nel percorso d’origine:
#........la tua configurazione progetto........
"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%"
}
]
Esempio 2. Uso di wildcard per ignorare i file:
#........la tua configurazione progetto........
"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
]
}
]
Spesso i progetti di software hanno nomi personalizzati per le directory locali. Crowdin allows you to map your own languages to be recognizable in your projects.
Diciamo che le tue directory locali sono denominate ‘en’, ‘uk’, ‘fr’, ‘de’. Tutti loro possono essere rappresentato dal segnaposto %two_letters_code%. Ancora, hai una directory denominata ‘zh_CH’. Puoi anche sovrascrivere i codici lingua per altri segnaposto come %android_code%, %locale%, etc.
To make it work with Crowdin without changes in your project, you can set up Language Mapping via UI.
To set up Language Mapping, follow these steps:
Se devi rinominare un file con traduzioni dopo l’esportazione, puoi facilmente farlo con l’aiuto del parametro translation_replsce
.
Per esempio, se il file è denominato “it_strings.po” può essere rinominato in “strings.po”. Per questo, aggiungi un nuovo parametro (allo stesso livello del parametro traduzione) al file di configurazione (crowdin.yml):
"files": [
{
"source": "/locale/**/en_*.po",
"translation": "/locale/**/%two_letters_code%_%original_file_name%",
"translation_replace": {
"en_": ""
}
}
]
In questo caos, “_en” sarà semplicemente cancellato dal nome file.
Di volta in volta ci sono file e directory che non necessiti tradurre in Crowdin. In tali casi, le regole dei file locali possono essere aggiunte al file di configurazione nel tuo profilo.
"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.
Esempio file CSV:
identifier,source_phrase,context,Ukrainian,Russian,French ident1,Source 1,Context 1,,, ident2,Source 2,Context 2,,, ident3,Source 3,Context 3,,,
Esempio file di configurazione:
"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 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%"
}
]
Di default, le directory che non contengono alcun file per la traduzione non saranno create in Crowdin. Per esempio:
- locale | |--it | |-- foo.po |-- bar.po
Per impostazione predefinita, i file di progetto saranno rappresentati in Crowdin come segue:
- foo.po
- bar.po
Usando l’opzione preserve_hierarchy
, la struttura del file in Crowdin sarà la seguente:
- it | |-- foo.po |-- bar.po
This feature adds support for 2 optional parameters in the yml file section: dest
and type
. Ciò è tipicamente usato per progetti, dove il nome caricato deve essere differente, quindi Crowdin può rilevare correttamente il tipo. Il parametro dest
ti permette di specificare un nome file in Crowdin.
dest
funziona solo per file singoli, e se lo usi, il file di configurazione dovrebbe anche includere il parametro preserve_hierarchy
con il valore true.Esempio del file di configurazione con entrambi i parametri:
"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"
}
]
Il parametro update_option
è facoltativo. Se non è configurato, le traduzioni per le stringhe modificate saranno perse. Utile per le correzioni di errori di ortografia e per modifiche minori nelle stringhe d’origine.
In base al valore, update_option
è usato per preservare traduzioni e preservare/rimuovere validazioni di stringhe modificate durante il caricamento del file.
I valori sono:
Esempio di file di configurazione con parametro update_option:
"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"
}
]
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.
I valori sono:
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 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://api.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 opzionale | booleano | Defines whether to translate texts placed inside the tags. Acceptable values are: 0 or 1. Predefinito è 1. |
translate_attributes opzionale | booleano | Defines whether to translate tags' attributes. Acceptable values are: 0 or 1. Predefinito è 1. |
content_segmentation opzionale | booleano | Defines whether to split long texts into smaller text segments. Acceptable values are: 0 or 1. Predefinito è 1. ImportanteQuesta opzione disabilita la possibilità di caricare traduzioni esistenti per file XML quando abilitata. |
translatable_elements opzionale | insieme | Questo è un insieme di stringhe, dove ogni elemento è l'elemento Xpath a Dom che dovrebbe essere importato. Esempio percorso: /path/to/node o /path/to/attribute[@attr] Nota! Se definiti, i parametri translate_content e translate_attributes non sono presi in conto durante l'importazione. |
Esempio del file di configurazione con parametri aggiuntivi:
"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
]
}
]
Definisce se una singola quota dovrebbe essere scappata da un’altra quota singola o debba essere eseguito un backslash nelle traduzioni esportate. You can add escape_quotes
per-file option. Valori accettabili sono: 0, 1, 2, 3. Predefinito è 3.
I valori sono:
Escape special characters
Defines whether any special characters (=, :, ! e #) dovrebbero essere usciti da uno backslash nelle traduzioni esportate. Puoi aggiungere l’opzione per file escape_special_characters
.
Acceptable values are: 0, 1. Predefinito è 1.
Esempio di file di configurazione:
"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
}
]
"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"
}
]
"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"
}
}
}
]
"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"
}
}
}
]
Le integrazioni VCS richiedono lo stesso file di configurazione dello strumento CLI, quindi la stessa struttura è supportata. L’unica differenza è che le credenziali di progetto non dovrebbero essere archiviate nell’intestazione file per ragioni di sicurezza. Inoltre, si possono usare due parametri aggiuntivi.
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).
Esempio:
"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. Puoi anche aggiungere due segnaposto opzionali: %original_file_name% e %language% per usare il nome file appropriato e le variabili lingua di conseguenza.
Esempio:
"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
parameter to specify them.
Esempio:
"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 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 “,
”.
Esempio:
"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.