20 projetos, 20 idiomas, prazo de ontem. Parte 2

Continuando uma série de artigos sobre como configurar localizações contínuas. Você pode encontrar o primeiro aqui . Neste artigo, mostrarei como integrar o pacote Serge-Smartcat-GitLab e configurar os arquivos de configuração do Serge usando um exemplo de projeto de teste. Instruções para o Ubuntu.


Instalação via vagrantfile


Se você não possui um servidor com o Ubuntu em mãos, pode usar o Vagrant. Como funciona:


  1. Instale o Vagrant e o VirtualBox seguindo as instruções .
  2. Faça o download do script vagrantfile e bash.
  3. Inicie o arquivo vagrant seguindo as instruções .

O resultado da compilação do Vagrant será uma máquina virtual Ubuntu na qual Serge está instalado com o plug-in Smartcat. Todos os arquivos necessários serão copiados, a chave ssh é criada. Você pode prosseguir imediatamente para configurar o projeto e iniciar o aplicativo.


Instalação manual


Criação de Usuário


Crie um grupo de usuários de distribuição:


sudo groupadd serge 

Crie o usuário serge com o diretório inicial / usr / local / serge:


 sudo useradd -g serge serge -m -d /usr/local/serge 

Instale o Serge


A documentação completa do Serge está aqui .
Atualize os metadados do banco de dados do pacote local:


 sudo apt-get -qq update 

Instale ferramentas de montagem, bem como os pacotes necessários. Antes de iniciar a instalação, verifique se o Perl 5.10 ou superior está instalado.


 sudo apt-get -qq -y install build-essential libssl-dev libexpat-dev unzip wget 

Vá para o diretório inicial do usuário serge e instale o Serge com todas as dependências necessárias.


 cd /usr/local/serge sudo -u serge wget https://github.com/evernote/serge/archive/master.zip -O serge-master.zip sudo -u serge unzip serge-master.zip sudo -u serge unlink serge-master.zip cd serge-master sudo cpan App::cpanminus sudo cpanm --installdeps . sudo -u serge sudo ln -s /usr/local/serge/serge-master/bin/serge /usr/local/bin/serge 

Instalando o plug-in Smartcat


 sudo cpanm HTTP::Daemon@6.01 sudo cpanm Serge::Sync::Plugin::TranslationService::Smartcat sudo cpan install LWP::Protocol::https 

Criação de chave


Crie um usuário serge com a chave ssh que o usuário serge usará no GitLab:


 sudo -u serge ssh-keygen -t rsa -N "" -f .id_rsa_serge 

Integração com GitLab


Crie um usuário de criação no GitLab e adicione-o a todos os repositórios de desenvolvedores.
Copie a chave ssh do arquivo id_rsa_serge.pub para as configurações de perfil de usuário serge no GitLab. Isso é necessário para que Serge possa receber e enviar seqüências de caracteres no GitLab.


A instalação está completa!


Integração Smartcat


Para começar, você deve:


  1. Inscreva-se no Smartcat .
  2. Crie um projeto indicando os idiomas para os quais você pretende traduzir. Ao configurar o plug-in, você precisará dos códigos de idioma usados ​​pelo Smartcat.
  3. Obtenha project_id , token e token_id .
  4. Escreva para support@smartcat.ai e peça para ativar o suporte ao algoritmo de análise de arquivos Serge

Configurando Serge-Smartcat


Antes de prosseguir com a instalação, descreverei o princípio geral de operação. O ciclo de localização padrão inclui 5 etapas:
imagem


  • pull - obtenha novas linhas do repositório.
  • pull-ts - obtenha seqüências de caracteres localizadas do Smartcat (o plug-in do Smartcat está ativado).
  • localizar - todos os formatos de origem do repositório são analisados ​​e convertidos em arquivos .po, as traduções recebidas são gravadas em arquivos .po. Todas as linhas são gravadas no banco de dados de memória de tradução Serge.
  • push-ts - novas linhas recebidas na primeira etapa são enviadas ao Smartcat (usando o plug-in Smartcat).
  • strings localizadas por push são confirmadas no GitLab.
    Você pode usar a integração com outro sistema CAT, por exemplo, existe um plugin para Pootle .

Repositórios Serge e Git


Como Serge sabe quais linhas enviar para tradução? Para determinar novas linhas, ferramentas git padrão são usadas: a diferença entre a ramificação principal e a atual é tomada. Diff é enviado para tradução.


imagem


Importante : Como regra geral, o ramo mestre é protegido, portanto, um ramo de tradução adicional é usado para definir diferenças, que chamamos de base-translate. Ou seja, após a mesclagem do release no master, o master deve ser mantido adicionalmente na base-translate.


Há um ponto importante aqui. É necessário construir os processos de tal maneira que, por um lado, os desenvolvedores entendam o que e em que momento será a tradução e, por outro, para que o techpeace não corra em círculos, segurando sua cabeça, porque seu diff é de 1000 linhas. E parece que apenas o título foi corrigido.


Princípio de funcionamento


Serge entra no repositório, pega todas as ramificações e começa a compará-las com a ramificação principal. Para cada filial na qual o diff é detectado, ele cria um conjunto de documentos de tradução no projeto Smartcat. Para não ficar atolado no caos de ramificações irrelevantes e não ficar perto de cada desenvolvedor com a pergunta: "você se lembrou de excluir a ramificação?", É conveniente usar prefixos. Por exemplo, Serge trabalha apenas com ramificações que possuem o prefixo de tradução .


Também é importante que os textos já lidos e aprovados e prontos para tradução caiam no ramo com o prefixo translate. Afinal, ninguém quer analisar a história dos commits em vão tentativas de entender que tipo de textos são e por que diff é assim?


Preparação de Conteúdo


Nosso processo de preparação de conteúdo é o seguinte:


imagem


Declaração do problema. Quando a tarefa está no estágio de formulação, algumas vezes os textos já aparecem lá e devem entrar inalterados no aplicativo. Se forem, um redator e redator técnico ajudam a finalizá-los.


Desenvolvimento de layouts. Quando o designer preparou os layouts, o redator e redator técnico leram todos os textos. Assim, os layouts deduzidos em inglês se enquadram no desenvolvimento. O desenvolvedor não precisa pensar em textos; ele simplesmente retira as linhas prontas dos layouts.


Desenvolvimento. Infelizmente, as etapas anteriores não podem cobrir todos os tipos de texto possíveis. Por exemplo, layouts não incluem validadores, erros de API, algumas janelas modais. Se durante o processo de desenvolvimento foi necessário adicionar linhas, o redator e redator técnico fornecem ao desenvolvedor todos os textos necessários.


Assim, em algum momento, temos um estado em que o ramo contém todos os novos textos necessários para a parte do código que está sendo desenvolvido nele. Nesse ponto, uma nova ramificação é criada com o prefixo translate- e Serge pode iniciar o processo de tradução. Quando as traduções estão prontas, o desenvolvedor as retira da ramificação de tradução e atua no fluxo git aceito na equipe.


Esse processo minimiza o envolvimento do desenvolvedor no processo de localização e também minimiza a quantidade de trabalho manual: você só precisa criar uma filial.


Uma descrição adicional do processo de ajuste depende muito do fato de a equipe ter arranjos e processos semelhantes.


Configuração do projeto


Efetue login como serge:


 sudo -Hu serge -i 

Crie o diretório de grupos:


 mkdir groups 

Este diretório hospedará os projetos correspondentes aos repositórios no GitLab. Faz sentido repetir a estrutura dos grupos de repositórios e seus locais para facilitar a navegação.


Crie um diretório para o primeiro projeto:


 cd groups mkdir myproject cd myproject 

Copie os arquivos de configuração do Serge. Você pode instalar o comandante da meia-noite e gerenciar arquivos usando o gerenciador de arquivos. Antes de instalar o MC, você deve sair da sua conta serge.


 exit sudo apt install mc sudo -Hu serge -i 

Arquivos para copiar de / usr / local / serge / serge-master / bin / tools / feature-branch-config-generator:


  • Arquivo de configuração Serge: myproject.cfg
  • arquivo de modelo de trabalho: myproject.inc
  • Modelo .serge: myproject.serge.tmpl
  • arquivo para adicionar ramificações manualmente: myproject_branches.txt
  • script para trabalhar com o GitLab : fbcgen.pl

 cp /usr/local/serge/serge-master/bin/tools/feature-branch-config-generator/{myproject.cfg,myproject.inc,myproject.serge.tmpl,myproject_branches.txt} /usr/local/serge/serge-master/groups/myproject cp /usr/local/serge/serge-master/bin/tools/feature-branch-config-generator/fbcgen.pl /usr/local/serge/serge-master/ 

Crie um arquivo para gravar os logs do plug-in:


 mkdir log cd log touch smartcat.log 

Configurar myproject.inc


  • No campo nome, especifique o formato do arquivo de recurso usado no projeto.
  • Preencha o ID com a máscara% yourproject%.% Yourformat%.% Yourmasterbranchname%.
  • No campo language_language, especifique os idiomas nos quais você deseja traduzir.
  • Preencha a fonte com a máscara ./%yourproject%/%yourmasterbranch%/res/en.
  • Preencha output_file_path com a máscara ./%yourproject%/%yourmasterbranch%/res/% LANG% /% FILE%.
  • Preencha source_match com a máscara.% Yourformat%.
  • Dependendo do formato dos arquivos de recursos, especifique o plug-in necessário para análise. Os plug-ins estão listados na documentação da serge . Preencha ts_file_path com a máscara ./po/%yourproject%/% LOCALE% /% FILE% .po.
  • Preencha master_job com a máscara% yourproject%.% Yourformat%.% Yourmasterbranch%.
    Os demais parâmetros permanecem inalterados.

Configurar myproject.serge.tmpl


  • project_id - ID do projeto no Smartcat
  • token_id, token - dados do Smartcat
  • remotepath - aqui você deve especificar corretamente o nome do parâmetro e seu valor {% yourmasterbranch %% ssh_path_to_your_repo% #% yourmasterbranch%}
  • $ FBCGEN_DIR_PADDED -% ssh_path_to_your_repo% # FBCGEN_BRANCH
  • id - job.yourmasterbranch
  • nome - seuprojeto
  • source_language - pt
  • destination_languages ​​- idiomas para os quais será necessário traduzir
  • source_dir - ./branches/yourmasterbranch/%path_to_resource_files%
  • source_match - pt.% yourformat%
  • db_source - DBI: SQLite: dbname -./% yourproject% .db3
  • db_namespace -% seuprojeto%
  • ts_file_path - ./po/PROJECT_ID_IN_SMARTCAT/% LANG% /% FILE% .po
  • output_file_path - ./branches/%yourmasterbranch%/%path_to_resource_files%/% LOCALE%. % yourformat%
  • output_lang_rewrite {
    zh-hans zh-cn '' zh-hant-tw zh-tw
    } - Este parâmetro permite redefinir as designações de idioma. Se as designações de idioma no projeto não corresponderem às designações usadas no Smartcat, você poderá redefini-las.
  • master_job - job.% yourmasterbranch%
  • @inherit -. # jobs /:% yourmasterbranch%
  • source_dir (em FBCGEN_BRANCH_JOBS) - ./branches/$FBCGEN_DIR/%path_to_resource_files%/
  • output_file_path (em FBCGEN_BRANCH_JOBS) - ./branches/$FBCGEN_DIR/%path_to_resource_files%/% LOCALE%. % yourformat%

Importante! Em source_path_prefix, o final deve ser o ponto% FBCGEN_BRANCH.


Uma chamada para o plug-in Smartcat deve ser adicionada à seção apropriada myproject.serge.tmpl


 sync { ts { plugin Smartcat data { project_id 12345678-1234-1234-1234-1234567890123 token_id 12345678-1234-1234-1234-1234567890123 token 1_qwertyuiopasdfghjklzxcvbn push { disassemble_algorithm_name Serge.io PO } pull { complete_projects NO complete_documents YES } log_file ./log/smartcat.log } } 

Descrição de alguns parâmetros:


  • disassemble_algorithm_name Serge.io PO - use os hashes de chave passados ​​para Serge. Este parâmetro é necessário para otimizar o tempo de execução dos comandos pull-ts e push-ts.
  • complete_projects NÃO - selecione as linhas do Smartcat apenas se todos os documentos no projeto forem concluídos. Para nossa integração, o projeto no Smartcat é sinônimo de repositório no GitLab e inclui um conjunto de documentos. Um documento é um produto cartesiano do número de ramificações no repositório e dos idiomas em que a tradução é feita. Ou seja, se no seu repositório houver 2 ramificações que precisam ser traduzidas para 6 idiomas, 12 documentos serão criados no projeto.
  • complete_documents YES - selecione as linhas do Smartcat se o documento estiver no status concluído. Isso é feito para minimizar o número de confirmações no repositório.

Exemplo de projeto personalizado


Abaixo estão os arquivos de configuração para um projeto com 6 idiomas. O projeto armazena as linhas de origem no formato js. Um formato de nomeação de arquivo de 5 caracteres é usado. O caminho para os arquivos de recursos: ./branches/base-translate/client/src/translations.


myproject.cfg


 # This is a configuration file for fbcgen.pl # Usage: fbcgen.pl myproject.cfg # Root directory where the master branch checkout is located. # (path is relative to the location of the configuration file itself). # The local checkout should be initialized *before* fbcgen.pl is run. # You can run `serge --initialize onboarding-frontend.serge.tmpl` # to do an initial checkout of the project data. $data_dir = './branches/base-translate'; $branch_list_file = 'myproject_branches.txt'; # Where to load Serge config template from. # (path is relative to the location of the configuration file itself). $template_file = "myproject.serge.tmpl"; # Where to save the localized Serge config file. # (path is relative to the location of the configuration file itself). $output_file = "myproject.local.serge"; our $skip_branch_mask = '^(master)$'; # skip these branches unconditionally our $unmerged_branch_mask = '^(translate-)'; # process unmerged branches matching this mask our $any_branch_mask = '^(translate-)'; # additionally, process these branches even if they were merged # Filter out commits that match this mask when determining if branch is inactive. $skip_commit_mask = '^l10n@example.com'; # This sub returns a hash map of additional parameters # that can be referenced in template as `$FBCGEN_<VARIABLE_NAME>`. # For example, `EXTRA_INCLUDE` parameter generated in the function below # is referenced in `myproject.serge.tmpl` file as `$FBCGEN_EXTRA_INCLUDE`. $calculate_params = sub { my ($branch) = @_; return { # for branch names starting with `release/`, return an empty string; # otherwise, return a string that will be used in the `@include` directive EXTRA_INCLUDE => $branch =~ m!^release/! ? '' : "myproject.inc#skip-saving-localized-files\n" } } 

myproject.inc


 # Here we define a job template (common parameters) that will be reused # across all jobs in the generated configuration file. # Certain job parameters (like job ID and paths) will be overridden # in each feature branch job. job-template { name JS file processing ('master' branch) id myproject.js.base-translate # master job id db_namespace myproject destination_languages ru ko de ja zh-Hans source_dir ./myproject/base-translate/res/en output_file_path ./myproject/base-translate/res/%LANG%/%FILE% source_match \.js$ parser { plugin parse_js } ts_file_path ./po/myproject/%LOCALE%/%FILE%.po callback_plugins { :feature_branch { plugin feature_branch data { master_job myproject.js.base-translate # this must match your master job id } } } } # This block will be included conditionally # for all branches except the `release/` ones (see myproject.cfg). # This allows one to skip saving localized files in non-release branches # (but still gather from them strings for translation). skip-saving-localized-files { callback_plugins { :skip-saving-localized-files { plugin process_if phase can_generate_localized_file data { if { lang_matches . then { return NO } } } } } } 

myproject.serge.tmpl


 sync { ts { plugin Smartcat data { project_id %project_id% token_id %token_id% token %token% push { disassemble_algorithm_name Serge.io PO } pull { complete_projects NO complete_documents YES } } } vcs { plugin git data { local_path ./branches add_unversioned YES name L10N Robot email l10n-robot@example.com remote_path { base-translate git@gitlab.loc:common/myproject.git#base-translate /* FBCGEN_BRANCH_REMOTES $FBCGEN_DIR_PADDED git@gitlab.loc:common/myproject.git#$FBCGEN_BRANCH */ } } } } jobs { :develop { id job.base-translate name myproject source_language en destination_languages ru zh-Hans ko de ja optimizations NO source_dir ./branches/base-translate/client/src/translations source_match `en-US.js` debug NO parser { plugin parse_js } leave_untranslated_blank YES db_source DBI:SQLite:dbname=./myproject.db3 db_namespace myproject ts_file_path ./po/1bd80338-a0b5-48b3-822c-e90affd2cdcc/%LANG%/%FILE%.po output_file_path ./branches/base-translate/client/src/translations/%CULTURE%.%EXT% output_bom NO output_lang_rewrite { zh-Hans zh } callback_plugins { :feature_branch { plugin feature_branch data { master_job job.base-translate } } } } /* FBCGEN_BRANCH_JOBS :$FBCGEN_DIR { @inherit .#jobs/:develop id job.$FBCGEN_DIR $FBCGEN_EXTRA_INCLUDE source_path_prefix $FBCGEN_BRANCH. source_dir ./branches/$FBCGEN_DIR/client/src/translations/ output_file_path ./branches/$FBCGEN_DIR/client/src/translations/%CULTURE%.%EXT% } */ } 

Lançamento do aplicativo


Clonar o repositório


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" git clone -b base-translate git@gitlab.loc:groups/myproject.git branches/base-translate/ 

Ciclo de localização


O arquivo .serge é formado:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" /usr/local/serge/serge-master/fbcgen.pl myproject.cfg 

Buscando alterações de todas as ramificações do repositório:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge pull --initialize myproject.local.serge 

Coleção de alterações de tradução para todas as filiais do Smartcat:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge pull-ts myproject.local.serge 

Formação do banco de dados e .po:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge localize myproject.local.serge 

Enviando novos dados do repositório para o Smartcat:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge push-ts myproject.local.serge 

Enviando transferências recebidas para o repositório nas ramificações apropriadas:


 GIT_SSH_COMMAND="ssh -i /usr/local/serge/serge-master/.id_rsa_serge" serge push myproject.local.serge 

Os artigos a seguir serão dedicados a Solução de problemas e descrição de casos especiais de integração.
Artigo final: 20 projetos, 20 idiomas, prazo de ontem. Parte 3

Source: https://habr.com/ru/post/pt446640/


All Articles