20 proyectos, 20 idiomas, fecha límite ayer. Parte 2

Continúa una serie de artículos sobre la configuración de localizaciones continuas. Puedes encontrar el primero aquí . En este artículo, le diré cómo integrar el paquete Serge-Smartcat-GitLab y configurar los archivos de configuración de Serge utilizando un proyecto de prueba de ejemplo. Instrucciones para Ubuntu.


Instalación a través de vagrantfile


Si no tiene un servidor con Ubuntu a mano, puede usar Vagrant. Cómo funciona


  1. Instale Vagrant y VirtualBox siguiendo las instrucciones .
  2. Descargue el script vagrantfile y bash.
  3. Inicie vagrantfile siguiendo las instrucciones .

El resultado de la compilación Vagrant es una máquina virtual con Ubuntu, en la que Serge está instalado con el complemento Smartcat. Se copiarán todos los archivos necesarios, se crea la clave ssh. Puede proceder de inmediato a configurar el proyecto e iniciar la aplicación.


Instalación manual


Creación de usuario


Cree un grupo de usuarios serge:


sudo groupadd serge 

Cree el usuario serge con el directorio de inicio / usr / local / serge:


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

Instalar Serge


La documentación completa de Serge está aquí .
Actualice los metadatos de la base de datos del paquete local:


 sudo apt-get -qq update 

Instale herramientas de ensamblaje, así como los paquetes necesarios. Antes de comenzar la instalación, asegúrese de que esté instalado Perl 5.10 o superior.


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

Vaya al directorio de inicio del usuario de serge e instale Serge con todas las dependencias necesarias.


 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 

Instalación del complemento Smartcat


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

Creación de clave


Cree un usuario serge con la clave ssh que el usuario serge usará en GitLab:


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

Integración con GitLab


Cree un usuario de sargento en GitLab y agréguelo a todos los repositorios de desarrolladores.
Copie la clave ssh del archivo id_rsa_serge.pub a la configuración del perfil de usuario de serge en GitLab. Esto es necesario para que Serge pueda recibir y enviar cadenas en GitLab.


¡La instalación está completa!


Integración Smartcat


Para comenzar, debes:


  1. Regístrese en Smartcat .
  2. Cree un proyecto indicando los idiomas a los que piensa traducir. Al configurar el complemento, necesitará los códigos de idioma utilizados por Smartcat.
  3. Obtenga project_id , token y token_id .
  4. Escriba a support@smartcat.ai y solicite habilitar el soporte para el algoritmo de análisis de archivos Serge

Configurar Serge-Smartcat


Antes de proceder a la configuración, describiré el principio general de operación. El ciclo de localización estándar incluye 5 pasos:
imagen


  • pull : obtén nuevas líneas del repositorio.
  • pull-ts : obtenga cadenas localizadas de Smartcat (el complemento Smartcat está habilitado).
  • localizar : todos los formatos de origen del repositorio se analizan y se convierten en archivos .po, las traducciones recibidas se escriben en archivos .po. Todas las líneas se escriben en la base de datos de memoria de traducción Serge.
  • push-ts : las nuevas líneas recibidas en el primer paso se envían a Smartcat (utilizando el complemento Smartcat).
  • push : las cadenas localizadas se comprometen en GitLab.
    Puede usar la integración con otro sistema CAT, por ejemplo, hay un complemento para Pootle .

Serge y repositorios git


¿Cómo sabe Serge qué líneas enviar para la traducción? Para determinar nuevas líneas, se utilizan herramientas git estándar: se toma la diferencia entre la rama maestra y la actual. Diff se envía para traducción.


imagen


Importante : Como regla, la rama maestra está protegida, por lo tanto, se usa una rama de traducción adicional para definir diffs, la llamamos base-translate. Es decir, después de la fusión de lanzamiento en master, master debe mantenerse adicionalmente en base-translate.


Hay un punto importante aquí. Es necesario construir los procesos de tal manera que, por un lado, los desarrolladores entiendan qué y en qué momento irá a la traducción, y por otro, para que el techpeace no se ejecute en círculos, sosteniendo su cabeza, porque su diferencia es de 1000 líneas. Y parece que solo se corrigió el título.


Principio de funcionamiento


Serge entra al repositorio, toma todas las ramas y comienza a compararlas con la rama maestra. Para cada rama en la que se detecta diff, crea un conjunto de documentos de traducción en el proyecto Smartcat. Para no quedar empantanado en el caos de ramas irrelevantes y no pararse cerca de cada desarrollador con la pregunta: "¿recordó eliminar la rama?", Es conveniente usar prefijos. Por ejemplo, Serge solo trabaja con ramas que tienen el prefijo de traducción .


También es importante que los textos ya leídos y aprobados que estén listos para traducir caigan en la rama con el prefijo traducir. Después de todo, nadie quiere analizar la historia de los commits en vanos intentos de entender qué tipo de textos son y ¿por qué se ve así?


Preparación de contenido


Nuestro proceso de preparación de contenido es el siguiente:


imagen


Declaración del problema. Cuando la tarea está en la etapa de formulación, a veces ya aparecen textos que deberían ir a la aplicación sin cambios. Si lo son, un redactor técnico y un redactor técnico ayudan a finalizarlos.


Desarrollo de diseños. Cuando el diseñador preparó los diseños, el redactor técnico y el redactor leyeron todos los textos. Por lo tanto, los diseños deducidos en inglés caen en el desarrollo. El desarrollador no tiene que pensar en textos; simplemente toma líneas preparadas de los diseños.


Desarrollo. Desafortunadamente, los pasos anteriores no pueden cubrir todos los tipos de texto posibles. Por ejemplo, los diseños no incluyen validadores, errores de API, algunas ventanas modales. Si durante el proceso de desarrollo fue necesario agregar líneas, el redactor técnico y el redactor proporcionarán al desarrollador todos los textos necesarios.


Por lo tanto, en algún momento, tenemos un estado en el que la rama contiene todos los textos nuevos que son necesarios para la parte del código que se está desarrollando en él. En este punto, se crea una nueva rama con el prefijo traductor, y Serge puede comenzar el proceso de traducción. Cuando las traducciones están listas, el desarrollador las toma de la rama de traducción y luego actúa según el flujo git aceptado en el equipo.


Este proceso minimiza la participación del desarrollador en el proceso de localización y también minimiza la cantidad de trabajo manual: solo necesita crear una sucursal.


Una descripción más detallada del proceso de ajuste se basa en gran medida en el hecho de que el equipo tiene arreglos y procesos similares.


Configuración del proyecto


Inicie sesión como serge:


 sudo -Hu serge -i 

Crea el directorio de grupos:


 mkdir groups 

Este directorio alojará los proyectos correspondientes a los repositorios en GitLab. Tiene sentido repetir la estructura de los grupos de repositorios y sus ubicaciones para facilitar la navegación.


Cree un directorio para el primer proyecto:


 cd groups mkdir myproject cd myproject 

Copie los archivos de configuración de Serge. Puede instalar Midnight Commander y administrar archivos usando el administrador de archivos. Antes de instalar MC, debe cerrar sesión en su cuenta serge.


 exit sudo apt install mc sudo -Hu serge -i 

Archivos para copiar desde / usr / local / serge / serge-master / bin / tools / feature-branch-config-generator:


  • Archivo de configuración de Serge: myproject.cfg
  • archivo de plantilla de trabajo: myproject.inc
  • .serge template: myproject.serge.tmpl
  • archivo para agregar ramas manualmente: myproject_branches.txt
  • script para trabajar con 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/ 

Cree un archivo para grabar registros de complementos:


 mkdir log cd log touch smartcat.log 

Configurar myproject.inc


  • En el campo de nombre, especifique el formato de archivo de recursos utilizado en el proyecto.
  • Rellene la identificación con la máscara% yourproject%.% Yourformat%.% Yourmasterbranchname%.
  • En el campo destination_languages, especifique los idiomas a los que desea traducir.
  • Rellene la fuente con la máscara ./%yourproject%/%yourmasterbranch%/res/en.
  • Rellene output_file_path con la máscara ./%yourproject%/%yourmasterbranch%/res/% LANG% /% FILE%.
  • Rellene source_match con la máscara.% Yourformat%.
  • Dependiendo del formato de los archivos de recursos, especifique el complemento requerido para el análisis. Los complementos se enumeran en la documentación de serge . Complete ts_file_path con máscara ./po/%yourproject%/% LOCALE% /% FILE% .po.
  • Complete master_job con la máscara% yourproject%.% Yourformat%.% Yourmasterbranch%.
    Los parámetros restantes se dejan sin cambios.

Configure myproject.serge.tmpl


  • project_id - id del proyecto en Smartcat
  • token_id, token: datos de Smartcat
  • ruta remota: aquí debe especificar correctamente el nombre del parámetro y su valor {% yourmasterbranch %% ssh_path_to_your_repo% #% yourmasterbranch%}
  • $ FBCGEN_DIR_PADDED -% ssh_path_to_your_repo% # FBCGEN_BRANCH
  • id - job.yourmasterbranch
  • nombre - su proyecto
  • source_language - es
  • destination_languages: idiomas a los que será necesario traducir
  • source_dir - ./branches/yourmasterbranch/%path_to_resource_files%
  • source_match - es.% yourformat%
  • db_source - DBI: SQLite: dbname -./% yourproject% .db3
  • db_namespace -% yourproject%
  • 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 le permite redefinir las designaciones de idioma. Si las designaciones de idioma en el proyecto no coinciden con las designaciones utilizadas en Smartcat, puede redefinirlas.
  • master_job - trabajo.% yourmasterbranch%
  • @inherit -. # jobs /:% yourmasterbranch%
  • source_dir (en FBCGEN_BRANCH_JOBS) - ./branches/$FBCGEN_DIR/%path_to_resource_files%/
  • output_file_path (en FBCGEN_BRANCH_JOBS) - ./branches/$FBCGEN_DIR/%path_to_resource_files%/% LOCALE%. % yourformat%

Importante! En source_path_prefix, el final debe ser el punto% FBCGEN_BRANCH.


Se debe agregar una llamada al complemento Smartcat a la sección correspondiente 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 } } 

Descripción de algunos parámetros:


  • disassemble_algorithm_name Serge.io PO : utilice los hashes clave pasados ​​a Serge. Este parámetro es necesario para optimizar el tiempo de ejecución de los comandos pull-ts y push-ts.
  • complete_projects NO : seleccione líneas de Smartcat solo si se han completado todos los documentos del proyecto. Para nuestra integración, el proyecto en Smartcat es sinónimo del repositorio en GitLab e incluye un conjunto de documentos. Un documento es un producto cartesiano del número de sucursales en el repositorio y los idiomas a los que se realiza la traducción. Es decir, si en su repositorio hay 2 sucursales que deben traducirse a 6 idiomas, se crearán 12 documentos en el proyecto.
  • complete_documents YES : seleccione líneas de Smartcat si el documento está en estado listo. Esto se hace para minimizar el número de confirmaciones en el repositorio.

Ejemplo de proyecto personalizado


A continuación se muestran los archivos de configuración para un proyecto con 6 idiomas. El proyecto almacena las líneas de origen en formato js. Se utiliza un formato de nombre de archivo de 5 caracteres. La ruta a los archivos 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% } */ } 

Lanzamiento de la aplicación


Clonar el repositorio


 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 localización


El archivo .serge está formado:


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

Obteniendo cambios de todas las ramas del repositorio:


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

Colección de cambios de traducción para todas las sucursales de Smartcat:


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

Formación de la base de datos y .po:


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

Envío de nuevos datos desde el repositorio a Smartcat:


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

Envío de transferencias recibidas al repositorio en las sucursales apropiadas:


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

Los siguientes artículos estarán dedicados a la resolución de problemas y la descripción de casos especiales de integración.
Artículo final: 20 proyectos, 20 idiomas, fecha límite ayer. Parte 3

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


All Articles