Crowdin CLI usa um arquivo de configuração que contém uma descrição dos recursos a serem gerenciados: arquivos a serem carregados no Crowdin e os locais das traduções correspondentes.
Para usar Crowdin CLI, você deve primeiro gerar seu arquivo de configuração e então executar a ferramenta. Por padrão, o Crowdin CLI procura por um arquivo de configuração nomeado por crowdin.yml (para que não precise de especificar o nome do arquivo, a menos que seja diferente de crowdin.yml).
Para criar o arquivo de configuração, execute o seguinte comando:
$ crowdin init
Um arquivo de configuração do Crowdin CLI, tem a seguinte estrutura, por isso, certifique-se de preencher todas as informações necessárias:
Um típico arquivo de configuração semelhante, ao seguinte:
"project_id": "projectId" #abra as configurações do projeto e vá para a seção API
"api_token": "personal-access-token" #abra as configurações de perfil e vá para API e SSO > Novo 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%"
}
]
Para executar o arquivo de configuração acima, e enviar os arquivos de origem para o Crowdin:
$ crowdin upload sources
Obtenha traduções do Crowdin e coloque-as nos locais certos:
$ crowdin download
Você pode carregar as Credenciais da API de uma variável de 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"
Se misturado, api_token e project_id são priorizados:
"project_id_env": "CROWDIN_PROJECT_ID" # Baixa prioridade
"api_token_env": "CROWDIN_PERSONAL_TOKEN" # Baixa prioridade
"base_path_env": "CROWDIN_BASE_PATH" # Baixa prioridade
"base_url_env": "CROWDIN_BASE_PATH" # Baixa prioridade
"project_id": "projectId" # Alta prioridade
"api_token": "personal-access-token" # Alta prioridade
"base_path": "/project-base-path" # Alta prioridade
"base_url": "https://crowdin.com" # Alta prioridade
O arquivo crowdin.yml contém uma descrição dos recursos para gerenciar e credenciais API (project_id, api_token, base_path, base_url). Isto significa que, não é seguro enviar (commit) este arquivo no repositório do código, porque a chave API pode ser acessada por outros usuários. O Crowdin CLI suporta dois tipos de arquivos de configuração:
Se você precisa de executar um comando com as credenciais específicas do usuário (por exemplo, upload sources
), então executa o seguinte comando:
$ crowdin upload sources --identity 'caminho-para-o-arquivo-das-credenciais-do-usuário'
Mas se o arquivode credenciais específicas do usuário, 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 arquivos.
Aqui estão os padrões que você pode usar:
* (asterisco)
Representa qualquer caractere no nome do arquivo ou diretório. Se você especificar um “*.json”, ele incluirá todos os arquivos, como “messages.json”, “about_us.json” e qualquer coisa que termine com “.json”.
** (duplo asterisco)
Corresponde a qualquer texto recursivo (incluindo subdiretórios). Nota que podes usa ** nos padrões de origem e tradução. Ao usar ** no padrão de tradução, ele sempre conterá um subdiretório da origem para um determinado arquivo. Por exemplo, pode usar a origem: ‘/en/**/*po’ para enviar todos os arquivos *.po para o Crowdin, recursivamente. O padrão de tradução será ‘/%two_letters_code%/**/%original_file_name%’.
? (ponto de interrogação)
Corresponde a qualquer caractere único.
[set]
Corresponde a qualquer caractere único em um conjunto. Comporta-se exatamente como conjuntos de caracteres no Regexp, incluindo negação de conjunto ([^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 arquivo resultante:
Nome | Descrição |
---|---|
%language% | Nome do idioma (por exemplo, Ucraniano) |
%two_letters_code% | Código do idioma ISO 639-1 (por exemplo uk) |
%three_letters_code% | Código do idioma ISO 639-2/T (por exemplo ukr) |
%locale% | Localidade (por exemplo uk-UA) |
%locale_with_underscore% | Localidade (por exemplo uk-Ua) |
%original_file_name% | Nome do arquivo 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 arquivo no pacote resultante |
%file_extension% | Extensão do arquivo original |
%file_name% | Nome do arquivo sem extensão |
Também pode definir o caminho para os arquivos no arquivamento resultante, ao colocar uma barra (/) no início do padrão.
A sua opção translation
pode se parecer como: “/locale/%two_letters_code%/LC_MESSAGES/%original_file_name%”.
Estrutura de arquivos e diretórios na máquina local:
- caminho_base | |-- pasta | | | |-- 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
Exemplo 1. Utilização de carateres de substituição no caminho fonte:
#........a sua 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%"
}
]
Exemplo 2. Utilização de caráteres de substituição para ignorar os arquivos:
#........a sua 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. O Crowdin permite mapear seus próprios idiomas para serem reconhecidos em seus projetos.
Digamos que seus diretórios de localidade sejam chamado ‘en’, ‘uk’, ‘fr’, ‘de’. Todos eles podem ser representados pelo espaço reservado %two_letters_code%. Ainda assim, você tem um diretório chamado “zh_CH’. Também pode substituir os códigos de idioma de outros marcadores como %android_code%, %locale%, etc.
Para fazê-lo funcionar com o Crowdin sem alterações em seu projeto, você pode configurar o mapeamento de idioma. via interface de usuário.
Para configurar o mapeamento de idioma, siga estas etapas:
Se você precisar renomear um arquivo com traduções após a exportação, você pode facilmente fazer isso com a ajuda do parâmetro translation_replace
.
Por exemplo, se o arquivo tiver o nome “en_strings.po”, ele poderá ser renomeado para “strings.po”. Para isto, adiciona um novo parâmetro (no mesmo nível do parâmetro de tradução) para o arquivo 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 arquivo.
De tempos em tempos existem arquivos e diretórios que você não precisa traduzir no Crowdin. Nesses casos, regras locais por arquivo podem ser adicionadas ao arquivo de configuração em seu projeto.
"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"
]
}
]
Se um arquivo CSV ou XLS/XLSX contém as traduções para todos os idiomas de destino, você deve especificar os códigos de idioma apropriados no esquema.
Exemplo de arquivo 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 arquivo de configuração:
"files": [
{
"source": "multicolumn.csv",
"translation": "multicolumn.csv",
"first_line_contains_header": true,
"scheme": "identifier,source_phrase,context,uk,ru,fr"
}
]
Se o seu arquivo CSV ou XLS/XLSX contiver colunas que devem ser ignoradas na importação, use none
para essas colunas no esquema, por exemplo:
"scheme" : "identifier,source_phrase,context,uk,none,ru,none,fr"
Para formar o esquema de seu arquivo CSV ou XLS/XLSX, use as seguintes constantes:
identifier
– A coluna contém identificadores de texto. source_phrase
– A coluna contém textos de origem. source_or_translation
– A coluna contém textos de origem, mas a mesma coluna será preenchida com traduções quando o arquivo for exportado. Ao enviar traduções existentes, os valores desta coluna serão usados como traduções. translation
– A coluna contém traduções. context
– A coluna contém comentários ou informações de contexto para os textos de origem. max_length
– A coluna contém valores de limite de comprimento máximo para as traduções dos textos. labels
– A coluna contém rótulos para os textos de origem. none
– Coluna que será ignorada na importação.
"preserve_hierarchy": true
Exemplo do arquivo de configuração usando a opção 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%"
}
]
Por padrão, as pastas que não contêm arquivos para a tradução não será criada em Crowdin. Por exemplo:
- locale | |-- en | |-- foo.po |-- bar.po
Por padrão, os arquivos do projeto serão representados no Crowdin da seguinte forma:
- foo.po
- bar.po
Ao usar a opção preserve_hierarchy
, a estrutura do arquivo no Crowdin será a seguinte:
- en | |-- foo.po |-- bar.po
Este recurso adiciona suporte para 2 parâmetros opcionais na secção do arquivo yml: dest
e type
. Isto é, normalmente, usado para projetos, onde o nome enviado deve ser diferente, para que o Crowdin possa excluir, corretamente, o tipo. O parâmetro dest
permite que especifiques um nome de arquivo no Crowdin.
dest
funciona apenas para arquivos únicos e, se você o usar, o arquivo de configuração também deverá incluir o parâmetro preserve_hierarchy
com o valor true.Exemplo do arquivo de configuração com os dois parâmetros:
"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"
}
]
O parâmetro update_option
é opcional. Se não estiver definido, as traduções para textps alteradas serão perdidas. Útil para correções de digitação e pequenas alterações nas strings de origem.
Depending on the value, update_option
is used to preserve translations and preserve/remove validations of changed strings during file update.
Os valores são:
Example of the configuration file with update_option parameter:
"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"
}
]
O comando upload translations envia as traduções existentes para a Crowdin. Se nenhuma opção for especificada, as traduções carregadas não serão importadas, mesmo que sejam iguais os textos de origem e não sejam aprovados.
Os valores são:
Para configurar o comportamento de exportação preferido para cada grupo de arquivos, você pode usar as seguintes opções de exportação:
skip_untranslated_strings
– Apenas textos traduzidos serão incluídos nos arquivos de tradução exportados. skip_untranslated_files
– Apenas os textos traduzidos serão incluídos nos arquivos de tradução exportados. export_only_approved
– Somente textos traduzidos e aprovados serão incluídos nos arquivos de tradução exportados.
Exemplo de arquivo de configuração com as opções de exportação:
"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 opcional | bool | Define se os atributos das etiquetas devem ser traduzidos. Os valores aceitáveis são: 0 ou 1. O padrão é 1. |
translate_attributes opcional | bool | Acceptable values are: 0, 1. O padrão é 1. |
content_segmentation opcional | bool | Define se é necessário dividir textos longos em segmentos de texto menores. Os valores aceitáveis são: 0 ou 1. O padrão é 1. Importante! Esta opção desativa a possibilidade de carregar traduções existentes para arquivos 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 ou /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 arquivo de configuração com parâmetros adicionais:
"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
]
}
]
Define se uma aspa simples deve ser ignorada por outra ou barra invertida em traduções exportadas. Podes adicionar escape_quotes
por opção de arquivo. Os valores aceitáveis são: 0, 1, 2, 3. O padrão é 3.
Os valores são:
Escapar de caracteres especiais
Define se algum caractere especial (=, :, ! e #) devem ser escapados por barras invertidas nas traduções exportadas. Podes adicionar escape_special_characters
por opção de arquivo.
Os valores aceitáveis são: 0 ou 1. O padrão é 1.
Exemplo de arquivo de configuração:
"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"
}
}
}
]
As integrações VCS requerem o mesmo arquivo 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 arquivo 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. Podes usar o parâmetro commit_message
adicionar etiquetas Git (por exemplo, para ignorar compilações).
Exemplo:
"base_path": "/project-base-path"
"commit_message": "[ci skip]"
"files": [
{
"source" : "/resources/en/*.json",
"translation" : "/resources/%two_letters_code%/%original_file_name%"
}
]
Para substituir a mensagem de confirmação padrão, use o parâmetro append_commit_message
com o valor false. Também podes adicionar dois espaços reservados: %original_file_name% e %language% para usar o nome de arquivo 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%"
}
]
Por padrão, todos os idiomas são exportados. Se você precisar exportar alguns idiomas específicos, use o parâmetro export_languages
para especificá-los.
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 adicionar rótulos existentes ou novos nos textos de origem, use o parâmetro labels
. Os rótulos serão adicionados nos textos de origem apenas durante o upload inicial para o projeto Crowdin.
Os textos enviadoas para o projeto Crowdin antes do uso do parâmetro ` abels` não serão rotuladas. Se você remover o rótulo adicionado durante o upload inicial diretamente no Crowdin, ele não será adicionado novamente nas próximas sincronizações.
Os nomes dos rótulos podem conter qualquer caractere, exceto “,
”.
Exemplo:
"base_path": "/project-base-path"
"files": [
{
"source" : "/resources/en/*.json",
"translation" : "/resources/%two_letters_code%/%original_file_name%",
"labels" : [
"android",
"emails"
]
}
]
Leia mais sobre rótulos.
Há casos em que é necessário usar a integração VCS e a CLI para um projeto. Principalmente, nesse tipo de situação, você precisa ter dois arquivos de configuração separados, um para integração com VCS e outro para CLI. No entanto, existe a possibilidade de usar um único arquivo de configuração para os dois casos.
Como o arquivo de configuração de integração VCS não contém credenciais project_id
and api_token
necessários para a CLI, você pode transmiti-los diretamente no comando usando os seguintes parâmetros: -i/--project-id
, -T/--token
. Como alternativa, você pode usar variáveis ambientais for para esse propósito.
Como resultado, seu comando para baixar traduções via CLI será semelhante ao seguinte:
$ crowdin download -i {your-project-id} -T {your-token}
Precisa de ajuda para trabalhar com Crowdin CLI ou tem alguma dúvida? Entre em contato com a equipe de suporte.